Accelerate documentation
FSDP ve DeepSpeed
FSDP ve DeepSpeed
Accelerate, dağıtık eğitim için son derece güçlü iki araç olan Pytorch FSDP ve Microsoft DeepSpeed'i entegre ederek eğitim çerçeveleri konusunda esneklik sunar. Bu öğretinin amacı, bu iki çerçeve arasında sorunsuz geçiş yapabilmesi için kullanıcıya paralellikleri ve olası farklılıkları ortaya koymaktır.
Çerçeveler arasında geçiş yapmak için,
accelerate launchkodunu--config_fileile doğru yapılandırma dosyasını geçirerek veya FSDP ve DeepSpeed için ilgili argümanları doğrudan geçirerek başlatmanızı öneririz.Örnek Accelerate yapılandırmaları DeepSpeed ve FSDP için burada veya “Launch Configurations” altındaki örnekler koleksiyonunda bulunabilir.
Bu eğitim yalnızca tek düğüm, çoklu GPU senaryoları içindir.
Özellikleri Yapılandırma
Model tensörleri, model boyutlarını ölçeklendirmek amacıyla farklı GPU'lara bölünür; bu işlem FSDP'de sharding, DeepSpeed'de ise partitioning olarak adlandırılır. FSDP sharding ve DeepSpeed ZeRO (partitioning) aşamaları sırasıyla --fsdp_sharding_strategy ve --zero_stage ile yapılandırılır. Özellikle FSDP FULL_SHARD, DeepSpeed ZeRO 3 aşamasına karşılık gelir; FSDP sharding ile DeepSpeed ZeRO ayarları arasındaki kapsamlı eşlemeyi inceleyin. Aşağıdaki tablo benzer ayarları özetler ve gruplar:
| Grup | Çerçeve | Yapılandırma | Örnek | Kısıtlamalar (varsa) |
|---|---|---|---|---|
| sharding / partitioning | FSDP DeepSpeed | --fsdp_sharding_strategy--zero_stage | 1 (FULL_SHARD) 3 | |
| offload | FSDP DeepSpeed | --fsdp_offload_params--offload_param_device--offload_optimizer_device | truecpucpu | tamamı ya da hiçbiri |
| model yükleme | FSDP DeepSpeed | --fsdp_cpu_ram_efficient_loading--zero3_init_flag | truetrue | yalnızca ZeRO 3 |
| verimli nokta kontrolü | FSDP DeepSpeed | --fsdp_state_dict_type--zero3_save_16bit_model | SHARDED_STATE_DICTtrue | yalnızca ZeRO 3 |
| weights ön yükleme | FSDP DeepSpeed | --fsdp_forward_prefetch--fsdp_backward_prefetchYok | trueBACKWARD_PRE | |
| model | FSDP DeepSpeed | --fsdp_auto_wrap_policy--fsdp_transformer_layer_cls_to_wrapYok | TRANSFORMER_BASED_WRAP<Katman Sınıfı> | Genellikle gerekmez Kullanıcı için şeffaftır. |
| parameters çağırma | FSDP DeepSpeed | --fsdp_use_orig_paramsYok | true | torch.compile için gerekliKullanıcıya şeffaf |
| parametre senkronizasyonu | FSDP DeepSpeed | --fsdp_sync_module_statesYok | true | |
| eğitim | FSDP DeepSpeed | Yok--gradient_accumulation_steps--gradient_clipping | autoauto | Kullanıcıya şeffaf |
Yukarıdakilerin ayrıntılı açıklamaları için Accelerate başlatma belgelerine başvurun.
Karışık hassasiyet ayarları gibi diğer DeepSpeed yapılandırmalarına erişmek için
--deepspeed_config_fileparametresini iletmeniz gerekir, bkz. belgeler.DeepSpeed ayrıca DeepSpeedPlugin üzerinden yapılandırılabilir; örneğin
DeepSpeedPlugin.zero_stage,--zero_stageile eşdeğerdir veDeepSpeedPlugin.hf_ds_config,--deepeed_config_file.parametresini geçmek için kullanılabilir.
FSDP ayrıca FullyShardedDataParallelPlugin üzerinden yapılandırılabilir; örneğin
FullyShardedDataParallelPlugin.sharding_strategy,--fsdp_sharding_strategy'nin eşdeğeridir.
Kontrol Noktası Alma
FSDP'nin --fsdp_state_dict_type ile yapılandırılarak tam / parçalı kontrol noktaları kaydedilebileceğini unutmayın.
DeepSpeed Zero3 için
--zero3_save_16bit_model trueparametresi geçirilebilir; bu, modeli tek bir rank'ta birleştirip kaydeder vefsdp_state_dict_type: FULL_STATE_DICT'in FSDP karşılığıdır.
Büyük modeller için, modelin tek bir sıraya (rank) konsolide edilmesi çok yavaş olabilir.
Daha hızlı checkpoint almak için, FSDP'de
fsdp_state_dict_type: SHARDED_STATE_DICTkullanın ve DeepSpeed Zero3 için parçalı checkpoint'leri dönüştürmek üzerezero_to_fp32.pybetiğini kullanın.
Offloading
FSDP yalnızca tümü ya da hiçbiri biçiminde offload (yani parametreleri, gradyanları ve optimizatörü offload etmek ya da hepsini GPU'da tutmak) imkânı tanır, ancak DeepSpeed parametreleri ve optimizatörü farklı biçimlerde offload edebilir. Ayrıca DeepSpeed, NVME'ye offload desteği de sunar.
Ön yükleme
FSDP, ek bellek maliyeti karşılığında iletişim/hesaplama örtüşmesini iyileştirmek için --fsdp_forward_prefetch ve --fsdp_backward_prefetch olmak üzere iki ön yükleme yapılandırmasına izin verir, bkz. FSDP belgeleri.
DeepSpeed için, ön yükleme gerektiğinde etkinleştirilir ve stage3_param_persistence_threshold, stage3_max_reuse_distance gibi belirli hiperparametrelere bağlı olarak açılır; Zero3 için yapılandırılabilir; accelerate, bu hiperparametreleri deepspeed yapılandırma dosyasında açıkça belirtmezseniz bunları otomatik olarak ayarlayabilir.
FSDP için bellek izin veriyorsa daha iyi verimlilikler elde etmek üzere
fsdp_backward_prefetch: BACKWARD_PREayarlayın.
Model Yükleme
FSDP, verimli model yüklemeyi etkinleştirmek için açık bir --fsdp_cpu_ram_efficient_loading true parametresi gerektirirken, transformers DeepSpeed Zero3 kullanıldığında benzer özelliği otomatik olarak etkinleştirir.
FSDP için
--fsdp_cpu_ram_efficient_loading trueayarlandığında,accelerateotomatik olaraksync_module_statesdeğerini true olarak ayarlar. RAM verimli yükleme için ağırlıklar yalnızca tek bir rank'ta yüklendiğinden, ağırlıkların diğer rank'lara yayınlanması içinsync_module_statesgereklidir.
Model
FSDP, algoritmanın all-gather ve reduce-scatter işlemlerini nasıl zamanlayacağına karar vermesi için açık bir --fsdp_auto_wrap_policy gerektirir. Ancak DeepSpeed için bu, kullanıcı için şeffaftır.
FSDP için yalnızca
fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAPdeğerini ayarlayın. En günceltransformerssürümlerinde, HF transformers modelleri için uygunfsdp_transformer_layer_cls_to_wrapdeğerini belirlemeye çalışıyoruz. Ancak bu konuda bir hata alırsanız, lütfen bu değeri açıkça belirtin.
Parametreleri Çağırma
torch.compile kullanılıyorsa FSDP için açık bir --fsdp_use_orig_params bayrağı gereklidir, bkz. pytorch dokümantasyonu. DeepSpeed için bu durum kullanıcı için şeffaftır.
FSDP için
torch.compilekullanırkenfsdp_use_orig_params: Truedeğerini ayarlayın.
Eğitim
Deepspeed, açık --gradient_accumulation_steps ve --gradient_clipping bayraklarını gerektirir. FSDP için bu, kullanıcı için şeffaftır.
DeepSpeed kullanırken, Accelerator veya
TrainingArguments(transformerskullanılıyorsa) içinde ayarlanan değerleri otomatik olarak almak içingradient_accumulation_steps: "auto"vegradient_clipping: "auto"değerlerini ayarlayın.
Veri Hassasiyeti İşleme Farkları Hakkında
FSDP ve DeepSpeed’de veri hassasiyetinin nasıl ele alındığını tartışmak için, önce bu çerçevelerde model parametrelerinin nasıl işlendiğine genel bir bakış yapmak faydalıdır. Model / optimizör parametreleri GPU’lar arasında dağıtılmadan önce, parametre hazırlığı aşamasında önce bir boyutlu torch.Tensor olarak “düzleştirilirler”. FSDP / DeepSpeed uygulamaları, bu “düzleştirilmiş” parametrelerin hangi dtype ile saklandığı konusunda farklılık gösterir ve bu durum, torch.Optimizer’in dtype’lerini nasıl ayırdığına ilişkin sonuçlar doğurur. Aşağıdaki tablo, her iki çerçevenin süreçlerini özetlemektedir; “Local” sütunu, süreçlerin GPU başına düzeyde gerçekleştiğini belirtir, bu nedenle yukarı dönüştürme (upcasting) kaynaklı herhangi bir bellek yükünün, kullanılan GPU sayısı üzerinden amorti edildiği anlaşılmalıdır.
Genel bir kural olarak, otomatik karma hassasiyetle (automatic mixed precision) kararlı bir eğitim için tüm eğitilebilir parametrelerin
torch.float32içinde olması gerekir.
| Süreç | Yerel | Çerçeve | Detaylar |
|---|---|---|---|
Yükleme, yani AutoModel.from_pretrained(..., torch_dtype=torch_dtype) | |||
| Hazırlık, yani “flat params” oluşturma | ✅ | FSDP DeepSpeed | torch_dtype içinde oluşturulur.torch_dtype göz ardı edilir, float32 içinde oluşturulur. |
| Optimizatör başlatma | ✅ | FSDP DeepSpeed | torch_dtype içinde parametreler oluştururfloat32 içinde parametreler oluşturur |
| Eğitim Adımı, yani ileri, geri, indirgeme | FSDP DeepSpeed | MixedPrecision ayarlarını izler deepspeed_config_file karma hassasiyet ayarlarını izler. | |
| Optimizatör (Adım Öncesi) | ✅ | FSDP DeepSpeed | torch_dtype'ye yukarı dönüştürme (varsa)float32'ye yukarı dönüştürüldü |
| Optimizatör (Gerçek Adım) | ✅ | FSDP DeepSpeed | torch_dtype içinde gerçekleşir float32 içinde gerçekleşir. |
Dolayısıyla DeepSpeed kullanırken küçük bir GPU sayısıyla çalışıyorsanız, hazırlık sırasında yukarı dönüştürme (upcasting) nedeniyle önemli bellek maliyetleri oluşabileceğini göz önünde bulundurun.
FSDP ile karışık hassasiyet yoksa,
torch.Optimizerdüşük hassasiyetlitorch_dtypeile çalıştırılabilir; bu, az sayıda GPU kullanıldığında faydalı olabilir.
Karışık hassasiyet ile FSDP ve DeepSpeed, model hazırlama adımında yukarı dönüştürme (upcast) yapar (bkz. yukarıdaki tablo). Ancak FSDP'nin bu durumda kontrol noktalarını (checkpoint) yukarı dönüştürülmüş hassasiyette kaydettiğini; DeepSpeed'in ise
--zero3_save_16bit_modelbelirtilirse hâlâ düşük hassasiyetli kontrol noktaları kaydedebileceğini unutmayın.
Yukarıdaki tabloyu netleştirmek için aşağıdaki somut örnekleri inceleyin; kısalık adına optimizörün ön ve gerçek adımı birleştirilmiştir. FSDP ile aşağıda gösterilen iki modda çalışmak mümkündür, ancak DeepSpeed yalnızca bir modda çalışabilir.
| Çerçeve | Model Yükleme (torch_dtype) | Karışık Hassasiyet | Hazırlık (Yerel) | Eğitim | Optimizatör (Yerel) |
|---|---|---|---|---|---|
| FSDP | bf16 | varsayılan (yok) | bf16 | bf16 | bf16 |
| FSDP | bf16 | bf16 | fp32 | bf16 | fp32 |
| DeepSpeed | bf16 | bf16 | fp32 | bf16 | fp32 |