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
Distribuované školení v MXNet s parametrickým serverem
Co je Horovod
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
Na konci si stáhněte testovací skript mxnet_mnist.py
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ů.
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 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
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.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
Pokud jste již s MXNet pracovali a chcete si vyzkoušet distribuované učení s Horovodem, pak se podívejte na
*cena se počítá na základě
Zjistěte více o kurzu
Zdroj: www.habr.com