Översättningen av artikeln förbereddes strax före kursstart
Distribuerad utbildning på flera högpresterande datorinstanser kan minska träningstiden för moderna djupa neurala nätverk på stora mängder data från veckor till timmar eller till och med minuter, vilket gör denna träningsteknik utbredd i praktiska tillämpningar av djupinlärning. Användare måste förstå hur man delar och synkroniserar data över flera instanser, vilket i sin tur har stor inverkan på skalningseffektiviteten. Dessutom bör användare också veta hur man distribuerar ett träningsskript som körs på en enda instans till flera instanser.
I den här artikeln kommer vi att prata om ett snabbt och enkelt sätt att distribuera lärande med hjälp av det öppna djupinlärningsbiblioteket Apache MXNet och Horovods distribuerade läranderamverk. Vi kommer tydligt att visa prestandafördelarna med Horovod-ramverket och visa hur man skriver ett MXNet-träningsskript så att det fungerar på ett distribuerat sätt med Horovod.
Vad är Apache MXNet
Distribuerad utbildning i MXNet med parameterserver
Vad är Horovod
MXNet och Horovod integration
MXNet integreras med Horovod genom API:erna för distribuerad lärande som definieras i Horovod. Horovod kommunikations API:er horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementeras med hjälp av asynkrona callbacks av MXNet-motorn, som en del av dess uppgiftsdiagram. På detta sätt hanteras databeroende mellan kommunikation och beräkning enkelt av MXNet-motorn för att undvika prestandaförluster på grund av synkronisering. Distribuerat optimeringsobjekt definierat i Horovod horovod.DistributedOptimizer expanderar Optimizer i MXNet så att den anropar motsvarande Horovod API för distribuerade parameteruppdateringar. Alla dessa implementeringsdetaljer är transparenta för slutanvändarna.
Snabb start
Du kan snabbt börja träna ett litet konvolutionellt neuralt nätverk på MNIST-datauppsättningen med MXNet och Horovod på din MacBook.
Installera först mxnet och horovod från PyPI:
pip install mxnet
pip install horovod
Obs: Om du stöter på ett fel under pip installera horovodkanske du behöver lägga till en variabel MACOSX_DEPLOYMENT_TARGET=10.vvvar vv – det här är versionen av din MacOS-version, till exempel för MacOSX Sierra måste du skriva MACOSX_DEPLOYMENT_TARGET=10.12 pip installera horovod
Installera sedan OpenMPI
I slutet laddar du ner testskriptet mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
Detta kommer att köra träning på två kärnor i din processor. Utgången blir följande:
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
Prestandademo
När du tränar en ResNet50-v1-modell på en ImageNet-datauppsättning på 64 GPU:er med åtta instanser p3.16xstor EC2, som var och en innehåller 8 NVIDIA Tesla V100 GPU:er på AWS-molnet, uppnådde en träningsgenomströmning på 45000 44 bilder/sek (dvs. antalet tränade prover per sekund). Träningen genomfördes på 90 minuter efter 75.7 epoker med en bästa noggrannhet på XNUMX %.
Vi jämförde detta med MXNets distribuerade träningsmetod att använda parameterservrar på 8, 16, 32 och 64 GPU:er med en enda parameterserver och en server till arbetarförhållande på 1 till 1 respektive 2 till 1. Du kan se resultatet i figur 1 nedan. På y-axeln till vänster representerar staplarna antalet bilder som ska tränas per sekund, linjerna återspeglar skalningseffektiviteten (det vill säga förhållandet mellan faktisk och idealisk genomströmning) på y-axeln till höger. Som du kan se påverkar valet av antalet servrar skalningseffektiviteten. Om det bara finns en parameterserver sjunker skalningseffektiviteten till 38 % på 64 GPU:er. För att uppnå samma skalningseffektivitet som med Horovod måste du dubbla antalet servrar i förhållande till antalet arbetare.
Figur 1. Jämförelse av distribuerad inlärning med MXNet med Horovod och med parameterserver
I Tabell 1 nedan jämför vi den slutliga kostnaden per instans när vi kör experiment på 64 GPU:er. Att använda MXNet med Horovod ger den bästa genomströmningen till lägsta kostnad.
Tabell 1. Kostnadsjämförelse mellan Horovod och Parameter Server med ett förhållande mellan server och arbetare på 2 till 1.
Steg för att reproducera
I nästa steg kommer vi att visa dig hur du återskapar resultatet av distribuerad träning med MXNet och Horovod. Läs mer om distribuerad inlärning med MXNet
Steg 1
Skapa ett kluster av homogena instanser med MXNet version 1.4.0 eller högre och Horovod version 0.16.0 eller högre för att använda distribuerad inlärning. Du måste också installera bibliotek för GPU-utbildning. För våra instanser valde vi Ubuntu 16.04 Linux, med GPU-drivrutin 396.44, CUDA 9.2, cuDNN 7.2.1-bibliotek, NCCL 2.2.13-kommunikatör och OpenMPI 3.1.1. Du kan också använda
Steg 2
Lägg till möjligheten att arbeta med Horovod API till ditt MXNet-utbildningsskript. Nedanstående skript baserat på MXNet Gluon API kan användas som en enkel mall. Raderna i fet stil behövs om du redan har ett motsvarande träningsmanus. Här är några viktiga ändringar du behöver göra för att lära dig med Horovod:
- Ställ in sammanhanget enligt den lokala Horovod-rankningen (rad 8) för att förstå att träningen utförs på rätt grafikkärna.
- Skicka inledande parametrar från en arbetare till alla (rad 18) för att säkerställa att alla arbetare börjar med samma initiala parametrar.
- Skapa en Horovod DistributedOptimizer (rad 25) för att uppdatera parametrarna på ett distribuerat sätt.
För att få hela skriptet, se Horovod-MXNet-exemplen
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 ...
Steg 3
Logga in på en av arbetarna för att starta distribuerad utbildning med hjälp av MPI-direktivet. I det här exemplet körs distribuerad utbildning på fyra instanser med 4 GPU:er vardera och totalt 16 GPU:er i klustret. Stochastic Gradient Descent (SGD)-optimeraren kommer att användas med följande hyperparametrar:
- minibatchstorlek: 256
- inlärningshastighet: 0.1
- fart: 0.9
- viktminskning: 0.0001
När vi skalade från en GPU till 64 GPU: er, skalade vi linjärt träningshastigheten enligt antalet GPU: er (från 0,1 för 1 GPU till 6,4 för 64 GPU), samtidigt som antalet bilder per GPU hölls på 256 (från en sats av 256 bilder för 1 GPU till 16 384 för 64 GPU). Parametrarna för viktminskning och momentum ändrades när antalet GPU:er ökade. Vi använde blandad precisionsträning med float16-datatypen för framåtpassningen och float32 för gradienter för att påskynda float16-beräkningarna som stöds av NVIDIA Tesla GPU:er.
$ 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
Slutsats
I den här artikeln tittade vi på ett skalbart tillvägagångssätt för distribuerad modellträning med Apache MXNet och Horovod. Vi demonstrerade skalningseffektiviteten och kostnadseffektiviteten jämfört med parameterservermetoden på ImageNet-datauppsättningen som ResNet50-v1-modellen tränades på. Vi har också inkluderat steg som du kan använda för att modifiera ett befintligt skript för att köra träning med flera instanser med Horovod.
Om du precis har börjat med MXNet och djupinlärning, gå till installationssidan
Om du redan har arbetat med MXNet och vill prova distribuerad inlärning med Horovod, ta en titt på
*kostnaden är beräknad utifrån
Läs mer om kursen
Källa: will.com