Accelerate documentation
Dağıtık kurulumlar arasında performans karşılaştırması
Dağıtık kurulumlar arasında performans karşılaştırması
Farklı kurulumlardan elde edilen performansı değerlendirmek ve karşılaştırmak, neye bakmanız gerektiğini bilmiyorsanız oldukça zor olabilir. Örneğin, Accelerate ile aynı betiği, TPU, çoklu GPU ve tek GPU arasında aynı batch boyutuyla çalıştırıp sonuçlarınızın eşleşmesini bekleyemezsiniz.
Ama neden?
Bu konunun bu öğreticide ele alınmasının üç nedeni var:
- Doğru tohumları ayarlama
- Gözlemlenen Toplu Boyutları
- Öğrenme Hızları
Tohumu Ayarlama
Bu sorun o kadar sık karşılaşılmamış olsa da, eğitim sürecinin yeniden üretilebilir olması için tüm dağıtık durumlarda tohumu tamamen ayarlamak üzere utils.set_seed() kullanıldığından emin olun:
from accelerate.utils import set_seed
set_seed(42)Neden bu önemli? Arka planda bu, 5 farklı tohum ayarını belirleyecektir:
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # or torch.xpu.manual_seed_all, etc
# ^^ safe to call this function even if cuda is not available
if is_torch_xla_available():
xm.set_rng_state(seed)Rastgele durum, numpy durumu, torch, torch cihaz durumu ve TPU'lar kullanılabilirse torch_xla cuda durumu.
Gözlemlenen Toplu Boyutları
Accelerate ile eğitim sırasında dataloader'a geçirilen batch size, GPU başına batch size'dır. Bu, iki GPU üzerinde 64 olan bir batch size'ın aslında 128'lik bir batch size olduğu anlamına gelir. Sonuç olarak, tek bir GPU üzerinde test ederken bunun dikkate alınması gerekir; TPU'lar için de benzer şekilde.
Aşağıdaki tablo, farklı parti boyutlarını denemek için hızlı bir başvuru olarak kullanılabilir:
Bu örnekte, “Multi-GPU” için iki GPU ve 8 işçili bir TPU pod bulunur
| Tek GPU Toplu Boyutu | Çoklu GPU Eşdeğer Toplu Boyutu | TPU Eşdeğer Toplu Boyutu |
|---|---|---|
| 256 | 128 | 32 |
| 128 | 64 | 16 |
| 64 | 32 | 8 |
| 32 | 16 | 4 |
Öğrenme Hızları
Birden fazla kaynakta belirtildiği üzere[1][2], öğrenme oranı, mevcut cihaz sayısına göre doğrusal olarak ölçeklendirilmelidir. Aşağıdaki kod parçası bunu Accelerate ile nasıl yapacağınızı göstermektedir:
Kullanıcıların kendi öğrenme hızı zamanlayıcılarını tanımlayabilmesi nedeniyle, öğrenme hızlarını ölçekleyip ölçeklememeye karar vermek kullanıcıya bırakılmıştır.
learning_rate = 1e-3
accelerator = Accelerator()
learning_rate *= accelerator.num_processes
optimizer = AdamW(params=model.parameters(), lr=learning_rate)Ayrıca, accelerate'in öğrenme hızını, eğitim yapılan süreç sayısına göre adım adım ilerlettiğini göreceksiniz. Bunun nedeni, daha önce belirtildiği üzere gözlemlenen parti boyutudur. Dolayısıyla 2 GPU durumunda, parti boyutunun iki katı büyüklükte olması (tek GPU örneğinde parti boyutunda herhangi bir değişiklik yapılmadığı varsayıldığında) telafi edilmek üzere öğrenme hızı, tek GPU durumuna kıyasla iki kat daha sık adım atar.
Gradyan Biriktirme ve Karışık Hassasiyet
Gradyan biriktirme ve karma hassasiyet kullanıldığında, gradyan ortalama işleyişinin (biriktirme) ve hassasiyet kaybının (karma hassasiyet) etkisiyle performansta bazı düşüşler beklenir. Bu durum, farklı hesaplama yapılandırmaları arasındaki parti bazlı kaybın karşılaştırılmasında açıkça görülecektir. Ancak, eğitimin sonunda genel kayıp, metrik ve genel performans yaklaşık olarak aynı olmalıdır.
Update on GitHub