Technikák nagy neurális hálózatok PlatoBlockchain adatintelligencia képzéséhez. Függőleges keresés. Ai.

Technikák a nagy neurális hálózatok betanításához

Technikák a nagy neurális hálózatok betanításához

A nagy neurális hálózatok a mesterséges intelligencia számos közelmúltbeli fejleménye alapját képezik, de ezek betanítása nehéz mérnöki és kutatási kihívás, amely megköveteli a GPU-k klaszterének összehangolását egyetlen szinkronizált számítás elvégzéséhez. Ahogy a fürtök és a modellek mérete nőtt, a gépi tanulással foglalkozó szakemberek egyre többféle technikát fejlesztettek ki a modellképzés párhuzamosítására számos GPU-n. Első pillantásra ijesztőnek tűnhet ezeknek a párhuzamossági technikáknak a megértése, de a számítás szerkezetére vonatkozó néhány feltételezéssel ezek a technikák sokkal világosabbá válnak – ezen a ponton már csak átlátszatlan bitek körül mozogsz A-ból B-be, mint egy hálózat. járatokat váltani a csomagok körül.

Adatpárhuzamosság

Technikák a nagy neurális hálózatok betanításához

Csővezeték párhuzamossága

Technikák a nagy neurális hálózatok betanításához

Tenzor párhuzamosság

Technikák a nagy neurális hálózatok betanításához

Szakértői párhuzamosság

Technikák a nagy neurális hálózatok betanításához

Adatpárhuzamosság

Technikák a nagy neurális hálózatok betanításához

Csővezeték párhuzamossága

Technikák a nagy neurális hálózatok betanításához

Tenzor párhuzamosság

Technikák a nagy neurális hálózatok betanításához

Szakértői párhuzamosság

Technikák a nagy neurális hálózatok betanításához

Különféle párhuzamossági stratégiák illusztrációja háromrétegű modellen. Minden szín egy rétegre utal, és szaggatott vonalak választják el a különböző GPU-kat.

Nincs párhuzamosság

A neurális hálózat betanítása iteratív folyamat. Minden iterációban egy modellen keresztül haladunk előre tojók hogy kiszámítson egy kimenetet minden egyes tanítási példához egy adatkötegben. Utána jön egy újabb passz hátrafelé a rétegeken keresztül, terjesztve, hogy az egyes paraméterek mennyiben befolyásolják a végső kimenetet az a kiszámításával gradiens minden paraméter tekintetében. A köteg átlagos gradiense, a paraméterek és néhány paraméterenkénti optimalizálási állapot átadásra kerül egy optimalizálási algoritmusnak, mint pl. Ádám, amely kiszámítja a következő iteráció paramétereit (amelynek valamivel jobb teljesítményt kell nyújtania az adatokon) és az új paraméterenkénti optimalizálási állapotot. Ahogy a betanítás több adatkötegen halad át, a modell egyre pontosabb kimenetek előállítására fejlődik.

Különböző párhuzamossági technikák szelelik fel ezt a képzési folyamatot különböző dimenziókra, többek között:

  • Adatok párhuzamossága – a köteg különböző részhalmazainak futtatása különböző GPU-kon;
  • Csővezeték párhuzamosság – futtassa a modell különböző rétegeit különböző GPU-kon;
  • Tenzorpárhuzam – bontsa fel a matematikát egyetlen műveletre, például egy mátrixszorzásra, amelyet a GPU-k között oszt fel;
  • Szakértők keveréke – az egyes példákat az egyes rétegek töredékével dolgozza fel.

(Ebben a bejegyzésben azt feltételezzük, hogy GPU-kat használ a neurális hálózatok betanításához, de ugyanezek az ötletek vonatkoznak azokra is neurális hálózati gyorsító.)

Adatpárhuzamosság

