La traduko de la artikolo estis preparita sojle de la komenco de la kurso
Distribuita trejnado en multoblaj alt-efikecaj komputikaj okazoj povas redukti la trejnan tempon de modernaj profundaj neŭralaj retoj sur grandaj kvantoj da datumoj de semajnoj ĝis horoj aŭ eĉ minutoj, igante ĉi tiun trejnan teknikon ĝenerala en praktikaj aplikoj de profunda lernado. Uzantoj devas kompreni kiel kunhavigi kaj sinkronigi datumojn tra pluraj okazoj, kio siavice havas gravan efikon al skala efikeco. Krome, uzantoj ankaŭ devus scii kiel disfaldi trejnan skripton, kiu funkcias per ununura kazo al pluraj okazoj.
En ĉi tiu artikolo ni parolos pri rapida kaj facila maniero distribui lernadon uzante la malfermitan profundan lernadon bibliotekon Apache MXNet kaj la distribua lernado de Horovod. Ni klare montros la rendimentajn avantaĝojn de la kadro de Horovod kaj montros kiel verki MXNet-trejnan skripton por ke ĝi funkciu distribue kun Horovod.
Kio estas Apache MXNet
estas malfermfonta profunda lernadkadro kiu estas uzata por krei, trejni kaj disfaldi profundajn neŭralaj retoj. MXNet abstraktas la kompleksecojn asociitajn kun efektivigado de neŭralaj retoj, estas tre efika kaj skalebla, kaj ofertas API-ojn por popularaj programlingvoj kiel ekzemple , , , , , , kaj aliaj.
Distribuita trejnado en MXNet kun parametroservilo
uzas parametran servilan aliron. Ĝi uzas aron de parametro-serviloj por kolekti gradientojn de ĉiu laboristo, fari agregadon kaj sendi ĝisdatigitajn gradientojn reen al laboristoj por la sekva optimumiga ripeto. Determini la ĝustan rilatumon de serviloj al laboristoj estas la ŝlosilo al efika skalo. Se ekzistas nur unu parametroservilo, ĝi povas rezulti esti proplemkolo en la kalkuloj. Male, se tro da serviloj estas uzataj, multaj-al-multaj komunikado povas ŝtopi ĉiujn retajn konektojn.
Kio estas Horovod
estas malferma distribuita profunda lernadkadro evoluigita ĉe Uber. Ĝi utiligas efikajn trans-GPU kaj transnodajn teknologiojn kiel ekzemple NVIDIA Collective Communications Library (NCCL) kaj Message Passing Interface (MPI) por distribui kaj aldoni modelajn parametrojn tra vorecs. Ĝi optimumigas la uzon de reta bendolarĝo kaj skaliĝas bone kiam oni laboras kun profundaj neŭralaj retaj modeloj. Ĝi nuntempe subtenas plurajn popularajn maŝinlernadajn kadrojn, nome , Tensorflow, Keras, kaj PyTorch.
MXNet kaj Horovod integriĝo
MXNet integriĝas kun Horovod per la Distributed Learning APIoj difinitaj en Horovod. Horovod-komunikaj APIoj horovod.broadcast(), horovod.allgather() и horovod.allreduce() efektivigite uzante nesinkronajn revokojn de la MXNet-motoro, kiel parto de ĝia taskografo. Tiamaniere, datendependecoj inter komunikado kaj komputado estas facile pritraktitaj de la MXNet-motoro por eviti rendimentajn perdojn pro sinkronigado. Distribuita optimumiga objekto difinita en Horovod horovod.DistributedOptimizer vastiĝas Optimizilo en MXNet tiel ke ĝi vokas la respondajn Horovod-APIojn por distribuitaj parametraj ĝisdatigoj. Ĉiuj ĉi tiuj efektivigdetaloj estas travideblaj por finaj uzantoj.
Rapida komenco
Vi povas rapide komenci trejni malgrandan konvolucian neŭralan reton sur la MNIST-datumaro uzante MXNet kaj Horovod sur via MacBook.
Unue, instalu mxnet kaj horovod de PyPI:
pip install mxnet
pip install horovodNoto: Se vi renkontas eraron dum pip instali horovodeble vi devas aldoni variablon MACOSX_DEPLOYMENT_TARGET=10.vvkie vv – ĉi tiu estas la versio de via MacOS-versio, ekzemple, por MacOSX Sierra vi devos skribi MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod
Poste instalu OpenMPI .
Je la fino, elŝutu la testan skripton mxnet_mnist.py kaj rulu la jenajn komandojn en la MacBook-terminalo en la labordosierujo:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyĈi tio funkcios trejnadon sur du kernoj de via procesoro. La eligo estos la sekva:
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.870000Efikeco Demo
Dum trejnado de modelo ResNet50-v1 sur ImageNet-datumaro sur 64 GPU-oj kun ok okazoj p3.16xgranda EC2, ĉiu enhavanta 8 GPU-ojn NVIDIA Tesla V100 sur AWS-nubo, ni atingis trejnan trairon de 45000 bildoj/sek (t.e. la nombro da trejnitaj specimenoj je sekundo). Trejnado finiĝis en 44 minutoj post 90 epokoj kun plej bona precizeco de 75.7%.
Ni komparis ĉi tion kun la distribuita trejna aliro de MXNet de uzado de parametroserviloj sur 8, 16, 32 kaj 64 GPU-oj kun ununura parametra servilo kaj rilatumo de servilo al laboristo de 1 al 1 kaj 2 al 1, respektive. Vi povas vidi la rezulton en la figuro 1 sube. Sur la y-akso maldekstre, la stangoj reprezentas la nombron da bildoj por trejni je sekundo, la linioj reflektas la skalan efikecon (t.e., la rilatumon de fakta ĝis ideala trairo) sur la y-akso dekstre. Kiel vi povas vidi, la elekto de la nombro da serviloj influas la skalan efikecon. Se ekzistas nur unu parametra servilo, la skala efikeco falas al 38% sur 64 GPUoj. Por atingi la saman skalan efikecon kiel kun Horovod, vi devas duobligi la nombron da serviloj rilate al la nombro da laboristoj.

