Messa a punto distribuita di un modello BERT Large per un'attività di risposta alle domande utilizzando Hugging Face Transformers su Amazon SageMaker

Nodo di origine: 1885069

Dalla formazione di nuovi modelli alla loro distribuzione in produzione, Amazon Sage Maker offre il set più completo di strumenti per startup e imprese per sfruttare la potenza del machine learning (ML) e del Deep Learning.

Con la sua libreria open source Transformers e la piattaforma ML, Hugging Face rende il transfer learning e gli ultimi modelli ML accessibili alla comunità globale dell'IA, riducendo il tempo necessario ai data scientist e agli ingegneri ML nelle aziende di tutto il mondo per trarre vantaggio da ogni nuova scienza avanzamento.

L'applicazione di Transformers a nuove attività o domini NLP richiede la messa a punto di modelli linguistici di grandi dimensioni, una tecnica che sfrutta la conoscenza accumulata dei modelli pre-addestrati per adattarli a una nuova attività oa un tipo specifico di documenti in un processo di formazione aggiuntivo ed efficiente.

La messa a punto del modello per produrre previsioni accurate per il problema aziendale in questione richiede la formazione di modelli di Transformers di grandi dimensioni, ad esempio BERT, BART, RoBERTa, T5, che possono essere difficili da eseguire in modo scalabile.

Hugging Face ha lavorato a stretto contatto con SageMaker per fornire contenitori di apprendimento profondo pronti per l'uso (DLC) che rendono la formazione e l'implementazione degli ultimi modelli Transformers più facili e veloci che mai. Poiché funzionalità come SageMaker Data Parallel (SMDP), SageMaker Model Parallel (SMMP) e la modalità pipe S3 sono integrate nel container, il loro utilizzo riduce drasticamente il tempo impiegato dalle aziende per creare soluzioni ML basate su Transformers come la risposta alle domande, la generazione di testo e immagini, ottimizzando i risultati di ricerca e migliora l'automazione dell'assistenza clienti, le interfacce di conversazione, la ricerca semantica, l'analisi dei documenti e molte altre applicazioni.

In questo post, ci concentriamo sulla profonda integrazione delle librerie distribuite SageMaker con Hugging Face, che consente ai data scientist di accelerare la formazione e la messa a punto dei modelli Transformers da giorni a ore, il tutto in SageMaker.

Panoramica della formazione distribuita

I professionisti del ML e gli scienziati dei dati devono affrontare due sfide di ridimensionamento durante l'addestramento dei modelli: ridimensionamento delle dimensioni del modello (numero di parametri e livelli) e ridimensionamento dei dati di addestramento. Il ridimensionamento delle dimensioni del modello o dei dati di addestramento può comportare una maggiore precisione, ma possono verificarsi casi nel deep learning in cui la quantità di memoria sull'acceleratore (CPU o GPU) limita la combinazione della dimensione dei dati di addestramento e della dimensione del modello. Ad esempio, quando si esegue il training di un modello linguistico di grandi dimensioni, la dimensione del batch è spesso limitata a un numero ridotto di campioni, il che può comportare un modello meno accurato.

La formazione distribuita può suddividere il carico di lavoro per addestrare il modello tra più processori, chiamati lavoratori. Questi lavoratori operano in parallelo per accelerare la formazione del modello.

Sulla base di ciò che vogliamo ridimensionare (modello o dati) ci sono due approcci alla formazione distribuita: parallelo di dati e parallelo di modello.

Data parallel è l'approccio più comune alla formazione distribuita. Il parallelismo dei dati implica la creazione di una copia dell'architettura del modello e il peso su diversi acceleratori. Quindi, invece di trasferire l'intero training set a un singolo acceleratore, possiamo suddividere il training set tra i diversi acceleratori e superare il training set più velocemente. Sebbene ciò aggiunga il passaggio degli acceleratori che devono comunicare le informazioni sul gradiente a un server di parametri, questa volta è più che compensato dall'aumento di velocità dell'iterazione su una frazione dell'intero set di dati per acceleratore. Per questo motivo, il parallelismo dei dati può aiutare notevolmente a ridurre i tempi di addestramento. Ad esempio, il training di un singolo modello senza parallelizzazione richiede 4 ore. L'uso della formazione distribuita può ridurlo a 24 minuti. La formazione distribuita SageMaker implementa anche tecniche all'avanguardia negli aggiornamenti del gradiente.

