Distribuované učení s Apache MXNet a Horovod

Překlad článku byl připraven v předvečer zahájení kurzu „Průmyslové ML na velkých datech“

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

Apache MX Net 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ř. PYTHON, C + +, Clojure, Jáva, Julie, R, Scala a další.

Distribuované školení v MXNet s parametrickým serverem

Standardní modul distribuovaného učení v MXNet 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

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ě MX Net, 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 horovod

Pozná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 proto.

Na konci si stáhněte testovací skript mxnet_mnist.py proto 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.py

Tí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.870000

Uká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ů.

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

Distribuované učení s Apache MXNet a Horovod
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 tento příspěvek.

Krok 1

Vytvořte shluk homogenních instancí s MXNet verze 1.4.0 nebo vyšší a Horovod verze 0.16.0 nebo vyšší pro použití distribuovaného učení. Budete také muset nainstalovat knihovny pro školení GPU. Pro naše instance jsme vybrali 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. Také můžete použít Amazon Deep Learning AMI, 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 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

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

Zá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 MXNenejprve vybudovat MXNet. Také důrazně doporučujeme přečíst si článek MXNet za 60 minutzačít.

Pokud jste již s MXNet pracovali a chcete si vyzkoušet distribuované učení s Horovodem, pak se podívejte na Instalační stránka Horovod, vytvořte jej z MXNet a postupujte podle příkladu MNIST nebo IMAGEnet.

*cena se počítá na základě hodinové sazby AWS pro instance EC2

Zjistěte více o kurzu „Průmyslové ML na velkých datech“

Zdroj: www.habr.com

Přidat komentář