Překlad článku byl připraven v předvečer zahájení kurzu
Distribuované školení na více vysoce výkonných výpočetních instancích může zkrátit dobu školení moderních hlubokých neuronových sítí na velkém množství dat z týdnů na hodiny nebo dokonce minuty, díky čemuž je tato technika školení převládající v praktických aplikacích hlubokého učení. Uživatelé musí rozumět tomu, jak sdílet a synchronizovat data napříč více instancemi, což má zase velký dopad na efektivitu škálování. Kromě toho by uživatelé měli také vědět, jak nasadit školicí skript, který běží na jedné instanci, na více instancí.
V tomto článku budeme hovořit o rychlém a snadném způsobu distribuce učení pomocí otevřené knihovny hlubokého učení Apache MXNet a distribuovaného výukového rámce Horovod. Jasně předvedeme výkonnostní výhody frameworku Horovod a předvedeme, jak napsat školicí skript MXNet tak, aby fungoval distribuovaným způsobem s Horovodem.
Co je Apache MXNet
je open-source rámec hlubokého učení, který se používá k vytváření, trénování a nasazení hlubokých neuronových sítí. MXNet abstrahuje složitosti spojené s implementací neuronových sítí, je vysoce výkonný a škálovatelný a nabízí API pro oblíbené programovací jazyky, jako je např. , , , , , , a další.
Distribuované školení v MXNet s parametrickým serverem
používá přístup parametrického serveru. Používá sadu parametrických serverů ke shromažďování přechodů od každého pracovníka, provádění agregace a odesílání aktualizovaných přechodů zpět pracovníkům pro další iteraci optimalizace. Určení správného poměru serverů a pracovníků je klíčem k efektivnímu škálování. Pokud existuje pouze jeden parametrický server, může se ukázat jako překážka ve výpočtech. Naopak, pokud je použito příliš mnoho serverů, může komunikace many-to-many ucpat všechna síťová připojení.
Co je Horovod
je otevřený distribuovaný rámec hlubokého učení vyvinutý ve společnosti Uber. Využívá efektivní technologie mezi GPU a mezi uzly, jako je NVIDIA Collective Communications Library (NCCL) a Message Passing Interface (MPI) k distribuci a agregaci parametrů modelu napříč vorecy. Optimalizuje využití šířky pásma sítě a dobře se škáluje při práci s modely hlubokých neuronových sítí. V současné době podporuje několik populárních rámců strojového učení, jmenovitě , Tensorflow, Keras a PyTorch.
Integrace MXNet a Horovod
MXNet se integruje s Horovodem prostřednictvím rozhraní Distributed Learning API definovaných v Horovod. Komunikační API Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementováno pomocí asynchronních zpětných volání enginu MXNet, jako součásti jeho grafu úloh. Tímto způsobem jsou datové závislosti mezi komunikací a výpočtem snadno řešeny jádrem MXNet, aby se zabránilo ztrátám výkonu v důsledku synchronizace. Distribuovaný objekt optimalizátoru definovaný v Horovodu horovod.DistributedOptimizer rozšiřuje Optimalizátor v MXNet tak, že volá odpovídající rozhraní Horovod API pro distribuované aktualizace parametrů. Všechny tyto podrobnosti implementace jsou pro koncové uživatele transparentní.
Rychlý start
Můžete rychle začít trénovat malou konvoluční neuronovou síť na datové sadě MNIST pomocí MXNet a Horovod na vašem MacBooku.
Nejprve nainstalujte mxnet a horovod z PyPI:
pip install mxnet
pip install horovodPoznámka: Pokud během aplikace dojde k chybě pip install horovodmožná budete muset přidat proměnnou MACOSX_DEPLOYMENT_TARGET=10.vvKde vv – toto je verze vaší verze MacOS, například pro MacOSX Sierra budete muset napsat MACOSX_DEPLOYMENT_TARGET=10.12 pip instalace horovod
Poté nainstalujte OpenMPI .
Na konci si stáhněte testovací skript mxnet_mnist.py a spusťte následující příkazy v terminálu MacBook v pracovním adresáři:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyTím spustíte školení na dvou jádrech vašeho procesoru. Výstup bude následující:
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ázka výkonu
Při trénování modelu ResNet50-v1 na datové sadě ImageNet na 64 GPU s osmi instancemi p3.16xvelký EC2, každý obsahující 8 GPU NVIDIA Tesla V100 v cloudu AWS, jsme dosáhli trénovací propustnosti 45000 44 snímků/s (tj. počet trénovaných vzorků za sekundu). Trénink dokončen za 90 minut po 75.7 epochách s nejlepší přesností XNUMX %.
Porovnali jsme to s přístupem distribuovaného školení MXNet, který používá parametrické servery na 8, 16, 32 a 64 GPU s jedním parametrickým serverem a poměrem server/pracovník 1:1 a 2:1. Výsledek můžete vidět na obrázku 1 níže. Sloupky na ose y vlevo představují počet snímků k natrénování za sekundu, čáry odrážejí efektivitu škálování (tj. poměr skutečné a ideální propustnosti) na ose y vpravo. Jak vidíte, výběr počtu serverů ovlivňuje efektivitu škálování. Pokud existuje pouze jeden parametrický server, účinnost škálování klesne na 38 % na 64 GPU. Chcete-li dosáhnout stejné efektivity škálování jako u Horovod, musíte zdvojnásobit počet serverů vzhledem k počtu pracovníků.

