Artikli tÔlge on koostatud kursuse alguse eelÔhtul
Jaotatud Ă”ppimine mitmetel kĂ”rgetasemelistel arvutusinstantsidel vĂ”ib vĂ€hendada kaasaegsete sĂŒvaĂ”ppe neuronaalvĂ”rkude koolitusaega suure hulga andmete puhul nĂ€dalatest tundide vĂ”i isegi minutiteni, mis muudab selle Ă”ppe tehnika ĂŒlekaalukaks sĂŒvaĂ”ppe praktilistes rakendustes. Kasutajad peavad mĂ”istma, kuidas jagada ja sĂŒnkroonida andmeid mitmetel instantsidel, mis omakorda mĂ”jutab oluliselt skaleeritavuse efektiivsust. Peale selle peavad kasutajad ka teadma, kuidas mitmel instantsil kĂ€ivitada koolitusskripti, mis töötab ĂŒhel instantsil.
Selles artiklis rÀÀgime kiirest ja lihtsast jaotatud Ă”ppimise viisist avatud sĂŒvaĂ”ppe raamatukogu Apache MXNet ja jaotatud Ă”ppimise raamistik Horovod kasutades. NĂ€itame selgelt, kuidas Horovodi raamistik parandab sooritust ja demonstreerime, kuidas kirjutada MXNet-i koolitusskript nii, et see töötaks jaotatult koos Horovodiga.
Mis on Apache MXNet
on avatud sĂŒvaĂ”ppe raamistik, mida kasutatakse sĂŒgavate neuronaalvĂ”rkude loomise, koolitamise ja juurutamise jaoks. MXNet abstraheerib sĂŒvaĂ”ppe neuronvĂ”rkude rakendamisega seotud keerukused, omab kĂ”rget sooritust ja skaleeritavust ning pakub API-d populaarsetele programmeerimiskeeltele, nagu , , , , , , ja teised.
Jaotatud Ôppimine MXNetis parametrite serveriga
kasutab parameetri serveri lĂ€henemist (parameter server). See kasutab parameetri serverite komplekti gradientide kogumiseks igalt töötajalt, aggregaatimiseks ja uute gradientide saatmiseks tagasi töötajatele jĂ€rgmise optimeerimise iteratsiooni jaoks. Ăige suhe serverite ja töötajate vahel on tĂ”husate skaleerimisvĂ”imaluste vĂ”ti. Kui parameetri server on vaid ĂŒks, vĂ”ib see kujuneda arvutuste pudelikaelaks. Vastupidi, kui on liiga palju servereid, vĂ”ib "palju-paljudele" side kĂ”ik vĂ”rguĂŒhendused ummistada.
Mis on Horovod
on avatud lĂ€htekoodiga jaotatud sĂŒgavĂ”ppe raamistik, mille on vĂ€lja töötanud Uber. See kasutab tĂ”husaid tehnoloogiaid, et suhelda mitme GPU ja sĂ”lme vahel, nagu NVIDIA Collective Communications Library (NCCL) ja Message Passing Interface (MPI) mudeli parameetride jaotamiseks ja aggregaatimiseks töötajate vahel. See optimeerib vĂ”rgu ribalaiuse kasutust ja skaleerub hĂ€sti sĂŒgavate nĂ€rvivĂ”rkude mudelite töötamisel. Praegu toetab see mitmeid populaarsed masinĂ”ppe raamistikke, nimelt , Tensorflow, Keras ja PyTorch.
MXNet ja Horovodi integreerimine
MXNet integreerub Horovodiga jaotatud Ă”ppimise API-de kaudu, mis on mÀÀratletud Horovodis. Horovodis on suhtluse API-d horovod.broadcast(), horovod.allgather() ja horovod.allreduce() rakendatud MXNet-i mootori asĂŒnkroonsete tagasisidega, kui osa oma ĂŒlesande graafikust. Seega töötleb MXNet kiiresti andmete sĂ”ltuvusi suhtlemise ja arvutuste vahel, et vĂ€ltida jĂ”udluse kaotust sĂŒnkroniseerimise tĂ”ttu. Horovodis mÀÀratletud jagatud optimeerija objekt horovod.DistributedOptimizer laiendab Optimizer MXNetis nii, et see kutsub ĂŒles vastavad Horovodi API-d parameetrite jaotatud uuendamiseks. Need kĂ”ik rakenduse detailid on lĂ”pukasutajate jaoks lĂ€bipaistvad.
Kiire alustamine
Sa saad kiiresti alustada vÀikese konvolutsioonilise nÀrvivÔrgu koolitamist MNIST andmestikul MXNeti ja Horovodiga oma MacBookis.
KĂ€ivitamiseks installige mxnet ja horovod PyPI kaudu:
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 on teie MacOS-i versioon, nÀiteks MacOSX Sierra jaoks tuleb kirjutada MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod
SeejÀrel installige OpenMPI .
LÔpuks laadige allalaadimisse skript mxnet_mnist.py ja kÀivitage jÀrgmised kÀsud MacBooki terminalis oma töötavas kataloogis:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyNii kÀitate koolitust teie protsessori kahel tuumal. VÀljund 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.870000TÔhususe demonstreerimine
Koolitades mudelit ResNet50-v1 ImageNet andmekogul 64 GPU-l kaheksa eksemplariga p3.16xlarge EC2, millest igaĂŒhel on 8 GPU NVIDIA Tesla V100 AWS pilves, saavutasime koolituse lĂ€bilaskevĂ”ime 45000 pilti/sec (st koolitatud nĂ€idiste arv sekundis). Koolitus lĂ”ppes 44 minuti pĂ€rast 90 epohhi ja parima tĂ€psusega 75,7%.
VĂ”rdlesime seda jaotatud koolitust MXNet-i puhul, kasutades parameetrite serverite lĂ€henemist 8, 16, 32 ja 64 GPU-l ĂŒhe parameetri serveriga ja teenuste töötajate suhe 1:1 ja 2:1 vastavalt. Tulemuse nĂ€ete allpool joonisel 1. Y-teljel vasakul kajastavad tulpade arv sekundis koolitamiseks pilte, jooned kajastavad skaleerimise efektiivsust (st tegeliku lĂ€bilaskevĂ”ime ja ideaalsete suhet) paremal Y-teljel. Nagu nĂ€ete, mĂ”jutab serverite arvu valik skaleerimise efektiivsust. Kui parameetri server on ĂŒks, langeb skaleerimise efektiivsus 64 GPU-l 38%-ni. Horovodiga sama skaleerimise efektiivsuse saavutamiseks peate suurendama serverite arvu kaks korda töötajate arvu suhtes.