Un approccio modello parallelo viene utilizzato con modelli di grandi dimensioni troppo grandi per adattarsi a un acceleratore (GPU). Questo approccio implementa una strategia di parallelizzazione in cui l'architettura del modello è divisa in shard e posizionata su diversi acceleratori. La configurazione di ciascuno di questi shard dipende dall'architettura della rete neurale e in genere include diversi livelli. La comunicazione tra gli acceleratori avviene ogni volta che i dati di training passano da uno shard al successivo.

Per riassumere, dovresti usare il parallelismo dei dati di addestramento distribuito per attività che richiedono molto tempo a causa di set di dati di grandi dimensioni o quando vuoi accelerare gli esperimenti di addestramento. Dovresti usare il parallelismo del modello quando il tuo modello non può adattarsi a un acceleratore.

Prerequisiti

Per eseguire l'addestramento distribuito dei modelli Hugging Face Transformers in SageMaker, è necessario completare i seguenti prerequisiti:

Implementare la formazione distribuita

La libreria Hugging Face Transformers fornisce un'API Trainer ottimizzata per addestrare o perfezionare i modelli forniti dalla libreria. Puoi anche usarlo sui tuoi modelli se funzionano allo stesso modo dei modelli Transformers; vedere Tutor per ulteriori dettagli. Questa API è utilizzata nel nostro script di esempio, che mostrano come preelaborare i dati per varie attività NLP, che puoi utilizzare come modelli per scrivere uno script che risolva il tuo problema personalizzato. La promessa dell'API Trainer è che questo script funziona immediatamente su qualsiasi configurazione distribuita, incluso SageMaker.

L'API Trainer prende tutto il necessario per la formazione. Ciò include i tuoi set di dati, il tuo modello (o una funzione che restituisce il tuo modello), a compute_metrics funzione che restituisce le metriche che desideri monitorare dagli array di predicazioni ed etichette, dall'ottimizzatore e dall'utilità di pianificazione del tasso di apprendimento (sono fornite buone impostazioni predefinite), nonché tutti gli iperparametri che puoi ottimizzare per il tuo allenamento raggruppati in una classe di dati chiamata TrainingArguments. Con tutto ciò, espone tre metodi (addestrare, valutare e prevedere) per addestrare il modello, ottenere i risultati della metrica su qualsiasi set di dati o ottenere le previsioni su qualsiasi set di dati. Per ulteriori informazioni sull'oggetto Trainer, fare riferimento a Perfezionamento di un modello con l'API Trainer e il video L'API del formatore, che ti guida attraverso un semplice esempio.

Dietro le quinte, l'API Trainer inizia analizzando l'ambiente in cui stai avviando lo script quando crei il file TrainingArguments. Ad esempio, se hai avviato la tua formazione con SageMaker, guarda a SM_FRAMEWORK_PARAMS variabile nell'ambiente per rilevare se hai abilitato il parallelismo dei dati di SageMaker o il parallelismo del modello. Quindi ottiene le variabili rilevanti (come il rango del processo o la dimensione mondiale) dall'ambiente prima di eseguire i passaggi di inizializzazione necessari (come smdistributed.dataparallel.torch.distributed.init_process_group()).

Il Trainer contiene l'intero ciclo di allenamento, quindi può regolare i passaggi necessari per assicurarsi che smdistributed.dataparallel il backend viene utilizzato quando necessario senza dover modificare una riga di codice nello script. Può ancora essere eseguito (anche se molto più lentamente) sul tuo computer locale per il debug. Gestisce lo sharding del tuo set di dati in modo tale che ogni processo veda automaticamente campioni diversi, con un rimpasto ad ogni epoca, sincronizzando i tuoi gradienti prima della fase di ottimizzazione, training di precisione mista se lo hai attivato, accumulo di gradiente se non puoi adattare un lotto di grandi dimensioni su le tue GPU e molte altre ottimizzazioni.

Se hai attivato il parallelismo del modello, assicura che i processi che devono vedere gli stessi dati (se il loro dp_rank è lo stesso) ottiene gli stessi batch e che elabora con diversi dp_rank non si vedono gli stessi campioni, sempre con un rimpasto ad ogni epoca. Si assicura che i dizionari di stato del modello o degli ottimizzatori siano sincronizzati correttamente durante il checkpoint e di nuovo gestisce tutte le ottimizzazioni come la precisione mista e l'accumulo del gradiente.

