Subiecte populare
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Ești într-un interviu pentru inginer ML la Google.
Intervievator: Trebuie să antrenăm un LLM pe 1.000 de GPU-uri. Cum te-ai asigura că toate plăcile video împărtășesc ceea ce învață?
Tu: Folosește un server central de parametri pentru a agrega și redistribui greutățile.
Interviul s-a încheiat.
Iată ce ai ratat:
Un blocaj major în timpul execuției în antrenamentul multi-GPU are loc în timpul sincronizării GPU.
De exemplu, în antrenamentul multi-GPU prin paralelism de date:
- Același model este distribuit pe diferite GPU-uri.
- Fiecare GPU procesează un subset diferit al întregului set de date.
Verificați acest lucru 👇
Acest lucru duce la gradiente diferite între dispozitive diferite.
Așadar, înainte de a actualiza parametrii modelului pe fiecare dispozitiv GPU, trebuie să comunicăm gradientele către toate celelalte dispozitive pentru a le sincroniza.
Să înțelegem două strategii comune în continuare!
Algoritmul 1) All-reduce
O metodă evidentă este să trimiți gradientele de la un dispozitiv la toate celelalte dispozitive pentru a le sincroniza.
Dar aceasta folosește o lățime de bandă mare.
Dacă fiecare GPU are "N" elemente și există "G" GPU-uri, rezultă un transfer total de elemente G*(G-1)*N 👇
Putem optimiza acest lucru transferând toate elementele pe o singură placă video, calculând valoarea finală și trimițând-o înapoi către toate celelalte plăci grafice.
Aceasta este o îmbunătățire semnificativă.
Dar acum o singură placă video trebuie să primească, să calculeze și să comunice înapoi gradientele, deci acest lucru nu se scalează.
Algoritmul 2) Reducerea inelului
Faza #1) Reducerea acțiunii
În primul rând, gradientele sunt împărțite în segmente G pe fiecare GPU (G = numărul total de GPU-uri).
Uită-te la asta 👇
Într-o iterație, fiecare GPU trimite un segment către următorul GPU:
- GPU1 trimite a₁ la GPU2, unde este adăugat la b₁
- GPU2 trimite b₂ la GPU3, unde este adăugat la c₂
- GPU3 trimite c₃ la GPU4, unde este adăugat la d₃
- GPU4 trimite d₄ la GPU1, unde este adăugat la a₄
Verificați acest lucru 👇
Acest proces se repetă din nou:
- GPU1 trimite (d₄+a₄) către GPU2, unde este adăugat la b₄.
- GPU2 trimite (a₁+b₁) către GPU3, unde este adăugat la c₁.
- GPU3 trimite (b₂+c₂) către GPU4, unde este adăugat la d₂.
- GPU4 trimite (c₃+d₃) către GPU1, unde este adăugat la a₃.
Uită-te la asta 👇
În iterația finală, următoarele segmente sunt transferate la următorul GPU.
Acest lucru duce la o stare în care fiecare GPU are un segment întreg și putem transfera aceste segmente complete către toate celelalte GPU-uri.
Verificați acest lucru 👇
Faza #2) Doar partajare
Acum că fiecare GPU are un segment întreg, putem transfera aceste segmente complete către toate celelalte plăci grafice.
Procesul se desfășoară similar cu ceea ce am discutat mai sus, așa că nu vom intra în detalii complete.
Iterația 1 este prezentată mai jos👇
Apoi, efectuăm iterațiile 2 și 3.
Acestea se desfășoară similar cu ceea ce am învățat în Faza 1.
Uită-te la asta 👇
Și iată!
Greutățile modelelor între GPU-uri au fost sincronizate.
Deși totalul elementelor transferate rămâne același ca în abordarea "single-GPU-master", această abordare în inel este mult mai scalabilă deoarece nu pune întreaga povară pe un singur GPU.
Uită-te la asta 👇

În mod implicit, modelele de deep learning utilizează o singură placă video pentru antrenament, chiar dacă există mai multe plăci video disponibile.
O modalitate ideală de a antrena modele este să distribui volumul de antrenare între mai multe plăci grafice.
Graficul ilustrează patru strategii pentru antrenamentul👇 multi-GPU
364,79K
Limită superioară
Clasament
Favorite

