Porazdeljena fina nastavitev velikega modela BERT za nalogo z odgovori na vprašanja z uporabo Hugging Face Transformers na Amazon SageMaker

Izvorno vozlišče: 1885069

Od usposabljanja novih modelov do njihove uporabe v proizvodnji, Amazon SageMaker ponuja najpopolnejši nabor orodij za startupe in podjetja za izkoriščanje moči strojnega učenja (ML) in globokega učenja.

S svojo odprtokodno knjižnico Transformers in platformo ML Hugging Face omogoča prenos učenja in najnovejše modele ML dostopne svetovni skupnosti umetne inteligence, s čimer skrajša čas, potreben za podatkovne znanstvenike in inženirje ML v podjetjih po vsem svetu, da izkoristijo vsako novo znanstveno napredovanje.

Uporaba Transformerjev pri novih NLP nalogah ali domenah zahteva fino nastavitev velikih jezikovnih modelov, tehniko, ki izkorišča nabrano znanje predhodno usposobljenih modelov, da jih prilagodi novi nalogi ali določeni vrsti dokumentov v dodatnem, učinkovitem procesu usposabljanja.

Natančna nastavitev modela za izdelavo natančnih napovedi za zadevni poslovni problem zahteva usposabljanje velikih modelov Transformers, na primer BERT, BART, RoBERTa, T5, kar je lahko izziv za izvedbo na razširljiv način.

Hugging Face tesno sodeluje s podjetjem SageMaker pri zagotavljanju pripravljeni za uporabo vsebniki za globoko učenje (DLC-ji), zaradi katerih je usposabljanje in uvajanje najnovejših modelov Transformerjev lažje in hitrejše kot kdaj koli prej. Ker so funkcije, kot so SageMaker Data Parallel (SMDP), SageMaker Model Parallel (SMMP), S3 pipe mode, integrirane v vsebnik, njihova uporaba drastično skrajša čas za podjetja, da ustvarijo rešitve ML, ki temeljijo na Transformers, kot so odgovarjanje na vprašanja, generiranje besedilo in slike, optimiziranje rezultatov iskanja in izboljšanje avtomatizacije podpore strankam, pogovornih vmesnikov, semantičnega iskanja, analiz dokumentov in številnih drugih aplikacij.

V tej objavi se osredotočamo na globoko integracijo porazdeljenih knjižnic SageMaker z Hugging Face, ki podatkovnim znanstvenikom omogoča pospešitev usposabljanja in natančnega prilagajanja modelov Transformers od dni do ur, vse v SageMakerju.

Pregled porazdeljenega usposabljanja

Strokovnjaki ML in podatkovni znanstveniki se pri usposabljanju modelov soočajo z dvema izzivoma skaliranja: skaliranjem velikosti modela (število parametrov in plasti) in skaliranjem podatkov za usposabljanje. Skaliranje velikosti modela ali podatkov o usposabljanju lahko povzroči večjo natančnost, vendar lahko pride do primerov pri globokem učenju, ko količina pomnilnika na pospeševalniku (CPE ali GPE) omejuje kombinacijo velikosti podatkov o usposabljanju in velikosti model. Na primer, pri usposabljanju velikega jezikovnega modela je velikost serije pogosto omejena na majhno število vzorcev, kar lahko povzroči manj natančen model.

Porazdeljeno usposabljanje lahko razdeli delovno obremenitev za usposabljanje modela med več procesorji, imenovano delavci. Ti delavci delujejo vzporedno, da pospešijo usposabljanje modelov.

Glede na to, kaj želimo meriti (model ali podatke), obstajata dva pristopa k porazdeljenemu usposabljanju: vzporedni podatki in vzporedni modeli.

