Mësimi i shpërndarë me Apache MXNet dhe Horovod

Përkthimi i artikullit është përgatitur në prag të fillimit të kursit «ML industrial për të dhëna të mëdha»

Mësimi i shpërndarë në shumë instance kompjuterike me performancë të lartë mund të reduktojë kohën e trajnimit të rrjeteve neuronale të thella moderne mbi volume të mëdha të dhënash nga disa javë në orë ose madje minuta, duke e bërë këtë teknikë mësimi mbizotëruese në përdorimin praktik të mësimit të thellë. Përdoruesit duhet të kuptojnë si të ndajnë dhe sinkronizojnë të dhënat në disa instance, çka në turn ndikon shumë në efikasitetin e shkallëzimit. Përveç kësaj, përdoruesit gjithashtu duhet të dinë si të vendosin një skenar trajnimi në disa instance që funksionon në një instance të vetme.

Në këtë artikull do të flasim për një mënyrë të shpejtë dhe të thjeshtë të mësimt të shpërndarë duke përdorur bibliotekën e hapur për mësim të thellë Apache MXNet dhe kuadri i mësimit të shpërndarë Horovod. Ne do të tregojmë në mënyrë vizuale përfitimet e kuadrit Horovod në çështjet e performancës dhe do të demonstrojmë si të shkruajmë një skript mësimi MXNet që funksionon në mënyrë të shpërndarë me Horovod.

ÇfarĂ« Ă«shtĂ« Apache MXNet

Apache MXNet – njĂ« kuadĂ«r i hapur pĂ«r mĂ«sim tĂ« thellĂ«, i cili pĂ«rdoret pĂ«r tĂ« krijuar, mĂ«suar dhe vendosur rrjete neurose tĂ« thella. MXNet e abstrakton kompleksitetin qĂ« lidhet me implementimin e rrjeteve neurose, ka performancĂ« tĂ« lartĂ« dhe shkallĂ«zim, si dhe ofron API pĂ«r gjuhĂ« tĂ« njohura programimi, si Python, C++, Clojure, Java, Julia, R, Scala dhe tĂ« tjera.

Mësimi i shpërndarë në MXNet me serverin e parametrave

Moduli standard i mësimit të shpërndarë në MXNet përdor qasjen e serverit të parametrave (parameter server). Ai përdor një grup serverash të parametrave për të mbledhur gradiente nga çdo punëtor, për të kryer agregimin dhe për të dërguar gradientet e përditësuara përsëri te punëtorët për iteracionin e ardhshëm të optimizimit. Përcaktimi i raportit të duhur ndërmjet serverëve dhe punëtorëve është çelësi për një shkallëzim efikas. Nëse ka vetëm një server të parametrave, ai mund të bëhet një bllokim në procesin e llogaritjeve. Përkundrazi, nëse përdoren shumë serverë, lidhja "shumë-në-shumë" mund të ngarkojë të gjitha lidhjet rrjetë.

ÇfarĂ« Ă«shtĂ« Horovod

Horovod – njĂ« kornizĂ« e hapur pĂ«r mĂ«simin e thellĂ« tĂ« shpĂ«rndarĂ«, e zhvilluar nĂ« Uber. Ajo pĂ«rdor teknologji efikase pĂ«r ndĂ«rveprimin midis shumĂ« GPU-ve dhe nyjeve, siç janĂ« Biblioteka e Komunikimeve Kolektive tĂ« NVIDIA (NCCL) dhe NdĂ«rfaqja e Kalimit tĂ« Mesazheve (MPI) pĂ«r tĂ« shpĂ«rndarĂ« dhe aggreguar parametrat e modelit midis vorkerĂ«ve. Ajo optimizon pĂ«rdorimin e kapacitetit tĂ« rrjetit dhe shkallĂ«zohet mirĂ« gjatĂ« punĂ«s me modelet e rrjeteve nervore tĂ« thella. Aktualisht, mbĂ«shtet disa korniza tĂ« njohura tĂ« mĂ«simit tĂ« makinerisĂ«, tĂ« tilla si MXNet, Tensorflow, Keras, dhe PyTorch.

Integrimi i MXNet dhe Horovod

MXNet integrihet me Horovod përmes API-së së mësimit të shpërndarë, të përcaktuara në Horovod. Në Horovod, API-të e komunikimit horovod.broadcast(), horovod.allgather() dhe horovod.allreduce() janë implementuar me asinkronizimin e callbacks të motorit MXNet, si pjesë e grafikut të detyrave të tij. Kështu, varësitë e të dhënave midis komunikimit dhe llogaritjeve trajtohen lehtësisht nga motori MXNet, për të shmangur humbjet e performancës nga sinkronizimi. Objekti optimizer të shpërndarë, i përcaktuar në Horovod, horovod.DistributedOptimizer shkallëzon Optimizer në MXNet në një mënyrë që ai të thërrasë API-të përkatëse të Horovod për përditësimin e shpërndarë të parametrave. Të gjitha këto detaje implementimi janë transparente për përdoruesit e fundit.

