Teknikker til træning af store neurale netværk PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Teknikker til træning af store neurale netværk

Teknikker til træning af store neurale netværk

Store neurale netværk er kernen i mange nyere fremskridt inden for kunstig intelligens, men træning af dem er en vanskelig ingeniør- og forskningsudfordring, som kræver orkestrering af en klynge af GPU'er for at udføre en enkelt synkroniseret beregning. Efterhånden som klynge- og modelstørrelser er vokset, har maskinlæringsudøvere udviklet et stigende udvalg af teknikker til at parallelisere modeltræning over mange GPU'er. Ved første øjekast kan det virke skræmmende at forstå disse parallelitetsteknikker, men med kun nogle få antagelser om strukturen af ​​beregningen bliver disse teknikker meget mere klare - på det tidspunkt kører du bare rundt på uigennemsigtige bits fra A til B som et netværk skifte shuttles rundt om pakker.

Dataparallelisme

Teknikker til træning af store neurale netværk

Pipeline parallelisme

Teknikker til træning af store neurale netværk

Tensor parallelisme

Teknikker til træning af store neurale netværk

Ekspertparallelisme

Teknikker til træning af store neurale netværk

Dataparallelisme

Teknikker til træning af store neurale netværk

Pipeline parallelisme

Teknikker til træning af store neurale netværk

Tensor parallelisme

Teknikker til træning af store neurale netværk

Ekspertparallelisme

Teknikker til træning af store neurale netværk

En illustration af forskellige parallelitetsstrategier på en trelagsmodel. Hver farve refererer til ét lag, og stiplede linjer adskiller forskellige GPU'er.

Ingen parallelisme

Træning af et neuralt netværk er en iterativ proces. I hver iteration laver vi en gennemgang gennem en model lag at beregne et output for hvert træningseksempel i en batch af data. Så fortsætter endnu et pas baglæns gennem lagene og udbreder, hvor meget hver parameter påvirker det endelige output ved at beregne en gradient med hensyn til hver parameter. Den gennemsnitlige gradient for batchen, parametrene og nogle optimeringstilstande pr. parameter overføres til en optimeringsalgoritme, som f.eks. Adam, som beregner den næste iterations parametre (som burde have en lidt bedre ydeevne på dine data) og ny per-parameter optimeringstilstand. Efterhånden som træningen itererer over batches af data, udvikler modellen sig til at producere mere og mere nøjagtige output.

Forskellige parallelitetsteknikker opdeler denne træningsproces på tværs af forskellige dimensioner, herunder:

  • Dataparallelisme – kør forskellige undersæt af batchen på forskellige GPU'er;
  • Pipeline parallelisme - kør forskellige lag af modellen på forskellige GPU'er;
  • Tensorparallelisme - opdel matematikken for en enkelt operation, såsom en matrixmultiplikation, der skal opdeles på tværs af GPU'er;
  • Blanding af eksperter – bearbejd hvert eksempel med kun en brøkdel af hvert lag.

