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
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. , , , , , , a ďalšie.
Distribuované školenie v MXNet s parametrickým serverom
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
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 , 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 horovodPozná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 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.pyToto 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.870000Ukáž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
Создайте кластер однородных экземпляров с MXNet версии 1.4.0 или выше и Horovod версии 0.16.0 или выше, чтобы использовать распределенное обучение. Вам также нужно будет установить библиотеки для обучения на GPU. Для наших экземпляров мы выбрали Ubuntu 16.04 Linux, с GPU Driver 396.44, CUDA 9.2, библиотеку cuDNN 7.2.1, коммуникатор NCCL 2.2.13 и OpenMPI 3.1.1. Также вы можете использовать , 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 и .
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.pyZá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 najprv vybudovať MXNet. Tiež dôrazne odporúčame prečítať si článok začať.
Ak ste už pracovali s MXNet a chcete si vyskúšať distribuované učenie s Horovodom, pozrite sa na , vytvorte si ho z MXNet a postupujte podľa príkladu alebo .
*cena sa vypočítava na základe AWS pre inštancie EC2
Zistite viac o kurze
Zdroj: hab.com