Fillim i shpejtë

Ju mund të filloni shpejt trajnimin e një rrjeti nervor konvolucional të vogël mbi të dhënat MNIST me MXNet dhe Horovod në MacBook-un tuaj.
Për të filluar, instaloni mxnet dhe horovod nga PyPI:

pip install mxnet
pip install horovod

VĂ«rejtje: NĂ«se hasni njĂ« gabim gjatĂ« pip install horovod, ndoshta duhet tĂ« shtoni variablĂ«n MACOSX_DEPLOYMENT_TARGET=10.vv, ku vv – kjo Ă«shtĂ« versioni i versionit tuaj tĂ« MacOS, pĂ«r shembull, pĂ«r MacOSX Sierra do tĂ« duhet tĂ« shkruani MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Pastaj instaloni OpenMPI këtu.

Në fund, shkarkoni skenarin e testit mxnet_mnist.py këtu dhe ekzekutoni komandat e mëposhtme në terminalin e MacBook-ut në direktorinë punuese:

mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py

Kështu do të filloni trajnimin në dy bërthama të procesorit tuaj. Në daljen do të shihni:

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

Demonstrimi i performancës

Gjatë trajnimit të modelit ResNet50-v1 mbi të dhënat ImageNet në 64 GPU me tetë instance p3.16xlarge EC2, secila përmban 8 GPU NVIDIA Tesla V100 në AWS cloud, arritëm një kapacitet trajnimi prej 45000 imazhesh/s (dmth. numri i mostrave të trajnuara në sekondë). Trajnimi përfundoi pas 44 minutash pas 90 epokave me saktësi maksimale prej 75.7%.

E krahasuam këtë me trajnimin e shpërndarë MXNet duke përdorur qasjen e serverëve të parametrave me 8, 16, 32 dhe 64 GPU me një server me një parametr dhe një raport serverësh në punëtorë 1 me 1 dhe 2 me 1 përkatësisht. Rezultatin mund ta shihni në Figurën 1 më poshtë. Në boshtin y të majtë kolonat pasqyrojnë numrin e imazheve për trajnim në sekondë, ndërsa linjat pasqyrojnë efikasitetin e shkallëzimit (dmth. raportin e kapacitetit real në atë ideal) në boshtin y të djathtë. Siç e shihni, zgjedhja e numrit të serverëve ndikon në efikasitetin e shkallëzimit. Nëse ka vetëm një server parametrash, efikasiteti i shkallëzimit bie në 38% me 64 GPU. Për të arritur të njëjtin efikasitet shkallëzimi si me Horovod, nevojitet të dyfishoni numrin e serverëve në raport me numrin e punëtorëve.

Mësimi i shpërndarë me Apache MXNet dhe Horovod
Figura 1. Krahasimi i mësimit të shpërndarë duke përdorur MXNet me Horovod dhe me serverin e parametrave

Në Tabelën 1 më poshtë kemi krahasuar koston përfundimtare të instancës gjatë eksperimenteve në 64 GPU. Përdorimi i MXNet së bashku me Horovod ofron kapacitetin më të mirë përmes kostove më të ulta.

Mësimi i shpërndarë me Apache MXNet dhe Horovod
Tabela 1. Krahasimi i kostove midis Horovod dhe serverit të parametrave me raportin e serverëve ndaj punëtorëve 2 me 1.

Hapat për të riprodhuar

Në hapat në vijim ne do t'ju tregojmë se si të riprodhoni rezultatin e mësimit të shpërndarë duke përdorur MXNet dhe Horovod. Për të mësuar më shumë rreth mësimit të shpërndarë me MXNet lexoni këto postime.

Hapi 1

Krijoni një klaster instancash homogjene me MXNet version 1.4.0 ose më lart dhe Horovod version 0.16.0 ose më lart, për të përdorur mësimin e shpërndarë. Ju gjithashtu do të duhet të instaloni bibliotekat për mësimin në GPU. Për instancat tona, kemi zgjedhur Ubuntu 16.04 Linux, me GPU Driver 396.44, CUDA 9.2, bibliotekën cuDNN 7.2.1, komunikuesin NCCL 2.2.13 dhe OpenMPI 3.1.1. Gjithashtu mund të përdorni Amazon Deep Learning AMI, ku këto biblioteka janë tashmë të parainstaluara.

Hapi 2

