Reglarea fină distribuită a unui model BERT Large pentru o sarcină de răspuns la întrebări folosind Hugging Face Transformers pe Amazon SageMaker

Nodul sursă: 1885069

De la formarea de noi modele până la implementarea lor în producție, Amazon SageMaker oferă cel mai complet set de instrumente pentru startup-uri și întreprinderi pentru a valorifica puterea învățării automate (ML) și a învățării profunde.

Cu biblioteca sa open-source Transformers și platforma ML, Hugging Face face ca învățarea prin transfer și cele mai recente modele ML să fie accesibile comunității globale de inteligență artificială, reducând timpul necesar oamenilor de știință de date și inginerilor ML din companii din întreaga lume pentru a profita de fiecare nou științific. avansare.

Aplicarea Transformers la noi sarcini sau domenii NLP necesită reglarea fină a modelelor de limbaj mari, o tehnică care valorifică cunoștințele acumulate ale modelelor pre-antrenate pentru a le adapta la o sarcină nouă sau la un tip specific de documente într-un proces suplimentar de instruire eficient.

Reglarea fină a modelului pentru a produce predicții precise pentru problema de afaceri în cauză necesită pregătirea modelelor mari Transformers, de exemplu, BERT, BART, RoBERTa, T5, care pot fi dificil de realizat într-un mod scalabil.

Hugging Face a lucrat îndeaproape cu SageMaker pentru a livra Containere Deep Learning gata de utilizat (DLC-uri) care fac antrenamentul și implementarea celor mai recente modele Transformers mai ușor și mai rapid ca niciodată. Deoarece caracteristici precum SageMaker Data Parallel (SMDP), SageMaker Model Parallel (SMMP), modul pipe S3 sunt integrate în container, utilizarea acestora reduce drastic timpul pentru companii de a crea soluții ML bazate pe Transformers, cum ar fi răspunsul la întrebări, generarea text și imagini, optimizează rezultatele căutării și îmbunătățește automatizarea asistenței pentru clienți, interfețele conversaționale, căutarea semantică, analizele documentelor și multe alte aplicații.

În această postare, ne concentrăm pe integrarea profundă a bibliotecilor distribuite SageMaker cu Hugging Face, care le permite oamenilor de știință de date să accelereze pregătirea și reglarea fină a modelelor Transformers de la zile la ore, totul în SageMaker.

Prezentare generală a instruirii distribuite

Practicienii ML și oamenii de știință de date se confruntă cu două provocări de scalare atunci când antrenează modele: scalarea dimensiunii modelului (număr de parametri și straturi) și scalarea datelor de antrenament. Scalarea fie a dimensiunii modelului, fie a datelor de antrenament poate duce la o mai bună acuratețe, dar pot exista cazuri de învățare profundă în care cantitatea de memorie de pe accelerator (CPU sau GPU) limitează combinația dintre dimensiunea datelor de antrenament și dimensiunea model. De exemplu, atunci când antrenați un model de limbă mare, dimensiunea lotului este adesea limitată la un număr mic de mostre, ceea ce poate duce la un model mai puțin precis.

Instruirea distribuită poate împărți volumul de lucru pentru a antrena modelul între mai multe procesoare, numite muncitorii. Acești lucrători operează în paralel pentru a accelera pregătirea modelelor.

Pe baza a ceea ce dorim să scalam (model sau date), există două abordări ale instruirii distribuite: paralel de date și paralel de model.

Paralelul datelor este cea mai comună abordare a instruirii distribuite. Paralelismul datelor implică crearea unei copii a arhitecturii modelului și a greutăților pe diferite acceleratoare. Apoi, în loc să trecem întregul set de antrenament la un singur accelerator, putem împărți setul de antrenament pe diferite acceleratoare și să trecem prin setul de antrenament mai repede. Deși acest lucru adaugă pasul în care acceleratorii trebuie să comunice informațiile despre gradient înapoi către un server de parametri, această dată este mai mult decât compensată de creșterea vitezei de iterare pe o fracțiune din întregul set de date per accelerator. Din acest motiv, paralelismul datelor poate ajuta semnificativ la reducerea timpilor de antrenament. De exemplu, antrenamentul unui singur model fără paralelizare durează 4 ore. Utilizarea antrenamentului distribuit poate reduce acest lucru la 24 de minute. Instruirea distribuită SageMaker implementează și tehnici de ultimă oră în actualizările gradientului.

O abordare paralelă a modelului este utilizată cu modelele mari prea mari pentru a se potrivi pe un accelerator (GPU). Această abordare implementează o strategie de paralelizare în care arhitectura modelului este împărțită în fragmente și plasată pe diferite acceleratoare. Configurația fiecăruia dintre aceste fragmente depinde de arhitectura rețelei neuronale și include de obicei mai multe straturi. Comunicarea între acceleratoare are loc de fiecare dată când datele de antrenament trec de la unul dintre cioburi la următorul.