Adatok Párhuzamos A képzés azt jelenti, hogy ugyanazokat a paramétereket másolják több GPU-ra (gyakran "dolgozóknak" nevezik), és mindegyikhez különböző példákat rendelnek, amelyeket egyidejűleg kell feldolgozni. Az adatok párhuzamossága önmagában továbbra is megköveteli, hogy a modell egyetlen GPU memóriájába illeszkedjen, de lehetővé teszi számos GPU számítását a paraméterek sok másolatának tárolása árán. Ennek ellenére léteznek stratégiák a GPU számára elérhető hatékony RAM növelésére, például a paraméterek ideiglenes feltöltése a CPU memóriájába a használatok között.

Ahogy minden adatpárhuzamos dolgozó frissíti a paraméterek másolatát, koordinálniuk kell, hogy minden dolgozó továbbra is hasonló paraméterekkel rendelkezzen. A legegyszerűbb megközelítés a dolgozók közötti kommunikáció blokkoló bevezetése: (1) függetlenül számítsa ki a gradienst minden dolgozóra; (2) átlagolja a gradienseket a dolgozók között; és (3) függetlenül számítja ki ugyanazokat az új paramétereket minden dolgozón. A (2) lépés egy blokkoló átlag, amely meglehetősen sok adat átvitelét igényli (arányosan a dolgozók számának szorzata a paraméterek méretével), ami ronthatja a képzési teljesítményt. Vannak különféle aszinkron szinkronizálási sémák eltávolítani ezt a többletköltséget, de rontják a tanulás hatékonyságát; a gyakorlatban az emberek általában ragaszkodnak a szinkron megközelítéshez.

Csővezeték párhuzamossága

A Csővezeték párhuzamos A képzés során a modell szekvenciális darabjait GPU-k között particionáljuk. Minden GPU csak a paraméterek töredékét tartalmazza, így ugyanaz a modell arányosan kevesebb memóriát fogyaszt GPU-nként.

Egyszerűen fel lehet osztani egy nagy modellt egymást követő rétegek darabjaira. A rétegek bemenetei és kimenetei között azonban szekvenciális függőség van, így a naiv megvalósítás nagy mennyiségű tétlenséghez vezethet, miközben a dolgozó arra vár, hogy az előző gép kimeneteit használják bemenetként. Ezeket a várakozási idő-darabokat „buborékoknak” nevezik, és elpazarolják az alapjárati gépek által elvégezhető számítási időt.

Technikák a nagy neurális hálózatok betanításához Előre
Technikák a nagy neurális hálózatok betanításához Hátrafelé
Technikák a nagy neurális hálózatok betanításához Gradiens frissítés
Technikák a nagy neurális hálózatok betanításához Idle
Technikák a nagy neurális hálózatok betanításához

Egy naiv csővezeték párhuzamossági beállítás illusztrációja, ahol a modell függőlegesen 4 partícióra van osztva rétegenként. Az 1. dolgozó a hálózat első rétegének modellparamétereit tárolja (legközelebb a bemenethez), míg a 4. dolgozó a 4. réteget (amely a legközelebb van a kimenethez). Az „F”, „B” és „U” előre, visszafelé és frissítési műveleteket jelöl. Az alsó indexek jelzik, hogy egy művelet melyik dolgozón fut. Az adatokat a szekvenciális függőség miatt egyszerre egy dolgozó dolgozza fel, ami nagy „buborékokhoz” vezet az üresjáratban.

Az adatpárhuzamból származó ötleteket újra felhasználhatjuk a buborék költségeinek csökkentése érdekében, ha minden dolgozónak egyszerre csak az adatelemek egy részét dolgozza fel, ami lehetővé teszi számunkra, hogy ügyesen átfedjük az új számításokat a várakozási idővel. Az alapötlet az, hogy egy tételt több mikroadagra kell felosztani; minden egyes mikroadagot arányosan gyorsabban kell feldolgozni, és minden dolgozó elkezd dolgozni a következő mikroadagon, amint az elérhető, így felgyorsítva a folyamat végrehajtását. Elegendő mikroadaggal a dolgozók legtöbbször használhatók minimális buborékkal a lépés elején és végén. A gradiensek átlagolása a mikrobatch-ek között történik, és a paraméterek frissítése csak akkor történik meg, ha az összes mikrobatch elkészült.