(I dette indlæg antager vi, at du bruger GPU'er til at træne dine neurale netværk, men de samme ideer gælder for dem, der bruger andre neural netværksaccelerator.)

Dataparallelisme

Data parallel træning betyder at kopiere de samme parametre til flere GPU'er (ofte kaldet "arbejdere") og tildele forskellige eksempler til hver af dem, der skal behandles samtidigt. Dataparallelisme alene kræver stadig, at din model passer ind i en enkelt GPU's hukommelse, men lader dig bruge beregningen af ​​mange GPU'er på bekostning af at gemme mange duplikerede kopier af dine parametre. Når det er sagt, er der strategier til at øge den effektive RAM, der er tilgængelig for din GPU, såsom midlertidig aflæsning af parametre til CPU-hukommelse mellem brug.

Da hver dataparallelarbejder opdaterer sin kopi af parametrene, skal de koordinere for at sikre, at hver arbejder fortsat har lignende parametre. Den enkleste tilgang er at indføre blokerende kommunikation mellem arbejdere: (1) uafhængigt beregne gradienten på hver arbejder; (2) gennemsnit af gradienterne på tværs af arbejdere; og (3) uafhængigt beregne de samme nye parametre på hver arbejder. Trin (2) er et blokerende gennemsnit, som kræver overførsel af en hel del data (proportionalt med antallet af arbejdere gange størrelsen af ​​dine parametre), hvilket kan skade din træningsgennemstrømning. Der er forskellige asynkrone synkroniseringsskemaer at fjerne denne overhead, men de skader læringseffektiviteten; i praksis holder folk sig generelt til den synkrone tilgang.

Pipeline parallelisme

Med Rørledning parallel træning, opdeler vi sekventielle bidder af modellen på tværs af GPU'er. Hver GPU rummer kun en brøkdel af parametre, og den samme model bruger derfor forholdsmæssigt mindre hukommelse pr. GPU.

Det er ligetil at opdele en stor model i bidder af på hinanden følgende lag. Der er dog en sekventiel afhængighed mellem input og output af lag, så en naiv implementering kan føre til en stor mængde ledig tid, mens en arbejder venter på, at output fra den tidligere maskine skal bruges som dens input. Disse ventetidsstykker er kendt som "bobler", og spilder den beregning, der kunne udføres af tomgangsmaskinerne.

Teknikker til træning af store neurale netværk Videresend
Teknikker til træning af store neurale netværk Baglæns
Teknikker til træning af store neurale netværk Gradientopdatering
Teknikker til træning af store neurale netværk tomgang
Teknikker til træning af store neurale netværk

Illustration af en naiv pipeline parallelisme opsætning, hvor modellen er vertikalt opdelt i 4 partitioner for lag. Arbejder 1 er vært for modelparametre for det første lag af netværket (tættest på input), mens arbejder 4 er vært for lag 4 (som er tættest på output). "F", "B" og "U" repræsenterer henholdsvis frem-, tilbage- og opdateringsoperationer. Abonnementerne angiver, hvilken arbejder en operation kører på. Data behandles af én arbejder ad gangen på grund af den sekventielle afhængighed, hvilket fører til store "bobler" af ledig tid.

Vi kan genbruge ideerne fra dataparallelisme for at reducere omkostningerne ved boblen ved at lade hver medarbejder kun behandle en delmængde af dataelementer ad gangen, hvilket giver os mulighed for smart at overlappe ny beregning med ventetid. Kerneideen er at opdele én batch i flere mikrobatcher; hver mikrobatch skal være proportionalt hurtigere at behandle, og hver medarbejder begynder at arbejde på den næste mikrobatch, så snart den er tilgængelig, hvilket fremskynder udførelse af pipeline. Med nok mikrobatcher kan arbejderne udnyttes det meste af tiden med en minimal boble i begyndelsen og slutningen af ​​trinnet. Gradienter beregnes som gennemsnit på tværs af mikrobatcher, og opdateringer af parametrene sker først, når alle mikrobatcher er afsluttet.

Antallet af arbejdere, som modellen er delt over, er almindeligvis kendt som rørlednings dybde.

Under det fremadrettede gennemløb behøver arbejderne kun at sende output (kaldet aktiveringer) af dens del af lag til den næste arbejder; under tilbageløbet sender den kun gradienterne på disse aktiveringer til den tidligere arbejder. Der er et stort designrum for, hvordan man planlægger disse gennemløb, og hvordan man samler gradienterne på tværs af mikrobatches. GPipe har hver arbejdsproces frem og tilbage fortløbende og derefter aggregerede gradienter fra flere mikrobatcher synkront til sidst. Ønskedrøm planlægger i stedet hver medarbejder til alternativt at behandle fremadgående og bagudgående afleveringer.

Teknikker til træning af store neurale netværk Videresend
Teknikker til træning af store neurale netværk Baglæns
Teknikker til træning af store neurale netværk Opdatering
Teknikker til træning af store neurale netværk tomgang
GPipe

Teknikker til træning af store neurale netværk

Ønskedrøm

Teknikker til træning af store neurale netværk

Sammenligning af GPipe- og PipeDream-pipelining-skemaer med 4 mikrobatcher pr. batch. Mikrobatches 1-8 svarer til to på hinanden følgende databatches. På billedet angiver "(nummer)" på hvilken mikrobatch en operation udføres, og subscriptet markerer arbejder-id'et. Bemærk, at PipeDream får mere effektivitet ved at udføre nogle beregninger med forældede parametre.

Tensor parallelisme

Pipeline parallelisme opdeler en model "lodret" for lag. Det er også muligt at "vandret" opdele visse operationer inden for et lag, som normalt kaldes Tensor parallel uddannelse. For mange moderne modeller (såsom Transformer), multiplicerer beregningsflaskehalsen en aktiveringsbatchmatrix med en stor vægtmatrix. Matrix multiplikation kan opfattes som prikprodukter mellem par af rækker og kolonner; det er muligt at beregne uafhængige prikprodukter på forskellige GPU'er eller at beregne dele af hvert prikprodukt på forskellige GPU'er og opsummere resultaterne. Med begge strategier kan vi opdele vægtmatricen i lige store "skår", hoste hvert shard på en anden GPU og bruge den shard til at beregne den relevante del af det overordnede matrixprodukt, før vi senere kommunikerer for at kombinere resultaterne.

Et eksempel er Megatron-LM, som paralleliserer matrixmultiplikationer inden for transformatorens selvopmærksomhed og MLP-lag. PTD-P bruger tensor, data og pipeline parallelisme; dens pipeline tidsplan tildeler flere ikke-konsekutive lag til hver enhed, hvilket reducerer bobleoverhead på bekostning af mere netværkskommunikation.

Nogle gange kan input til netværket paralleliseres på tværs af en dimension med en høj grad af parallel beregning i forhold til krydskommunikation. Sekvensparallelisme er en sådan idé, hvor en inputsekvens opdeles på tværs af tid i flere undereksempler, hvilket reducerer det maksimale hukommelsesforbrug proportionalt ved at tillade beregningen at fortsætte med eksempler i mere granulær størrelse.

Blanding af eksperter (MoE)

Med Blanding af eksperter (MoE) metode, bruges kun en brøkdel af netværket til at beregne output for en hvilken som helst input. Et eksempel på en tilgang er at have mange sæt vægte, og netværket kan vælge, hvilket sæt der skal bruges via en gating-mekanisme på inferenstidspunktet. Dette muliggør mange flere parametre uden øgede beregningsomkostninger. Hvert sæt vægte omtales som "eksperter", i håbet om, at netværket vil lære at tildele specialiserede beregninger og færdigheder til hver ekspert. Forskellige eksperter kan hostes på forskellige GPU'er, hvilket giver en klar måde at opskalere antallet af GPU'er, der bruges til en model.

Teknikker til træning af store neurale netværk

Illustration af en blanding af eksperter (MoE) lag. Kun 2 ud af n eksperter er udvalgt af gating-netværket. (Billede tilpasset fra: Shazeer et al., 2017)

GShard skalerer en MoE-transformer op til 600 milliarder parametre med et skema, hvor kun MoE-lagene er opdelt på tværs af flere TPU-enheder, og andre lag er fuldt duplikeret. Switch Transformer skalerer modelstørrelsen til billioner af parametre med endnu højere sparsitet ved at dirigere et input til en enkelt ekspert.

Andre hukommelsesbesparende designs

Der er mange andre beregningsstrategier til at gøre træning i stadig større neurale netværk mere håndterbare. For eksempel:

  • For at beregne gradienten skal du have gemt de originale aktiveringer, som kan forbruge meget enhedens RAM. Checkpointing (også kendt som aktiveringsgenberegning) gemmer enhver delmængde af aktiveringer og genberegner de mellemliggende just-in-time under tilbageløbet. Dette sparer en masse hukommelse til de beregningsmæssige omkostninger på højst én ekstra fuld fremadgang. Man kan også løbende afveje mellem beregnings- og hukommelsesomkostninger ved selektiv aktiveringsgenberegning, som kontrollerer undersæt af aktiveringerne, der er relativt dyrere at opbevare, men billigere at beregne.

  • Blandet præcisionstræning er at træne modeller med lavere præcisionstal (oftest FP16). Moderne acceleratorer kan nå meget højere FLOP-tal med lavere præcisionstal, og du sparer også på enhedens RAM. Med ordentlig pleje kan den resulterende model næsten ikke miste nøjagtighed.

  • losning er midlertidigt at overføre ubrugte data til CPU'en eller mellem forskellige enheder og senere læse dem tilbage, når det er nødvendigt. Naive implementeringer vil bremse træningen meget, men sofistikerede implementeringer vil forhåndshente data, så enheden aldrig behøver at vente på det. En implementering af denne idé er Nul som opdeler parametrene, gradienterne og optimeringstilstande på tværs af al tilgængelig hardware og materialiserer dem efter behov.

  • Hukommelseseffektive optimeringsværktøjer er blevet foreslået for at reducere hukommelsesfodaftrykket af den kørende tilstand, der opretholdes af optimizeren, Såsom Adafaktor.

  • Compression kan også bruges til at gemme mellemresultater i netværket. For eksempel, Resumé komprimerer aktiveringer, der er gemt til tilbageløbet; DALL E komprimerer gradienterne, før de synkroniseres.


Hos OpenAI træner og forbedrer vi store modeller fra den underliggende infrastruktur hele vejen til at implementere dem til problemer i den virkelige verden. Hvis du gerne vil omsætte ideerne fra dette indlæg i praksis – især relevant for vores skalerings- og anvendte forskningsteams – er vi leje!


Tak
Tak til Nikolas Tezak, Sam Altman, Daniel Gackle, Ilya Sutskever og Steven Adler for feedback på udkast. Tak til Justin Jay Wang, Bianca Martin og Steve Dowling for kommunikation og design.

Tidsstempel:

Mere fra OpenAI