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
Distribuita trejnado en MXNet kun parametroservilo
Kio estas Horovod
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
Je la fino, elŝutu la testan skripton mxnet_mnist.py
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.
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 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
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.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
Se vi jam laboris kun MXNet kaj volas provi distribuitan lernadon kun Horovod, tiam rigardu
*kosto estas kalkulita surbaze de
Lernu pli pri la kurso
fonto: www.habr.com