Mikrobatch, geri geçiş ve güncellemeyi ayırmak
Mikrobatch, bir replikada ileri geçiş tarafından işlenen örnek grubudur. Geri geçiş, bunun gradyanlara katkısını hesaplar. Optimize edici güncellemesi, mevcut gradyanları kullanarak parametreleri değiştirir. Birikimle birlikte, bu güncellemeden önce birkaç ileri/geri geçiş yapılır; parametreler grup boyunca değişmeden kalır.
PyTorch'ta gradyanlar bunun için ayrılmış tensörlerde birikir. Dolayısıyla her mikrobatch'ten sonra gradyanları silmek, istenen birikimi iptal eder. Tersine, iki grup arasında sıfırlamayı unutmak, önceki güncellemenin örneklerinin katkıda bulunmasına yol açar.
Günlükleme biriminizi tanımlayın: mikrobatch numarası, optimize edici güncellemesi, görülen örnekler veya tokenlar. Yalnızca "step" sözcüğü belirsizdir. Eksen, denemelerden birinde sekiz kat daha fazla örneği temsil ediyorsa bir kayıp eğrisi doğru şekilde karşılaştırılamaz.
Teknik kaynaklar: PyTorch — gradyan birikimi ve sıfırlama
Etkin batch'i GPU'ları iki kez saymadan hesaplamak
Mikrobatch ve replika başına örnek sayısını m, biriken mikrobatch sayısını A, veri paralelliği replika sayısını D olarak gösterelim. Bu boyutlar sabitse ve örnekler doğru şekilde dağıtılmışsa, genel bir güncellemeye katkıda bulunan örnek sayısı m × A × D'dir.
D faktörü mutlaka makinedeki tüm kartları ifade etmez. Tensor veya pipeline paralelliğiyle aynı modeli paylaşan GPU'lar, o kadar veri replikası hâline gelmez. Yalnızca ticari lot miktarını değil, gerçekten yapılandırılmış grupları yazın.
Aritmetik örnek: mikro yığın başına iki örnek, sekiz birikim ve iki replika, küresel güncelleme başına 32 örnek verir. Her replika bu grupta on altı örneği işler. Tablo sayımları karşılaştırır; bunların belleğini veya hızını sıralamaz.
| m | A | D | Küresel güncelleme başına örnek |
|---|---|---|---|
| 2 | 8 | 2 | 32 |
| 1 | 16 | 2 | 32 |
| 4 | 4 | 2 | 32 |
| 2 | 8 | 1 | 16 |
Teknik kaynaklar: PyTorch — karma duyarlılıkta etkin yığın ve birikim · PyTorch — DistributedDataParallel replikalarının davranışı
Kaybı gerçekten değerlendirilen öğelere göre normalleştirin
Aynı sayıda ilgili öğe içeren mikro yığınlar üzerinde ortalama kayıp için, her katkıyı A'ya bölmek grubun ortalamasını verir. Bu kural, çerçevenin bu normalleştirmeyi zaten yapmadığını varsayar. Birikimi yöneten bir araçla, manuel bir bölme eklemeden önce sözleşmesini yeniden okuyun.
Ortalama token başına kayıpta, farklı uzunluklar paydayı değiştirir. Kayıpların toplamını, grubun dolgu ve yok sayılan konumlar hariç gerçekten denetlenen tokenlarına oranlamak gerekir. Mikro grupların ortalamalarının ortalaması genellikle aynı hedefi vermez.
Teorik örnek: bir mikro grupta ortalama kaybı 2 olan 512 denetlenen token var; bir diğerinde ortalaması 4 olan 1.536 token var. Ağırlıklı ortalama (512 × 2 + 1.536 × 4) ÷ 2.048 = 3,5 olur. Ağırlıksız ortalama ise 3 olur ve küçük gruba fazla ağırlık verir. Bu değerler yalnızca hesaplamayı örneklemektedir.
Teknik kaynaklar: Hugging Face Accelerate — değişken boyutlu örneklerle birikim
Tam bir birikim grubunu organize etme
Önce grubun sınırlarını ve paydasını hazırlayın. Her mikro grup için çıktıyı, normalleştirilmiş kaybı ve ara güncelleme yapmadan geri geçişi hesaplayın. Artık ihtiyaç duymadığınız çıktıları serbest bırakın; kayıpları grafiklerine bağlı olarak bir listede tutmak, ayırmaların ömrünü uzatabilir.
Son katkıdan sonra, tam gradyan üzerinde öngörülen işlemleri, ardından güncellemeyi uygulayın. Sonra bir sonraki grup için gradyanları sıfırlayın. Tur, A mikro gruptan daha azıyla bitiyorsa, bu kısmi grubu gerçek paydasıyla işlemeyi ya da dışarıda bırakmayı açıkça seçin; ilgili örnekleri not edin.
GradScaler kullanan karışık hassasiyette, ölçek faktörü birikim boyunca sabit kalır. Gerçek yeniden ölçekleme ve olası kırpma, katkılardan sonra devreye girer; scaler güncellemesi adım denemesini izler. Sonlu olmayan değer kontrolleri, parametrelerin değiştirilmesini engelleyebilir.
Zamanlayıcı, döngünüzün duyurduğu birimi izlemelidir. Optimize edici güncellemesiyle tanımlanmışsa, her mikro grupta çağırmak takvimi değiştirir. Sisteminiz bazılarını atlayabildiğinde, denemeleri ve gerçekten uygulanan güncellemeleri ayrı ayrı kaydedin.
Teknik kaynaklar: PyTorch — geri yayılım için korunan autograd grafikleri ve tensörler · PyTorch — biriktirme, ölçek kaldırma, kırpma ve GradScaler
Çoklu GPU'da örneklerin indirgenmesini ve dağıtımını doğrulayın
DistributedDataParallel, gradyanları replikalar arasında senkronize eder. Olağan davranışında indirgeme bunların ortalamasını alır; bu nedenle toplanmış bir kayıp ile yerel olarak ortalaması alınmış bir kayıp aynı ölçeğe sahip değildir. Replikalar arasında token sayıları farklıysa, genel payda ile bu indirgeme birlikte değerlendirilmelidir.
Gerçekte işlenen ID'leri doğrulayın: aynı örnekleri istemeden tüm kartlarda çoğaltmak, grubun bilgisini o oranda artırmaz. Ara iletişimleri geciktirmek için, son senkronizasyondan önceki mikro partilerde no_sync kullanılabilir; bağlamı ileri geçişi de kapsamalıdır.
Bu kuralı tüm dağıtık sistemlere uyarlamayın. Durum parçalama, pipeline, iletişim kancaları ve çerçeveler gerçekleşen işlemleri değiştirebilir. Aracınızın desteklediği yapılandırmayla başlayın, ardından her replikada eksiksiz bir grubu kontrol edin.
Teknik kaynaklar: PyTorch — DDP'de gradyan indirgemesi ve no_sync kapsamı
Aynı etkin batch neden aynı deneyimi garanti etmez
m × A × D eşitliği bir sayımdır. Büyük bir batch'in gradyanını yeniden elde etmek için özellikle doğru şekilde ağırlıklandırılmış katkılar, grup boyunca aynı parametre durumu ve bu ayrıştırmayla uyumlu işlemler gerekir. Sayısal yakınlık uygun bir toleransla doğrulanır; yalnızca çarpımdan çıkarılamaz.
BatchNorm, geçişinin girdilerinden istatistikleri hesaplar: birden çok küçük microbatch ona büyük bir batch'in gruplarını sunmaz. Rastgele işlemler, hesaplama sırası ve yuvarlamalar da farklılık gösterebilir. Nihai ağırlıkların bit bit aynı olacağını vaat etmeyin.
Genel batch'teki bir değişiklik, aynı sayıda görülen örnek için güncelleme sayısını da değiştirebilir. Karşılaştırma eksenini ve kalite kuralınızı önceden belirleyin. Öğrenme oranını, scheduler'ı ve süreyi bu yeni varsayımları belgelemeden aynı anda değiştirmeyin.
Teknik kaynaklar: PyTorch — BatchNorm1d istatistikleri · PyTorch — yeniden üretilebilirlik sınırları
Belleği kontrol edin ve sonrasına karar verin
Geri geçişleri ve ilk güncellemeyi içeren bir grubu, ardından sonraki grupları izleyin. Forward'daki bir başarı, gradyanları veya optimizer'ın oluşturduğu durumları doğrulamaz. Sayaçlar device başına kapsamlarını korumalıdır. Bellek dosyası, baseline ve piklerin okunma yöntemini sunar.
Bir grup başarısız olursa microbatch'i küçültün ve bu seçim hâlâ uygunsa hedeflenen efektif batch'i korumak için A'yı yeniden hesaplayın. Bu değişiklik ne pikte orantılı bir bölünmeyi ne de daha iyi bir süreyi garanti eder. Ağırlıklar veya durumlar baskınsa, yalnızca biriktirme yetersiz kalabilir.
Bir kampanyadan önce, küçük ve kontrol edilen bir küme üzerinde bir güncellemeyi doğrulayın: aynı örnekler, ağırlıklı kayıp, sonlu gradyanlar, grup sınırı ve adım sayısı. Ardından kaliteyi seçilen protokolle değerlendirin. İndirilebilir dosyadaki küçük çıkarım MLP'si bu eğitim tarifini çalıştırmaz; bu kontrolün yerini tutmaz.
Nihai kaydınız m, A, D, denetimli token'lar, hassasiyet, normalizasyon, son grubun işlenmesi ve gözlemlenen pikleri bir araya getirir. Ardından hazırlık, denemeler ve gerçekten kabul edilen sonuçları ayırarak yapılandırma seçimine ve deney bütçesine geri dönün.
- Anormal derecede küçük kayıp: biriktirme yoluyla çift bölme olup olmadığını araştırın.
- Bölümlemeye göre değişen sonuç: yok sayılan token'ları ve ortalamaların ortalamasını kontrol edin.
- Etkisiz biriktirme: zero_grad ve optimizer.step'i kontrol edin.
- Artan bellek: microbatch'ler arasında tutulan referansları araştırın.
- Kaymış takvim: geri geçişleri ve güncellemeleri ayırt edin.
Teknik kaynaklar: Hugging Face — bir eğitimin bellek kontrol noktaları
Pratik sorular
On altı microbatch biriktirmek belleği on altıyla çarpar mı?
Mutlaka değil: katkılar art arda işlenir. Gradyanlar kalıcıdır, gereksiz aktivasyonlar ise serbest bırakılabilir. Ancak pik; modele, tutulan referanslara ve optimizer durumlarına bağlıdır; tam grubu ölçün.
İki GPU her zaman efektif batch'i ikiye katlar mı?
Yalnızca bu GPU'lar, belirtilen microbatch ile iki veri replikası olarak katılırsa. Aynı modeli paylaşan kartlar otomatik olarak iki replika oluşturmaz. Dağıtılmış grupları ve işlenen örnekleri doğrulayın.
Tüm kayıpları biriktirme sayısına bölebilir miyim?
Bu basit kural, framework tarafından zaten yönetilmeyen bir normalizasyon olmadan eşit ağırlıklı microbatch'lere karşılık gelir. Değişken sayıda denetimli token veya eksik bir son grupla, hedefin gerçek paydasını kullanın.