A modellben felosztott munkavállalók számát közismert nevén csővezeték mélysége.

Az előrehaladás során a dolgozóknak csak a rétegrész kimenetét (úgynevezett aktiválások) kell elküldeniük a következő dolgozónak; a visszafelé lépés során csak az aktiválások gradienseit küldi el az előző dolgozónak. Hatalmas tervezési terület áll rendelkezésre ezen áthaladások ütemezésére és a gradiensek mikrobategenkénti összesítésére. GPipe minden egyes feldolgozói folyamat előre és visszafelé halad, majd a végén szinkronban összesíti a gradienseket több microbatch-ből. PipeDream ehelyett minden dolgozót úgy ütemez, hogy alternatív módon dolgozza fel az előre- és hátrameneteket.

Technikák a nagy neurális hálózatok betanításához Előre
Technikák a nagy neurális hálózatok betanításához Hátrafelé
Technikák a nagy neurális hálózatok betanításához Frissítések
Technikák a nagy neurális hálózatok betanításához Idle
GPipe

Technikák a nagy neurális hálózatok betanításához

PipeDream

Technikák a nagy neurális hálózatok betanításához

A GPipe és PipeDream csővezeték-sémák összehasonlítása kötegenként 4 mikrobatch használatával. Az 1-8. mikrobatch két egymást követő adatkötegnek felel meg. A képen a „(szám)” jelzi, hogy melyik mikrobatch-en történik a művelet, az alsó index pedig a dolgozói azonosítót jelöli. Vegye figyelembe, hogy a PipeDream nagyobb hatékonyságot ér el, ha néhány számítást hajt végre elavult paraméterekkel.

Tenzor párhuzamosság

A csővezeték párhuzamossága a modellt „függőlegesen” rétegenként osztja fel. Lehetőség van bizonyos műveletek „vízszintes” felosztására is egy rétegen belül, amit általában ún Tenzor párhuzamos kiképzés. Számos modern modellhez (mint pl Transzformátor), a számítási szűk keresztmetszet egy aktiválási kötegmátrixot megszoroz egy nagy súlyú mátrixszal. Mátrixszorzás pontszorzatnak tekinthető a sor- és oszloppárok között; lehetséges a független ponttermékek kiszámítása különböző GPU-kon, vagy az egyes ponttermékek részeinek kiszámítása különböző GPU-kon, és az eredmények összegzése. Bármelyik stratégiával feloszthatjuk a súlymátrixot egyenlő méretű „szilánkokra”, minden egyes szilánkot egy másik GPU-n tárolhatunk, és ezzel a szilánkkal kiszámolhatjuk a teljes mátrixtermék releváns részét, mielőtt később kommunikálnánk az eredmények kombinálásával.

Egy példa Megatron-LM, amely párhuzamosítja a mátrixszorzásokat a Transformer önfigyelem és MLP rétegén belül. PTD-P tenzort, adatot és csővezeték párhuzamosságot használ; a folyamat ütemezése több, nem egymást követő réteget rendel minden eszközhöz, csökkentve a buborékok többletköltségét a több hálózati kommunikáció árán.

Néha a hálózat bemenete párhuzamosítható egy dimenzión keresztül, a keresztkommunikációhoz képest nagyfokú párhuzamos számítással. Sorozat párhuzamosság Az egyik ilyen ötlet, ahol egy bemeneti szekvencia időben több részpéldára van felosztva, ezzel arányosan csökkentve a csúcsmemória-felhasználást azáltal, hogy lehetővé teszi a számítást a szemcsésebb méretű példákkal.

Szakértők keveréke (ME)

Aktivitáskövető Szakértők keveréke (ME) megközelítésben a hálózatnak csak egy töredéke kerül felhasználásra bármely bemenet kimenetének kiszámításához. Egy példa arra, hogy sok súlykészletet használjunk, és a hálózat a következtetési időpontban egy kapuzási mechanizmuson keresztül kiválaszthatja, hogy melyik készletet használja. Ez sokkal több paramétert tesz lehetővé megnövekedett számítási költségek nélkül. Minden súlycsoportot „szakértőnek” neveznek, abban a reményben, hogy a hálózat megtanulja, hogyan rendeljen hozzá speciális számításokat és készségeket az egyes szakértőkhöz. Különböző szakértők fogadhatók különböző GPU-kon, egyértelmű módot biztosítva a modellhez használt GPU-k számának növelésére.