Vzporedni podatki so najpogostejši pristop k porazdeljenemu usposabljanju. Paralelizem podatkov pomeni ustvarjanje kopije arhitekture modela in uteži na različnih pospeševalnikih. Potem, namesto da bi celoten vadbeni niz predali enemu pospeševalniku, lahko vadbeni niz razdelimo med različne pospeševalnike in hitreje preidemo skozi vadbeni niz. Čeprav to doda korak pospeševalnikov, ki morajo svoje informacije o gradientu sporočiti nazaj strežniku parametrov, je ta čas več kot izravnan s povečanjem hitrosti ponavljanja v delčku celotnega nabora podatkov na pospeševalnik. Zaradi tega lahko vzporednost podatkov bistveno pomaga zmanjšati čas usposabljanja. Na primer, usposabljanje enega modela brez paralelizacije traja 4 ure. Z uporabo porazdeljenega usposabljanja lahko to skrajšate na 24 minut. Porazdeljeno usposabljanje SageMaker uporablja tudi vrhunske tehnike pri posodobitvah gradientov.

Pristop z vzporednim modelom se uporablja z velikimi modeli, ki so preveliki, da bi se prilegali enemu pospeševalniku (GPU). Ta pristop izvaja strategijo paralelizacije, kjer je arhitektura modela razdeljena na drobce in postavljena na različne pospeševalnike. Konfiguracija vsakega od teh drobcev je odvisna od arhitekture nevronske mreže in običajno vključuje več plasti. Komunikacija med pospeševalniki se pojavi vsakič, ko podatki o usposabljanju preidejo iz enega od drobcev v drugega.

Če povzamemo, bi morali uporabiti paralelizem podatkov o porazdeljenem usposabljanju za časovno intenzivne naloge zaradi velikih naborov podatkov ali ko želite pospešiti poskuse usposabljanja. Paralelizem modela uporabite, ko se vaš model ne more prilegati enemu pospeševalniku.

Predpogoji

Če želite izvajati porazdeljeno usposabljanje modelov Hugging Face Transformers v SageMakerju, morate izpolniti naslednje predpogoje:

Izvedite porazdeljeno usposabljanje

Knjižnica Hugging Face Transformers ponuja API za usposabljanje, ki je optimiziran za usposabljanje ali natančno nastavitev modelov, ki jih ponuja knjižnica. Uporabite ga lahko tudi na svojih modelih, če delujejo na enak način kot modeli Transformers; glej Trainer za več podrobnosti. Ta API se uporablja v našem primeri skriptov, ki prikazujejo, kako vnaprej obdelati podatke za različne naloge NLP, ki jih lahko vzamete kot modele za pisanje skripta za reševanje lastne težave po meri. Obljuba API-ja Trainer je, da ta skript deluje takoj po namestitvi v vseh porazdeljenih nastavitvah, vključno s SageMakerjem.

Trainer API zajema vse, kar je potrebno za usposabljanje. To vključuje vaše nabore podatkov, vaš model (ali funkcijo, ki vrne vaš model), a compute_metrics funkcija, ki vrne meritve, ki jim želite slediti, iz nizov napovedi in oznak, vašega optimizatorja in razporejevalnika hitrosti učenja (na voljo so dobre privzete vrednosti), kot tudi vse hiperparametre, ki jih lahko nastavite za svojo vadbo, združene v podatkovnem razredu, imenovanem TrainingArguments. Ob vsem tem izpostavlja tri metode – usposabljanje, vrednotenje in napovedovanje – za usposabljanje vašega modela, pridobivanje rezultatov metrike za kateri koli niz podatkov ali pridobivanje napovedi za kateri koli niz podatkov. Če želite izvedeti več o predmetu Trainer, glejte Natančna nastavitev modela z API-jem Trainer in video API za trenerja, ki vas vodi skozi preprost primer.

V zakulisju se API Trainer začne z analizo okolja, v katerem zaženete svoj skript, ko ustvarite TrainingArguments. Na primer, če ste svoje usposabljanje zagnali s programom SageMaker, si ogleda SM_FRAMEWORK_PARAMS spremenljivko v okolju, da ugotovite, ali ste omogočili vzporednost podatkov SageMaker ali vzporednost modela. Nato pridobi ustrezne spremenljivke (kot je rang procesa ali velikost sveta) iz okolja, preden izvede potrebne inicializacijske korake (kot je npr. smdistributed.dataparallel.torch.distributed.init_process_group()).

