Distribuerat lärande med Apache MXNet och Horovod

Översättningen av artikeln förbereddes strax före kursstart "Industriell ML på Big Data"

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

Apache MX Net är ett ramverk för djupinlärning med öppen källkod som används för att skapa, träna och distribuera djupa neurala nätverk. MXNet abstraherar komplexiteten som är förknippad med att implementera neurala nätverk, är högpresterande och skalbar och erbjuder API:er för populära programmeringsspråk som t.ex. Python, C + +, Clojure, java, julia, R, Skala och andra.

Distribuerad utbildning i MXNet med parameterserver

Standard distribuerad inlärningsmodul i MXNet använder en parameterservermetod. Den använder en uppsättning parameterservrar för att samla in gradienter från varje arbetare, utföra aggregering och skicka uppdaterade gradienter tillbaka till arbetarna för nästa optimeringsiteration. Att fastställa det korrekta förhållandet mellan servrar och arbetare är nyckeln till effektiv skalning. Om det bara finns en parameterserver kan det visa sig vara en flaskhals i beräkningarna. Omvänt, om för många servrar används, kan många-till-många-kommunikation täppa till alla nätverksanslutningar.

Vad är Horovod

Horovod är ett öppet distribuerat ramverk för djupinlärning utvecklat på Uber. Den utnyttjar effektiv cross-GPU och cross-node-teknologier som NVIDIA Collective Communications Library (NCCL) och Message Passing Interface (MPI) för att distribuera och aggregera modellparametrar över vorecs. Den optimerar användningen av nätverksbandbredd och skalas väl när man arbetar med djupa neurala nätverksmodeller. Den stöder för närvarande flera populära ramverk för maskininlärning, nämligen MX Net, Tensorflow, Keras och PyTorch.

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

I slutet laddar du ner testskriptet mxnet_mnist.py hence och kör följande kommandon i MacBook-terminalen i arbetskatalogen:

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.

Distribuerat lärande med Apache MXNet och Horovod
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.

Distribuerat lärande med Apache MXNet och Horovod
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 den här posten.

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 Amazon Deep Learning AMI, där dessa bibliotek redan är förinstallerade.

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

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 MXNeför att först bygga MXNet. Vi rekommenderar också starkt att läsa artikeln MXNet på 60 minuterför att starta.

Om du redan har arbetat med MXNet och vill prova distribuerad inlärning med Horovod, ta en titt på Horovod installationssida, bygg den från MXNet och följ exemplet MNIST eller IMAGEnet.

*kostnaden är beräknad utifrån timpriser AWS för EC2-instanser

Läs mer om kursen "Industriell ML på Big Data"

Källa: will.com

Lägg en kommentar