Perfezionamento rapido ed economico LLaMA 2 con AWS Trainium

Perfezionamento veloce ed economico con LLaMA 2 grazie ad AWS Trainium

I modelli linguistici di grandi dimensioni (LLM) hanno catturato l’immaginazione e l’attenzione di sviluppatori, scienziati, tecnologi, imprenditori e dirigenti in diversi settori. Questi modelli possono essere utilizzati per rispondere a domande, fare sintesi, traduzioni e altro ancora in applicazioni come agenti conversazionali per il supporto clienti, creazione di contenuti per il marketing e assistenti di coding.

Recentemente, Meta ha rilasciato Llama 2 sia per ricercatori che per entità commerciali, aggiungendosi alla lista di altri LLM, tra cui MosaicML MPT e Falcon. In questo post, vedremo come ottimizzare Llama 2 su AWS Trainium, un acceleratore appositamente progettato per l’addestramento di LLM, al fine di ridurre i tempi e i costi di addestramento. Esamineremo gli script di ottimizzazione forniti dal SDK AWS Neuron (utilizzando NeMo Megatron-LM), le diverse configurazioni utilizzate e i risultati del throughput che abbiamo ottenuto.

Informazioni sul modello Llama 2

Simile al modello precedente Llama 1 e ad altri modelli come GPT, Llama 2 utilizza l’architettura solo-decoder del Transformer. Viene proposto in tre dimensioni: 7 miliardi, 13 miliardi e 70 miliardi di parametri. Rispetto a Llama 1, Llama 2 raddoppia la lunghezza del contesto da 2.000 a 4.000 e utilizza l’attenzione raggruppata delle query (solo per 70B). I modelli preaddestrati di Llama 2 sono stati allenati su 2 trilioni di token e i modelli ottimizzati sono stati addestrati su oltre 1 milione di annotazioni umane.

Addestramento distribuito di Llama 2

Per adattare Llama 2 con una lunghezza sequenza di 2.000 e 4.000, abbiamo implementato lo script utilizzando NeMo Megatron per Trainium che supporta il parallelismo dei dati (DP), il parallelismo dei tensori (TP) e il parallelismo delle pipeline (PP). Per essere specifici, con l’implementazione di nuove funzionalità come unire l’embedding delle parole, l’embedding rotativo, RMSNorm e l’attivazione Swiglu, utilizzeremo lo script generico di GPT Neuron Megatron-LM per supportare lo script di addestramento di Llama 2.

La nostra procedura di addestramento ad alto livello è la seguente: per il nostro ambiente di addestramento, utilizziamo un cluster multi-istanza gestito dal sistema SLURM per l’addestramento distribuito e la pianificazione nell’ambito del framework NeMo.

Prima di tutto, scarichiamo il modello Llama 2 e i set di dati di addestramento e li preelaboriamo utilizzando il tokenizer Llama 2. Ad esempio, per utilizzare il dataset RedPajama, utilizziamo il seguente comando:

wget https://data.together.xyz/redpajama-data-1T/v1.0.0/book/book.jsonlpython nemo/scripts/nlp_language_modeling/preprocess_data_for_megatron.py

Per una guida dettagliata sul download dei modelli e sugli argomenti dello script di preelaborazione, fare riferimento a Download LlamaV2 dataset and tokenizer.

Successivamente, compiliamo il modello:

sbatch --nodes 4 compile.slurm ./llama_7b.sh

Dopo che il modello è stato compilato, avviamo il job di addestramento con lo script seguente, già ottimizzato con la migliore configurazione e i migliori iperparametri per Llama 2 (inclusi nel codice di esempio):

sbatch --nodes 4 run.slurm ./llama_7b.sh

Infine, monitoriamo TensorBoard per tenere traccia dei progressi dell’addestramento:

tensorboard --logdir ./

Per il codice di esempio completo e gli script che abbiamo menzionato, consulta il tutorial sulla Llama 7B e il codice NeMo nell’SDK Neuron per seguire passaggi più dettagliati.

Esperimenti di fine-tuning

Abbiamo effettuato il fine-tuning del modello 7B sui dataset OSCAR (Open Super-large Crawled ALMAnaCH coRpus) e QNLI (Question-answering NLI) in un ambiente Neuron 2.12 (PyTorch). Per ogni lunghezza sequenza di 2.000 e 4.000, abbiamo ottimizzato alcune configurazioni, come batchsize e gradient_accumulation, per l’efficienza di addestramento. Come strategia di fine-tuning, abbiamo adottato il fine-tuning completo di tutti i parametri (circa 500 passi), che può essere esteso a un pre-training con passi e dataset più lunghi (ad esempio, 1T RedPajama). La parallelizzazione della sequenza può anche essere abilitata per consentire a NeMo Megatron di eseguire il fine-tuning con una lunghezza di sequenza superiore a 4.000. La tabella seguente mostra la configurazione e i risultati del throughput dell’esperimento di fine-tuning della Llama 7B. Il throughput scala quasi linearmente all’aumentare del numero di istanze fino a 4.

Libreria Distribuita Dataset Lunghezza Sequenza Numero di Istanze Parallelismo Tensoriale Parallelismo dei Dati Parallelismo Pipeline Batch Globale Throughput (seq/s)
Neuron NeMo Megatron OSCAR 4096 1 8 4 1 256 3.7
. . 4096 2 8 4 1 256 7.4
. . 4096 4 8 4 1 256 14.6
. QNLI 4096 4 8 4 1 256 14.1

L’ultimo passo è verificare l’accuratezza con il modello di base. Abbiamo implementato uno script di riferimento per gli esperimenti con GPU e abbiamo confermato che le curve di allenamento per GPU e Trainium corrispondono, come mostrato nella figura seguente. La figura illustra le curve di perdita in relazione al numero di passaggi di allenamento sul dataset QNLI. Per GPU è stato adottato il metodo a precisione mista (blu), mentre per Trainium è stato utilizzato il metodo bf16 con arrotondamento stocastico predefinito (arancione).

Curva di allenamento

Conclusioni

In questo post abbiamo dimostrato che Trainium offre elevate prestazioni e un’ottimizzazione dei costi per il raffinamento di Llama 2. Per ulteriori risorse sull’utilizzo di Trainium per il pre-training distribuito e il raffinamento dei modelli di intelligenza artificiale generativi con NeMo Megatron, consulta AWS Neuron Reference per NeMo Megatron.