Obrázek 1. Porovnání distribuovaného učení pomocí MXNet s Horovodem a s parametrickým serverem
V tabulce 1 níže porovnáváme konečné náklady na instanci při spuštění experimentů na 64 GPU. Použití MXNet s Horovod poskytuje nejlepší propustnost za nejnižší cenu.

Tabulka 1. Porovnání nákladů mezi Horovod a Parameter Server s poměrem server/pracovník 2:1.
Kroky k reprodukci
V dalších krocích si ukážeme, jak reprodukovat výsledek distribuovaného školení pomocí MXNet a Horovod. Chcete-li se dozvědět více o distribuovaném učení s MXNet, přečtěte si .
Krok 1
Vytvořte cluster homogenních instancí s MXNet verze 1.4.0 nebo vyšší a Horovod verze 0.16.0 nebo vyšší pro použití distribuovaného trénování. Budete také muset nainstalovat knihovny pro trénování GPU. Pro naše instance jsme zvolili Ubuntu 16.04 Linux, s ovladačem GPU 396.44, CUDA 9.2, knihovnou cuDNN 7.2.1, komunikátorem NCCL 2.2.13 a OpenMPI 3.1.1. Můžete také použít , kde jsou tyto knihovny již předinstalované.
Krok 2
Přidejte do tréninkového skriptu MXNet možnost pracovat s Horovod API. Níže uvedený skript založený na MXNet Gluon API lze použít jako jednoduchou šablonu. Tučné řádky jsou potřeba, pokud již máte odpovídající tréninkový skript. Zde je několik zásadních změn, které musíte provést, abyste se naučili s Horovodem:
- Nastavte kontext podle místní hodnosti Horovod (řádek 8), abyste pochopili, že školení se provádí na správném grafickém jádru.
- Předejte počáteční parametry od jednoho pracovníka všem (řádek 18), abyste zajistili, že všichni pracovníci začínají se stejnými počátečními parametry.
- Vytvořte Horovod DistributedOptimizer (řádek 25) k aktualizaci parametrů distribuovaným způsobem.
Chcete-li získat úplný skript, podívejte se na pří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
Přihlaste se k jednomu z pracovníků a začněte distribuované školení pomocí směrnice MPI. V tomto příkladu běží distribuované školení na čtyřech instancích se 4 GPU a celkem 16 GPU v clusteru. Optimalizátor Stochastic Gradient Descent (SGD) bude použit s následujícími hyperparametry:
- velikost mini-dávky: 256
- rychlost učení: 0.1
- hybnost: 0.9
- úbytek hmotnosti: 0.0001
Když jsme škálovali z jednoho GPU na 64 GPU, lineárně jsme škálovali rychlost školení podle počtu GPU (od 0,1 pro 1 GPU do 6,4 pro 64 GPU), přičemž jsme zachovali počet obrázků na GPU na 256 (z dávky 256 obrázků pro 1 GPU až 16 384 pro 64 GPU). Parametry úbytku hmotnosti a hybnosti se měnily s rostoucím počtem GPU. Použili jsme smíšené trénování přesnosti s datovým typem float16 pro dopředný průchod a float32 pro gradienty, abychom urychlili výpočty float16 podporované GPU 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.pyZávěr
V tomto článku jsme se podívali na škálovatelný přístup k tréninku distribuovaných modelů pomocí Apache MXNet a Horovod. Prokázali jsme efektivitu škálování a nákladovou efektivitu ve srovnání s přístupem parametrického serveru na datové sadě ImageNet, na které byl trénován model ResNet50-v1. Zahrnuli jsme také kroky, které můžete použít k úpravě existujícího skriptu pro spuštění víceinstančního školení pomocí Horovod.
Pokud s MXNet a hlubokým učením teprve začínáte, přejděte na stránku instalace nejprve vybudovat MXNet. Také důrazně doporučujeme přečíst si článek začít.
Pokud jste již s MXNet pracovali a chcete si vyzkoušet distribuované učení s Horovodem, pak se podívejte na , vytvořte jej z MXNet a postupujte podle příkladu nebo .
*cena se počítá na základě AWS pro instance EC2
Zjistěte více o kurzu
Zdroj: www.habr.com
