Artikli tõlge on ettevalmistatud kursuse alguseks
Jaotatud õppimine mitme kõrge jõudlusega arvutusüksuse peal võib vähendada kaasaegsete sügavate närvivõrkude treeninguaega suure hulga andmete korral nädalatest tundide või isegi minutiteni, muutes selle treeningutehnika domineerivaks sügava õppimise praktilistes rakendustes. Kasutajad peavad mõistma, kuidas andmeid mitmete instantside vahel jagada ja sünkroonida, mis omakorda mõjutab oluliselt skaleerimise efektiivsust. Lisaks peavad kasutajad teadma, kuidas juurutada treeninguskripti mitme instantsi peale, mis töötab ühel instantsil.
Selles artiklis räägime kiirest ja lihtsast jaotatud õppimise viisist, kasutades avatud sügava õppe teeki Apache MXNet ja jaotatud õppimise raami Horovod. Näitame selgelt Horovodi raami eeliseid jõudluses ja demonstreerime, kuidas kirjutada MXNet'i treeninguskript, et see töötaks jaotatult koos Horovodiga.
Mis on Apache MXNet
– avatud süvaõppe raamistik, mida kasutatakse sügavate närvivõrkude loomisel, koolitamisel ja juurutamisel. MXNet lihtsustab närvivõrkude realiseerimise keerukusi, pakub kõrget jõudlust ja skaleeritavust ning võimaldab kasutada API-sid populaarsetes programmeerimiskeeltes, nagu , , , , , , ja muu.
Jaotatud õppimine MXNetis koos parameeter serveriga
kasutab parameeter serveri lähenemist. See kasutab komplekti parameeter servereid gradientide kogumiseks iga töötaja (worker) juurest, tehes kogumise ja edastades uuendatud gradientid tagasi töötajatele järgmise optimeerimise iteratsiooni jaoks. Õige serverite ja töötajate suhe on tõhusa skaleerimise aluseks. Kui parameeter server on vaid üks, võib see osutuda arvutuste pudelikaelaks. Vastupidiselt, kui servereid on liiga palju, võib 'palju-kellelegi' ühendus ummistada kõik võrguühendused.
Mis on Horovod
– avatud jaotatud süvade õppimise raamistik, mis on välja töötatud Uberis. See kasutab tõhusaid tehnoloogiaid mitme GPU ja sõlme vaheliseks suhtlemiseks, nagu NVIDIA Collective Communications Library (NCCL) ja Message Passing Interface (MPI), et jagada ja koguda mudeli parameetreid tööriistade vahel. See optimeerib võrgu läbilaskevõime kasutamist ja skaibib hästi sügavate närvivõrkude mudelite töötlemisel. Praegu toetab see mitmeid populaarseid masinõppe raamistikku, nimelt , TensorFlow, Keras ja PyTorch.
MXNet ja Horovodi integreerimine
MXNet integreeritakse Horovodiga läbi jaotatud õppimise API-de, mis on määratletud Horovodis. Horovodis on kommunikatsiooni API-d horovod.broadcast(), horovod.allgather() ja horovod.allreduce() teostatud MXNetsi mootori asünkroonsete tagasisidefunktsioonide abil, mis on osa selle ülesande graafikust. Seega hallatakse andmete sõltuvusi suhtlemise ja arvutuste vahel kergelt MXNetsi mootori poolt, vältides jõudluse langust sünkroniseerimise tõttu. Horovodis määratletud objekt horovod.DistributedOptimizer laiendab Optimizer MXNet-i tuleb üles ehitada nii, et see kutsuks esile vastavad Horovod API-d parameetrite jaotatud värskendamiseks. Kõik need rakenduse üksikasjad on lõppkasutajatele läbipaistvad.
Kiire algus
Saate kiiresti alustada väikese konvolutsioonilise närvivõrgu õpetamist MNIST-andmestikul MXNet'i ja Horovodiga teie MacBookil.
Alustamiseks installige mxnet ja horovod PyPI-st:
pip install mxnet
pip install horovodMärkus: Kui teil tekib viga ajal pip install horovod, peate võib-olla lisama muutuja MACOSX_DEPLOYMENT_TARGET=10.vv, kus vv – see on teie MacOS-i versiooni versioon, näiteks MacOSX Sierra jaoks tuleb kirjutada MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod
Seejärel installige OpenMPI .
Lõpuks laadige alla testskript mxnet_mnist.py ja käivitage järgmised käsklused MacBooki terminalis töökataloogis:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyNii alustate õpetamist kahel teie protsessori tuumal. Väljundiks on järgmine:
INFO:root:Epoch[0] Batch [0-50] Speed: 2248.71 samples/sec accuracy=0.583640
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.89 samples/sec accuracy=0.882812
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.39 samples/sec accuracy=0.870000Tootlikkuse demonstreerimine
ResNet50-v1 mudeli õpetamine ImageNet andmestikul 64 GPU-l kaheksa eksemplariga p3.16xlarge EC2, kus igaühes on 8 GPU NVIDIA Tesla V100 AWS pilves, on jõudnud meie treeningu läbilaskevõime 45000 pilti/sek (st. treenitud proovide arv sekundis). Treening lõpetati 44 minuti pärast 90 epohhi juures parima täpsusega 75,7%.
Võrdlesime seda jaotatud treeninguga MXNet, kasutades parameetrite serverite lähenemist 8, 16, 32 ja 64 GPU puhul ühes parameetriserveris ning serverite ja töötajate suhet 1:1 ja 2:1 vastavalt. Tulemuse võite näha allpool olevast Joonisest 1. Y-teljel vasakul kajastavad ribad treenimise ajaliste piltide arvu sekundis, jooned peegeldavad skaleerimise efektiivsust (st. tegeliku läbilaskevõime suhet ideaalilises) Y-teljel paremal. Nagu näete, mõjutab valitud serverite arv skaleerimise efektiivsust. Kui parameetrite server on üks, langeb skaleerimise efektiivsus 64 GPU juures 38%-ni. Samasuguse skaleerimise efektiivsuse saavutamiseks nagu Horovodiga on vajalik suurendada serverite arvu kahekordselt töötajate arvuga võrreldes.

Joonis 1. Jagatud õppe võrdlus MXNet'i ja Horovod'i ning parameetrite serveriga
Tabelis 1 allpool võrdsustasime eksperimentide kogumaksumust 64 GPU-l. MXNet'i kasutamine koos Horovod'iga tagab parima läbilaskevõime madalaimate kuludega.

Tabel 1. Kulude võrdlus Horovod'i ja parameetrite serveri vahel serverite ja töötlusprotsesside suhtega 2:1.
Reprodutseerimise sammud
Järgmistes sammudes anname ülevaate, kuidas kinnitada jagatud õppe tulemusi MXNet'i ja Horovod'iga. Lisainformatsiooni saamiseks jagatud õppe kohta MXNet'iga, lugege .
Samm 1
Looge homogeensete eksemplaride klaster MXNet'i versiooniga 1.4.0 või uuem ja Horovod'i versiooniga 0.16.0 või uuem, et kasutada jagatud õppimist. Teil tuleb samuti installida GPU õppe raamatukogud. Meie eksemplaride jaoks valisime Ubuntu 16.04 Linuxi, GPU draiver 396.44, CUDA 9.2, cuDNN raamatukogu 7.2.1, NCCL 2.2.13 kommunikator ja OpenMPI 3.1.1. Samuti võite kasutada , kus need raamatukogud on juba eelnevalt installitud.
Samm 2
Lisage oma MXNet koolitusskripti Horovod API toega. Allpool esitatud skripti, mis põhineb MXNet Gluon API-l, saab kasutada lihtsa šabloonina. Rasvases kirjas olevad read on vajalikud, kui teil on juba vastav koolitusskript. Siin on mõned kriitilised muudatused, mida on vaja teha Horovodiga koolitamiseks:
- Seadke kontekst vastavusse Horovodi kohalikuga (rida 8), et mõista, et koolitus toimub õiges graafikatuumas.
- Edastage algparameetrid ühest tööst kõikidele (rida 18), et veenduda, et kõik tööd alustavad sama algsete parameetritega.
- Looge Horovod DistributedOptimizer (rida 25), et ajakohandada parameetreid jaotatult.
Täieliku skripti saamiseks vaadake Horovod-MXNet näiteid. ja .
1 import mxnet as mx
2 import horovod.mxnet as hvd
3
4 # Horovod: initialize Horovod
5 hvd.init()
6
7 # Horovod: pin a GPU to be used to local rank
8 context = mx.gpu(hvd.local_rank())
9
10 # Build model
11 model = ...
12
13 # Initialize parameters
14 model.initialize(initializer, ctx=context)
15 params = model.collect_params()
16
17 # Horovod: broadcast parameters
18 hvd.broadcast_parameters(params, root_rank=0)
19
20 # Create optimizer
21 optimizer_params = ...
22 opt = mx.optimizer.create('sgd', **optimizer_params)
23
24 # Horovod: wrap optimizer with DistributedOptimizer
25 opt = hvd.DistributedOptimizer(opt)
26
27 # Create trainer and loss function
28 trainer = mx.gluon.Trainer(params, opt, kvstore=None)
29 loss_fn = ...
30
31 # Train model
32 for epoch in range(num_epoch):
33 ...Samm 3
Logige ühte töötajat, et alustada jaotatud õpet, kasutades MPI direktiivi. Antud näites käivitatakse jaotatud õpe neljal eksemplaril, milles igas on 4 GPU, ja kokku 16 GPU klusteris. Kasutatakse stohhastilise gradientide langemise (SGD) optimeerijat järgmiste hüperparameetritega:
- mini-batch size: 256
- learning rate: 0.1
- momentum: 0.9
- weight decay: 0.0001
GPU-de arvust 64 GPU-ni skaleerimise ajal suutsime õppimiskiiruset lineaarselt kasvatada vastavalt GPU-arvule (0,1 1 GPU puhul kuni 6,4 64 GPU puhul), säilitades samas 256 kuva ühe GPU kohta (256 kuva pakist 1 GPU puhul kuni 16 384 64 GPU puhul). Varamise aegade kaalu ja momentum muutsime koos GPU arvu suurenemisega. Kasutasime segase täpsusega õppimist, kasutades vahetus andmetüüpi float16 otsest läbitungimist ja float32 gradientide jaoks, et kiirendada GPU NVIDIA Tesla võimeid float16 arvutuste tegemisel.
$ mpirun -np 16
-H server1:4,server2:4,server3:4,server4:4
-bind-to none -map-by slot
-mca pml ob1 -mca btl ^openib
python mxnet_imagenet_resnet50.pyKokkuvõte
Selles artiklis käsitleme skaleeritavat lähenemist jaotatud mudeli õppimisele Apache MXNet ja Horovodi abil. Näitame skaalamise efektiivsust ja kuluefektiivsust võrreldes parameetrite serveri lähenemisega ImageNeti andmestikul, kus koolitati mudelit ResNet50-v1. Samuti peegeldame samme, kuidas saate olemasolevat skripti muuta, et alustada mitme eksemplari õpetamist Horovodi abil.
Kui olete MXNet’i ja süvaõppega just alustamas, minge installimise lehele , et kõigepealt MXNet kokku panna. Soovitame tungivalt lugeda artiklit , et alustada tööd.
Kui olete juba töötanud MXNet’iga ja soovite proovida jaotatud õppetööd Horovodiga, siis külastage , seadistage see MXNet’iga ja järgige näidet või .
*hind arvutatakse AWS EC2 instantside jaoks
Tutvuge kursusega
Allikas: habr.com
