Distribuita Lernado kun Apache MXNet kaj Horovod

La traduko de la artikolo estis preparita sojle de la komenco de la kurso "Industria ML pri Grandaj Datumoj"

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

Apache MX Net 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 python, C ++, Clojure, java, Julia, R, Scala kaj aliaj.

Distribuita trejnado en MXNet kun parametroservilo

Norma distribuita lernmodulo en MXNet 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

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 MX Net, 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 horovod

Noto: 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 de ĉi tie.

Je la fino, elŝutu la testan skripton mxnet_mnist.py de ĉi tie 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.870000

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

Distribuita Lernado kun Apache MXNet kaj Horovod
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.

Distribuita Lernado kun Apache MXNet kaj Horovod
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 ĉi tiu afiŝo.

paŝi 1

Kreu aron de homogenaj okazoj kun MXNet-versio 1.4.0 aŭ pli alta kaj Horovod-versio 0.16.0 aŭ pli alta por uzi distribuitan lernadon. Vi ankaŭ devos instali bibliotekojn por trejnado de GPU. Por niaj kazoj, ni elektis Ubuntu 16.04 Linukso, kun GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 biblioteko, NCCL 2.2.13 komunikilo kaj OpenMPI 3.1.1. Ankaŭ vi povas uzi Amazon Deep Learning AMI, 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 MNIST и 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    ...

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

konkludo

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 MXNeunue konstrui MXNet. Ni ankaŭ forte rekomendas legi la artikolon MXNet en 60 minutojpor komenci.

Se vi jam laboris kun MXNet kaj volas provi distribuitan lernadon kun Horovod, tiam rigardu Paĝo pri instalado de Horovod, konstruu ĝin el MXNet kaj sekvu la ekzemplon MNISTImageNet.

*kosto estas kalkulita surbaze de horaj tarifoj AWS por EC2-Instancoj

Lernu pli pri la kurso "Industria ML pri Grandaj Datumoj"

fonto: www.habr.com

Aldoni komenton