Preklad článku bol pripravený v predstihu pred začiatkom kurzu
Distribuované školenie na viacerých vysokovýkonných výpočtových inštanciách môže skrátiť čas školenia moderných hlbokých neurónových sietí na veľké množstvo údajov z týždňov na hodiny alebo dokonca minúty, vďaka čomu je táto školiaca technika rozšírená v praktických aplikáciách hlbokého učenia. Používatelia musia pochopiť, ako zdieľať a synchronizovať údaje vo viacerých inštanciách, čo má zase veľký vplyv na efektivitu škálovania. Okrem toho by používatelia mali vedieť, ako nasadiť školiaci skript, ktorý beží na jednej inštancii, do viacerých inštancií.
V tomto článku budeme hovoriť o rýchlom a jednoduchom spôsobe distribúcie učenia pomocou otvorenej knižnice hlbokého učenia Apache MXNet a distribuovaného vzdelávacieho rámca Horovod. Jasne predvedieme výkonnostné výhody rámca Horovod a ukážeme, ako napísať školiaci skript MXNet tak, aby fungoval distribuovaným spôsobom s Horovodom.
Čo je Apache MXNet
Distribuované školenie v MXNet s parametrickým serverom
Čo je Horovod
Integrácia MXNet a Horovod
MXNet sa integruje s Horovodom prostredníctvom distribuovaných vzdelávacích API definovaných v Horovode. Komunikačné API Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementované pomocou asynchrónnych spätných volaní motora MXNet, ako súčasť jeho grafu úloh. Týmto spôsobom sú dátové závislosti medzi komunikáciou a výpočtom ľahko spracované pomocou MXNet motora, aby sa predišlo stratám výkonu v dôsledku synchronizácie. Distribuovaný objekt optimalizátora definovaný v Horovode horovod.DistributedOptimizer expanduje Optimizer v MXNet tak, že volá zodpovedajúce Horovod API pre distribuované aktualizácie parametrov. Všetky tieto podrobnosti o implementácii sú pre koncových používateľov transparentné.
Rýchly štart
Môžete rýchlo začať trénovať malú konvolučnú neurónovú sieť na dátovom súbore MNIST pomocou MXNet a Horovod na vašom MacBooku.
Najprv nainštalujte mxnet a horovod z PyPI:
pip install mxnet
pip install horovod
Poznámka: Ak sa počas pip nainštalovať horovodmožno budete musieť pridať premennú MACOSX_DEPLOYMENT_TARGET=10.vvKde vv – toto je verzia vašej verzie MacOS, napríklad pre MacOSX Sierra budete musieť napísať MACOSX_DEPLOYMENT_TARGET=10.12 pip inštalácia horovod
Potom nainštalujte OpenMPI
Na konci si stiahnite testovací skript mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
Toto spustí školenie na dvoch jadrách vášho procesora. Výstup bude nasledovný:
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
Ukážka výkonu
Pri tréningu modelu ResNet50-v1 na množine údajov ImageNet na 64 GPU s ôsmimi inštanciami p3.16xveľký EC2, z ktorých každý obsahuje 8 GPU NVIDIA Tesla V100 v cloude AWS, sme dosiahli trénovaciu priepustnosť 45000 44 obrázkov/s (t. j. počet trénovaných vzoriek za sekundu). Tréning dokončený za 90 minút po 75.7 epochách s najlepšou presnosťou XNUMX %.
Porovnali sme to s prístupom distribuovaného tréningu MXNet, ktorý využíva parametrické servery na 8, 16, 32 a 64 GPU so serverom s jedným parametrom a pomerom servera k pracovníkovi 1:1 a 2:1. Výsledok môžete vidieť na obrázku 1 nižšie. Na osi y vľavo pruhy predstavujú počet obrázkov, ktoré sa majú natrénovať za sekundu, čiary odrážajú účinnosť škálovania (t. j. pomer skutočnej a ideálnej priepustnosti) na osi y vpravo. Ako vidíte, výber počtu serverov ovplyvňuje efektivitu škálovania. Ak existuje iba jeden server parametrov, účinnosť škálovania klesne na 38 % na 64 GPU. Aby ste dosiahli rovnakú efektivitu škálovania ako pri Horovode, musíte zdvojnásobiť počet serverov v pomere k počtu pracovníkov.
Obrázok 1. Porovnanie distribuovaného učenia pomocou MXNet s Horovodom a parametrickým serverom
V tabuľke 1 nižšie porovnávame konečné náklady na inštanciu pri spustení experimentov na 64 GPU. Použitie MXNet s Horovod poskytuje najlepšiu priepustnosť pri najnižších nákladoch.
Tabuľka 1. Porovnanie nákladov medzi Horovod a Parameter Server s pomerom server/pracovník 2:1.
Kroky na reprodukciu
V ďalších krokoch si ukážeme, ako reprodukovať výsledok distribuovaného tréningu pomocou MXNet a Horovod. Ak sa chcete dozvedieť viac o distribuovanom učení s MXNet, prečítajte si
Krok 1
Vytvorte zhluk homogénnych inštancií pomocou MXNet verzie 1.4.0 alebo vyššej a Horovod verzie 0.16.0 alebo vyššej na použitie distribuovaného učenia. Budete tiež musieť nainštalovať knižnice na školenie GPU. Pre naše príklady sme si vybrali Ubuntu 16.04 Linux s ovládačom GPU 396.44, CUDA 9.2, knižnicou cuDNN 7.2.1, komunikátorom NCCL 2.2.13 a OpenMPI 3.1.1. Tiež môžete použiť
Krok 2
Pridajte do školiaceho skriptu MXNet možnosť pracovať s Horovod API. Nižšie uvedený skript založený na MXNet Gluon API možno použiť ako jednoduchú šablónu. Tučné riadky sú potrebné, ak už máte zodpovedajúci tréningový skript. Tu je niekoľko kritických zmien, ktoré musíte urobiť, aby ste sa naučili s Horovodom:
- Nastavte kontext podľa miestnej hodnosti Horovod (riadok 8), aby ste pochopili, že tréning sa vykonáva na správnom grafickom jadre.
- Odovzdajte počiatočné parametre od jedného pracovníka všetkým (riadok 18), aby ste zabezpečili, že všetci pracovníci začnú s rovnakými počiatočnými parametrami.
- Vytvorte Horovod DistributedOptimizer (riadok 25) na aktualizáciu parametrov distribuovaným spôsobom.
Ak chcete získať úplný skript, pozrite si príklady 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 ...
Krok 3
Prihláste sa k jednému z pracovníkov a začnite distribuované školenie pomocou smernice MPI. V tomto príklade prebieha distribuované školenie na štyroch inštanciách so 4 GPU a celkovo 16 GPU v klastri. Optimalizátor Stochastic Gradient Descent (SGD) sa použije s nasledujúcimi hyperparametrami:
- Veľkosť mini-dávky: 256
- miera učenia: 0.1
- hybnosť: 0.9
- úbytok hmotnosti: 0.0001
Keď sme škálovali z jedného GPU na 64 GPU, lineárne sme škálovali rýchlosť tréningu podľa počtu GPU (od 0,1 pre 1 GPU po 6,4 pre 64 GPU), pričom sme zachovali počet obrázkov na GPU na 256 (z dávky 256 obrázkov pre 1 GPU až 16 384 pre 64 GPU). Parametre úbytku hmotnosti a hybnosti sa menili so zvyšujúcim sa počtom GPU. Na zrýchlenie výpočtov float16 podporovaných grafickými procesormi NVIDIA Tesla sme použili trénovanie zmiešanej presnosti s typom údajov float32 pre prechod dopredu a float16 pre gradienty.
$ 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
Záver
V tomto článku sme sa pozreli na škálovateľný prístup k tréningu distribuovaných modelov pomocou Apache MXNet a Horovod. Preukázali sme efektivitu škálovania a nákladovú efektívnosť v porovnaní s prístupom parametrického servera na súbore údajov ImageNet, na ktorom bol trénovaný model ResNet50-v1. Zahrnuli sme aj kroky, ktoré môžete použiť na úpravu existujúceho skriptu na spustenie viacstupňového školenia pomocou Horovod.
Ak s MXNet a hlbokým učením ešte len začínate, prejdite na stránku inštalácie
Ak ste už pracovali s MXNet a chcete si vyskúšať distribuované učenie s Horovodom, pozrite sa na
*cena sa vypočítava na základe
Zistite viac o kurze
Zdroj: hab.com