Figuro 1. Komparo de distribuita lernado uzante MXNet kun Horovod kaj kun parametroservilo
En Tabelo 1 malsupre, ni komparas la finan koston per okazo kiam oni faras eksperimentojn sur 64 GPUoj. Uzi MXNet kun Horovod provizas la plej bonan trairon je la plej malalta kosto.

Tablo 1. Kosta komparo inter Horovod kaj Parametro-Servilo kun rilatumo de servilo al laboristo de 2 ĝis 1.
Paŝoj por reprodukti
En la sekvaj paŝoj, ni montros al vi kiel reprodukti la rezulton de distribuita trejnado uzante MXNet kaj Horovod. Por lerni pli pri distribuita lernado kun MXNet legu .
paŝi 1
Kreu areton de homogenaj instancoj kun MXNet versio 1.4.0 aŭ pli alta kaj Horovod versio 0.16.0 aŭ pli alta por uzi distribuitan trejnadon. Vi ankaŭ devos instali la bibliotekojn por GPU-trejnado. Por niaj instancoj, ni elektis Ubuntu 16.04 Linux, kun GPU-pelilo 396.44, CUDA 9.2, cuDNN-biblioteko 7.2.1, NCCL-komunikilo 2.2.13 kaj OpenMPI 3.1.1. Vi ankaŭ povas uzi , kie ĉi tiuj bibliotekoj jam estas antaŭinstalitaj.
paŝi 2
Aldonu la kapablon labori kun la Horovod API al via MXNet-trejna skripto. La suba skripto bazita sur la MXNet Gluon API povas esti uzata kiel simpla ŝablono. La linioj en grasa skribo estas necesaj se vi jam havas respondan trejnan skripton. Jen kelkaj kritikaj ŝanĝoj, kiujn vi devas fari por lerni kun Horovod:
- Fiksu la kuntekston laŭ la loka Horovod-rango (linio 8) por kompreni, ke trejnado estas farita sur la ĝusta grafika kerno.
- Transdonu komencajn parametrojn de unu laboristo al ĉiuj (linio 18) por certigi, ke ĉiuj laboristoj komencu kun la samaj komencaj parametroj.
- Kreu Horovodon DistributedOptimizer (linio 25) por ĝisdatigi la parametrojn en distribuita maniero.
Por akiri la plenan skripton, bonvolu raporti al la ekzemploj de Horovod-MXNet и .
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 ...paŝi 3
Ensalutu al unu el la laboristoj por komenci distribuitan trejnadon uzante la MPI-direktivon. En ĉi tiu ekzemplo, distribuita trejnado funkcias en kvar okazoj kun 4 GPU-oj ĉiu, kaj entute 16 GPU-oj en la areto. La stokasta Gradient Descent (SGD) optimumiganto estos uzata kun la sekvaj hiperparametroj:
- grandeco de mini-aroj: 256
- lernoprocento: 0.1
- impeto: 0.9
- malpliiĝo de pezo: 0.0001
Dum ni grimpis de unu GPU al 64 GPU-oj, ni linie skalis la trejnadon laŭ la nombro da GPU-oj (de 0,1 por 1 GPU al 6,4 por 64 GPU-oj), konservante la nombron da bildoj per GPU ĉe 256 (de aro de 256 bildoj por 1 GPU al 16 por 384 GPU-oj). La parametroj de pezo kaj impeto ŝanĝiĝis dum la nombro da GPUoj pliiĝis. Ni uzis miksitan precizecan trejnadon kun la datumtipo float64 por la antaŭa paŝo kaj float16 por gradientoj por akceli la float32-kalkulojn subtenatajn de NVIDIA Tesla GPU-oj.
$ 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.pykonkludo
En ĉi tiu artikolo, ni rigardis skaleblan aliron al distribuita modeltrejnado uzante Apache MXNet kaj Horovod. Ni pruvis la skalan efikecon kaj kostefikecon kompare kun la parametro-servila aliro sur la ImageNet-datumaro sur kiu la modelo ResNet50-v1 estis trejnita. Ni ankaŭ inkludis paŝojn, kiujn vi povas uzi por modifi ekzistantan skripton por ekzekuti plur-instancan trejnadon per Horovod.
Se vi ĵus komencas kun MXNet kaj profunda lernado, iru al la instala paĝo unue konstrui MXNet. Ni ankaŭ forte rekomendas legi la artikolon por komenci.
Se vi jam laboris kun MXNet kaj volas provi distribuitan lernadon kun Horovod, tiam rigardu , konstruu ĝin el MXNet kaj sekvu la ekzemplon aŭ .
*kosto estas kalkulita surbaze de AWS por EC2-Instancoj
Lernu pli pri la kurso
fonto: www.habr.com
