Usposabljanje ogromnih modelov s skoraj linearnim skaliranjem z uporabo paralelizma razdrobljenih podatkov na Amazon SageMaker

V prizadevanju za vrhunsko natančnost so se modeli globokega učenja na področjih, kot sta obdelava naravnega jezika in računalniški vid, v zadnjih nekaj letih močno povečali in se pogosto štejejo v desetine do stotine milijard parametrov. Usposabljanje teh ogromnih modelov je zahtevno in zahteva zapletene distribucijske strategije. Podatkovni znanstveniki in inženirji strojnega učenja nenehno iščejo najboljši način za optimizacijo svojega računanja za usposabljanje, vendar se spopadajo s komunikacijskimi stroški, ki se lahko povečajo skupaj s celotno velikostjo gruče.

Zato smo pred kratkim začeli strdi paralelizem podatkov on Amazon SageMaker, nova tehnika porazdeljenega usposabljanja za varčevanje s spominom v Knjižnica vzporednega modela SageMaker (SMP).. Paralelizem razdeljenih podatkov je namensko izdelan za modele ekstremnega obsega in uporablja interni Amazon MiCS tehnologija pod pokrovom, znanstveno prizadevanje za zmanjšanje komunikacijskega obsega z znižanjem dragih komunikacijskih stroškov, ki temeljijo na zbiranju parametrov in gradientni sinhronizaciji. Z modelom GPT-30 s parametrom 2B in dolžino zaporedja 2048 je ta nova funkcija dosegla 141 TFLOP, kar je 39.7-odstotna hitrost v primerjavi z DeepSpeed ​​ZeRO-3. Za model 10B GPT-2 z dolžino zaporedja 512 je ta nova funkcija dosegla tudi 564 vzorcev na sekundo, kar je 13.9-odstotna hitrost v primerjavi s PyTorchovim Fully Sharded Data Parallel (FSDP). Ne pozabite, da se pri usposabljanju z ogromnim modelom vsak odstotek pospešitve pretvori v prihranjene dolarje in povečano produktivnost v vaši ekipi.

V tej objavi v spletnem dnevniku si bomo najprej podrobneje ogledali ključne razlike med paralelizmom razdrobljenih podatkov in kdaj ga uporabiti. Nato se boste naučili, kako z lahkoto usposobiti model GPT-30 s parametrom 2B na SageMaker s to novo funkcijo. Nazadnje bomo primerjali zmogljivost z drugimi odprtokodnimi možnostmi, zlasti s prekašanjem DeepSpeed ​​ZeRO za do 39.7 % na 256 grafičnih procesorjih.

Kako deluje paralelizem razdeljenih podatkov in kdaj ga uporabiti

Preden predstavimo paralelizem razdrobljenih podatkov, si poglejmo njegovo širšo družino tehnik. Nedavni pristopi porazdeljenega usposabljanja za velike modele so se premaknili na paradigmo, kjer so parametri modela, gradienti in stanja optimizatorja v skupni rabi med podatkovno vzporednimi vozlišči. V nasprotju s cevovodnim paralelizmom, ki ima prirojeno zapletenost izbire plasti za razdelitev med napravami, zlasti kadar vaše ogrodje ne podpira avtomatsko razdelitev modela, ta paradigma elegantno ohranja preprostost vzporednosti podatkov, medtem ko odpravlja omejitev vzporednosti podatkov, kjer se mora model prilegati enemu GPU.

V obstoječih okvirih, ki spadajo pod to paradigmo, zlasti DeepSpeed ​​ZeRO-3 in PyTorchov FSDP, ki je navzgor od FairScale, so stanja modela razdeljena po vse GPU-ji, strategija, ki zmanjša porabo pomnilnika na vsakem GPE-ju za ceno velikih komunikacijskih stroškov, ki se povečujejo z velikostjo gruče in zato povzročijo znatno zmanjšanje razširljivosti v obsegu. Nasprotno pa paralelizem razdrobljenih podatkov v modelu particij knjižnice SMP navaja a zavedajoč se obsega tako, da vsako repliko stanj modela razdelite samo znotraj podnabor grafičnih procesorjev.