Trainer vsebuje celotno vadbeno zanko, tako da lahko prilagodi potrebne korake, da zagotovi smdistributed.dataparallel backend se uporablja po potrebi, ne da bi vam bilo treba spremeniti vrstico kode v vašem skriptu. Še vedno lahko deluje (čeprav precej počasneje) na vašem lokalnem računalniku za odpravljanje napak. Obravnava razrezovanje vašega nabora podatkov, tako da vsak proces samodejno vidi različne vzorce, s prerazporeditvijo v vsaki epohi, sinhronizacijo vaših gradientov pred korakom optimizacije, mešano natančno usposabljanje, če ste ga aktivirali, kopičenje gradientov, če ne morete prilagoditi velike serije vaše grafične procesorje in še veliko drugih optimizacij.

Če ste aktivirali vzporednost modela, poskrbi, da procesi, ki morajo videti iste podatke (če so njihovi dp_rank je enak) dobite enake serije in te procese z različnimi dp_rank ne vidite istih vzorcev, spet s prerazporeditvijo v vsaki dobi. Zagotavlja, da so slovarji stanja modela ali optimizatorjev pravilno sinhronizirani pri postavljanju kontrolnih točk, in spet obravnava vse optimizacije, kot sta mešana natančnost in kopičenje gradientov.

Pri uporabi metod ocenjevanja in predvidevanja Trener izvaja porazdeljeno vrednotenje, da izkoristi prednosti vseh vaših grafičnih procesorjev. Pravilno obravnava razdelitev vaših podatkov za vsak proces (proces istega dp_rank če je vzporednost modela aktivirana) in poskrbi, da so napovedi pravilno zbrane v istem vrstnem redu kot nabor podatkov, ki ga uporabljate, preden se pošljejo v compute_metrics funkcijo ali pravkar vrnjeno. Uporaba API-ja Trainer ni obvezna. Uporabniki lahko še vedno uporabljajo Keras ali PyTorch znotraj Hugging Face. Vendar pa lahko Trainer API zagotovi koristen sloj abstrakcije.

Usposobite model z uporabo SageMaker Hugging Face Estimators

Ocenjevalnik je vmesnik na visoki ravni za usposabljanje SageMaker in obravnava naloge usposabljanja in uvajanja SageMaker od konca do konca. Usposabljanje vašega skripta se prikliče, ko pokličete fit o HuggingFace Cenilec. V ocenjevalniku določite, kateri skript za natančno nastavitev boste uporabili entry_point, Ki je instance_type za uporabo in kateri hiperparametri so posredovani. Za več informacij o HuggingFace parametre, glej Ocenjevalnik objemajočih se obrazov.

Porazdeljeno usposabljanje: vzporedni podatki

V tem primeru uporabljamo nove DLC-je Hugging Face in SDK SageMaker za usposabljanje porazdeljenega modela transformatorja Seq2Seq za nalogo vprašanj in odgovorov z uporabo knjižnic Transformers in naborov podatkov. The bert-large-uncased-whole-word-masking model je natančno nastavljen na moštvo nabor podatkov.

Naslednji vzorci kode prikazujejo korake ustvarjanja a HuggingFace ocenjevalec za porazdeljeno usposabljanje s paralelizmom podatkov.

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

Ko ustvarite datoteko HuggingFace Estimator, kot vstopno točko za Estimator lahko določite skript za usposabljanje, ki je shranjen v repozitoriju GitHub, tako da vam skriptov ni treba prenašati lokalno. Lahko uporabiš git_config za zagon primerov skriptov Hugging Face Transformers in desne 'veje', če je vaš transformers_version je treba konfigurirati. Na primer, če uporabljate transformers_version 4.6.1, morate uporabiti 'branch':'v4.6.1".

  1. Konfigurirajte hiperparametre usposabljanja, ki se posredujejo v opravilo usposabljanja:
    # 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'
    }

