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), her GPU üzerinde modelin tam bir kopyasını tutar. Her GPU, bir ileri ve geri geçişle verinin örtüşmeyen bir dilimini işler. Optimizer adımı öncesinde, all-reduce işlemi tüm GPU'lar arasında gradyanları ortalayarak her model kopyasının aynı kalmasını sağlar. Modeliniz tek bir GPU'ya sığıyorsa DDP kullanın.

                         ┌─────────────────┐
                         │  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 gibi çoklu işlem başlatıcılarıyla başlattığınızda otomatik olarak etkinleşir.

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

DDP'yi yapılandır

DDP davranışını kontrol etmek için bu TrainingArguments değerlerini iletin.

  • gradient_accumulation_steps(), all-reduce işleminin ne zaman gerçekleştirileceğini belirler. Trainer, ara birikim adımlarında all-reduce işlemini atlar ve yalnızca son mikro-partide çalıştırır. Örneğin, gradient_accumulation_steps=4 kullanıldığında, all-reduce her 4 geri yayılım geçişinde çalıştırılır.
  • ~TrainingArguments.ddp_find_unused_parameters, ileri geçişin sonunda gradyan almayacak parametreler için autograd grafiğini tarar ve bunları hazır olarak işaretler, böylece all-reduce işlemini engellemezler. ~TrainingArguments.gradient_checkpointing ile birlikte kullanmayın, çünkü gradyan checkpointing ara aktivasyonları atar ve bunları anlık olarak yeniden hesaplar.
  • ~TrainingArguments.ddp_bucket_cap_mb, geriye yayılım sırasında gradyanları tek bir all-reduce işlemine toplu olarak göndermek için kullanılan varil boyutudur. Daha büyük bir varil, daha az all-reduce çağrısı ve daha düşük başlatma maliyeti anlamına gelir.
  • ~TrainingArguments.ddp_broadcast_buffers, her ileri geçişin başlangıcında model tamponlarını (BatchNorm yürüyen istatistikleri gibi) 0. sıradan diğer tüm sıralara senkronize eder. Modeliniz yalnızca LayerNorm kullanıyorsa devre dışı bırakın. ~TrainingArguments.gradient_checkpointing ile birlikte kullanmayın.
  • ~TrainingArguments.ddp_backend iletişim arka ucunu belirler. NVIDIA GPU'lar için (varsayılan ve en hızlısı) "nccl", CPU eğitimi veya hata ayıklama için "gloo", diğer donanımlar için ise "xccl", "hccl" veya "cncl" kullanın.
  • ddp_timeout(), tüm süreçlerin ve işlemlerin (all-reduce, broadcast) tamamlanması için zaman sınırını belirler. Bir süreç takılırsa (örneğin büyük bir modelin yavaş yüklenmesi gibi), zaman aşımı sonsuza kadar bloklamak yerine bir hata oluşturur.
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,
)

Sonraki adımlar

  • Tek bir GPU'ya sığmayacak kadar büyük modelleri eğitmek için FSDP'ye bakın.
  • ZeRO optimizasyonu ve offload için DeepSpeed'e bakın.
  • DDP'nin nasıl çalıştığı hakkında daha fazla bilgi için The Ultra-Scale Playbook'taki Data Parallelism bölümünü okuyun.
Update on GitHub