Technieken voor het trainen van grote neurale netwerken PlatoBlockchain Data Intelligence. Verticaal zoeken. Ai.

Technieken voor het trainen van grote neurale netwerken

Technieken voor het trainen van grote neurale netwerken

Grote neurale netwerken vormen de kern van veel recente ontwikkelingen in AI, maar het trainen ervan is een moeilijke technische en onderzoeksuitdaging, waarbij een cluster van GPU's moet worden georkestreerd om een โ€‹โ€‹enkele gesynchroniseerde berekening uit te voeren. Naarmate de cluster- en modelgroottes zijn gegroeid, hebben machine learning-beoefenaars een toenemende verscheidenheid aan technieken ontwikkeld om modeltraining over veel GPU's te parallelliseren. Op het eerste gezicht lijkt het begrijpen van deze parallellisme-technieken misschien ontmoedigend, maar met slechts een paar aannames over de structuur van de berekening worden deze technieken veel duidelijker - op dat moment pendel je gewoon rond ondoorzichtige bits van A naar B als een netwerk wisselen shuttles rond pakketten.

Gegevensparallellisme

Technieken voor het trainen van grote neurale netwerken

Pijplijn parallellisme

Technieken voor het trainen van grote neurale netwerken

Tensor parallellisme

Technieken voor het trainen van grote neurale netwerken

Expert parallellisme

Technieken voor het trainen van grote neurale netwerken

Gegevensparallellisme

Technieken voor het trainen van grote neurale netwerken

Pijplijn parallellisme

Technieken voor het trainen van grote neurale netwerken

Tensor parallellisme

Technieken voor het trainen van grote neurale netwerken

Expert parallellisme

Technieken voor het trainen van grote neurale netwerken

Een illustratie van verschillende parallellismestrategieรซn op een drielagenmodel. Elke kleur verwijst naar รฉรฉn laag en onderbroken lijnen scheiden verschillende GPU's.

Geen parallellisme

Het trainen van een neuraal netwerk is een iteratief proces. In elke iteratie voeren we een doorgang door een model uit Legkippen om een โ€‹โ€‹uitvoer te berekenen voor elk trainingsvoorbeeld in een batch met gegevens. Dan gaat er weer een pas door achterwaarts door de lagen, en propageert hoeveel elke parameter de uiteindelijke output beรฏnvloedt door a . te berekenen gradient met betrekking tot elke parameter. De gemiddelde gradiรซnt voor de batch, de parameters en een aantal optimalisatiestatussen per parameter wordt doorgegeven aan een optimalisatiealgoritme, zoals: Adam, waarmee de parameters van de volgende iteratie worden berekend (die iets betere prestaties op uw gegevens zouden moeten leveren) en een nieuwe optimalisatiestatus per parameter. Terwijl de training meerdere batches gegevens herhaalt, evolueert het model om steeds nauwkeurigere resultaten te produceren.

Verschillende parallellismetechnieken verdelen dit trainingsproces over verschillende dimensies, waaronder:

  • Gegevensparallellisme: voer verschillende subsets van de batch uit op verschillende GPU's;
  • Pijplijnparallellisme: voer verschillende lagen van het model uit op verschillende GPU's;
  • Tensor-parallellisme: verbreek de wiskunde voor een enkele bewerking, zoals een matrixvermenigvuldiging die over GPU's moet worden verdeeld;
  • Mix-of-Experts: verwerk elk voorbeeld met slechts een fractie van elke laag.

