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
ir atvÄrtÄ koda dziļÄs mÄcīŔanÄs ietvars, ko izmanto, lai izveidotu, apmÄcÄ«tu un izvietotu dziļos neironu tÄ«klus. MXNet abstrahÄ sarežģījumus, kas saistÄ«ti ar neironu tÄ«klu ievieÅ”anu, ir ļoti veiktspÄjÄ«gs un mÄrogojams, kÄ arÄ« piedÄvÄ API populÄrÄm programmÄÅ”anas valodÄm, piemÄram, , , , , , , un citi.
SadalÄ«ta apmÄcÄ«ba MXNet ar parametru serveri
izmanto parametru servera pieeju. Tas izmanto parametru serveru kopu, lai savÄktu gradientus no katra darbinieka, veiktu apkopoÅ”anu un nosÅ«tÄ«tu atjauninÄtos gradientus atpakaļ darbiniekiem nÄkamajai optimizÄcijas iterÄcijai. Pareizas serveru un darbinieku attiecÄ«bas noteikÅ”ana ir efektÄ«vas mÄrogoÅ”anas atslÄga. Ja ir tikai viens parametru serveris, tas var izrÄdÄ«ties aprÄÄ·inu saÅ”aurinÄjums. Un otrÄdi, ja tiek izmantots pÄrÄk daudz serveru, saziÅa daudzi pret daudziem var aizsprostot visus tÄ«kla savienojumus.
Kas ir Horovod
ir atvÄrta izplatÄ«ta dziļÄs mÄcīŔanÄs sistÄma, kas izstrÄdÄta Uber. Tas izmanto efektÄ«vas GPU un vairÄku mezglu tehnoloÄ£ijas, piemÄram, NVIDIA Collective Communications Library (NCCL) un Message Passing Interface (MPI), lai izplatÄ«tu un apkopotu modeļa parametrus pa voreciem. Tas optimizÄ tÄ«kla joslas platuma izmantoÅ”anu un labi mÄrogojas, strÄdÄjot ar dziļo neironu tÄ«klu modeļiem. PaÅ”laik tas atbalsta vairÄkas populÄras maŔīnmÄcīŔanÄs sistÄmas, proti , Tensorflow, Keras un PyTorch.
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 horovodPiezÄ«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 un palaidiet Å”Ädas komandas MacBook terminÄlÄ« darba direktorijÄ:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyTÄ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.870000Izpildes 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
Š”Š¾Š·Š“Š°Š¹ŃŠµ клаŃŃŠµŃ Š¾Š“Š½Š¾ŃŠ¾Š“нŃŃ ŃŠŗŠ·ŠµŠ¼ŠæŠ»ŃŃŠ¾Š² Ń MXNet веŃŃŠøŠø 1.4.0 или вŃŃŠµ Šø Horovod веŃŃŠøŠø 0.16.0 или вŃŃŠµ, ŃŃŠ¾Š±Ń ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ ŃŠ°ŃŠæŃŠµŠ“еленное обŃŃŠµŠ½ŠøŠµ. ŠŠ°Š¼ ŃŠ°ŠŗŠ¶Šµ Š½ŃŠ¶Š½Š¾ Š±ŃŠ“ŠµŃ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃ Š±ŠøŠ±Š»ŠøŠ¾ŃŠµŠŗŠø Š“Š»Ń Š¾Š±ŃŃŠµŠ½ŠøŃ на GPU. ŠŠ»Ń Š½Š°ŃŠøŃ ŃŠŗŠ·ŠµŠ¼ŠæŠ»ŃŃŠ¾Š² Š¼Ń Š²ŃŠ±Ńали Ubuntu 16.04 Linux, Ń GPU Driver 396.44, CUDA 9.2, Š±ŠøŠ±Š»ŠøŠ¾ŃŠµŠŗŃ cuDNN 7.2.1, ŠŗŠ¾Š¼Š¼ŃŠ½ŠøŠŗŠ°ŃŠ¾Ń NCCL 2.2.13 Šø OpenMPI 3.1.1. Также Š²Ń Š¼Š¾Š¶ŠµŃŠµ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ , kur Ŕīs bibliotÄkas jau ir iepriekÅ” instalÄtas.
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.pySecinÄ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 lai vispirms izveidotu MXNet. MÄs arÄ« ļoti iesakÄm izlasÄ«t rakstu lai sÄktu.
Ja esat jau strÄdÄjis ar MXNet un vÄlaties izmÄÄ£inÄt izplatÄ«to mÄcīŔanos ar Horovod, apskatiet , izveidojiet to no MXNet un sekojiet piemÄram vai .
*izmaksas tiek aprÄÄ·inÄtas, pamatojoties uz AWS EC2 gadÄ«jumiem
Uzziniet vairÄk par kursu
Avots: www.habr.com
