ForgeLM, DeepSpeed ve PyTorch FSDP aracılığıyla çoklu GPU dağıtık eğitimi destekler. Bu sayede daha büyük modeller (30B+ parametre) eğitilebilir veya eğitim birden fazla GPU'da önemli ölçüde hızlandırılabilir.
# DeepSpeed
pip install forgelm[distributed]
# FSDP, PyTorch'un içinde yerleşiktir — ek kurulum gerekmez# my_config.yaml
distributed:
strategy: "deepspeed"
deepspeed_config: "zero2"torchrun ile başlatma:
torchrun --nproc_per_node=4 -m forgelm.cli --config my_config.yamlVeya accelerate ile:
accelerate launch --num_processes=4 -m forgelm.cli --config my_config.yamldistributed:
strategy: "fsdp"
fsdp_strategy: "full_shard"
fsdp_auto_wrap: truetorchrun --nproc_per_node=4 -m forgelm.cli --config my_config.yamlForgeLM, üç yerleşik DeepSpeed ön ayarı sunar. deepspeed_config parametresine bu isimlerden birini veya kendi JSON dosyanızın yolunu verin.
| Ön Ayar | ZeRO Aşaması | Offload | En Uygun |
|---|---|---|---|
zero2 |
2 | Hayır | 2-4 GPU'da 7B-13B modeller |
zero3 |
3 | Hayır | 13B-30B modeller, parametrelerin GPU'lar arasında bölünmesi |
zero3_offload |
3 | optimizer state + parametreler → CPU | 30B-70B modeller, sınırlı VRAM, yeterli CPU RAM |
distributed:
strategy: "deepspeed"
deepspeed_config: "zero2" # Ön ayar adı
# deepspeed_config: "./my_ds_config.json" # Veya özel dosya yoluZeRO-2 (Optimizer + Gradient Bölümleme):
- Optimizer durumlarını ve gradyanları GPU'lar arasında böler
- Her GPU, model parametrelerinin tam bir kopyasını tutar
- Bellek tasarrufu ve iletişim yükü arasında iyi denge
- QLoRA (4-bit) ile iyi çalışır
ZeRO-3 (Tam Parametre Bölümleme):
- Her şeyi böler: optimizer, gradyanlar VE parametreler
- Hiçbir GPU'nun tam modeli tutması gerekmez
- En yüksek bellek tasarrufu — çok daha büyük modeller eğitilebilir
- Daha yüksek iletişim yükü
- Uyarı: QLoRA (4-bit kuantizasyon) ile bilinen uyumluluk sorunları var
ZeRO-3 + CPU Offload:
- ZeRO-3 ile aynı, artı optimizer ve parametreleri CPU RAM'e aktarır
- Eğitim hızı pahasına GPU bellek tasarrufunu maksimize eder
- GPU VRAM darboğaz olduğunda ama CPU RAM yeterli olduğunda faydalı
Kendi JSON dosyanızı oluşturun. HuggingFace Trainer'ın "auto"
değerleri ForgeLM YAML config'inizden çözmesini istiyorsanız o şekilde
bırakın:
{
"zero_optimization": {
"stage": 2,
"overlap_comm": true,
"contiguous_gradients": true
},
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"gradient_clipping": "auto"
}PyTorch Fully Sharded Data Parallel (FSDP), DeepSpeed'e alternatif olarak PyTorch'un içinde yerleşik bir çözümdür.
| Strateji | Açıklama | Bellek Tasarrufu |
|---|---|---|
full_shard |
Parametreleri, gradyanları ve optimizer durumlarını böl | En Yüksek |
shard_grad_op |
Yalnızca gradyanları ve optimizer durumlarını böl | Orta |
hybrid_shard |
Düğüm içi tam bölme, düğümler arası çoğaltma | Çoklu Düğüm |
no_shard |
Standart DDP (bölme yok) | Yok |
distributed:
strategy: "fsdp"
fsdp_strategy: "full_shard"
fsdp_auto_wrap: true # Auto-wrap transformer layers
fsdp_offload: false # Offload parameters AND gradients (between forward/backward) to CPU
fsdp_backward_prefetch: "backward_pre" # Prefetch strategy
fsdp_state_dict_type: "FULL_STATE_DICT" # State dict handling- FSDP: Native PyTorch, ekstra bağımlılık yok, daha basit kurulum, çoğu use-case için iyi.
- DeepSpeed: Daha çok özellik (ZeRO-Infinity, NVMe offload), çok büyük modeller için daha iyi optimizasyon, 70B+ parametre eğitiminde daha çok savaş tecrübesi.
| Kombinasyon | Durum | Notlar |
|---|---|---|
| QLoRA + ZeRO-2 | Çalışır | Çoklu GPU QLoRA için önerilir |
| QLoRA + ZeRO-3 | Kararsız | bitsandbytes + parametre bölümleme ile bilinen sorunlar |
| QLoRA + FSDP full_shard | Deneysel | Özel PEFT/FSDP entegrasyon bayrakları gerekebilir |
| QLoRA + FSDP shard_grad_op | Çalışır | ZeRO-2 seviyesi bölümlemeye benzer |
| Arka Uç | Çoklu GPU | Notlar |
|---|---|---|
transformers |
Evet | Tam DeepSpeed ve FSDP desteği |
unsloth |
Hayır | Yalnızca tek GPU — dağıtık config ayarlanırsa ForgeLM uyarı verir |
LoRA/DoRA adapter'ları hem DeepSpeed hem FSDP ile iyi çalışır. Adapter'lar bölümlenmenin overhead'ini önemsiz kılacak kadar küçükken, dondurulmuş base-model parametreleri bölümlenmeden ciddi yarar görür.
Birden fazla makine üzerinde eğitim için torchrun'ı düğüm
yapılandırmasıyla kullanın:
# Düğüm 0 (master)
torchrun \
--nproc_per_node=4 \
--nnodes=2 \
--node_rank=0 \
--master_addr=192.168.1.100 \
--master_port=29500 \
-m forgelm.cli --config my_config.yaml
# Düğüm 1
torchrun \
--nproc_per_node=4 \
--nnodes=2 \
--node_rank=1 \
--master_addr=192.168.1.100 \
--master_port=29500 \
-m forgelm.cli --config my_config.yamldocker run --gpus all \
-v $(pwd)/my_config.yaml:/workspace/config.yaml \
--shm-size=16g \
forgelm:full \
torchrun --nproc_per_node=4 -m forgelm.cli --config /workspace/config.yamlNot:
--shm-size=16gçoklu GPU eğitimi için önemlidir. PyTorch, süreçler arası iletişim için paylaşılan bellek kullanır ve Docker'ın varsayılan paylaşılan belleği (64MB) yetersizdir.
- ZeRO-3 veya CPU offload'lu ZeRO-3 deneyin
per_device_train_batch_sizedeğerini düşürün- Efektif batch boyutunu korumak için
gradient_accumulation_stepsdeğerini artırın
- Tüm GPU'ların görünür olduğunu doğrulayın:
nvidia-smi - Tanı için
NCCL_DEBUG=INFOortam değişkenini kontrol edin - Zaman aşımını artırın:
export NCCL_TIMEOUT=1800
pip install forgelm[distributed]- ZeRO-3 daha yüksek iletişim yüküne sahiptir — bu beklenen bir durumdur
- Model GPU belleğine sığıyorsa ZeRO-2'yi değerlendirin
- DeepSpeed yapılandırmasında
overlap_comm: trueetkinleştirin (ön ayarlarda varsayılan)