(In dit bericht gaan we ervan uit dat u GPU's gebruikt om uw neurale netwerken te trainen, maar dezelfde ideeรซn zijn van toepassing op degenen die andere neurale netwerkversneller.)

Gegevensparallellisme

Gegevens parallel training betekent het kopiรซren van dezelfde parameters naar meerdere GPU's (vaak "werknemers" genoemd) en het toewijzen van verschillende voorbeelden aan elke GPU om ze tegelijkertijd te verwerken. Gegevensparallellisme alleen vereist nog steeds dat uw model in het geheugen van รฉรฉn GPU past, maar u kunt de rekenkracht van veel GPU's gebruiken, ten koste van het opslaan van veel dubbele kopieรซn van uw parameters. Dat gezegd hebbende, zijn er strategieรซn om het effectieve RAM-geheugen dat beschikbaar is voor uw GPU te vergroten, zoals het tijdelijk overbrengen van parameters naar het CPU-geheugen tussen gebruik door.

Aangezien elke parallelle werker voor gegevens zijn kopie van de parameters bijwerkt, moeten ze coรถrdineren om ervoor te zorgen dat elke werker vergelijkbare parameters blijft hebben. De eenvoudigste benadering is om blokkerende communicatie tussen werknemers in te voeren: (1) bereken onafhankelijk de gradiรซnt op elke werknemer; (2) het gemiddelde nemen van de gradiรซnten over de werknemers; en (3) bereken onafhankelijk dezelfde nieuwe parameters voor elke werknemer. Stap (2) is een blokkeringsgemiddelde waarvoor nogal wat gegevens moeten worden overgedragen (evenredig met het aantal werknemers maal de grootte van uw parameters), wat uw trainingsdoorvoer kan schaden. Er zijn verschillende asynchrone synchronisatieschema's om deze overhead te verwijderen, maar ze doen afbreuk aan de leerefficiรซntie; in de praktijk blijft men over het algemeen bij de synchrone benadering.

Pijplijn parallellisme

met Pijpleiding parallel training, verdelen we opeenvolgende delen van het model over GPU's. Elke GPU bevat slechts een fractie van de parameters, en dus verbruikt hetzelfde model proportioneel minder geheugen per GPU.

Het is eenvoudig om een โ€‹โ€‹groot model op te splitsen in stukken van opeenvolgende lagen. Er is echter een sequentiรซle afhankelijkheid tussen invoer en uitvoer van lagen, dus een naรฏeve implementatie kan leiden tot een grote hoeveelheid inactieve tijd terwijl een werknemer wacht tot uitvoer van de vorige machine als invoer wordt gebruikt. Deze wachttijden staan โ€‹โ€‹bekend als "bubbels", waardoor de berekening wordt verspild die door de stationair draaiende machines zou kunnen worden gedaan.

Technieken voor het trainen van grote neurale netwerken Naar voren
Technieken voor het trainen van grote neurale netwerken achterwaarts
Technieken voor het trainen van grote neurale netwerken Verloop update
Technieken voor het trainen van grote neurale netwerken Idle
Technieken voor het trainen van grote neurale netwerken

Illustratie van een naรฏeve opstelling van parallellisme in pijplijnen waarbij het model verticaal in 4 partities per laag is opgesplitst. Worker 1 host modelparameters van de eerste laag van het netwerk (het dichtst bij de invoer), terwijl werknemer 4 laag 4 host (die het dichtst bij de uitvoer ligt). "F", "B" en "U" vertegenwoordigen respectievelijk voorwaartse, achterwaartse en update-bewerkingen. De subscripts geven aan op welke worker een bewerking wordt uitgevoerd. Gegevens worden door รฉรฉn werknemer tegelijk verwerkt vanwege de sequentiรซle afhankelijkheid, wat leidt tot grote "bellen" van inactieve tijd.

We kunnen de ideeรซn van dataparallellisme hergebruiken om de kosten van de bubbel te verlagen door elke werknemer slechts een subset van data-elementen tegelijk te laten verwerken, waardoor we nieuwe berekeningen slim kunnen overlappen met wachttijd. Het kernidee is om รฉรฉn batch op te splitsen in meerdere microbatches; elke microbatch moet proportioneel sneller worden verwerkt en elke werknemer begint aan de volgende microbatch te werken zodra deze beschikbaar is, waardoor de uitvoering van de pijplijn wordt versneld. Met voldoende microbatches kunnen de werkers meestal worden gebruikt met een minimale luchtbel aan het begin en einde van de stap. Verlopen worden gemiddeld over microbatches en updates van de parameters vinden pas plaats als alle microbatches zijn voltooid.

Het aantal werknemers waarover het model is verdeeld, is algemeen bekend als: pijpleiding diepte.

Tijdens de voorwaartse pas hoeven werknemers alleen de uitvoer (activeringen genoemd) van zijn stuk lagen naar de volgende werknemer te sturen; tijdens de achterwaartse pas stuurt het alleen de hellingen op die activeringen naar de vorige werknemer. Er is een grote ontwerpruimte voor het plannen van deze passen en het samenvoegen van de gradiรซnten over microbatches. GPijp laat elk werkproces achtereenvolgens vooruit en achteruit doorlopen en aggregeert vervolgens synchroon gradiรซnten van meerdere microbatches aan het einde. PijpDroom in plaats daarvan plant elke werknemer om afwisselend voorwaartse en achterwaartse passen te verwerken.

Technieken voor het trainen van grote neurale netwerken Naar voren
Technieken voor het trainen van grote neurale netwerken achterwaarts
Technieken voor het trainen van grote neurale netwerken bijwerken
Technieken voor het trainen van grote neurale netwerken Idle
GPijp

Technieken voor het trainen van grote neurale netwerken

PijpDroom

Technieken voor het trainen van grote neurale netwerken

Vergelijking van GPipe- en PipeDream-pijplijnschema's, met behulp van 4 microbatches per batch. Microbatches 1-8 komen overeen met twee opeenvolgende databatches. In de afbeelding geeft "(getal)" aan op welke microbatch een bewerking wordt uitgevoerd en het subscript markeert de werknemer-ID. Merk op dat PipeDream meer efficiรซntie krijgt door enkele berekeningen uit te voeren met verouderde parameters.

Tensor parallellisme

Pijplijnparallellisme splitst een model โ€œverticaalโ€ per laag. Het is ook mogelijk om bepaalde bewerkingen โ€œhorizontaalโ€ te splitsen binnen een laag, wat meestal wordt genoemd Tensor parallel opleiding. Voor veel moderne modellen (zoals de Transformator), is het rekenknelpunt het vermenigvuldigen van een activeringsbatchmatrix met een grote gewichtsmatrix. Matrix vermenigvuldiging kan worden gezien als puntproducten tussen paren rijen en kolommen; het is mogelijk om onafhankelijke puntproducten op verschillende GPU's te berekenen, of om delen van elk puntproduct op verschillende GPU's te berekenen en de resultaten samen te vatten. Met beide strategieรซn kunnen we de gewichtsmatrix opdelen in โ€˜schervenโ€™ van gelijke grootte, elke scherf op een andere GPU hosten en die scherf gebruiken om het relevante deel van het totale matrixproduct te berekenen voordat we later communiceren om de resultaten te combineren.

Een voorbeeld is Megatron-LM, die matrixvermenigvuldigingen parallelliseert binnen de zelfaandacht- en MLP-lagen van de Transformer. PTD-P maakt gebruik van tensor-, data- en pijplijnparallellisme; het pijplijnschema wijst meerdere niet-opeenvolgende lagen toe aan elk apparaat, waardoor de luchtbellen worden verminderd ten koste van meer netwerkcommunicatie.

Soms kan de invoer naar het netwerk worden geparallelliseerd over een dimensie met een hoge mate van parallelle berekening ten opzichte van cross-communicatie. Sequentie parallellisme is zo'n idee, waarbij een invoerreeks in de tijd wordt opgesplitst in meerdere subvoorbeelden, waardoor het piekgeheugenverbruik proportioneel wordt verminderd door de berekening door te laten gaan met voorbeelden van meer granulaire grootte.

Mix-of-Experts (MoE)

Met de Mix-of-Experts (MoE) benadering, wordt slechts een fractie van het netwerk gebruikt om de uitvoer voor elke invoer te berekenen. Een voorbeeldbenadering is om veel sets met gewichten te hebben en het netwerk kan kiezen welke set wordt gebruikt via een poortmechanisme op het moment van inferentie. Dit maakt veel meer parameters mogelijk zonder hogere rekenkosten. Elke set gewichten wordt 'experts' genoemd, in de hoop dat het netwerk zal leren om gespecialiseerde berekeningen en vaardigheden toe te wijzen aan elke expert. Verschillende experts kunnen op verschillende GPU's worden gehost, wat een duidelijke manier biedt om het aantal GPU's dat voor een model wordt gebruikt, op te schalen.

Technieken voor het trainen van grote neurale netwerken

Illustratie van een mengsel-van-experts (MoE) laag. Slechts 2 van de n experts worden geselecteerd door het poortnetwerk. (Afbeelding aangepast van: Shazeer et al., 2017)

GShard schaalt een MoE-transformator tot 600 miljard parameters met een schema waarbij alleen de MoE-lagen worden gesplitst over meerdere TPU-apparaten en andere lagen volledig worden gedupliceerd. Transformator wisselen: schaalt modelgrootte tot biljoenen parameters met nog grotere schaarste door รฉรฉn invoer naar รฉรฉn expert te routeren.

Andere geheugenbesparende ontwerpen

Er zijn veel andere computationele strategieรซn om het trainen van steeds grotere neurale netwerken beter hanteerbaar te maken. Bijvoorbeeld:

  • Om het verloop te berekenen, moet u de oorspronkelijke activeringen hebben opgeslagen, die veel apparaat-RAM kunnen verbruiken. controlepunt (ook bekend als activeringsherberekening) slaat elke subset van activeringen op en berekent de tussenliggende just-in-time opnieuw tijdens de achterwaartse doorgang. Dit bespaart veel geheugen tegen de rekenkosten van maximaal รฉรฉn extra volledige voorwaartse doorgang. Men kan ook voortdurend een afweging maken tussen reken- en geheugenkosten door: selectieve activering herberekening, dat is het controleren van subsets van de activeringen die relatief duurder zijn om op te slaan, maar goedkoper om te berekenen.

  • Gemengde precisietraining is om modellen te trainen met getallen met een lagere precisie (meestal FP16). Moderne versnellers kunnen veel hogere FLOP-tellingen bereiken met lagere precisiegetallen, en u bespaart ook op apparaat-RAM. Met de juiste zorg kan het resulterende model bijna geen nauwkeurigheid verliezen.

  • Lossen is om ongebruikte gegevens tijdelijk over te brengen naar de CPU of tussen verschillende apparaten en deze later terug te lezen als dat nodig is. Naรฏeve implementaties zullen de training veel vertragen, maar geavanceerde implementaties zullen vooraf gegevens ophalen, zodat het apparaat er nooit op hoeft te wachten. Een implementatie van dit idee is: Nul die de parameters, gradiรซnten en optimalisatiestatussen verdeelt over alle beschikbare hardware en deze waar nodig materialiseert.

  • Geheugenefficiรซnte Optimizers Er zijn voorgesteld om de geheugenvoetafdruk van de actieve status die door de optimizer wordt onderhouden, te verkleinen, zoals Aanpasser.

  • Samendrukking kan ook worden gebruikt voor het opslaan van tussenresultaten in het netwerk. Bijvoorbeeld, Kern comprimeert activeringen die zijn opgeslagen voor de achterwaartse pas; DALL ยท E comprimeert de verlopen voordat ze worden gesynchroniseerd.


Bij OpenAI trainen en verbeteren we grote modellen, van de onderliggende infrastructuur tot ze in te zetten voor echte problemen. Als je de ideeรซn uit dit bericht in de praktijk wilt brengen - vooral relevant voor onze Scaling en Applied Research-teams - zijn we verhuring!


Dankwoord
Met dank aan Nikolas Tezak, Sam Altman, Daniel Gackle, Ilya Sutskever en Steven Adler voor feedback op concepten. Met dank aan Justin Jay Wang, Bianca Martin en Steve Dowling voor communicatie en ontwerp.

Tijdstempel:

Meer van OpenAI