Pentru a rezuma, ar trebui să utilizați paralelismul de date de antrenament distribuit pentru sarcini care necesită mult timp din cauza seturilor de date mari sau atunci când doriți să vă accelerați experimentele de antrenament. Ar trebui să utilizați paralelismul modelului atunci când modelul dvs. nu se poate potrivi pe un singur accelerator.

Cerințe preliminare

Pentru a efectua instruire distribuită a modelelor Hugging Face Transformers în SageMaker, trebuie să îndepliniți următoarele cerințe preliminare:

Implementați formarea distribuită

Biblioteca Hugging Face Transformers oferă un API Trainer care este optimizat pentru a antrena sau a ajusta modelele pe care le oferă biblioteca. Îl poți folosi și pe propriile modele dacă funcționează la fel ca modelele Transformers; vedea Antrenor pentru mai multe detalii. Acest API este folosit în sistemul nostru exemple de scripturi, care arată cum să preprocesați datele pentru diverse sarcini NLP, pe care le puteți lua ca modele pentru a scrie un script care rezolvă propria problemă personalizată. Promisiunea API-ului Trainer este că acest script funcționează imediat pe orice configurare distribuită, inclusiv SageMaker.

API-ul Trainer preia tot ceea ce este necesar pentru antrenament. Aceasta include seturile dvs. de date, modelul dvs. (sau o funcție care returnează modelul dvs.), a compute_metrics funcție care returnează valorile pe care doriți să le urmăriți din matricele de predicții și etichete, optimizatorul și planificatorul ratei de învățare (sunt furnizate valori implicite bune), precum și toți hiperparametrii pe care îi puteți regla pentru antrenamentul dvs. grupați într-o clasă de date numită TrainingArguments. Cu toate acestea, expune trei metode — antrenarea, evaluarea și prezicerea — pentru a vă antrena modelul, pentru a obține rezultatele metricii pentru orice set de date sau pentru a obține predicții pentru orice set de date. Pentru a afla mai multe despre obiectul Trainer, consultați Reglați fin un model cu API-ul Trainer și videoclipul API-ul Trainer, care vă ghidează printr-un exemplu simplu.

În culise, API-ul Trainer începe prin a analiza mediul în care lansați scriptul atunci când creați TrainingArguments. De exemplu, dacă v-ați lansat antrenamentul cu SageMaker, se uită la SM_FRAMEWORK_PARAMS variabilă din mediu pentru a detecta dacă ați activat paralelismul datelor SageMaker sau paralelismul modelului. Apoi primește variabilele relevante (cum ar fi rangul procesului sau dimensiunea lumii) din mediu înainte de a efectua pașii necesari de inițializare (cum ar fi smdistributed.dataparallel.torch.distributed.init_process_group()).

Trainerul conține întreaga buclă de antrenament, astfel încât poate ajusta pașii necesari pentru a se asigura că smdistributed.dataparallel backend-ul este utilizat atunci când este necesar, fără a fi nevoie să schimbați o linie de cod în scriptul dvs. Poate rula în continuare (deși mult mai lent) pe mașina dvs. locală pentru depanare. Se ocupă de împărțirea setului de date astfel încât fiecare proces să vadă automat eșantioane diferite, cu o remaniere la fiecare epocă, sincronizează gradienții înainte de pasul de optimizare, antrenament mixt de precizie dacă l-ați activat, acumulare de gradient dacă nu puteți încadra o dimensiune mare a lotului. GPU-urile dvs. și multe alte optimizări.

Dacă ați activat paralelismul modelului, se asigură că procesele care trebuie să vadă aceleași date (dacă au dp_rank este același) obține aceleași loturi și procesează cu diferite dp_rank nu vezi aceleasi mostre, din nou cu o remaniere la fiecare epoca. Se asigură că dicționarele de stare ale modelului sau ale optimizatorilor sunt sincronizate corect atunci când se efectuează puncte de control și se ocupă din nou de toate optimizările, cum ar fi precizia mixtă și acumularea de gradient.

Când utilizați metodele de evaluare și predicție, Trainerul efectuează o evaluare distribuită, pentru a profita de toate GPU-urile dvs. Se ocupă în mod corespunzător de împărțirea datelor dvs. pentru fiecare proces (proces al aceluiași proces dp_rank dacă este activat paralelismul modelului) și se asigură că predicțiile sunt adunate corect în aceeași ordine ca setul de date pe care îl utilizați înainte de a fi trimise către compute_metrics funcție sau doar returnat. Utilizarea API-ului Trainer nu este obligatorie. Utilizatorii pot folosi în continuare Keras sau PyTorch în Hugging Face. Cu toate acestea, API-ul Trainer poate oferi un strat de abstractizare util.

