Transformers documentation
DDP
Начало работы
Базовые классы
Модели
Предобработчики
Вывод
API конвейера
Generate API
Оптимизация
Чат с моделями
Развёртывание
Обучение
Начало работы
Настройка
Производительность
Распределённое обучение
Аппаратное обеспечение
Квантование
Интеграции с экосистемой
Ресурсы
API
You are viewing main version, which requires installation from source. If you'd like
regular pip install, checkout the latest stable version (v5.22.2).
DDP
DistributedDataParallel (DDP) хранит полную копию модели на каждом GPU. Каждый GPU обрабатывает непересекающийся фрагмент данных с прямым и обратным проходом. Перед шагом оптимизатора операция all-reduce усредняет градиенты по всем GPU, чтобы все копии модели оставались идентичными. Используйте DDP, если ваша модель помещается на одном GPU.
┌─────────────────┐
│ training data │
└────────┬────────┘
┌──────────────────┼──────────────────┐
│ shard 0 │ shard 1 │ shard 2
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ model │ │ model │ │ model │
│ (copy 0) │ │ (copy 1) │ │ (copy 2) │
│ GPU 0 │ │ GPU 1 │ │ GPU 2 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ grads │ grads │ grads
└──────────────────┼──────────────────┘
all-reduce
(average gradients)
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ optimizer │ │ optimizer │ │ optimizer │
│ step │ │ step │ │ step │
└─────────────┘ └─────────────┘ └─────────────┘
(identical) (identical) (identical)DDP активируется автоматически при запуске с помощью многопроцессного лаунчера, такого как Accelerate.
# 4 GPUs on one machine
accelerate launch --num_processes 4 train.pyНастройка DDP
Передайте эти TrainingArguments, чтобы управлять поведением DDP.
gradient_accumulation_steps()определяет, когда выполнять all-reduce. Trainer пропускает all-reduce на промежуточных шагах накопления и выполняет его только на последнем микро-батче. Например, приgradient_accumulation_steps=4all-reduce выполняется каждые 4 шага обратного распространения.~TrainingArguments.ddp_find_unused_parametersобходит граф autograd в конце прямого прохода для параметров, которые не получат градиент, и помечает их как готовые, чтобы они не блокировали all-reduce. Не используйте вместе с~TrainingArguments.gradient_checkpointing, так как gradient checkpointing отбрасывает промежуточные активации и пересчитывает их на лету.~TrainingArguments.ddp_bucket_cap_mb— это размер блока для пакетирования градиентов в один all-reduce во время обратного прохода. Больший блок означает меньшее количество вызовов all-reduce и меньший накладной расход на запуск.~TrainingArguments.ddp_broadcast_buffersсинхронизирует буферы модели (например, накопленную статистику BatchNorm) с rank 0 на все остальные rank в начале каждого forward pass. Отключите, если ваша модель использует только LayerNorm. Не используйте вместе с~TrainingArguments.gradient_checkpointing.~TrainingArguments.ddp_backendзадаёт коммуникационный бэкенд. Используйте"nccl"для GPU NVIDIA (по умолчанию и самый быстрый),"gloo"для обучения или отладки на CPU, а также"xccl","hccl"или"cncl"для другого оборудования.ddp_timeout()устанавливает временной лимит на завершение всех процессов и операций (all-reduce, broadcast). Если процесс зависает, например, при медленной загрузке большой модели, по истечении таймаута будет выброшена ошибка вместо бесконечного блокирования.
from transformers import TrainingArguments
args = TrainingArguments(
...,
gradient_accumulation_steps=4,
ddp_backend="nccl",
ddp_find_unused_parameters=False,
ddp_bucket_cap_mb=25,
ddp_broadcast_buffers=True,
ddp_timeout=1800,
)Дальнейшие шаги
- См. FSDP для обучения моделей, которые слишком велики, чтобы поместиться на одном GPU.
- См. DeepSpeed для оптимизации ZeRO и выгрузки (offloading).
- Ознакомьтесь с главой Data Parallelism в The Ultra-Scale Playbook, чтобы узнать больше о том, как работает DDP.