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

Përkthimi i artikullit u përgatit në prag të fillimit të kursit "ML Industriale mbi të dhënat e mëdha"

Trajnimi i shpërndarë në instanca të shumta kompjuterike me performancë të lartë mund të zvogëlojë kohën e trajnimit të rrjeteve moderne nervore të thella në sasi të mëdha të dhënash nga javë në orë apo edhe minuta, duke e bërë këtë teknikë trajnimi të përhapur në aplikimet praktike të të mësuarit të thellë. Përdoruesit duhet të kuptojnë se si të ndajnë dhe sinkronizojnë të dhënat në shumë raste, gjë që nga ana tjetër ka një ndikim të madh në efikasitetin e shkallëzimit. Për më tepër, përdoruesit duhet të dinë gjithashtu se si të vendosin një skript trajnimi që funksionon në një shembull të vetëm në disa raste.

Në këtë artikull do të flasim për një mënyrë të shpejtë dhe të lehtë për të shpërndarë mësimin duke përdorur bibliotekën e hapur të mësimit të thellë Apache MXNet dhe kornizën e të mësuarit të shpërndarë Horovod. Ne do të demonstrojmë qartë përfitimet e performancës së kornizës Horovod dhe do të demonstrojmë se si të shkruhet një skenar trajnimi MXNet në mënyrë që të funksionojë në mënyrë të shpërndarë me Horovod.

Çfarë është Apache MXNet

Apache MX Net është një kornizë e mësimit të thellë me burim të hapur që përdoret për të krijuar, trajnuar dhe vendosur rrjete të thella nervore. MXNet abstrakton kompleksitetin që lidhet me zbatimin e rrjeteve nervore, është shumë performues dhe i shkallëzuar dhe ofron API për gjuhët e programimit të njohura si p.sh. Piton, C + +, Clojure, Java, Julia, R, Scala dhe të tjerët.

Trajnim i shpërndarë në MXNet me server parametrash

Moduli standard mësimor i shpërndarë në MXNet përdor një qasje të serverit me parametra. Ai përdor një grup serverësh parametrash për të mbledhur gradientë nga secili punonjës, për të kryer grumbullimin dhe për të dërguar gradientët e përditësuar përsëri te punëtorët për përsëritjen e ardhshme të optimizimit. Përcaktimi i raportit të saktë të serverëve me punëtorët është çelësi për shkallëzimin efektiv. Nëse ka vetëm një server parametri, ai mund të rezultojë të jetë një pengesë në llogaritjet. Në të kundërt, nëse përdoren shumë serverë, komunikimi shumë-për-shumë mund të bllokojë të gjitha lidhjet e rrjetit.

Çfarë është Horovod

Horovod është një kornizë e hapur e shpërndarë e mësimit të thellë e zhvilluar në Uber. Ai përdor teknologjitë efikase ndër-GPU dhe ndër-nyje, të tilla si NVIDIA Collective Communications Library (NCCL) dhe Message Passing Interface (MPI) për të shpërndarë dhe grumbulluar parametrat e modelit nëpër vorecs. Optimizon përdorimin e gjerësisë së brezit të rrjetit dhe shkallëzohet mirë kur punon me modele të rrjetit të thellë nervor. Aktualisht mbështet disa korniza të njohura të mësimit të makinerive, përkatësisht MX Net, Tensorflow, Keras dhe PyTorch.

Integrimi MXNet dhe Horovod

MXNet integrohet me Horovod përmes API-ve të të mësuarit të shpërndarë të përcaktuar në Horovod. API-të e komunikimit Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() zbatuar duke përdorur thirrjet asinkrone të motorit MXNet, si pjesë e grafikut të detyrave të tij. Në këtë mënyrë, varësitë e të dhënave ndërmjet komunikimit dhe llogaritjes trajtohen lehtësisht nga motori MXNet për të shmangur humbjet e performancës për shkak të sinkronizimit. Objekti i optimizuesit të shpërndarë i përcaktuar në Horovod horovod.DistributedOptimizer zgjerohet Optimizer në MXNet në mënyrë që të thërrasë API-të përkatëse Horovod për përditësimet e parametrave të shpërndarë. Të gjitha këto detaje të zbatimit janë transparente për përdoruesit përfundimtarë.

Fillimi i shpejtë

Mund të filloni shpejt trajnimin e një rrjeti të vogël nervor konvolucional në grupin e të dhënave MNIST duke përdorur MXNet dhe Horovod në MacBook tuaj.
Së pari, instaloni mxnet dhe horovod nga PyPI:

pip install mxnet
pip install horovod

Shënim: Nëse hasni një gabim gjatë pip install horovodndoshta ju duhet të shtoni një variabël MACOSX_DEPLOYMENT_TARGET=10.vvKu vv – ky është versioni i versionit tuaj MacOS, për shembull, për MacOSX Sierra do t'ju duhet të shkruani MACOSX_DEPLOYMENT_TARGET=10.12 pip instalimi horovod

Pastaj instaloni OpenMPI prandaj.

Në fund, shkarkoni skriptin e testimit mxnet_mnist.py prandaj dhe ekzekutoni komandat e mëposhtme në terminalin MacBook në drejtorinë e punës:

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

Kjo do të kryejë trajnime në dy bërthama të procesorit tuaj. Rezultati do të jetë si më poshtë:

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

Demo e performancës

Kur trajnoni një model ResNet50-v1 në një grup të dhënash ImageNet në 64 GPU me tetë shembuj p3.16x madhe EC2, secila përmban 8 GPU NVIDIA Tesla V100 në renë kompjuterike AWS, ne arritëm një xhiro trajnimi prej 45000 imazhesh/sek (d.m.th., numri i mostrave të trajnuara për sekondë). Stërvitja përfundoi në 44 minuta pas 90 epokave me një saktësi më të mirë prej 75.7%.

