Tecniche per la formazione di grandi reti neurali PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Tecniche per l'allenamento di grandi reti neurali

Tecniche per l'allenamento di grandi reti neurali

Le grandi reti neurali sono al centro di molti recenti progressi nell'IA, ma addestrarle è una sfida di ingegneria e ricerca difficile che richiede l'orchestrazione di un cluster di GPU per eseguire un singolo calcolo sincronizzato. Con l'aumento delle dimensioni dei cluster e dei modelli, i professionisti dell'apprendimento automatico hanno sviluppato una varietà crescente di tecniche per parallelizzare l'addestramento dei modelli su molte GPU. A prima vista, la comprensione di queste tecniche di parallelismo può sembrare scoraggiante, ma con solo alcune ipotesi sulla struttura del calcolo queste tecniche diventano molto più chiare: a quel punto, stai solo spostando bit opachi da A a B come una rete scambiare navette attorno ai pacchetti.

Parallelismo dei dati

Tecniche per l'allenamento di grandi reti neurali

Parallelismo delle condutture

Tecniche per l'allenamento di grandi reti neurali

Parallelismo tensoriale

Tecniche per l'allenamento di grandi reti neurali

Parallelismo esperto

Tecniche per l'allenamento di grandi reti neurali

Parallelismo dei dati

Tecniche per l'allenamento di grandi reti neurali

Parallelismo delle condutture

Tecniche per l'allenamento di grandi reti neurali

Parallelismo tensoriale

Tecniche per l'allenamento di grandi reti neurali

Parallelismo esperto

Tecniche per l'allenamento di grandi reti neurali

Un'illustrazione di varie strategie di parallelismo su un modello a tre strati. Ogni colore si riferisce a un livello e le linee tratteggiate separano GPU diverse.

Nessun parallelismo

L'addestramento di una rete neurale è un processo iterativo. In ogni iterazione, eseguiamo un passaggio in avanti attraverso un modello galline ovaiole per calcolare un output per ogni esempio di addestramento in un batch di dati. Quindi procede un altro passaggio arretrato attraverso i livelli, propagando quanto ciascun parametro influisce sull'output finale calcolando a gradiente rispetto a ciascun parametro. Il gradiente medio per il batch, i parametri e alcuni stati di ottimizzazione per parametro vengono passati a un algoritmo di ottimizzazione, ad esempio Adam, che calcola i parametri dell'iterazione successiva (che dovrebbero avere prestazioni leggermente migliori sui dati) e il nuovo stato di ottimizzazione per parametro. Man mano che l'addestramento scorre su batch di dati, il modello si evolve per produrre output sempre più accurati.

Varie tecniche di parallelismo suddividono questo processo di formazione in diverse dimensioni, tra cui:

  • Parallelismo dei dati: esegui diversi sottoinsiemi del batch su GPU diverse;
  • Parallelismo della pipeline: esegui diversi livelli del modello su GPU diverse;
  • Parallelismo tensoriale: suddividere la matematica per una singola operazione come una moltiplicazione di matrici da dividere tra GPU;
  • Miscela di esperti: elabora ogni esempio solo per una frazione di ogni livello.

(In questo post, assumiamo che tu stia utilizzando le GPU per addestrare le tue reti neurali, ma le stesse idee si applicano a coloro che utilizzano qualsiasi altro acceleratore di rete neurale.)

Parallelismo dei dati

Dati paralleli formazione significa copiare gli stessi parametri su più GPU (spesso chiamate "lavoratori") e assegnare a ciascuna esempi diversi da elaborare contemporaneamente. Il solo parallelismo dei dati richiede ancora che il tuo modello rientri nella memoria di una singola GPU, ma ti consente di utilizzare il calcolo di molte GPU al costo di archiviare molte copie duplicate dei tuoi parametri. Detto questo, ci sono strategie per aumentare la RAM effettiva disponibile per la tua GPU, come scaricare temporaneamente i parametri sulla memoria della CPU tra un utilizzo e l'altro.

Man mano che ogni lavoratore parallelo dati aggiorna la propria copia dei parametri, deve coordinarsi per garantire che ogni lavoratore continui ad avere parametri simili. L'approccio più semplice consiste nell'introdurre il blocco della comunicazione tra i lavoratori: (1) calcolare in modo indipendente il gradiente su ciascun lavoratore; (2) media i gradienti tra i lavoratori; e (3) calcolare in modo indipendente gli stessi nuovi parametri su ciascun lavoratore. Il passaggio (2) è una media di blocco che richiede il trasferimento di una notevole quantità di dati (proporzionale al numero di lavoratori moltiplicato per la dimensione dei parametri), il che può danneggiare la produttività della formazione. Ci sono vari schemi di sincronizzazione asincrona rimuovere questo sovraccarico, ma danneggiano l'efficienza dell'apprendimento; in pratica, le persone generalmente si attengono all'approccio sincrono.

Parallelismo delle condutture

Con Pipeline parallela training, partizioniamo blocchi sequenziali del modello tra le GPU. Ogni GPU contiene solo una frazione dei parametri e quindi lo stesso modello consuma proporzionalmente meno memoria per GPU.

È semplice dividere un modello di grandi dimensioni in blocchi di livelli consecutivi. Tuttavia, esiste una dipendenza sequenziale tra input e output dei livelli, quindi un'implementazione ingenua può portare a una grande quantità di tempo di inattività mentre un lavoratore attende che gli output della macchina precedente vengano utilizzati come input. Questi blocchi di tempo di attesa sono noti come "bolle", sprecando il calcolo che potrebbe essere eseguito dalle macchine inattive.

Tecniche per l'allenamento di grandi reti neurali Avanti
Tecniche per l'allenamento di grandi reti neurali a rovescio
Tecniche per l'allenamento di grandi reti neurali Aggiornamento gradiente
Tecniche per l'allenamento di grandi reti neurali Idle
Tecniche per l'allenamento di grandi reti neurali

Illustrazione di una configurazione di parallelismo ingenuo della pipeline in cui il modello è diviso verticalmente in 4 partizioni per livello. Il lavoratore 1 ospita i parametri del modello del primo livello della rete (il più vicino all'input), mentre il lavoratore 4 ospita il livello 4 (il più vicino all'output). “F”, “B” e “U” rappresentano rispettivamente le operazioni avanti, indietro e di aggiornamento. Gli indici indicano su quale lavoratore viene eseguita un'operazione. I dati vengono elaborati da un lavoratore alla volta a causa della dipendenza sequenziale, portando a grandi "bolle" di tempo di inattività.

Possiamo riutilizzare le idee del parallelismo dei dati per ridurre il costo della bolla facendo in modo che ogni lavoratore elabori solo un sottoinsieme di elementi di dati alla volta, consentendoci di sovrapporre in modo intelligente i nuovi calcoli con i tempi di attesa. L'idea principale è suddividere un batch in più microbatch; ogni microbatch dovrebbe essere proporzionalmente più veloce da elaborare e ogni lavoratore inizia a lavorare sul microbatch successivo non appena è disponibile, accelerando così l'esecuzione della pipeline. Con un numero sufficiente di microbatch, i lavoratori possono essere utilizzati per la maggior parte del tempo con una bolla minima all'inizio e alla fine del passaggio. I gradienti vengono calcolati in media tra i microbatch e gli aggiornamenti dei parametri avvengono solo dopo che tutti i microbatch sono stati completati.

Il numero di lavoratori su cui è suddiviso il modello è comunemente noto come profondità della condotta.

Durante il passaggio in avanti, i lavoratori devono solo inviare l'output (chiamato attivazioni) del suo blocco di livelli al lavoratore successivo; durante il passaggio a ritroso invia solo le pendenze su quelle attivazioni al lavoratore precedente. C'è un grande spazio di progettazione su come programmare questi passaggi e come aggregare i gradienti tra i microbatch. GPe ogni processo di lavoro passa avanti e indietro consecutivamente e quindi aggrega i gradienti di più microbatch in modo sincrono alla fine. Sogno impossibile pianifica invece ogni lavoratore per elaborare alternativamente i passaggi avanti e indietro.

Tecniche per l'allenamento di grandi reti neurali Avanti
Tecniche per l'allenamento di grandi reti neurali a rovescio
Tecniche per l'allenamento di grandi reti neurali Aggiornanento
Tecniche per l'allenamento di grandi reti neurali Idle
GPe

Tecniche per l'allenamento di grandi reti neurali

Sogno impossibile

Tecniche per l'allenamento di grandi reti neurali

Confronto degli schemi di pipeline GPipe e PipeDream, utilizzando 4 microbatch per batch. I microbatch 1-8 corrispondono a due batch di dati consecutivi. Nell'immagine, "(numero)" indica su quale microbatch viene eseguita un'operazione e il pedice contrassegna l'ID lavoratore. Nota che PipeDream ottiene una maggiore efficienza eseguendo alcuni calcoli con parametri non aggiornati.

Parallelismo tensoriale

Il parallelismo della pipeline divide un modello "verticalmente" per livello. È anche possibile dividere "orizzontalmente" determinate operazioni all'interno di un livello, che di solito viene chiamato Tensore parallelo addestramento. Per molti modelli moderni (come il trasformatore), il collo di bottiglia di calcolo sta moltiplicando una matrice batch di attivazione con una matrice di peso grande. Moltiplicazione della matrice può essere pensato come un prodotto scalare tra coppie di righe e colonne; è possibile calcolare prodotti dot indipendenti su GPU diverse o calcolare parti di ciascun prodotto dot su GPU diverse e riassumere i risultati. Con entrambe le strategie, possiamo suddividere la matrice di peso in "shard" di dimensioni pari, ospitare ogni shard su una GPU diversa e utilizzare tale shard per calcolare la parte rilevante del prodotto matrice complessivo prima di comunicare in seguito per combinare i risultati.

Un esempio è Megatron-LM, che parallelizza le moltiplicazioni di matrici all'interno dei livelli di auto-attenzione e MLP del Transformer. PTD-P utilizza il parallelismo di tensore, dati e pipeline; la sua pianificazione della pipeline assegna più livelli non consecutivi a ciascun dispositivo, riducendo il sovraccarico delle bolle al costo di una maggiore comunicazione di rete.

A volte l'input alla rete può essere parallelizzato in una dimensione con un alto grado di calcolo parallelo rispetto alla comunicazione incrociata. Parallelismo di sequenza è una di queste idee, in cui una sequenza di input viene suddivisa nel tempo in più sottoesempi, riducendo proporzionalmente il consumo di memoria di picco consentendo al calcolo di procedere con esempi di dimensioni più granulari.

Mix di esperti (MoE)

Grazie alla Mix di esperti (MoE) approccio, solo una frazione della rete viene utilizzata per calcolare l'output per qualsiasi input. Un approccio di esempio consiste nell'avere molti set di pesi e la rete può scegliere quale set utilizzare tramite un meccanismo di gating al momento dell'inferenza. Ciò consente molti più parametri senza aumentare i costi di calcolo. Ogni serie di pesi viene definita "esperti", nella speranza che la rete impari ad assegnare calcoli e abilità specializzate a ciascun esperto. Diversi esperti possono essere ospitati su diverse GPU, fornendo un modo chiaro per aumentare il numero di GPU utilizzate per un modello.

Tecniche per l'allenamento di grandi reti neurali

Illustrazione di uno strato misto di esperti (MoE). Solo 2 su n gli esperti sono selezionati dalla rete di gating. (Immagine adattata da: Shazeer et al., 2017)

GShard ridimensiona un trasformatore MoE fino a 600 miliardi di parametri con uno schema in cui solo i livelli MoE sono suddivisi su più dispositivi TPU e altri livelli sono completamente duplicati. Trasformatore dell'interruttore ridimensiona la dimensione del modello a trilioni di parametri con una scarsità ancora maggiore instradando un input a un singolo esperto.

Altri modelli di risparmio di memoria

Esistono molte altre strategie computazionali per rendere più trattabile l'addestramento di reti neurali sempre più grandi. Per esempio:

  • Per calcolare il gradiente, devi aver salvato le attivazioni originali, che possono consumare molta RAM del dispositivo. Checkpoint (noto anche come ricalcolo dell'attivazione) memorizza qualsiasi sottoinsieme di attivazioni e ricalcola quelle intermedie just-in-time durante il passaggio all'indietro. Ciò consente di risparmiare molta memoria al costo computazionale di al massimo un passaggio in avanti completo aggiuntivo. Si può anche continuamente scambiare tra calcolo e costo della memoria ricalcolo di attivazione selettiva, che sta controllando sottoinsiemi delle attivazioni che sono relativamente più costose da archiviare ma meno costose da calcolare.

  • Allenamento di precisione mista consiste nel addestrare modelli utilizzando numeri di precisione inferiore (più comunemente FP16). Gli acceleratori moderni possono raggiungere conteggi FLOP molto più elevati con numeri di precisione inferiore e si risparmia anche sulla RAM del dispositivo. Con la cura adeguata, il modello risultante può perdere quasi nessuna precisione.

  • Scarico consiste nello scaricare temporaneamente i dati inutilizzati sulla CPU o tra dispositivi diversi e poi rileggerli quando necessario. Le implementazioni ingenue rallenteranno molto l'addestramento, ma le implementazioni sofisticate preleggeranno i dati in modo che il dispositivo non debba mai aspettarli. Un'implementazione di questa idea è Zero che suddivide i parametri, i gradienti e gli stati dell'ottimizzatore su tutto l'hardware disponibile e li materializza secondo necessità.

  • Ottimizzatori efficienti in termini di memoria sono stati proposti per ridurre l'impronta di memoria dello stato di esecuzione mantenuto dall'ottimizzatore, come Adafattore.

  • Compressione può essere utilizzato anche per memorizzare i risultati intermedi nella rete. Per esempio, nocciolo comprime le attivazioni salvate per il passaggio all'indietro; DALL · E comprime i gradienti prima di sincronizzarli.


In OpenAI, stiamo addestrando e migliorando modelli di grandi dimensioni dall'infrastruttura sottostante fino alla loro distribuzione per problemi del mondo reale. Se desideri mettere in pratica le idee di questo post, particolarmente rilevanti per i nostri team di Scaling e Applied Research, siamo assunzione!


Ringraziamenti
Grazie a Nikolas Tezak, Sam Altman, Daniel Gackle, Ilya Sutskever e Steven Adler per il feedback sulle bozze. Grazie a Justin Jay Wang, Bianca Martin e Steve Dowling per la comunicazione e il design.

Timestamp:

Di più da OpenAI