Technikák a nagy neurális hálózatok betanításához

A szakértői keverék (MoE) réteg illusztrációja. Csak 2 a n a szakértőket a kapuhálózat választja ki. (A kép forrása: Shazeer et al., 2017)

GShard 600 milliárd paraméterre skáláz egy MoE Transformert egy olyan sémával, amelyben csak a MoE rétegek vannak felosztva több TPU-eszköz között, a többi réteg pedig teljesen megkettőződik. Transzformátor kapcsoló a modell méretét több billió paraméterre skálázza még nagyobb ritkasággal azáltal, hogy egyetlen bemenetet egyetlen szakértőhöz irányít.

Egyéb memóriatakarékos kivitelek

Számos más számítási stratégia is létezik arra, hogy az egyre nagyobb neurális hálózatok képzését jobban követhetővé tegyék. Például:

  • A gradiens kiszámításához el kell mentenie az eredeti aktiválásokat, amelyek sok eszköz RAM-ot fogyaszthatnak. Ellenőrzőpontozás (más néven aktiválási újraszámítás) az aktiválások bármely részhalmazát tárolja, és a közbensőeket a visszafelé lépés során, éppen időben újraszámítja. Ez sok memóriát takarít meg legfeljebb egy további teljes előrelépés számítási költsége mellett. Folyamatosan kompromisszumot lehet kötni a számítási és a memóriaköltség között is szelektív aktiválás újraszámítása, amely az aktiválások azon részhalmazait ellenőrzi, amelyek tárolása viszonylag drágább, de kiszámítása olcsóbb.

  • Vegyes precíziós képzés a modellek betanítása kisebb pontosságú számokkal (leggyakrabban FP16). A modern gyorsítók sokkal nagyobb FLOP-számot érhetnek el alacsonyabb pontosságú számokkal, és az eszköz RAM-ját is megtakaríthatja. Megfelelő gondossággal a kapott modell szinte semmilyen pontosságot nem veszíthet.

  • Kirakodás A fel nem használt adatok ideiglenes töltése a CPU-ra vagy a különböző eszközök között, majd szükség esetén később visszaolvasható. A naiv implementációk nagyon lelassítják a képzést, de a kifinomult implementációk előre lekérik az adatokat, így az eszköznek soha nem kell rá várnia. Ennek az ötletnek az egyik megvalósítása az Nulla amely felosztja a paramétereket, a színátmeneteket és az optimalizáló állapotokat az összes elérhető hardver között, és szükség szerint megvalósítja azokat.

  • Memóriahatékony optimalizálók Javasolták, hogy csökkentsék az optimalizáló által fenntartott futó állapot memóriaterületét, Mint például a Adafaktor.

  • Tömörítés köztes eredmények tárolására is használható a hálózatban. Például, Lényeg tömöríti a visszafelé lépéshez mentett aktiválásokat; DALL E szinkronizálás előtt tömöríti a színátmeneteket.


Az OpenAI-nál nagy modelleket képezünk és fejlesztünk az alapul szolgáló infrastruktúrától egészen a valós problémák megoldásáig. Ha szeretné a gyakorlatban átültetni a bejegyzésből származó ötleteket – különösen a méretezési és alkalmazott kutatási csapataink számára –, bérbeadása!


Köszönetnyilvánítás
Köszönet Nikolas Tezaknak, Sam Altmannak, Daniel Gackle-nek, Ilya Sutskevernek és Steven Adlernek a piszkozatokkal kapcsolatos visszajelzésért. Köszönet Justin Jay Wangnak, Bianca Martinnak és Steve Dowlingnak a kommunikációért és a tervezésért.

Időbélyeg:

Még több OpenAI