Poglejmo si pobliže razdelitev modela glede na merilo v MiCS, temeljni tehnologiji za vzporednimi podatki v razdelkih. Intuicija v ozadju te zasnove je, da particioniranje stanj usposabljanja v celotni podatkovni vzporedni skupini morda ni potrebno za usposabljanje modela z več deset milijardami parametrov. Na primer, 8 grafičnih procesorjev V100 (vsak po 32 GB) zadostuje za shranjevanje replike stanj modela modela s parametri 10B, ki potrebuje približno 200 GB pomnilnika pri usposabljanju z optimizatorjem Adam z uporabo mešane natančnosti. Z omejevanjem popolne replike stanj modela v najmanjši podnaboru grafičnih procesorjev, lahko učinkovito zmanjšamo obseg komunikacijskih stroškov v primerjavi z DeepSpeed ​​in PyTorch FSDP. Vzporedni razdrobljeni podatki izkoriščajo tudi druge tehnike v MiCS, kot sta hierarhična komunikacija in 2-hop gradientna sinhronizacija. Za več informacij preverite Skoraj linearno skaliranje usposabljanja gigantskega modela na AWS or MiCS: skoraj linearno skaliranje za usposabljanje gigantskega modela v javnem oblaku.

Zdaj pa, kako veste, kdaj izbrati vzporedne razdrobljene podatke pred drugimi tehnikami porazdeljenega usposabljanja? Splošno pravilo je, da če ima vaš model manj kot milijardo parametrov in se lahko prilega pomnilniku GPU, Vzporedna podatkovna knjižnica SageMaker or Prevajalnik za usposabljanje SageMaker lahko zadostuje za vas. Če imate večje jezikovne modele ali modele računalniškega vida, je naš predlog, da ga usposobite s tehniko paralelizma razdrobljenih podatkov v kombinaciji z aktivacijska kontrolna točka in aktiviranje razbremenitve najprej v vzporedni knjižnici modela SageMaker, pred drugimi tehnikami, kot je npr tenzorski paralelizem ali vzporednost cevovoda.

Uporaba paralelizma razdeljenih podatkov za usposabljanje GPT-2 na Amazon SageMaker

Zdaj pa se naučimo, kako usposobiti model GPT-2 z vzporednimi razdrobljenimi podatki, pri čemer SMP za vas zaobjema kompleksnost. to celoten zvezek za poučevanje vas vodi skozi celoten proces, od obdelave podatkov, definiranja in oddaje izobraževalnih nalog do spremljanja dnevnikov usposabljanja. Sledi kratek pregled, ki poudarja ključne korake za uporabo te funkcije.

1. Začnite

Paralelizem razdeljenih podatkov je na voljo v PyTorch v1.12.0+ in deluje s FP16 in BF16. Najlažji način za uporabo knjižnice SMP je prek vnaprej izdelanega vsebnika za globoko učenje AWS za PyTorch. Če pa želite prinesti svoj vsebnik Docker, se lahko obrnete na Ustvarite svoj lasten vsebnik Docker z vzporedno knjižnico distribuiranega modela SageMaker. Za začetek sledite Spremenite skript za usposabljanje PyTorch za prilagoditev API-jev SMP v vašem skriptu za usposabljanje. V tem razdelku navajamo samo nekaj glavnih korakov z delčki kode iz skripta za usposabljanje, pripravljenega za uporabo. train_gpt_simple.py. Lahko sledite komentarjem v scenariju in Dokument API če želite izvedeti več o tem, kje se uporabljajo API-ji SMP.

Najprej uvozite in inicializirajte knjižnico s klicem smdistributed.modelparallel.torch.init() na začetku scenarija usposabljanja:

import smdistributed.modelparallel.torch as smp

smp.init(smp_config)

Drugič, ovijte model, s katerim želite pregraditi smdistributed.modelparallel.torch.DistributedModel in uporabite vrnjeno DistributedModel predmet naprej:

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_config(model_config)
model = smp.DistributedModel(model, trace_device="gpu", backward_passes_per_step=args.gradient_accumulation)

Optimizator ovijte s smdistributed.modelparallel.torch.DistributedOptimizer za shranjevanje in nalaganje stanj optimizatorja.

from torch import optim

optimizer = optim.Adam(
    param_groups, betas=(args.beta1, args.beta2), lr=args.lr, weight_decay=args.weight_decay
)

optimizer = smp.DistributedOptimizer(
        optimizer, 
        static_loss_scale=None, 
        dynamic_loss_scale=True,
        dynamic_loss_args={"scale_window": 1000, "min_scale": 1, "delayed_shift": 2},
        )

Postavite logiko naprej in nazaj v funkcijo korakov in jo okrasite z smdistributed.modelparallel.torch.step.  Vsak izračun, definiran znotraj smp.step-decorated funkcija se izvaja na porazdeljen način.

@smp.step
def train_step(model, optimizer, input_ids, attention_mask, args):
    loss = model(input_ids=input_ids, attention_mask=attention_mask, labels=input_ids)["loss"]
    model.backward(loss)

    return loss

@smp.step
def test_step(model, input_ids, attention_mask):
    loss = model(input_ids=input_ids, attention_mask=attention_mask, labels=input_ids)["loss"]
    
    return loss

2. Pripravite nabor podatkov

