Raksta tulkojums tika sagatavots kursu sÄkuma priekÅ”vakarÄ
SadalÄ«ta apmÄcÄ«ba vairÄkos augstas veiktspÄjas skaitļoÅ”anas gadÄ«jumos var samazinÄt mÅ«sdienu dziļo neironu tÄ«klu apmÄcÄ«bas laiku lielÄ datu apjomÄ no nedÄļÄm lÄ«dz stundÄm vai pat minÅ«tÄm, padarot Å”o apmÄcÄ«bas metodi izplatÄ«tu dziļÄs mÄcÄ«Å”anÄs praktiskÄs pielietojumos. LietotÄjiem ir jÄsaprot, kÄ koplietot un sinhronizÄt datus vairÄkos gadÄ«jumos, kas savukÄrt bÅ«tiski ietekmÄ mÄrogoÅ”anas efektivitÄti. TurklÄt lietotÄjiem bÅ«tu arÄ« jÄzina, kÄ vairÄkÄs instancÄs izvietot apmÄcÄ«bu skriptu, kas darbojas vienÄ instancÄ.
Å ajÄ rakstÄ mÄs runÄsim par Ätru un vienkÄrÅ”u veidu, kÄ izplatÄ«t mÄcÄ«Å”anos, izmantojot atvÄrto dziļÄs apmÄcÄ«bas bibliotÄku Apache MXNet un Horovod izplatÄ«to mÄcÄ«bu sistÄmu. MÄs skaidri parÄdÄ«sim Horovod sistÄmas veiktspÄjas priekÅ”rocÄ«bas un parÄdÄ«sim, kÄ uzrakstÄ«t MXNet apmÄcÄ«bas skriptu, lai tas darbotos izplatÄ«tÄ veidÄ ar Horovod.
Kas ir Apache MXNet
SadalÄ«ta apmÄcÄ«ba MXNet ar parametru serveri
Kas ir Horovod
MXNet un Horovod integrÄcija
MXNet integrÄjas ar Horovod, izmantojot Horovod definÄtos Distributed Learning API. Horovod komunikÄcijas API horovod.broadcast(), horovod.allgather() Šø horovod.allreduce() ieviests, izmantojot MXNet dzinÄja asinhronos atzvanus kÄ daļu no tÄ uzdevumu diagrammas. TÄdÄ veidÄ MXNet dzinÄjs viegli apstrÄdÄ datu atkarÄ«bas starp saziÅu un aprÄÄ·iniem, lai izvairÄ«tos no veiktspÄjas zudumiem sinhronizÄcijas dÄļ. IzplatÄ«ts optimizÄtÄja objekts, kas definÄts HorovodÄ horovod.DistributedOptimizer izpleÅ”as OptimizÄtÄjs MXNet, lai tas izsauktu atbilstoÅ”Äs Horovod API izplatÄ«tajiem parametru atjauninÄjumiem. Visa Ŕī ievieÅ”anas informÄcija ir pÄrredzama galalietotÄjiem.
Ätrs sÄkums
Varat Ätri sÄkt apmÄcÄ«t nelielu konvolucionÄlo neironu tÄ«klu MNIST datu kopÄ, izmantojot MXNet un Horovod savÄ MacBook.
Vispirms instalÄjiet mxnet un horovod no PyPI:
pip install mxnet
pip install horovod
PiezÄ«me: ja rodas kļūda laikÄ pip instalÄt horovodvarbÅ«t jÄpievieno mainÄ«gais MACOSX_DEPLOYMENT_TARGET=10.vvKur vv ā Ŕī ir jÅ«su MacOS versijas versija, piemÄram, MacOSX Sierra jums bÅ«s jÄraksta MACOSX_DEPLOYMENT_TARGET=10.12 pip instalÄÅ”anas horovod
PÄc tam instalÄjiet OpenMPI
BeigÄs lejupielÄdÄjiet testa skriptu mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
TÄdÄjÄdi tiks veikta apmÄcÄ«ba divos procesora kodolos. Izvade bÅ«s Å”Äda:
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
Izpildes demonstrÄcija
ApmÄcot ResNet50-v1 modeli ImageNet datu kopÄ 64 GPU ar astoÅiem gadÄ«jumiem p3.16xlarge EC2, katrs satur 8 NVIDIA Tesla V100 GPU AWS mÄkonÄ«, mÄs sasniedzÄm apmÄcÄ«bas caurlaidspÄju 45000 44 attÄlu/sek (t.i., apmÄcÄ«to paraugu skaitu sekundÄ). ApmÄcÄ«ba tika pabeigta 90 minÅ«tÄs pÄc 75.7 epochiem ar labÄko precizitÄti XNUMX%.
MÄs to salÄ«dzinÄjÄm ar MXNet izplatÄ«to apmÄcÄ«bas pieeju, izmantojot parametru serverus 8, 16, 32 un 64 GPU ar viena parametra serveri un servera un darbinieka attiecÄ«bu attiecÄ«gi 1:1 un 2:1. RezultÄtu var redzÄt 1. attÄlÄ zemÄk. Uz y ass kreisajÄ pusÄ joslas attÄlo attÄlu skaitu, kas jÄapmÄca sekundÄ, lÄ«nijas atspoguļo mÄrogoÅ”anas efektivitÄti (tas ir, faktiskÄs un ideÄlÄs caurlaidspÄjas attiecÄ«bu) uz y ass labajÄ pusÄ. KÄ redzat, serveru skaita izvÄle ietekmÄ mÄrogoÅ”anas efektivitÄti. Ja ir tikai viens parametru serveris, mÄrogoÅ”anas efektivitÄte samazinÄs lÄ«dz 38% 64 GPU. Lai sasniegtu tÄdu paÅ”u mÄrogoÅ”anas efektivitÄti kÄ ar Horovod, jums ir nepiecieÅ”ams dubultot serveru skaitu attiecÄ«bÄ pret darbinieku skaitu.
1. attÄls. IzkliedÄtÄs mÄcÄ«Å”anÄs salÄ«dzinÄjums, izmantojot MXNet ar Horovod un ar parametru serveri
TÄlÄk esoÅ”ajÄ 1. tabulÄ mÄs salÄ«dzinÄm galÄ«gÄs izmaksas par vienu gadÄ«jumu, veicot eksperimentus ar 64 GPU. Izmantojot MXNet ar Horovod, tiek nodroÅ”inÄta vislabÄkÄ caurlaidspÄja par zemÄkajÄm izmaksÄm.
1. tabula. Izmaksu salÄ«dzinÄjums starp Horovod un Parameter Server ar servera un darbinieku attiecÄ«bu 2 pret 1.
ReproducÄÅ”anas soļi
NÄkamajÄs darbÄ«bÄs mÄs parÄdÄ«sim, kÄ reproducÄt izplatÄ«to apmÄcÄ«bu rezultÄtu, izmantojot MXNet un Horovod. Lai uzzinÄtu vairÄk par izplatÄ«to mÄcÄ«Å”anos ar MXNet, lasiet
Solis 1
Izveidojiet viendabÄ«gu gadÄ«jumu kopu ar MXNet versiju 1.4.0 vai jaunÄku un Horovod versiju 0.16.0 vai jaunÄku, lai izmantotu izkliedÄto apmÄcÄ«bu. Jums bÅ«s arÄ« jÄinstalÄ bibliotÄkas GPU apmÄcÄ«bai. MÅ«su gadÄ«jumiem mÄs izvÄlÄjÄmies Ubuntu 16.04 Linux ar GPU draiveri 396.44, CUDA 9.2, cuDNN 7.2.1 bibliotÄku, NCCL 2.2.13 komunikatoru un OpenMPI 3.1.1. Varat arÄ« izmantot
Solis 2
Pievienojiet savam MXNet apmÄcÄ«bas skriptam iespÄju strÄdÄt ar Horovod API. TÄlÄk norÄdÄ«to skriptu, kura pamatÄ ir MXNet Gluon API, var izmantot kÄ vienkÄrÅ”u veidni. Rindas treknrakstÄ ir nepiecieÅ”amas, ja jums jau ir atbilstoÅ”s apmÄcÄ«bas skripts. Å eit ir dažas bÅ«tiskas izmaiÅas, kas jÄveic, lai mÄcÄ«tos ar Horovod:
- Iestatiet kontekstu atbilstoÅ”i vietÄjam Horovoda rangam (8. rindiÅa), lai saprastu, ka apmÄcÄ«ba tiek veikta pareizajÄ grafikas kodolÄ.
- Nododiet viena darbinieka sÄkotnÄjos parametrus visiem (18. rindiÅa), lai nodroÅ”inÄtu, ka visi darbinieki sÄk ar vienÄdiem sÄkotnÄjiem parametriem.
- Izveidojiet Horovodu DistributedOptimizer (25. rinda), lai atjauninÄtu parametrus sadalÄ«tÄ veidÄ.
Lai iegÅ«tu pilnu skriptu, lÅ«dzu, skatiet Horovod-MXNet piemÄrus
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 ...
Solis 3
Piesakieties vienÄ no darbiniekiem, lai sÄktu izplatÄ«tu apmÄcÄ«bu, izmantojot MPI direktÄ«vu. Å ajÄ piemÄrÄ sadalÄ«tÄ apmÄcÄ«ba darbojas Äetros gadÄ«jumos ar 4 GPU katrÄ un kopÄ 16 GPU kopÄ. StohastiskÄ gradienta nolaiÅ”anÄs (SGD) optimizÄtÄjs tiks izmantots ar Å”Ädiem hiperparametriem:
- mini partijas lielums: 256
- mÄcÄ«Å”anÄs Ätrums: 0.1
- impulss: 0.9
- svara samazinÄÅ”anÄs: 0.0001
MÄrogojot no viena GPU uz 64 GPU, mÄs lineÄri mÄrogojÄm apmÄcÄ«bas Ätrumu atbilstoÅ”i GPU skaitam (no 0,1 1 GPU lÄ«dz 6,4 64 GPU), vienlaikus saglabÄjot attÄlu skaitu uz grafisko procesoru 256 (no daudzu GPU) 256 attÄli 1 GPU lÄ«dz 16 384 attÄli 64 GPU). Svara samazinÄÅ”anÄs un impulsa parametri mainÄ«jÄs, palielinoties GPU skaitam. Lai paÄtrinÄtu NVIDIA Tesla GPU atbalstÄ«tos float16 aprÄÄ·inus, mÄs izmantojÄm jauktu precizitÄtes apmÄcÄ«bu ar datu tipu float32 pÄrejai uz priekÅ”u un float16 gradientiem.
$ 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
SecinÄjums
Å ajÄ rakstÄ mÄs apskatÄ«jÄm mÄrogojamu pieeju izplatÄ«to modeļu apmÄcÄ«bai, izmantojot Apache MXNet un Horovod. MÄs parÄdÄ«jÄm mÄrogoÅ”anas efektivitÄti un rentabilitÄti salÄ«dzinÄjumÄ ar parametru servera pieeju ImageNet datu kopÄ, kurÄ tika apmÄcÄ«ts ResNet50-v1 modelis. MÄs esam iekļÄvuÅ”i arÄ« darbÄ«bas, kuras varat izmantot, lai modificÄtu esoÅ”u skriptu, lai palaistu vairÄku instanÄu apmÄcÄ«bu, izmantojot Horovod.
Ja jÅ«s tikko sÄkat darbu ar MXNet un dziļu mÄcÄ«Å”anos, dodieties uz instalÄÅ”anas lapu
Ja esat jau strÄdÄjis ar MXNet un vÄlaties izmÄÄ£inÄt izplatÄ«to mÄcÄ«Å”anos ar Horovod, apskatiet
*izmaksas tiek aprÄÄ·inÄtas, pamatojoties uz
Uzziniet vairÄk par kursu
Avots: www.habr.com