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

and get access to the augmented documentation experience

to get started

DDP

DistributedDataParallel (DDP) mantém uma cópia completa do modelo em cada GPU. Cada GPU processa um fragmento de dados não sobreposto com uma passagem de ida e uma de volta. Antes do passo do otimizador, um all-reduce faz a média dos gradientes entre todas as GPUs para que todas as cópias do modelo permaneçam idênticas. Use DDP quando o seu modelo couber em uma única 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)

O DDP é ativado automaticamente quando você inicia com um lançador multiprocessos, como o Accelerate.

# 4 GPUs on one machine
accelerate launch --num_processes 4 train.py

Configurar DDP

Passe estes TrainingArguments para controlar o comportamento do DDP.

  • gradient_accumulation_steps() determina quando executar o all-reduce. O Trainer ignora o all-reduce nos passos intermediários de acumulação e o executa apenas no micro-lote final. Por exemplo, com gradient_accumulation_steps=4, o all-reduce é executado a cada 4 passes de retropropagação.
  • ~TrainingArguments.ddp_find_unused_parameters percorre o grafo do autograd no final da passagem de frente para parâmetros que não receberão um gradiente e os marca como prontos para que não bloqueiem o all-reduce. Não use com ~TrainingArguments.gradient_checkpointing porque o gradient checkpointing descarta as ativações intermediárias e as recalcula em tempo real.
  • ~TrainingArguments.ddp_bucket_cap_mb é o tamanho do bucket para agrupar gradientes em uma única operação all-reduce durante a passagem reversa. Um bucket maior significa menos chamadas de all-reduce e menos sobrecarga de lançamento.
  • ~TrainingArguments.ddp_broadcast_buffers sincroniza os buffers do modelo (como as estatísticas de execução do BatchNorm) do rank 0 para todos os outros ranks no início de cada forward pass. Desative se o seu modelo usar apenas LayerNorm. Não use com ~TrainingArguments.gradient_checkpointing.
  • ~TrainingArguments.ddp_backend define o backend de comunicação. Use "nccl" para GPUs NVIDIA (padrão e mais rápido), "gloo" para treinamento em CPU ou depuração, e "xccl", "hccl" ou "cncl" para outros hardwares.
  • ddp_timeout() define o limite de tempo para que todos os processos e operações (all-reduce, broadcast) sejam concluídos. Se um processo travar, como ao carregar um modelo grande lentamente, o timeout gera um erro em vez de bloquear indefinidamente.
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,
)

Próximas etapas

  • Veja FSDP para treinar modelos grandes demais para caber em uma única GPU.
  • Consulte DeepSpeed para otimização ZeRO e offloading.
  • Leia o capítulo Paralelismo de Dados do The Ultra-Scale Playbook para obter mais informações sobre como o DDP funciona.
Update on GitHub