Shtoni në skriptin tuaj të trajnimit MXNet mundësinë e punës me API Horovod. Skripti më poshtë, i bazuar në API-në Gluon të MXNet, mund të përdoret si një shabllon i thjeshtë. Rreshtat e theksuar me bold janë të nevojshëm në rast se keni një skript trajnimi përkatës. Ja disa ndryshime kritike që duhet të bëni për trajnimin me Horovod:

  • Vendosni kontekstin nĂ« pĂ«rputhje me rangun lokal tĂ« Horovod (rreshti 8), pĂ«r tĂ« kuptuar se trajnimi po kryhet nĂ« bĂ«rthamĂ«n e duhur grafike.
  • Transferoni parametrat fillestarĂ« nga njĂ« punĂ«tor te tĂ« gjithĂ« (rreshti 18), pĂ«r t'u siguruar qĂ« tĂ« gjithĂ« punĂ«torĂ«t fillojnĂ« punĂ«n me tĂ« njĂ«jtat parametra fillestarĂ«.
  • Krijoni Horovod DistributedOptimizer (rreshti 25), pĂ«r tĂ« pĂ«rditĂ«suar parametrat nĂ« mĂ«nyrĂ« tĂ« shpĂ«rndarĂ«.

Për të marrë skriptin e plotë, referojuni shembujve të Horovod-MXNet MNIST dhe ImageNet.

1  import mxnet as mx
2  import horovod.mxnet as hvd
3
4  # Horovod: inicializoni Horovod
5  hvd.init()
6
7  # Horovod: caktoni një GPU për t'u përdorur për renditjen lokale
8  context = mx.gpu(hvd.local_rank())
9
10 # Ndërtoni modelin
11 model = ...
12
13 # Inizializoni parametrat
14 model.initialize(initializer, ctx=context)
15 params = model.collect_params()
16
17 # Horovod: transmetoni parametrat
18 hvd.broadcast_parameters(params, root_rank=0)
19
20 # Krijoni optimizuesin
21 optimizer_params = ...
22 opt = mx.optimizer.create('sgd', **optimizer_params)
23
24 # Horovod: mbështesni optimizuesin me DistributedOptimizer
25 opt = hvd.DistributedOptimizer(opt)
26
27 # Krijoni trajnerin dhe funksionin e humbjes
28 trainer = mx.gluon.Trainer(params, opt, kvstore=None)
29 loss_fn = ...
30
31 # Trajnoni modelin
32 për epoçën në gamën e num_epoch:
33    ...

Hapi 3

Hyni në një nga punëtorët për të nisur trajnimin e shpërndarë duke përdorur direktivat MPI. Në këtë shembull, trajnimi i shpërndarë niset në katër instanca me 4 GPU në secilën, dhe me 16 GPU në klaster në përfundim. Do të përdoret optimizuesi i shpërndarë i gradienteve stohastike (SGD) me këto hiperparametra:

  • mini-batch size: 256
  • learning rate: 0.1
  • momentum: 0.9
  • weight decay: 0.0001

Duke përmirësuar nga një GPU në 64 GPU, ne kemi rritur linearisht shpejtësinë e trajnimit në përputhje me numrin e GPU-ve (nga 0,1 për 1 GPU deri në 6,4 për 64 GPU), duke mbajtur numrin e imazheve për çdo GPU në 256 (nga një paketë me 256 imazhe për 1 GPU deri në 16,384 për 64 GPU). Parametrat e weight decay dhe momentum u ndryshuan ndërsa rritej numri i GPU-ve. Ne kemi përdorur mësim me precizitet të përzier me llojin e të dhënave float16 në kalimin direkt dhe float32 për gradiente, për të përshpejtuar llogaritjet float16, të mbështetura nga GPU NVIDIA Tesla.

$ 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

Përfundimi

Në këtë artikull, ne shqyrtuam një qasje të shkallëzuar për trajnimin e shpërndarë të modelit duke përdorur Apache MXNet dhe Horovod. Ne treguam efikasitetin e shkallëzimit dhe efikasitetin ekonomik në krahasim me qasjen e serverit të parametrave mbi setin e të dhënave ImageNet, mbi të cilin u trajnuar modeli ResNet50-v1. Gjithashtu reflektonim hapat me anë të të cilëve mund të ndryshoni një skenari ekzistues për të nisur trajnimin në shumë instanca duke përdorur Horovod.

Nëse sapo po filloni me MXNet dhe mësimin e thellë, vizitoni faqen e instalimit MXNe, për të ndihmuar në mbledhjen fillestare të MXNet. Po ashtu, rekomandohet fuqishëm të lexoni artikullin MXNet in 60 minutes, për të filluar.

Nëse tashmë keni punuar me MXNet dhe dëshironi të provoni mësimin e shpërndarë me Horovod, atëherë shikoni faqen e instalimit të Horovod, mbledhni atë me MXNet dhe ndiqni shembullin MNIST ose ImageNet.

*kostoja llogaritet në bazë të çmimit për orë AWS për instancat EC2

Mëso më shumë për kursin «ML industrial për të dhëna të mëdha»

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster