Artikli tÔlge valmis kursuse alguse eelÔhtul
Jaotatud koolitus mitmel suure jĂ”udlusega andmetöötluseksemplaril vĂ”ib vĂ€hendada kaasaegsete sĂŒgavate nĂ€rvivĂ”rkude koolitusaega suurte andmemahtude korral nĂ€dalatest tundideks vĂ”i isegi minutiteks, muutes selle koolitustehnika levinud sĂŒvaĂ”ppe praktilistes rakendustes. Kasutajad peavad mĂ”istma, kuidas jagada ja sĂŒnkroonida andmeid mitme eksemplari vahel, mis omakorda mĂ”jutab oluliselt skaleerimise tĂ”husust. Lisaks peaksid kasutajad teadma, kuidas juurutada koolitusskripti, mis töötab ĂŒhel eksemplaril, mitmes eksemplaris.
Selles artiklis rÀÀgime kiirest ja lihtsast viisist Ă”ppe levitamiseks avatud sĂŒvaĂ”ppeteegi Apache MXNet ja Horovodi hajutatud Ă”pperaamistiku abil. NĂ€itame selgelt Horovodi raamistiku jĂ”udluse eeliseid ja nĂ€itame, kuidas kirjutada MXNeti koolitusskripti nii, et see töötaks koos Horovodiga hajutatud viisil.
Mis on Apache MXNet
on avatud lĂ€htekoodiga sĂŒvaĂ”pperaamistik, mida kasutatakse sĂŒgavate nĂ€rvivĂ”rkude loomiseks, koolitamiseks ja juurutamiseks. MXNet vĂ”tab kokku nĂ€rvivĂ”rkude rakendamisega seotud keerukuse, on suure jĂ”udlusega ja skaleeritav ning pakub API-sid populaarsete programmeerimiskeelte jaoks, nagu nĂ€iteks , , , , , , ja teised.
Jagatud koolitus MXNetis koos parameetriserveriga
kasutab parameetriserveri lĂ€henemist. See kasutab parameetriserverite komplekti, et koguda gradiente igalt töötajalt, teostada liitmist ja saata vĂ€rskendatud gradiente töötajatele jĂ€rgmise optimeerimise iteratsiooni jaoks. Serverite ja töötajate Ă”ige suhte mÀÀramine on tĂ”husa skaleerimise vĂ”ti. Kui on ainult ĂŒks parameetriserver, vĂ”ib see osutuda arvutustes kitsaskohaks. Ja vastupidi, kui kasutatakse liiga palju servereid, vĂ”ib mitu-mitmele suhtlus ummistada kĂ”ik vĂ”rguĂŒhendused.
Mis on Horovod
on avatud hajutatud sĂŒvaĂ”ppe raamistik, mis on vĂ€lja töötatud Uberis. See kasutab tĂ”husaid GPU ja sĂ”lmedevahelisi tehnoloogiaid, nagu NVIDIA Collective Communications Library (NCCL) ja Message Passing Interface (MPI), et levitada ja koondada mudeli parameetreid vorecide vahel. See optimeerib vĂ”rgu ribalaiuse kasutamist ja skaleerib hĂ€sti sĂŒgava nĂ€rvivĂ”rgu mudelitega töötamisel. See toetab praegu mitmeid populaarseid masinĂ”ppe raamistikke, nimelt , Tensorflow, Keras ja PyTorch.
MXNeti ja Horovodi integratsioon
MXNet integreerub Horovodiga Horovodis mÀÀratletud hajutatud Ă”ppe API-de kaudu. Horovodi side API-d horovod.broadcast(), horovod.allgather() Đž horovod.allreduce() rakendatakse MXNeti mootori asĂŒnkroonsete tagasihelistamiste abil selle ĂŒlesannete graafiku osana. Sel viisil saab MXNeti mootor hĂ”lpsasti kĂ€sitleda andmeside ja arvutuste vahelisi sĂ”ltuvusi, et vĂ€ltida sĂŒnkroonimisest tulenevat jĂ”udluse kadu. Horovodis mÀÀratletud hajutatud optimeerija objekt horovod.DistributedOptimizer laieneb Optimeerija MXNetis, nii et see kutsub hajutatud parameetrite vĂ€rskendamiseks vastavaid Horovodi API-sid. KĂ”ik need rakenduse ĂŒksikasjad on lĂ”ppkasutajatele lĂ€bipaistvad.
Kiire algus
Saate kiiresti alustada vÀikese konvolutsioonilise nÀrvivÔrgu treenimist MNIST-i andmestikul, kasutades oma MacBookis MXNeti ja Horovodi.
Esmalt installige PyPI-st mxnet ja horovod:
pip install mxnet
pip install horovodMĂ€rkus. Kui ilmneb tĂ”rge ajal pip install horovodvĂ”ib-olla peate lisama muutuja MACOSX_DEPLOYMENT_TARGET=10.vvKus vv â see on teie MacOS-i versiooni versioon, nĂ€iteks MacOSX Sierra jaoks peate kirjutama MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod
SeejÀrel installige OpenMPI .
LÔpuks laadige alla testskript mxnet_mnist.py ja kÀivitage töökataloogis MacBooki terminalis jÀrgmised kÀsud:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pySee kÀivitab koolituse 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.870000Esituse demo
ResNet50-v1 mudeli treenimisel ImageNeti andmestikul 64 GPU-l kaheksa eksemplariga p3.16xsuur EC2, millest igaĂŒks sisaldab 8 NVIDIA Tesla V100 GPU-d AWS-i pilves, saavutasime treeningu lĂ€bilaskevĂ”ime 45000 44 pilti sekundis (st treenitud nĂ€idiste arv sekundis). Treening lĂ€biti 90 minutiga pĂ€rast 75.7 epohhi parima tĂ€psusega XNUMX%.
VĂ”rdlesime seda MXNeti hajutatud koolitusmeetodiga, mille kohaselt kasutatakse parameetriservereid 8, 16, 32 ja 64 GPU-l ĂŒhe parameetriga serveriga ning serveri ja töötaja suhe on vastavalt 1:1 ja 2:1. Tulemust nĂ€ete alloleval joonisel 1. Vasakpoolsel y-teljel tĂ€histavad tulbad sekundis treenitavate piltide arvu, jooned peegeldavad skaleerimise efektiivsust (st tegeliku ja ideaalse lĂ€bilaskevĂ”ime suhet) paremal y-teljel. Nagu nĂ€ete, mĂ”jutab serverite arvu valik skaleerimise efektiivsust. Kui on ainult ĂŒks parameetriserver, langeb skaleerimise efektiivsus 38 GPU puhul 64%-ni. Samasuguse skaleerimise efektiivsuse saavutamiseks nagu Horovodi puhul peate serverite arvu töötajate arvuga vĂ”rreldes kahekordistama.

Joonis 1. Hajutatud Ôppe vÔrdlus MXNeti ja Horovodi ja parameetriserveriga
Allolevas tabelis 1 vÔrdleme eksemplari lÔplikku maksumust katsete tegemisel 64 GPU-ga. MXNeti kasutamine koos Horovodiga tagab parima lÀbilaskevÔime madalaima kuluga.

Tabel 1. Horovodi ja parameetriserveri kulude vÔrdlus serveri ja töötaja suhtega 2:1.
Paljundamise sammud
JÀrgmistes sammudes nÀitame teile, kuidas MXNeti ja Horovodi abil hajutatud treeningu tulemusi reprodutseerida. MXNeti abil hajutatud Ôppimise kohta lisateabe saamiseks lugege .
Samm 1
Hajutatud treeningu kasutamiseks looge homogeensetest eksemplaridest koosnev klaster, kasutades MXNeti versiooni 1.4.0 vÔi uuemat ja Horovodi versiooni 0.16.0 vÔi uuemat. Samuti peate installima GPU-treeningu teegid. Meie eksemplaride jaoks valisime Ubuntu 16.04 Linux, GPU draiveriga 396.44, CUDA 9.2, cuDNN teegiga 7.2.1, NCCL kommunikaatoriga 2.2.13 ja OpenMPI 3.1.1. VÔite kasutada ka , kus need teegid on juba eelinstallitud.
Samm 2
Lisage oma MXNeti treeningskriptile vÔimalus töötada koos Horovodi API-ga. Allolevat MXNet Gluoni API-l pÔhinevat skripti saab kasutada lihtsa mallina. Paksus read on vajalikud, kui teil on juba vastav koolitusskript. Siin on mÔned olulised muudatused, mida peate Horovodiga Ôppimiseks tegema:
- Seadke kontekst vastavalt kohalikule Horovodi auastmele (rida 8), et mÔista, et koolitus viiakse lÀbi Ôigel graafikatuumal.
- Edastage algparameetrid ĂŒhelt töötajalt kĂ”igile (rida 18), et kĂ”ik töötajad alustaksid samade algparameetritega.
- Looge Horovod DistributedOptimizer (rida 25), et vÀrskendada parameetreid hajutatud viisil.
TÀieliku skripti saamiseks vaadake Horovod-MXNeti nÀiteid О .
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
MPI direktiivi abil hajutatud koolituse alustamiseks logige sisse ĂŒhe töötaja juurde. Selles nĂ€ites töötab hajutatud koolitus neljal eksemplaril, millest igaĂŒhes on 4 GPU-d ja klastris kokku 16 GPU-d. Stochastic Gradient Descent (SGD) optimeerijat kasutatakse jĂ€rgmiste hĂŒperparameetritega:
- minipartii suurus: 256
- Ôppimise mÀÀr: 0.1
- hoog: 0.9
- kaalulangus: 0.0001
Kui me skaleerisime ĂŒhelt GPU-lt 64-le GPU-le, skaleerisime treeningkiirust lineaarselt vastavalt GPU-de arvule (0,1-lt 1 GPU-le 6,4-le 64-le GPU-le), hoides samal ajal piltide arvu GPU kohta 256-l (kogust 256 pilti 1 GPU jaoks kuni 16 384 pilti 64 GPU jaoks). Kaalu vĂ€henemise ja impulsi parameetrid muutusid GPU-de arvu suurenedes. NVIDIA Tesla GPU-de toetatud float16 arvutuste kiirendamiseks kasutasime segatud tĂ€psustreeningut andmetĂŒĂŒbiga float32 edasipÀÀsu jaoks ja float16 gradientide jaoks.
$ 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.pyJĂ€reldus
Selles artiklis vaatlesime hajutatud mudelikoolituse skaleeritavat lÀhenemisviisi Apache MXNeti ja Horovodi abil. NÀitasime skaleerimise tÔhusust ja kulutasuvust vÔrreldes parameetriserveri lÀhenemisviisiga ImageNeti andmekogumis, mille pÔhjal ResNet50-v1 mudelit koolitati. Oleme lisanud ka sammud, mida saate kasutada olemasoleva skripti muutmiseks, et kÀivitada Horovodi abil mitme eksemplari koolitust.
Kui te alles alustate MXNeti ja sĂŒvaĂ”ppega, minge installilehele et kĂ”igepealt ehitada MXNet. Samuti soovitame tungivalt artiklit lugeda alustamiseks.
Kui olete juba MXNetiga töötanud ja soovite Horovodiga hajutatud Ôpet proovida, siis vaadake , looge see MXNetist ja jÀrgige eeskuju vÔi .
*kulu arvutatakse lÀhtuvalt AWS EC2 eksemplaride jaoks
Lisateavet kursuse kohta
Allikas: www.habr.com
