Transformers documentation

DDP

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).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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=4 all-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.
Update on GitHub