Accelerate documentation

FSDP ve DeepSpeed

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.15.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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 launch kodunu --config_file ile 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çeveYapılandırmaÖrnekKısıtlamalar (varsa)
sharding / partitioningFSDP
DeepSpeed
--fsdp_sharding_strategy
--zero_stage
1 (FULL_SHARD)
3
offloadFSDP
DeepSpeed
--fsdp_offload_params
--offload_param_device
--offload_optimizer_device
true
cpu
cpu
tamamı ya da hiçbiri

model yüklemeFSDP
DeepSpeed
--fsdp_cpu_ram_efficient_loading
--zero3_init_flag
true
true

yalnızca ZeRO 3
verimli nokta kontrolüFSDP
DeepSpeed
--fsdp_state_dict_type
--zero3_save_16bit_model
SHARDED_STATE_DICT
true

yalnızca ZeRO 3
weights ön yüklemeFSDP

DeepSpeed
--fsdp_forward_prefetch
--fsdp_backward_prefetch
Yok
true
BACKWARD_PRE


modelFSDP

DeepSpeed
--fsdp_auto_wrap_policy
--fsdp_transformer_layer_cls_to_wrap
Yok
TRANSFORMER_BASED_WRAP
<Katman Sınıfı>

Genellikle gerekmez
Kullanıcı için şeffaftır.
parameters çağırmaFSDP
DeepSpeed
--fsdp_use_orig_params
Yok
truetorch.compile için gerekli
Kullanıcıya şeffaf
parametre senkronizasyonuFSDP
DeepSpeed
--fsdp_sync_module_states
Yok
true
eğitimFSDP
DeepSpeed
Yok
--gradient_accumulation_steps
--gradient_clipping

auto
auto
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_file parametresini iletmeniz gerekir, bkz. belgeler.

DeepSpeed ayrıca DeepSpeedPlugin üzerinden yapılandırılabilir; örneğin DeepSpeedPlugin.zero_stage, --zero_stage ile eşdeğerdir ve DeepSpeedPlugin.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 true parametresi geçirilebilir; bu, modeli tek bir rank'ta birleştirip kaydeder ve fsdp_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_DICT kullanın ve DeepSpeed Zero3 için parçalı checkpoint'leri dönüştürmek üzere zero_to_fp32.py betiğ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_PRE ayarlayı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 true ayarlandığında, accelerate otomatik olarak sync_module_states değ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çin sync_module_states gereklidir.

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_WRAP değerini ayarlayın. En güncel transformers sürümlerinde, HF transformers modelleri için uygun fsdp_transformer_layer_cls_to_wrap değ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.compile kullanırken fsdp_use_orig_params: True değ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 (transformers kullanılıyorsa) içinde ayarlanan değerleri otomatik olarak almak için gradient_accumulation_steps: "auto" ve gradient_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.float32 içinde olması gerekir.

SüreçYerelÇerçeveDetaylar
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şturur
float32 içinde parametreler oluşturur
Eğitim Adımı, yani ileri, geri, indirgemeFSDP
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.Optimizer düşük hassasiyetli torch_dtype ile ç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_model belirtilirse 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çeveModel Yükleme (torch_dtype)Karışık HassasiyetHazırlık (Yerel)EğitimOptimizatör (Yerel)
FSDPbf16varsayılan (yok)bf16bf16bf16
FSDPbf16bf16fp32bf16fp32
DeepSpeedbf16bf16fp32bf16fp32
Update on GitHub