Mi uporabljamo openwebtext je nabor podatkov, ki ga uporabljamo v tem primeru. Beležnica uporablja skripto data_prep_512.py za prenos in predhodno obdelavo nabora podatkov. S spreminjanjem se lahko usposabljate tudi z drugimi nabori podatkov data_pipeline.py. Ko imate opravka z velikim naborom podatkov in modelom, lahko pospešite usposabljanje z uporabo podatkov, shranjenih v Amazon FSx za Luster, ki zagotavlja visoko zmogljiv datotečni sistem, izvorno integriran z Preprosta storitev shranjevanja Amazon (S3). Oglejte si navodila iz Konfigurirajte kanal za vnos podatkov za uporabo Amazon FSx za Luster za navodila o nastavitvi datotečnega sistema FSx Luster kot kanala za vnos podatkov.

3. Začnite z usposabljanjem

Ta korak predvideva, da ste že spremenili vaš scenarij usposabljanja in pripravil nabor podatkov, kot je omenjeno v prejšnjih razdelkih. Za omogočite paralelizem razdeljenih podatkov, preprosto nastavite sharded_data_parallel_degree v Ocenjevalnik PyTorch. V tej vadnici smo nastavili sharded_data_parallel_degree=128 in instace_count=32 za vozlišča p4d.24xlarge, kar nakazuje, da bodo stanja modela razdeljena na 128 grafičnih procesorjev med skupno 256 grafičnimi procesorji. Na podlagi te izbrane vrednosti bo SMP samodejno nastavil stopnjo vzporednosti podatkov na 2 (ker je 256/128=2), kar pomeni, da bomo imeli dve replici za vzporednost podatkov. Splošno pravilo za izbiro idealne vrednosti za sharded_data_parallel_degree je dodati še eno vozlišče skupini za skupno rabo na vsakih 3B parametrov modela. V tej vadnici je velikost našega modela 30B, zato bi morali uporabiti vsaj 10 vozlišč za razdeljevanje. In ker je 16 vozlišč (128 grafičnih procesorjev) najmanjša potenca 2 nad pragom, smo nastavili sharded_data_parallel_degree=128.

Za kontrolne točke ponujamo tudi nabor pripomočkov za kontrolne točke sharded_data_parallel_checkpoint.py , vključno s pripomočkom za popolno rekonstrukcijo state_dict za napredne primere uporabe. Končno lahko zaženemo porazdeljeno usposabljanje s klicem fit() v ocenjevalniku.

smp_estimator = PyTorch(
    entry_point="train_gpt_simple.py",
    instance_type="ml.p4d.24xlarge",
    source_dir=os.getcwd(),
    volume_size=500,
    instance_count=32,
    distribution={
        "mpi": {
            "enabled": True,
            "processes_per_host": processes_per_host,
            "custom_mpi_options": mpioptions,
        },
        "smdistributed": {
            "modelparallel": {
                "enabled": True,
                "parameters": {
                    "ddp": True,
                    "skip_tracing": True,
                    "delayed_parameter_initialization": True,
                    "offload_activations": True,
                    "activation_loading_horizon": 4,
                    # To enable sharded data parallelism.
                    # Here we shard model states across 128 GPUs. 
                    "sharded_data_parallel_degree": 128, 
                    "fp16": False,
                    "bf16": True,
                    # This is to disable pipeline parallelism.
                    "partitions": 1,
                },
            }
        },
    },
    framework_version="1.12",
    py_version="py38",
    hyperparameters=hyperparameters,
    checkpoint_s3_uri=checkpoint_s3_uri if not use_fsx else None,
    checkpoint_local_path=hyperparameters["checkpoint-dir"] if use_fsx else None,
    ...
)

smp_estimator.fit(inputs=data_channels)

4. Spremljajte delovna mesta za usposabljanje

Dostopate lahko do dnevnikov vadbe in spremljate uporabo GPE in pomnilnika amazoncloudwatch. Prepričajte se, da si ogledate dnevnike »algo-1« ker je to glavno vozlišče, katerega izhodni tok ima dnevnike opravil usposabljanja iz vseh primerkov.

Primerjalna uspešnost

Primerjali smo paralelizem razdeljenih podatkov v knjižnici SMP na 16 in 32 vozliščih p4d.24xlarge za dolžino zaporedja 512 oziroma 2048. Model GPT30 s parametrom 2B je konfiguriran za uporabo skrite širine 7168, 48 plasti in 64 glav. Z nastavitvijo lahko sprejmete popolnoma enako konfiguracijo, kjer je dolžina zaporedja 2048 model_config = "gpt2-30b" v učnem zvezku. S to nastavitvijo je SMP dosegel 73.52 vzorcev na sekundo, kar je 39.7-odstotna hitrost v primerjavi z DeepSpeed ​​ZeRO-3. Če je velikost vašega žetona 500 milijard, ta pospešek pomeni skoraj 367 ur prihranka na vozliščih p4d.24xlarge, kar ustreza več kot 12,000 USD prihranjenega proračuna na usposabljanje! Naslednja tabela povzema naše primerjalne rezultate.

