Përkthimi i artikullit është përgatitur në prag të fillimit të kursit
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
â 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 , , , , , , dhe tĂ« tjera.
Mësimi i shpërndarë në MXNet me serverin e parametrave
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
â 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 , 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 horovodVĂ«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 .
Në fund, shkarkoni skenarin e testit mxnet_mnist.py 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.pyKë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.870000Demonstrimi 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.

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.

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 .
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 , 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 dhe .
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.pyPë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 , për të ndihmuar në mbledhjen fillestare të MXNet. Po ashtu, rekomandohet fuqishëm të lexoni artikullin , 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 , mbledhni atë me MXNet dhe ndiqni shembullin ose .
*kostoja llogaritet në bazë të AWS për instancat EC2
Mëso më shumë për kursin
Burimi: habr.com