Kot hiperparameter lahko definiramo katerikoli Seq2SeqTrainingArguments in tistimi, ki so opredeljeni v scenariju usposabljanja.

  1. Določite parametre porazdelitve v HuggingFace Ocenjevalnik:
    # configuration for running training on smdistributed Data Parallel
    distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}

Lahko uporabite Knjižnica paralelnosti podatkov SageMaker pripravljeno za porazdeljeno usposabljanje. Funkcionalnost paralelizma podatkov smo dodali neposredno v Trainer. Če želite omogočiti vzporednost podatkov, lahko svojemu parametru preprosto dodate en sam parameter HuggingFace Ocenjevalnik, ki omogoča samodejno uporabo kode, ki temelji na programu Trainer.

  1. Ustvarite HuggingFace Ocenjevalnik, ki vključuje parametre, definirane v prejšnjih korakih, in začetek usposabljanja:
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()

O Hugging Face Transformers repozitorij vsebuje več primerov in skriptov za natančno prilagajanje modelov pri nalogah od jezikovnega modeliranja do klasifikacije žetonov. V našem primeru uporabljamo run_qa.py Iz examples/pytorch/question-answering primeri.

smdistributed.dataparallel podpira usposabljanje modelov na SageMaker s samo naslednje vrste primerkov. Za najboljše delovanje priporočamo uporabo vrste primerka, ki podpira Adapter za elastične tkanine (EFA):

  • ml.p3.16xvelika
  • ml.p3dn.24xlarge (priporočeno)
  • ml.p4d.24xlarge (priporočeno)

Da bi dobili najboljšo zmogljivost in kar najbolje izkoristili SMDataParallel, morate uporabiti vsaj dva primerka, lahko pa uporabite tudi enega za testiranje tega primera.

Naslednja primer zvezek nudi podrobnejša navodila po korakih.

Porazdeljeno usposabljanje: Model vzporedno

Za porazdeljeno usposabljanje s paralelizmom modelov uporabljamo knjižnico Hugging Face Transformers in podatkovnih nizov skupaj s SDK SageMaker za klasifikacijo zaporedja na Splošno vrednotenje razumevanja jezika (GLUE) primerjalno merilo na gruči z več vozlišči in več GPE z uporabo Knjižnica paralelizma modelov SageMaker.

Tako kot pri paralelizmu podatkov, najprej nastavimo konfiguracijo git, hiperparametre usposabljanja in parametre distribucije v HuggingFace Ocenjevalnik:

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

Knjižnica vzporednosti modela interno uporablja MPI, zato mora biti za uporabo vzporednosti modela MPI omogočen s parametrom distribucije. “processes_per_host” v prejšnji kodi določa število procesov, ki naj jih MPI zažene na vsakem gostitelju. Predlagamo jih za razvoj in testiranje. V času proizvodnje se lahko obrnete na podporo AWS, če zahtevate obsežno zmogljivost GPE. Za več informacij glejte Zaženite opravilo vzporednega usposabljanja distribuiranega modela SageMaker.

Naslednja primer zvezek vsebuje celotne kodne skripte.

Spot primerki

Z razširitvijo ogrodja Hugging Face za SDK SageMaker Python lahko izkoristimo tudi prednosti popolnoma upravljanega Amazonski elastični računalniški oblak (Amazon EC2) Spot primerki in prihranite do 90 % naših stroškov usposabljanja.

Priporočamo, da uporabite, razen če se bo vaše delo usposabljanja končalo hitro kontrolna točka z upravljanim usposabljanjem na kraju samem, zato morate opredeliti checkpoint_s3_uri.

Za uporabo primerkov Spot z HuggingFace Ocenjevalnik, nastaviti moramo use_spot_instances nastavite na True in določite svoj max_wait in max_run čas. Za več informacij o življenjskem ciklu upravljanega usposabljanja na kraju samem glejte Izobraževalni trening v mestu Amazon SageMaker.

Sledi delček kode za nastavitev ocenjevalca usposabljanja na kraju samem:

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)

Naslednja prenosnik vsebuje celotne kodne skripte.

zaključek

V tej objavi smo razpravljali o porazdeljenem usposabljanju Hugging Face Transformers z uporabo SageMakerja. Najprej smo pregledali primere uporabe za vzporednost podatkov v primerjavi z vzporednostjo modelov. Vzporednost podatkov je običajno primernejša, vendar ni nujno omejena na primere, ko je usposabljanje ozko grlo zaradi računanja, medtem ko lahko vzporednost modela uporabite, ko se model ne more prilegati pomnilniku, ki je na voljo v enem pospeševalniku. Nato smo pokazali, kako trenirati z obema metodama.

V primeru uporabe paralelizma podatkov, o katerem smo razpravljali, usposabljanje modela na enem primerku p3.2xlarge (z enim GPE) traja 4 ure in stane približno 15 USD v času tega pisanja. S paralelizmom podatkov lahko isti model usposobimo v 24 minutah po ceni 28 USD. Čeprav so se stroški podvojili, je to zmanjšalo čas usposabljanja za faktor 10. Za situacijo, v kateri morate usposobiti veliko modelov v kratkem času, lahko vzporednost podatkov to omogoči ob relativno nizkem povečanju stroškov. Kar zadeva primer uporabe vzporednosti modela, dodaja zmožnost usposabljanja modelov, ki jih zaradi omejitev strojne opreme prej sploh ni bilo mogoče usposobiti. Obe funkciji omogočata nove poteke dela za praktike ML in sta zlahka dostopni prek HuggingFace Ocenjevalnik kot del SDK-ja SageMaker Python. Uvajanje teh modelov v gostujoče končne točke sledi istemu postopku kot za druge ocenjevalce.

Ta integracija omogoča druge funkcije, ki so del ekosistema SageMaker. Na primer, lahko uporabite promptne primerke z dodajanjem preproste zastavice v ocenjevalnik za dodatno optimizacijo stroškov. Kot naslednji korak lahko poiščete in zaženete demo usposabljanja in primer zvezek.


O avtorjih

Arhis Joglekar je arhitekt partnerskih rešitev AI/ML v ekipi Emerging Technologies. Zanima ga zmogljivo, razširljivo globoko učenje in znanstveno računalništvo z uporabo gradnikov v AWS. Njegove pretekle izkušnje segajo od raziskav računalniške fizike do razvoja platforme strojnega učenja v akademskih krogih, nacionalnih laboratorijih in startupih. Svoj čas stran od računalnika porabi za igranje nogometa ter s prijatelji in družino.

James Yi je starejši arhitekt partnerskih rešitev AI/ML v ekipi za nastajajoče tehnologije pri Amazon Web Services. Navdušen je nad sodelovanjem s podjetniškimi strankami in partnerji pri načrtovanju, uvajanju in prilagajanju aplikacij AI/ML, da izpeljejo svoje poslovne vrednosti. Zunaj dela uživa v igranju nogometa, potovanjih in preživljanju časa z družino.

Filip Šmid je inženir strojnega učenja in tehnični vodja pri Hugging Face, kjer vodi sodelovanje z ekipo Amazon SageMaker. Navdušen je nad demokratizacijo, optimizacijo in produkcijo najsodobnejših NLP modelov ter izboljšanjem enostavne uporabe za globoko učenje.

Sylvain Gugger je raziskovalni inženir pri Hugging Face in eden glavnih vzdrževalcev knjižnice Transformers. Rad ima odprtokodno programsko opremo in pomaga skupnosti pri njeni uporabi.

Jeff Boudier gradi izdelke pri Hugging Face, ustvarjalcu Transformers, vodilne odprtokodne knjižnice ML. Pred tem je bil Jeff soustanovitelj podjetja Stupeflix, ki ga je prevzela družba GoPro, kjer je delal kot direktor produktnega upravljanja, trženja izdelkov, poslovnega razvoja in korporativnega razvoja.

Vir: 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/

Časovni žig:

Več od Blog za strojno učenje AWS