konfiguracija Uspešnost Čas za usposabljanje s SMP (dnevi)
Model/usposabljanje Grozd DeepSpeed SMP Hitrost (vzorcev/s)
DeepSpeed ​​v0.7.2
Hitrost (vzorcev/s)
SMP v1.11
% pospešitve SMP TFLOPS, dosežen s SMP 100 milijard žetonov 500 milijard žetonov
30B GPT-2
Dolžina zaporedja: 512
Globalna velikost serije: 3072
FP16
16 p4d.24xvelika vozlišča Aktivacijska kontrolna točka
gradient_accumulation_steps:2
Aktivacijska kontrolna točka
sharded_data_parallel_degree:64
gradient_akumulacija:1
142 181.05 27.5 173.6 12.49 62.43
30B GPT-2
Dolžina zaporedja: 2048
Globalna velikost serije 1536
FP16
32 p4d.24xvelika vozlišča Aktivacijska kontrolna točka
gradient_accumulation_steps:2
Aktivacijska kontrolna točka sharded_data_parallel_degree:128
gradient_akumulacija:1
52.6 73.52 39.77 141 7.69 38.43
1/ Za vsako konfiguracijo modela smo preizkusili različne funkcije, stopnje in konfiguracije v DeepSpeed ​​ZeRO in izbrali tisto, ki zagotavlja najboljšo prepustnost kot izhodišče DeepSpeed. Merilo uspešnosti je bilo zagnano Amazonski elastični računalniški oblak (Amazon EC2). 2/ Ti rezultati temeljijo na izboljšanih komunikacijskih kolektivih, optimiziranih za AWS, ki bodo kmalu na voljo. 3/ Čas za usposabljanje je predviden glede na hitrost na podlagi števila obdelanih žetonov.

Če povzamemo, opazili smo dosledno višjo prepustnost s paralelizmom razdeljenih podatkov v SMP v primerjavi z DeepSpeed ​​v različnih modelih in konfiguracijah. Ta nova funkcija je pokazala tudi boljšo učinkovitost pomnilnika v primerjavi z DeepSpeed, kar je omogočilo, da se SMP prilega večji velikosti serije in zmanjša raven kopičenja gradientov, ki je potrebna za prilagoditev določeni globalni velikosti serije.

zaključek

V tej objavi smo predstavili novo tehniko porazdeljenega usposabljanja – paralelizem razdrobljenih podatkov – in kako pospešuje usposabljanje ogromnih modelov s skoraj linearnim skaliranjem na Amazon SageMaker. Sledili smo tudi, kako usposobiti model GPT-2 z novo tehniko popoln primer. Lahko sledite Amazon SageMaker Primeri GitHub repo sledite vsem primerom vzporednih modelov SageMaker ali se udeležite našega naslednjega razdeljene učne delavnice. Če želite izvedeti več o paralelizmu razdrobljenih podatkov, glejte Dokumentacija.


O avtorjih

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Emily Webber se je pridružil AWS takoj po lansiranju SageMakerja in od takrat poskuša svetu povedati o njem! Poleg ustvarjanja novih izkušenj ML za stranke Emily uživa v meditaciji in preučevanju tibetanskega budizma.

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Lahko Karakus je višji aplikativni znanstvenik pri AWS, ki optimizira obsežno porazdeljeno globoko učenje na AWS. Njegovi raziskovalni interesi zajemajo globoko učenje, porazdeljeno optimizacijo, porazdeljene sisteme in teorijo informacij. Izven službe rad kolesari, potuje, bere in se uči.

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Rahul Huilgol je višji programski inženir pri AWS. Dela na sistemih porazdeljenega globokega učenja, da bi olajšal in zmogljivo treniral velike modele globokega učenja v oblaku. V prostem času se ukvarja s fotografijo, kolesarjenjem in vrtnarjenjem.

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Suhit Kodgule je inženir za razvoj programske opreme v skupini za umetno inteligenco AWS, ki se ukvarja z ogrodji globokega učenja. V prostem času uživa v pohodništvu, potovanjih in kuhanju.

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Erin Ho je produktni vodja za AWS Deep Learning. Dela na izdelkih, ki strankam olajšajo urjenje modelov globokega učenja na AWS. Za zabavo zunaj dela uživa v pohodništvu in smučanju.

Časovni žig:

Več od Strojno učenje AWS