Jaotatud Ôppimine Apache MXNet ja Horovodiga

Artikli tĂ”lge on koostatud kursuse alguse eelĂ”htul „Tööstuslik ML suurte andmete jaoks“

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

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 Python, C++, Clojure, Java, Julia, R, Scala ja teised.

Jaotatud Ôppimine MXNetis parametrite serveriga

MXNeti standardne jaotatud Ă”ppimise moodul 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

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 MXNet, 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 horovod

MÀ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 siit.

LÔpuks laadige allalaadimisse skript mxnet_mnist.py siit 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.py

Nii 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.870000

TÔ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.

Jaotatud Ôppimine Apache MXNet ja Horovodiga
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.

Jaotatud Ôppimine Apache MXNet ja Horovodiga
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 seda postitust.

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 Amazon Deep Learning AMI, 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 MNIST ja ImageNet.

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.py

KokkuvÔ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 MXNe, et kĂ”igepealt MXNet kokku panna. Soovitame tungivalt tutvuda artikliga MXNet 60 minutiga, et alustada.

Kui olete juba töötanud MXNet'iga ja soovite proovida jaotatud Ôppimist Horovodiga, siis vaadake Horovod'i installimise lehte, koguge see MXNet'i abil ja jÀrgige nÀidet MNIST vÔi ImageNet.

*hind arvutatakse tunnitasu AWS EC2 eksemplaride jaoks

Pi-KVM — avatud IP-KVM projekt Raspberry Pi-l „Tööstuslik ML suurte andmete jaoks“

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster