Përkthimi i artikullit u përgatit në prag të fillimit të kursit
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
Trajnim i shpërndarë në MXNet me server parametrash
Çfarë është Horovod
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
Në fund, shkarkoni skriptin e testimit mxnet_mnist.py
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.
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.
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
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
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
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
Nëse tashmë keni punuar me MXNet dhe dëshironi të provoni mësimin e shpërndarë me Horovod, atëherë hidhini një sy
*kostoja llogaritet në bazë të
Mësoni më shumë rreth kursit
Burimi: www.habr.com