Quando si utilizzano i metodi di valutazione e previsione, il Trainer esegue una valutazione distribuita, per sfruttare tutte le GPU. Gestisce correttamente la suddivisione dei tuoi dati per ogni processo (processo dello stesso dp_rank se il parallelismo del modello è attivato) e assicura che le previsioni siano raccolte correttamente nello stesso ordine del set di dati che stai utilizzando prima di essere inviate al compute_metrics funzione o appena restituito. L'utilizzo dell'API Trainer non è obbligatorio. Gli utenti possono ancora utilizzare Keras o PyTorch all'interno di Hugging Face. Tuttavia, l'API Trainer può fornire un utile livello di astrazione.

Addestra un modello utilizzando SageMaker Hugging Face Estimators

Uno stimatore è un'interfaccia di alto livello per la formazione di SageMaker e gestisce le attività di formazione e distribuzione end-to-end di SageMaker. L'addestramento del tuo script viene richiamato quando chiami fit su una HuggingFace Estimatore. In Estimator, definisci quale script di fine tuning utilizzare come entry_point, quale instance_type da utilizzare e quali iperparametri vengono passati. Per ulteriori informazioni su HuggingFace parametri, vedere Estimatore del viso che abbraccia.

Formazione distribuita: Dati paralleli

In questo esempio, utilizziamo i nuovi DLC Hugging Face e SageMaker SDK per addestrare un modello di trasformatore Seq2Seq distribuito sull'attività di domanda e risposta utilizzando le librerie Transformers e dataset. Il bert-large-uncased-intera-parola-mascheramento il modello è messo a punto sul squadra set di dati.

Gli esempi di codice seguenti mostrano i passaggi per creare un HuggingFace stimatore per training distribuito con parallelismo dei dati.

  1. Scegli uno script di Hugging Face Transformers:
    # git configuration to download our fine-tuning script
    git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'}

Quando crei un file HuggingFace Estimator, puoi specificare uno script di addestramento archiviato in un repository GitHub come punto di ingresso per Estimator, quindi non devi scaricare gli script localmente. Puoi usare git_config per eseguire gli script di esempio di Hugging Face Transformers e il "ramo" a destra se il tuo transformers_version deve essere configurato. Ad esempio, se usi transformers_version 4.6.1, devi usare 'branch':'v4.6.1'.

  1. Configura gli iperparametri di addestramento che vengono passati nel processo di addestramento:
    # hyperparameters, which are passed into the training job
    hyperparameters={ 'model_name_or_path': 'bert-large-uncased-whole-word-masking', 'dataset_name':'squad', 'do_train': True, 'do_eval': True, 'fp16': True, 'per_device_train_batch_size': 4, 'per_device_eval_batch_size': 4, 'num_train_epochs': 2, 'max_seq_length': 384, 'max_steps': 100, 'pad_to_max_length': True, 'doc_stride': 128, 'output_dir': '/opt/ml/model'
    }

Come iperparametro, possiamo definire any Argomenti Seq2SeqTraining e quelli definiti nello script di formazione.

  1. Definire i parametri di distribuzione in HuggingFace Estimatore:
    # configuration for running training on smdistributed Data Parallel
    distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}

È possibile utilizzare il Libreria di parallelismo dei dati SageMaker pronto per la formazione distribuita. Abbiamo aggiunto la funzionalità del parallelismo dei dati direttamente nel Trainer. Per abilitare il parallelismo dei dati, puoi semplicemente aggiungere un singolo parametro al tuo HuggingFace Estimator per consentire al tuo codice basato su Trainer di utilizzarlo automaticamente.

  1. Creare un HuggingFace Estimatore che include i parametri definiti nei passaggi precedenti e inizia l'allenamento:
from sagemaker.huggingface import HuggingFace
# estimator
huggingface_estimator = HuggingFace(entry_point='run_qa.py', source_dir='./examples/pytorch/question-answering', git_config=git_config, instance_type= 'ml.p3.16xlarge', instance_count= 2, volume_size= 200, role= <SageMaker Role>, # IAM role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', distribution= distribution, hyperparameters = hyperparameters) # starting the train job huggingface_estimator.fit()

I Repository di Hugging Face Transformers contiene diversi esempi e script per la messa a punto dei modelli su attività dalla modellazione del linguaggio alla classificazione dei token. Nel nostro caso, usiamo run_qa.py dal examples/pytorch/question-answering esempi.

smdistributed.dataparallel supporta l'addestramento del modello su SageMaker con solo i seguenti tipi di istanza. Per prestazioni ottimali, ti consigliamo di utilizzare un tipo di istanza che supporti Adattatore in tessuto elastico (EFA):

  • ml.p3.16xgrande
  • ml.p3dn.24xlarge (consigliato)
  • ml.p4d.24xlarge (consigliato)

Per ottenere le migliori prestazioni e il massimo SMDataParallel, dovresti usare almeno due istanze, ma puoi anche usarne una per testare questo esempio.

Le seguenti quaderno di esempio fornisce una guida passo passo più dettagliata.

Formazione distribuita: modello parallelo

Per l'addestramento distribuito con parallelismo del modello, utilizziamo la libreria Hugging Face Transformers e dataset insieme a SageMaker SDK per la classificazione delle sequenze sul Valutazione della comprensione della lingua generale (GLUE) benchmark su un cluster multi-nodo e multi-GPU che utilizza il Libreria di parallelismo del modello SageMaker.

Come per il parallelismo dei dati, per prima cosa impostiamo la configurazione git, gli iperparametri di training e i parametri di distribuzione nel file HuggingFace Estimatore:

# git configuration to download our fine-tuning script
git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'} # hyperparameters, which are passed into the training job
hyperparameters={ 'model_name_or_path':'roberta-large', 'task_name': 'mnli', 'per_device_train_batch_size': 16, 'per_device_eval_batch_size': 16, 'do_train': True, 'do_eval': True, 'do_predict': True, 'num_train_epochs': 2, 'output_dir':'/opt/ml/model', 'max_steps': 500,
} # configuration for running training on smdistributed Model Parallel
mpi_options = { "enabled" : True, "processes_per_host" : 8,
}
smp_options = { "enabled":True, "parameters": { "microbatches": 4, "placement_strategy": "spread", "pipeline": "interleaved", "optimize": "speed", "partitions": 4, "ddp": True, }
} distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options
}

La libreria di parallelismo del modello utilizza internamente MPI, quindi per utilizzare il parallelismo del modello, MPI deve essere abilitato utilizzando il parametro di distribuzione. “processes_per_host” nel codice precedente specifica il numero di processi che MPI dovrebbe avviare su ciascun host. Suggeriamo questi per lo sviluppo e il test. In fase di produzione, puoi contattare il supporto AWS se richiedi un'ampia capacità della GPU. Per ulteriori informazioni, vedere Eseguire un processo di formazione parallela modello distribuito SageMaker.

Le seguenti quaderno di esempio contiene gli script di codice completi.

Istanze Spot

Con l'estensione del framework Hugging Face per SageMaker Python SDK, possiamo anche trarre vantaggio dalla gestione completa Cloud di calcolo elastico di Amazon (Amazon EC2) Istanze Spot e risparmia fino al 90% del nostro costo di formazione.

A meno che il tuo lavoro di formazione non venga completato rapidamente, ti consigliamo di utilizzare checkpoint con formazione in loco gestita, quindi è necessario definire checkpoint_s3_uri.

Per utilizzare le istanze Spot con HuggingFace Estimatore, dobbiamo impostare il use_spot_instances parametro su True e definisci il tuo max_wait ed max_run tempo. Per ulteriori informazioni sul ciclo di vita dell'addestramento in loco gestito, vedere Formazione spot gestita in Amazon SageMaker.

Quello che segue è uno snippet di codice per impostare uno stimatore di formazione spot:

from sagemaker.huggingface import HuggingFace # hyperparameters, which are passed into the training job
hyperparameters={'epochs': 1, 'train_batch_size': 32, 'model_name':'distilbert-base-uncased', 'output_dir':'/opt/ml/checkpoints' } # s3 uri where our checkpoints will be uploaded during training
job_name = "using-spot"
checkpoint_s3_uri = f's3://{sess.default_bucket()}/{job_name}/checkpoints' huggingface_estimator = HuggingFace(entry_point='train.py', source_dir='./scripts', instance_type='ml.p3.2xlarge', instance_count=1, base_job_name=job_name, checkpoint_s3_uri=checkpoint_s3_uri, use_spot_instances=True, max_wait=3600, # This should be equal to or greater than max_run in seconds' max_run=1000, # expected max run in seconds role=role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', hyperparameters = hyperparameters)

Le seguenti taccuino contiene gli script di codice completi.

Conclusione

In questo post, abbiamo discusso della formazione distribuita di Hugging Face Transformers utilizzando SageMaker. Abbiamo prima esaminato i casi d'uso per il parallelismo dei dati rispetto al parallelismo del modello. Il parallelismo dei dati è in genere più appropriato ma non necessariamente limitato a quando l'addestramento è ostacolato dal calcolo, mentre puoi usare il parallelismo del modello quando un modello non può rientrare nella memoria fornita su un singolo acceleratore. Abbiamo poi mostrato come allenarci con entrambi i metodi.

Nel caso d'uso del parallelismo dei dati che abbiamo discusso, il training di un modello su una singola istanza p3.2xlarge (con una singola GPU) richiede 4 ore e costa circa $ 15 al momento della stesura di questo articolo. Con il parallelismo dei dati, possiamo addestrare lo stesso modello in 24 minuti al costo di $ 28. Sebbene il costo sia raddoppiato, ciò ha ridotto il tempo di addestramento di un fattore 10. Per una situazione in cui è necessario addestrare molti modelli in un breve periodo di tempo, il parallelismo dei dati può consentire ciò con un aumento dei costi relativamente basso. Per quanto riguarda il caso d'uso del parallelismo del modello, aggiunge la possibilità di addestrare modelli che non avrebbero potuto essere addestrati in precedenza a causa di limitazioni hardware. Entrambe le funzionalità consentono nuovi flussi di lavoro per i professionisti del ML e sono facilmente accessibili tramite il HuggingFace Estimator come parte di SageMaker Python SDK. La distribuzione di questi modelli sugli endpoint ospitati segue la stessa procedura degli altri stimatori.

Questa integrazione abilita altre funzionalità che fanno parte dell'ecosistema SageMaker. Ad esempio, puoi utilizzare le istanze Spot aggiungendo un semplice flag a Estimator per un'ulteriore ottimizzazione dei costi. Come passaggio successivo, puoi trovare ed eseguire il file demo di formazione ed quaderno di esempio.


Informazioni sugli autori

Archis Joglekar è un Partner Solutions Architect AI/ML nel team Emerging Technologies. È interessato al deep learning e al calcolo scientifico performanti e scalabili che utilizzano gli elementi costitutivi di AWS. Le sue esperienze passate spaziano dalla ricerca sulla fisica computazionale allo sviluppo di piattaforme di apprendimento automatico nel mondo accademico, nei laboratori nazionali e nelle startup. Il suo tempo lontano dal computer lo trascorre giocando a calcio e con amici e familiari.

Giacomo Yi è Sr. AI/ML Partner Solutions Architect nel team Emerging Technologies di Amazon Web Services. È appassionato di lavorare con clienti e partner aziendali per progettare, distribuire e scalare applicazioni AI/ML per ricavarne i valori aziendali. Al di fuori del lavoro, gli piace giocare a calcio, viaggiare e passare il tempo con la sua famiglia.

Filippo Schmid è un Machine Learning Engineer e Tech Lead presso Hugging Face, dove guida la collaborazione con il team di Amazon SageMaker. È appassionato di democratizzazione, ottimizzazione e produzione di modelli NLP all'avanguardia e di miglioramento della facilità d'uso per il Deep Learning.

Sylvain Gugger è un ingegnere di ricerca presso Hugging Face e uno dei principali manutentori della libreria Transformers. Ama il software open source e aiuta la comunità a usarlo.

Jeff Boudier crea prodotti presso Hugging Face, creatore di Transformers, la principale libreria ML open source. In precedenza Jeff è stato co-fondatore di Stupeflix, acquisita da GoPro, dove ha ricoperto il ruolo di direttore di Product Management, Product Marketing, Business Development e Corporate Development.

Fonte: https://aws.amazon.com/blogs/machine-learning/distributed-fine-tuning-of-a-bert-large-model-for-a-question-answering-task-using-hugging-face- trasformatori-su-amazon-sagemaker/

Timestamp:

Di più da Blog di apprendimento automatico AWS