Distribuované učenie s Apache MXNet a Horovod

Preklad článku bol pripravený v predstihu pred začiatkom kurzu „Priemyselné ML na veľkých dátach“

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

Apache MX Net je open-source rámec hlbokého učenia, ktorý sa používa na vytváranie, trénovanie a nasadzovanie hlbokých neurónových sietí. MXNet abstrahuje zložitosti spojené s implementáciou neurónových sietí, je vysoko výkonný a škálovateľný a ponúka API pre populárne programovacie jazyky ako napr. Pytón, C + +, Clojure, Jáva, Julie, R, Scala a ďalšie.

Distribuované školenie v MXNet s parametrickým serverom

Štandardný distribuovaný vzdelávací modul v MXNet používa prístup parametrického servera. Používa sadu parametrických serverov na zhromažďovanie gradientov od každého pracovníka, vykonávanie agregácie a odosielanie aktualizovaných gradientov späť pracovníkom na ďalšiu iteráciu optimalizácie. Určenie správneho pomeru serverov a pracovníkov je kľúčom k efektívnemu škálovaniu. Ak existuje iba jeden parametrický server, môže sa to ukázať ako prekážka vo výpočtoch. Naopak, ak sa používa príliš veľa serverov, komunikácia typu many-to-many môže upchať všetky sieťové pripojenia.

Čo je Horovod

Horovod je otvorený distribuovaný rámec hlbokého učenia vyvinutý v Uberi. Využíva efektívne technológie naprieč GPU a medziuzlami, ako je NVIDIA Collective Communications Library (NCCL) a Message Passing Interface (MPI) na distribúciu a agregáciu parametrov modelu medzi vorecmi. Optimalizuje využitie šírky pásma siete a dobre sa škáluje pri práci s modelmi hlbokých neurónových sietí. V súčasnosti podporuje niekoľko populárnych rámcov strojového učenia, konkrétne MX Net, Tensorflow, Keras a PyTorch.

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 preto.

Na konci si stiahnite testovací skript mxnet_mnist.py preto a spustite nasledujúce príkazy v termináli MacBook v pracovnom adresári:

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.

Distribuované učenie s Apache MXNet a Horovod
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.

Distribuované učenie s Apache MXNet a Horovod
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 tento príspevok.

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ť Amazon Deep Learning AMI, kde sú tieto knižnice už predinštalované.

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 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    ...

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 MXNenajprv vybudovať MXNet. Tiež dôrazne odporúčame prečítať si článok MXNet za 60 minútzačať.

Ak ste už pracovali s MXNet a chcete si vyskúšať distribuované učenie s Horovodom, pozrite sa na Inštalačná stránka Horovod, vytvorte si ho z MXNet a postupujte podľa príkladu MNIST alebo ImageNet.

*cena sa vypočítava na základe hodinové sadzby AWS pre inštancie EC2

Zistite viac o kurze „Priemyselné ML na veľkých dátach“

Zdroj: hab.com

Pridať komentár