Austerity incontra Precisione Addestramento a basso costo dei modelli GPT NeoX e Pythia con AWS Trainium

['Austerità e Precisione l'addestramento a basso costo dei modelli GPT NeoX e Pythia con AWS Trainium']

Large language models (o LLM) sono diventati argomento di conversazione quotidiana. La loro adozione rapida è evidente dal tempo necessario per raggiungere 100 milioni di utenti, passando da “4,5 anni da parte di Facebook” a un minimo storico di soli “2 mesi da parte di ChatGPT”. Un generatore pre-addestrato trasformatore (GPT) utilizza aggiornamenti causalmente autoregressivi per effettuare previsioni. Questi modelli architettonici dimostrano una performance stupefacente in una varietà di compiti come il riconoscimento vocale, la generazione di testo e la risposta alle domande. Modelli recenti come NeoX, Falcon, Llama utilizzano l’architettura GPT come base. Addestrare LLM richiede un’enorme quantità di tempo di elaborazione, che costa milioni di dollari. In questo articolo, riassumeremo la procedura di addestramento di GPT NeoX su AWS Trainium, un acceleratore di apprendimento automatico (ML) appositamente progettato ottimizzato per l’addestramento di deep learning. Spiegheremo come abbiamo addestrato tali modelli in modo efficiente dal punto di vista dei costi (3,2 milioni di token/$) utilizzando AWS Trainium senza perdere la qualità del modello.

Panoramica della soluzione

Modelli GPT NeoX e Pythia

GPT NeoX e Pythia sono modelli di linguaggio causale open-source creati da Eleuther-AI, con circa 20 miliardi di parametri in NeoX e 6,9 miliardi in Pythia. Entrambi sono modelli decodificatori che seguono un design architettonico simile a Chat GPT3. Tuttavia, presentano anche diverse aggiunte, che sono ampiamente adottate anche nei modelli recenti come Llama. In particolare, hanno un embedding posizionale rotazionale (ROPE) con rotazione parziale nelle dimensioni delle teste. I modelli originali (NeoX e Pythia 6.9B) sono addestrati su un dataset pubblico disponibile Pile con deduplica e utilizzando il backend Megatron e Deepspeed.

Dimostreremo il pre-addestramento e il fine-tuning di questi modelli su istanze Trn1 basate su AWS Trainium utilizzando la libreria Neuron NeMo. Per stabilire la prova di concetto e ottenere una riproducibilità rapida, utilizzeremo un sottoinsieme più piccolo del dataset di Wikipedia tokenizzato utilizzando il tokenizzatore GPT2 Byte-pair encoding (BPE).

Procedura dettagliata

Scarica il dataset di Wikipedia pre-tokenizzato come mostrato di seguito:

export DATA_DIR=~/examples_datasets/gpt2mkdir -p ${DATA_DIR} && cd ${DATA_DIR}wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.jsonwget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txtaws s3 cp s3://neuron-s3/training_datasets/gpt/wikipedia/my-gpt2_text_document.bin . --no-sign-requestaws s3 cp s3://neuron-s3/training_datasets/gpt/wikipedia/my-gpt2_text_document.idx . --no-sign-requestaws s3 cp s3://neuron-s3/training_datasets/gpt/wikipedia/license.txt . --no-sign-request

Sia NeoX 20B che Pythia 6.9B utilizzano ROPE con rotazione parziale, ad esempio, ruotano il 25% delle dimensioni delle teste e mantengono le altre immobili. Per implementare efficacemente la rotazione parziale sull’acceleratore AWS Trainium, invece di concatenare le dimensioni che ruotano e quelle che non ruotano, aggiungiamo frequenze zero per le dimensioni che non ruotano e quindi ruotiamo l’intero set di dimensioni delle teste. Questo semplice trucco ci ha aiutato a migliorare la velocità di elaborazione (sequenze elaborate al secondo) su AWS Trainium.

Fasi di addestramento

Per eseguire l’addestramento, utilizziamo il cluster Trn1 di Amazon Elastic Compute Cloud (Amazon EC2) multi-nodo gestito da SLURM, con ogni nodo contenente un’istanza trn1.32xl. Ogni trn1.32xl ha 16 acceleratori con due worker per acceleratore. Dopo aver scaricato l’ultima versione del pacchetto Neuron NeMo, utilizzare gli script di pre-addestramento e messa a punto neox e pythia forniti con iperparametri ottimizzati ed eseguire quanto segue per un addestramento a quattro nodi.

  1. Compila: Pre-compila il modello con tre iterazioni di addestramento per generare e salvare i grafici:

    sbatch --nodes 4 compile.slurm ./neoX_20B_slurm.sh
  2. Esegui: Esegui l’addestramento caricando i grafici memorizzati dai primi passaggi

    sbatch --nodes 4 run.slurm ./neoX_20B_slurm.sh
  3. Monitora i risultati

    tensorboard --logdir=nemo_experiments/megatron_neox

Gli stessi passaggi devono essere seguiti per eseguire il modello Pythia 6.9B sostituendo neox_20B_slurm.sh con pythia_6.9B_slurm.sh.

Esperimenti di pre-addestramento e messa a punto

Dimostriamo il pre-addestramento dei modelli GPT-NeoX e Pythia su AWS Trainium utilizzando la libreria Neuron NeMo per 10k iterazioni, e mostriamo anche la messa a punto di questi modelli per 1k passaggi. Per il pre-addestramento, utilizziamo il tokenizer BPE di GPT2 all’interno del NeMo e seguiamo la stessa configurazione utilizzata nel modello originale. La messa a punto su AWS Trainium richiede la modifica di alcuni parametri (come il fattore di divisione delle dimensioni del vocabolario), che vengono forniti negli script di messa a punto per adattarsi alle differenze tra Megatron e NeMo e alle modifiche tra GPU e AWS Trainium. L’efficienza di addestramento distribuito multi-nodo con diversi numeri di nodi è mostrata nella Tabella-1.

Modello Parallelismo Tensoriale Parallelismo a Pipeline Numero di istanze Costo ($/ora) Lunghezza sequenza Dimensione batch globale Efficienza di addestramento (seq/sec) Rapporto costo-efficienza (token/$)
Pythia 6.9B 8 1 1 7.59 2048 256 10.4 10,102,387
8 1 4 30.36 2048 256 35.8 8,693,881
NeoX 20B 8 4 4 30.36 2048 16384 13.60 3,302,704
8 4 8 60.72 2048 16384 26.80 3,254,134
8 4 16 121.44 2048 16384 54.30 3,296,632
8 4 32 242.88 2048 16384 107.50 3,263,241
8 4 64 485.76 2048 16384 212.00 3,217,708

Tabella 1. Confronto della media del throughput dei modelli GPT NeoX e Pythia per l’addestramento fino a 500 passi con un numero variabile di nodi. Il prezzo di trn1.32xl si basa sul tasso effettivo per ora riservato di 3 anni.

In seguito, valutiamo anche la traiettoria della perdita dell’addestramento del modello su AWS Trainium e la confrontiamo con l’esecuzione corrispondente su un cluster P4d (core GPU Nvidia A100). Oltre alla perdita dell’addestramento, confrontiamo anche utili indicatori come la norma del gradiente, che è la norma 2 dei gradienti del modello calcolati ad ogni iterazione dell’addestramento per monitorare l’avanzamento dell’addestramento. I risultati dell’addestramento sono mostrati nelle Figure-1, 2 e il fine-tuning di NeoX 20B nella Figura-3.

Perdita media dell'addestramento su tutti i nodi (sinistra) e norma del gradiente (destra) ad ogni passo di addestramento.

Figura-1. Perdita media dell’addestramento su tutti i nodi (sinistra) e norma del gradiente (destra) ad ogni passo di addestramento. NeoX 20B è addestrato su 4 nodi con un piccolo dataset wiki sulla GPU e Trainium con gli stessi iperparametri di addestramento (dimensione del batch globale = 256). La GPU utilizza BF16 e la precisione mista predefinita, mentre AWS Trainium utilizza BF16 completo con arrotondamento stocastico. La traiettoria della perdita e della norma del gradiente corrisponde per GPU e AWS Trainium.

Perdita media dell'addestramento su tutti i nodi (sinistra) e norma del gradiente (destra) ad ogni passo di addestramento (Pythia).

Figura-2. Perdita media dell’addestramento su tutti i nodi (sinistra) e norma del gradiente (destra) ad ogni passo di addestramento. Similmente a GPT NeoX nella Figura-1, Pythia 6.9B è addestrato su 4 nodi con un piccolo dataset wiki sulla GPU e Trainium con gli stessi iperparametri di addestramento (dimensione del batch globale = 256). La traiettoria della perdita e della norma del gradiente corrisponde per GPU e Trainium.

Raffinamento del modello GPT NeoX 20B sulla GPU e AWS Trainium con perdita media dell'addestramento su tutti i nodi (sinistra) e norma del gradiente (destra).

Figura-3. Raffinamento del modello GPT NeoX 20B sulla GPU e AWS Trainium con perdita media dell’addestramento su tutti i nodi (sinistra) e norma del gradiente (destra). Viene utilizzato un piccolo dataset wiki per una dimostrazione di raffinamento. La traiettoria della perdita e della norma del gradiente corrisponde per GPU e AWS Trainium.

In questo post, abbiamo mostrato l’addestramento a costo ridotto di LLM su hardware di deep learning di AWS. Abbiamo addestrato i modelli GPT NeoX 20B e Pythia 6.9B su AWS Trn1 con la libreria Neuron NeMo. Il throughput normalizzato per costo per 20 miliardi di modelli con AWS Trainium è di circa 3,2M token/$ spesi. Oltre all’addestramento a costo ridotto su AWS Trainium, otteniamo una precisione del modello simile, come evidenziato dalla perdita dei passaggi di addestramento e dalla traiettoria della norma del gradiente. Abbiamo anche eseguito il raffinamento dei checkpoint disponibili per il modello NeoX 20B su AWS Trainium. Per ulteriori informazioni sull’addestramento distribuito con NeMo Megatron su AWS Trainium, consulta AWS Neuron Reference per NeMo Megatron. Una buona risorsa per iniziare il raffinamento del modello Llama può essere trovata qui, Raffinamento Llama2. Per iniziare con AWS Trainium gestito su Amazon SageMaker, consulta Addestrare i tuoi modelli di ML con AWS Trainium e Amazon SageMaker.