Ne e krahasuam këtë me qasjen e shpërndarë të trajnimit të MXNet për përdorimin e serverëve me parametra në 8, 16, 32 dhe 64 GPU me një server me parametra të vetëm dhe një raport server ndaj punonjësit përkatësisht 1 me 1 dhe 2 me 1. Ju mund ta shihni rezultatin në Figurën 1 më poshtë. Në boshtin y në të majtë, shiritat përfaqësojnë numrin e imazheve që duhen trajnuar për sekondë, linjat pasqyrojnë efikasitetin e shkallëzimit (d.m.th., raportin e xhiros aktuale me atë ideale) në boshtin y në të djathtë. Siç mund ta shihni, zgjedhja e numrit të serverëve ndikon në efikasitetin e shkallëzimit. Nëse ka vetëm një server me parametra, efikasiteti i shkallëzimit bie në 38% në 64 GPU. Për të arritur të njëjtin efikasitet shkallëzimi si me Horovod, duhet 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ë, ne krahasojmë koston përfundimtare për shembull kur ekzekutohen eksperimentet në 64 GPU. Përdorimi i MXNet me Horovod siguron qarkullimin më të mirë me koston më të ulët.

Mësimi i shpërndarë me Apache MXNet dhe Horovod
Tabela 1. Krahasimi i kostos midis Horovod dhe Serverit të Parametrave me një raport server-punëtor prej 2 me 1.

Hapat për të riprodhuar

Në hapat e ardhshëm, ne do t'ju tregojmë se si të riprodhoni rezultatin e trajnimit 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ëtë postim.

Hapi 1

Krijoni një grup shembujsh homogjenë me versionin MXNet 1.4.0 ose më të lartë dhe versionin Horovod 0.16.0 ose më të lartë për të përdorur mësimin e shpërndarë. Ju gjithashtu do të duhet të instaloni biblioteka për trajnimin e GPU. Për rastet tona, ne zgjodhëm Ubuntu 16.04 Linux, me GPU Driver 396.44, CUDA 9.2, bibliotekë cuDNN 7.2.1, komunikues 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 aftësinë për të punuar me Horovod API në skriptin tuaj të trajnimit MXNet. Skripti i mëposhtëm i bazuar në MXNet Gluon API mund të përdoret si një shabllon i thjeshtë. Linjat me shkronja të zeza janë të nevojshme nëse tashmë keni një skenar trajnimi përkatës. Këtu janë disa ndryshime kritike që duhet të bëni për të mësuar me Horovod:

  • Vendosni kontekstin sipas renditjes lokale të Horovod (rreshti 8) për të kuptuar se trajnimi kryhet në bërthamën e saktë grafike.
  • Kaloni parametrat fillestarë nga një punëtor te të gjithë (rreshti 18) për të siguruar që të gjithë punëtorët të fillojnë me të njëjtat parametra fillestarë.
  • Krijo një Horovod DistributedOptimizer (rreshti 25) për të përditësuar parametrat në mënyrë të shpërndarë.

Për të marrë skenarin e plotë, ju lutemi referojuni shembujve Horovod-MXNet 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    ...

Hapi 3

Identifikohu te një nga punëtorët për të filluar trajnimin e shpërndarë duke përdorur direktivën MPI. Në këtë shembull, trajnimi i shpërndarë zhvillohet në katër raste me 4 GPU secila dhe gjithsej 16 GPU në grup. Optimizuesi Stochastic Gradient Descent (SGD) do të përdoret me hiperparametrat e mëposhtëm:

  • Madhësia e grupit të vogël: 256
  • shkalla e të mësuarit: 0.1
  • vrulli: 0.9
  • zbehja e peshës: 0.0001

Ndërsa shkallëzuam nga një GPU në 64 GPU, ne shkallëzuam në mënyrë lineare shkallën e trajnimit sipas numrit të GPU-ve (nga 0,1 për 1 GPU në 6,4 për 64 GPU), ndërsa e mbajtëm numrin e imazheve për GPU në 256 ( nga një grup i 256 imazhe për 1 GPU në 16 për 384 GPU). Prishja e peshës dhe parametrat e momentit ndryshuan me rritjen e numrit të GPU-ve. Ne përdorëm trajnim të përzier me saktësi me llojin e të dhënave float64 për kalimin përpara dhe float16 për gradientët për të shpejtuar llogaritjet float32 të mbështetur nga GPU-të 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ërfundim

Në këtë artikull, ne shikuam një qasje të shkallëzuar për trajnimin e modeleve të shpërndara duke përdorur Apache MXNet dhe Horovod. Ne demonstruam efikasitetin e shkallëzimit dhe efektivitetin e kostos në krahasim me qasjen e serverit të parametrave në grupin e të dhënave ImageNet mbi të cilin u trajnua modeli ResNet50-v1. Ne kemi përfshirë gjithashtu hapa që mund t'i përdorni për të modifikuar një skript ekzistues për të ekzekutuar trajnime me shumë instanca duke përdorur Horovod.

Nëse sapo po filloni me MXNet dhe të mësuarit e thellë, shkoni te faqja e instalimit MXNepër të ndërtuar fillimisht MXNet. Ne gjithashtu rekomandojmë fuqimisht leximin e artikullit MXNet në 60 minutaper te filluar.

Nëse tashmë keni punuar me MXNet dhe dëshironi të provoni mësimin e shpërndarë me Horovod, atëherë hidhini një sy Faqja e instalimit të Horovod, ndërtojeni atë nga MXNet dhe ndiqni shembullin MNIST ose ImageNet.

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

Mësoni më shumë rreth kursit "ML Industriale mbi të dhënat e mëdha"

Burimi: www.habr.com

Shto një koment