Joonis 1. MXNet ja Horovod-i jaotatud koolituse ning parameetrite serveriga vÔrreldav joonis
Tabelis 1 allpool vÔrreldes eksperimentide lÔppkulusid 64 GPU-l. MXNet-i kasutamine koos Horovodiga tagab parima lÀbilaskevÔime madalaimate kuludega.

Tabel 1. Kulude vÔrdlemine Horovod-i ja parameetrite serveriga, kasutades teenuste töötajate suhet 2:1.
Reprodutseerimise sammud
JÀrgmistes sammudes nÀitame, kuidas reprodutseerida jaotatud koolituse tulemusi MXNet-i ja Horovod-i abil. Jaotatud koolituse kohta MXNet-i puhul lugeda .
Samm 1
Looge ĂŒhtsete instantside klaster, kasutades MXNet versiooni 1.4.0 vĂ”i kĂ”rgemat ja Horovod versiooni 0.16.0 vĂ”i kĂ”rgemat, et kasutada jaotatud Ă”ppimist. Samuti peate installima GPU Ă”ppe raamatukogud. Meie instantside jaoks valisime Ubuntu 16.04 Linuxi, GPU draiveri 396.44, CUDA 9.2, cuDNN 7.2.1, NCCL 2.2.13 ja OpenMPI 3.1.1. Samuti saate kasutada , kus need raamatukogud on juba eelnevalt installitud.
Samm 2
Lisage oma Ôppeskripti MXNet'i toetuse vÔimalus Horovod API jaoks. JÀrgnevat MXNet Gluoni API pÔhjal koostatud skripti saab kasutada lihtsa mallina. Rasvases kirjas olevad read on vajalikud juhul, kui teil on juba sobiv Ôppescript. Siin on mÔned kriitilised muudatused, mida tuleb teha Horovodiga Ôppimiseks:
- Seadke kontekst vastavalt Horovodi kohalikule jÀrjestusele (rida 8), et mÔista, et Ôppimine toimub Ôiges graafikus.
- Kandke algparameetrid ĂŒhest töötlusmasinast kĂ”ikidele (rida 18), et veenduda, et kĂ”ik töötlusmasinad alustavad sama vÀÀrtusega algparameetritega.
- Looge Horovod DistributedOptimizer (rida 25), et parameetreid jaotatult uuendada.
Kogu skripti saamiseks tutvuge Horovod-MXNet nÀidetega 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öötlusmasinasse, et alustada jaotatud Ă”ppimist MPI direktiivi abil. Antud nĂ€ites kĂ€ivitatakse jaotatud Ă”pe neljal instantsil, milles igas on 4 GPU ja kokku 16 GPU klastris. Kasutatakse stohhastilise gradientide laskmise (SGD) optimeerijat jĂ€rgmiste hĂŒperparameetritega:
- mini-batch suurus: 256
- ÔppemÀÀr: 0.1
- moment: 0.9
- kaalu dekadeerimine: 0.0001
GPU-dest 1 GPU-lt 64 GPU-ni skaleerimise kÀigus suutsime me lineaarset Ôppimiskiiruse skaleerimist vastavalt GPU-de arvule (0,1 1 GPU-lt kuni 6,4 64 GPU-ni), sÀilitades samal ajal, et iga GPU kohta jÀÀb 256 pilti (256 pildi partii 1 GPU-lt kuni 16 384 64 GPU-ni). Kaalude lagunemise ja hetkemomendi parameetreid muudeti vastavalt GPU-de arvu suurenemisele. Kasutasime segatud tÀpsuse Ôppimist, kasutades andmeformaati float16 otse edasi ja float32 gradientide jaoks, et kiirendada GPU NVIDIA Tesla poolt toetatud float16 arvutusi.
$ 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 vaatlesime jagatavat lĂ€henemist mudeli jaotatud Ă”ppimisele, kasutades Apache MXNet'i ja Horovod'i. NĂ€itasime skaleerimise efektiivsust ja majanduslikku tasuvust vĂ”rreldes mudelitĂ€htaja lĂ€henemisega ImageNet andmestikul, mille pĂ”hjal koolitati mudelit ResNet50-v1. Samuti andsime ĂŒlevaate sammudest, kuidas saate muuta juba olemasolevat skripti, et alustada mitme eksemplari koolitamist Horovodiga.
Kui olete MXNet'i ja sĂŒvaĂ”ppega alles alustamas, minge installimise lehele , et kĂ”igepealt MXNet kokku panna. Soovitame tungivalt tutvuda artikliga , et alustada.
Kui olete juba töötanud MXNet'iga ja soovite proovida jaotatud Ôppimist Horovodiga, siis vaadake , koguge see MXNet'i abil ja jÀrgige nÀidet vÔi .
*hind arvutatakse AWS EC2 eksemplaride jaoks
Pi-KVM â avatud IP-KVM projekt Raspberry Pi-l
Allikas: habr.com
