Jste na pohovoru na pozici ML inženýra ve Googlu. Tazatel: Potřebujeme trénovat LLM na 1 000 GPU. Jak byste zajistili, že všechny GPU sdílejí to, co se naučí? Vy: Použijte centrální server parametrů pro agregaci a redistribuci vah. Pohovor skončil. Tady je, co jste přehlédli:
K jednomu z hlavních kritických bodů běhu při trénování více GPU dochází během synchronizace GPU. Například při trénování s více GPU pomocí datového paralelismu: - Stejný model je distribuován do různých GPU. - Každý GPU zpracovává jinou podmnožinu celé datové sady. Zkontrolujte toto 👇
To vede k různým gradientům u různých zařízení. Takže před aktualizací parametrů modelu na každém GPU zařízení musíme gradienty komunikovat všem ostatním zařízením, aby se synchronizovaly. Pojďme si pojasnit dvě běžné strategie!
Algoritmus 1) Vše-redukovaný Zřejmým způsobem je posílat gradienty z jednoho zařízení na všechna ostatní zařízení a synchronizovat je. Ale to využívá vysokou šířku pásma. Pokud má každá GPU "N" prvků a existují "G" GPU, výsledkem je celkový přenos G*(G-1)*N prvků 👇
Optimalizujeme to tak, že všechny prvky přeneseme na jednu GPU, vypočítáme finální hodnotu a pošleme ji zpět všem ostatním GPU. To je významné zlepšení. Ale nyní musí jedna GPU přijímat, počítat a komunikovat gradienty zpět, takže to není škálovatelné.
Algoritmus 2) Redukce okruhu Fáze #1) Snížení podílu Nejprve jsou gradienty rozděleny do segmentů G na každém GPU (G = celkový počet GPU). Podívej se na to 👇
V iteraci každý GPU odešle segment dalšímu GPU: - GPU1 pošle hodnotu a₁ do GPU2, kde se přidá do b₁ - GPU2 posílá b₂ do GPU3, kde je přidáno do c₂ - GPU3 posílá c₃ do GPU4, kde je přidáno do d₃ - GPU4 odesílá kód d₄ do GPU1, kde je přidán do procesoru a₄ Zkontrolujte toto 👇
Tento proces se opakuje: - GPU1 posílá (d₄+a₄) do GPU2, kde je přidáno do b₄. - GPU2 posílá (a₁+b₁) do GPU3, kde je přidáno do c₁. - GPU3 posílá (b₂+c₂) do GPU4, kde je přidáno k d₂. - GPU4 posílá (c₃+d₃) do GPU1, kde je přidáno do a₃. Podívej se na to 👇
V konečné iteraci se následující segmenty přenesou na další GPU. To vede ke stavu, kdy každý GPU má jeden celý segment a tyto kompletní segmenty můžeme přenést na všechny ostatní GPU. Zkontrolujte toto 👇
Fáze #2) Pouze sdílené Nyní, když má každá GPU jeden celý segment, můžeme tyto kompletní segmenty přenést na všechny ostatní GPU. Proces probíhá podobně jako jsme výše diskutovali, takže nebudeme zacházet do úplných detailů. Iterace 1 je uvedena níže👇
Dále provedeme iterace 2 a 3. Tyto postupy probíhají podobně jako jsme se naučili ve fázi 1. Podívej se na to 👇
A je to tady! Hmotnosti modelů napříč GPU byly synchronizovány. I když celkový počet přenesených prvků je stále stejný jako u přístupu "single-GPU-master", tento kruhový přístup je mnohem škálovatelnější, protože neklade celou zátěž na jednu GPU. Podívej se na to 👇
Ve výchozím nastavení modely hlubokého učení využívají pouze jednu GPU pro trénování, i když je k dispozici více GPU. Ideálním způsobem trénování modelů je rozdělit tréninkovou zátěž mezi více GPU. Grafika zobrazuje čtyři strategie pro trénink👇 více GPU
362,5K