Google'da bir ML Mühendisi mülakatındasın. Röportajcı: 1.000 GPU üzerinde bir LLM eğitmemiz gerekiyor. Tüm GPU'ların öğrendiklerini paylaşmasını nasıl sağlarsınız? Sen: Ağırlıkları toplamak ve yeniden dağıtmak için merkezi bir parametre sunucusu kullanabilirsiniz. Mülakat bitti. İşte kaçırdığınız şeyler:
Çoklu GPU eğitimindeki önemli bir çalışma zamanı darboğazı, GPU senkronizasyonu sırasında meydana gelir. Örneğin, veri paralelliği aracılığıyla çoklu GPU eğitiminde: - Aynı model farklı GPU'lara dağıtılır. - Her GPU, tüm veri kümesinin farklı bir alt kümesini işler. 👇 Bunu kontrol et
Bu da farklı cihazlarda farklı gradyanlara yol açar. Bu yüzden, her GPU cihazındaki model parametrelerini güncellemeden önce, gradyanları diğer tüm cihazlara senkronize etmek için iletmemiz gerekiyor. Sırada 2 yaygın stratejiyi anlayalım!
Algoritma 1) Hepsi indirgeme Bariz bir yol, gradyanları bir cihazdan diğer tüm cihazlara gönderip senkronize etmektir. Ama bu yüksek bant genişliği kullanıyor. Eğer her GPU'nun "N" elemanı varsa ve "G" GPU'ları varsa, bu tamamen G*(G-1)*N eleman 👇 transferi ile sonuçlanır
Bunu optimize ederek tüm elemanları tek bir GPU'ya aktarabiliriz, nihai değeri hesaplayıp diğer tüm GPU'lara geri gönderebiliriz. Bu önemli bir gelişmedir. Ama şimdi tek bir GPU gradyanları almak, hesaplamak ve geri iletmek zorunda, bu yüzden ölçeklenmiyor.
Algoritma 2) Halka indirgemesi Aşama #1) Hisse azaltma İlk olarak, gradyanlar her GPU'da G segmentlerine bölünür (G = toplam GPU sayısı). Şuna 👇 bak
Bir yinelemede, her GPU bir sonraki GPU'ya bir segment gönderir: - GPU1, a₁'yi GPU2'ye gönderir ve burada b₁'ye eklenir - GPU2, b₂'yi GPU3'e gönderir ve burada c₂'ye eklenir - GPU3, c₃'yi GPU4'e gönderir ve burada d₃'ye eklenir - GPU4, d₄'yi GPU1'e gönderir ve burada a₄'ye eklenir. 👇 Bunu kontrol et
Bu işlem tekrar yapılır: - GPU1, GPU2'ye (d₄+a₄) gönderir ve burada b₄'ye eklenir. - GPU2, GPU3'e (a₁+b₁) gönderir ve burada c₁'ye eklenir. - GPU3, GPU4'e (b₂+c₂) gönderir ve burada d₂'ye eklenir. - GPU4, GPU1'e (c₃+d₃) gönderir ve burada a₃'ya eklenir. 👇 Bunu kontrol et
Son sürümde, aşağıdaki segmentler bir sonraki GPU'ya aktarılır. Bu, her GPU'nun bir tam segmente sahip olduğu bir duruma yol açar ve bu tüm segmentleri diğer tüm GPU'lara aktarabiliyoruz. Şuna 👇 bak
Aşama #2) Sadece paylaşım Artık her GPU'nun bir tam segmenti olduğuna göre, bu tüm segmentleri diğer tüm GPU'lara aktarabiliyoruz. Süreç, yukarıda tartıştığımıza benzer şekilde yürütülüyor, bu yüzden tam detaylara girmeyeceğiz. Aşağıda 1. yineleme gösterilmiştir👇
Sonrasında 2. ve 3. yinelemeleri gerçekleştiriyoruz. Bunlar, Birinci Aşama'da öğrendiğimiz gibi uygulanıyor. Şuna 👇 bak
İşte bu! GPU'lar arasındaki model ağırlıkları senkronize edilmiştir. Aktarılan toplam elemanlar hâlâ "tek GPU-master" yaklaşımıyla aynı olsa da, bu halka yaklaşımı çok daha ölçeklenebilir çünkü tüm yükü tek bir GPU'ya yüklemez. Şuna 👇 bak
Varsayılan olarak, derin öğrenme modelleri eğitim için yalnızca tek bir GPU kullanır, birden fazla GPU olsa bile. Modelleri eğitmenin ideal bir yolu, eğitim iş yükünü birden fazla GPU arasında dağıtmaktır. Grafik, çoklu GPU eğitimi👇 için dört stratejiyi gösteriyor
364,91K