Antrenează un model folosind SageMaker Hugging Face Estimators

Un Estimator este o interfață de nivel înalt pentru instruirea SageMaker și se ocupă de sarcinile de instruire și implementare SageMaker de la capăt la capăt. Antrenamentul scriptului dvs. este invocat atunci când apelați fit pe o HuggingFace Estimator. În Estimator, definiți ce script de reglare fină să utilizați entry_point, Care instance_type de utilizat și ce hiperparametri sunt transferați. Pentru mai multe informații despre HuggingFace parametri, vezi Hugging Face Estimator.

Training distribuit: Date paralele

În acest exemplu, folosim noile DLC-uri Hugging Face și SageMaker SDK pentru a antrena un model de transformator Seq2Seq distribuit pe sarcina de întrebări și răspunsuri folosind bibliotecile Transformers și seturi de date. The bert-large-descărcat-întregul-cuvânt-mascare modelul este reglat fin pe echipă set de date.

Următoarele exemple de cod vă arată pașii de creare a unui HuggingFace estimator pentru instruire distribuită cu paralelism de date.

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

Când creați un HuggingFace Estimator, puteți specifica un script de antrenament care este stocat într-un depozit GitHub ca punct de intrare pentru Estimator, astfel încât să nu fie nevoie să descărcați scripturile local. Poți să folosești git_config pentru a rula exemplele de scripturi Hugging Face Transformers și „ramura” potrivită dacă dvs transformers_version trebuie configurat. De exemplu, dacă utilizați transformers_version 4.6.1, trebuie să utilizați „branch':'v4.6.1".

  1. Configurați hiperparametrii de antrenament care sunt trecuți în jobul de antrenament:
    # 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'
    }

Ca hiperparametru, putem defini oricare Seq2SeqTrainingArguments și cele definite în scenariul de antrenament.

  1. Definiți parametrii de distribuție în HuggingFace Estimator:
    # configuration for running training on smdistributed Data Parallel
    distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}

Aveți posibilitatea să utilizați Biblioteca de paralelism de date SageMaker din cutie pentru instruire distribuită. Am adăugat funcționalitatea paralelismului de date direct în Trainer. Pentru a activa paralelismul datelor, puteți pur și simplu să adăugați un singur parametru la dvs HuggingFace Estimator pentru a permite codului dvs. bazat pe Trainer să-l folosească automat.

  1. Crearea unei HuggingFace Estimator care include parametri definiți în pașii anteriori și începe antrenamentul:
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()

Depozitul Hugging Face Transformers conține mai multe exemple și scripturi pentru reglarea fină a modelelor pentru sarcini de la modelarea limbajului până la clasificarea token-ului. În cazul nostru, folosim run_qa.py de la examples/pytorch/question-answering exemple.

smdistributed.dataparallel acceptă formarea modelului pe SageMaker cu numai următoarele tipuri de instanțe. Pentru o performanță optimă, vă recomandăm să utilizați un tip de instanță care acceptă Adaptor pentru țesături elastice (EFA):

  • ml.p3.16xmare
  • ml.p3dn.24xlarge (recomandat)
  • ml.p4d.24xlarge (recomandat)

Pentru a obține cele mai bune performanțe și la maximum SMDataParallel, ar trebui să utilizați cel puțin două instanțe, dar puteți utiliza și una pentru a testa acest exemplu.

Următoarele exemplu caiet oferă îndrumări mai detaliate pas cu pas.

Antrenament distribuit: Model paralel

Pentru instruire distribuită cu paralelism model, folosim Hugging Face Transformers și biblioteca de seturi de date împreună cu SageMaker SDK pentru clasificarea secvenței pe Evaluarea generală a înțelegerii limbajului (GLUE) benchmark pe un cluster multi-nod, multi-GPU folosind Biblioteca de paralelism model SageMaker.

Ca și în cazul paralelismului de date, mai întâi setăm configurația git, hiperparametrii de antrenament și parametrii de distribuție în HuggingFace Estimator:

# 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
}

Biblioteca de paralelism de model folosește intern MPI, deci pentru a utiliza paralelismul de model, MPI trebuie să fie activat folosind parametrul de distribuție. „processes_per_host” în codul precedent specifică numărul de procese pe care MPI trebuie să le lanseze pe fiecare gazdă. Le sugerăm pentru dezvoltare și testare. În timpul producției, puteți contacta asistența AWS dacă solicitați o capacitate GPU extinsă. Pentru mai multe informații, vezi Rulați o lucrare de instruire paralelă a modelului distribuit SageMaker.

