Izkliedētā mācÄ«Å”anās ar Apache MXNet un Horovod

Raksta tulkojums tika sagatavots kursu sākuma priekŔvakarā "Rūpnieciskā ML par lielajiem datiem"

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

Apache MX Net 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, Pitons, C + +, Clojure, Java, Julia, R, Scala un citi.

Sadalīta apmācība MXNet ar parametru serveri

Standarta izplatÄ«ts mācÄ«bu modulis MXNet 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

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 MX tÄ«kls, 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 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 tātad.

Beigās lejupielādējiet testa skriptu mxnet_mnist.py tātad un palaidiet Ŕādas komandas MacBook terminālÄ« darba direktorijā:

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.

Izkliedētā mācÄ«Å”anās ar Apache MXNet un Horovod
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.

Izkliedētā mācÄ«Å”anās ar Apache MXNet un Horovod
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 Å”o ziņu.

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 Amazon Deep Learning AMI, 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 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    ...

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 MXNelai vispirms izveidotu MXNet. Mēs arÄ« ļoti iesakām izlasÄ«t rakstu MXNet 60 minÅ«tēslai sāktu.

Ja esat jau strādājis ar MXNet un vēlaties izmēģināt izplatÄ«to mācÄ«Å”anos ar Horovod, apskatiet Horovod instalācijas lapa, izveidojiet to no MXNet un sekojiet piemēram MNIST vai ImageNet.

*izmaksas tiek aprēķinātas, pamatojoties uz stundas likmes AWS EC2 gadījumiem

Uzziniet vairāk par kursu "Rūpnieciskā ML par lielajiem datiem"

Avots: www.habr.com

Pievieno komentāru