Următoarele exemplu caiet conține scripturile de cod complete.

Instanțe spot

Cu extensia cadrului Hugging Face pentru SDK-ul SageMaker Python, putem profita și de serviciile complet gestionate Cloud Elastic de calcul Amazon (Amazon EC2) Instanțe spot și economisiți până la 90% din costul nostru de formare.

Cu excepția cazului în care munca de formare se va finaliza rapid, vă recomandăm să utilizați puncte de control cu antrenament la fața locului gestionat, de aceea trebuie să definiți checkpoint_s3_uri.

Pentru a utiliza Instanțele Spot cu HuggingFace Estimator, trebuie să setăm use_spot_instances parametrul la True și definiți-vă max_wait și max_run timp. Pentru mai multe informații despre ciclul de viață de formare spot gestionat, consultați Instruire la fața locului gestionat în Amazon SageMaker.

Următorul este un fragment de cod pentru configurarea unui Estimator de antrenament 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)

Următoarele caiet conține scripturile de cod complete.

Concluzie

În această postare, am discutat despre instruirea distribuită a Hugging Face Transformers folosind SageMaker. Am analizat mai întâi cazurile de utilizare pentru paralelismul datelor vs. paralelismul modelului. Paralelismul datelor este de obicei mai potrivit, dar nu este neapărat limitat la atunci când antrenamentul este blocat de calcul, în timp ce puteți utiliza paralelismul de model atunci când un model nu se poate încadra în memoria furnizată pe un singur accelerator. Apoi am arătat cum să ne antrenăm cu ambele metode.

În cazul de utilizare a paralelismului de date pe care l-am discutat, antrenarea unui model pe o singură instanță p3.2xlarge (cu un singur GPU) durează 4 ore și costă aproximativ 15 USD la momentul scrierii acestui articol. Cu paralelismul de date, putem antrena același model în 24 de minute la un cost de 28 USD. Deși costul s-a dublat, acest lucru a redus timpul de antrenament cu un factor de 10. Pentru o situație în care trebuie să antrenezi multe modele într-o perioadă scurtă de timp, paralelismul datelor poate permite acest lucru la o creștere relativ scăzută a costurilor. În ceea ce privește cazul de utilizare a paralelismului modelului, adaugă capacitatea de a antrena modele care nu ar fi putut fi antrenate anterior deloc din cauza limitărilor hardware. Ambele funcții permit noi fluxuri de lucru pentru practicienii ML și sunt ușor accesibile prin intermediul HuggingFace Estimator ca parte a SDK-ului SageMaker Python. Implementarea acestor modele la punctele finale găzduite urmează aceeași procedură ca și pentru alți Estimatori.

Această integrare permite alte funcții care fac parte din ecosistemul SageMaker. De exemplu, puteți utiliza Instanțele Spot adăugând un semnal simplu la Estimator pentru optimizarea suplimentară a costurilor. Ca pas următor, puteți găsi și rula demonstrație de antrenament și exemplu caiet.


Despre Autori

Archis Joglekar este arhitect de soluții partener AI/ML în echipa Tehnologii emergente. El este interesat de învățarea profundă performantă, scalabilă și de calcul științific, folosind elementele de bază ale AWS. Experiențele sale anterioare variază de la cercetare în fizica computațională la dezvoltarea platformei de învățare automată în mediul academic, laboratoare naționale și startup-uri. Timpul său departe de computer este petrecut jucând fotbal și cu prietenii și familia.

James Yi este arhitect senior de soluții partener AI/ML în echipa de tehnologii emergente de la Amazon Web Services. El este pasionat de lucrul cu clienții și partenerii întreprinderilor pentru a proiecta, implementa și scala aplicații AI/ML pentru a le deriva valorile de afaceri. În afara serviciului, îi place să joace fotbal, să călătorească și să petreacă timpul cu familia.

Philipp Schmid este inginer de învățare automată și șef tehnic la Hugging Face, unde conduce colaborarea cu echipa Amazon SageMaker. Este pasionat de democratizarea, optimizarea și producția de modele de ultimă generație NLP și de îmbunătățirea ușurinței de utilizare pentru Deep Learning.

Sylvain Gugger este inginer de cercetare la Hugging Face și unul dintre principalii menținători ai bibliotecii Transformers. Îi place software-ul open source și ajută comunitatea să-l folosească.

Jeff Boudier construiește produse la Hugging Face, creatorul Transformers, principala bibliotecă ML open-source. Anterior, Jeff a fost co-fondator al Stupeflix, achiziționată de GoPro, unde a ocupat funcția de director de management de produs, marketing de produs, dezvoltare de afaceri și dezvoltare corporativă.

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

Timestamp-ul:

Mai mult de la Blog de AWS Machine Learning