Distribuerad inlÀrning med Apache MXNet och Horovod

ÖversĂ€ttningen av artikeln Ă€r framtagen inför kursstarten «Industriell ML pĂ„ stora data»

Distribuerad trÀning pÄ flera högpresterande berÀkningsinstanser kan minska trÀningstiden för moderna djupa neurala nÀtverk pÄ stora datamÀngder frÄn flera veckor till timmar eller till och med minuter, vilket gör denna inlÀrningsteknik dominerande inom tillÀmpningen 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 mÄste anvÀndare veta hur man deployar ett trÀningsskript pÄ flera instanser som fungerar pÄ en enda instans.

I denna artikel kommer vi att diskutera ett snabbt och enkelt sÀtt för distribuerad trÀning med hjÀlp av det öppna djupinlÀrningsbiblioteket Apache MXNet och ramverket för distribuerad trÀning Horovod. Vi kommer tydligt att visa fördelarna med Horovod-ramverket nÀr det gÀller prestanda och demonstrera hur man skriver ett MXNet-trÀningsskript sÄ att det fungerar distribuerat med Horovod.

Vad Àr Apache MXNet

Apache MXNet – ett öppet ramverk för djupinlĂ€rning, som anvĂ€nds för att skapa, trĂ€na och deploya djupa neurala nĂ€tverk. MXNet abstraherar bort komplexiteten som Ă€r kopplad till implementeringen av neurala nĂ€tverk, har hög prestanda och skalbarhet, och erbjuder API:er för populĂ€ra programmeringssprĂ„k som Python, C++, Clojure, Java, Julia, R, Scala och andra.

Distribuerad trÀning i MXNet med parameter server

Standardmodulen för distribuerad trĂ€ning i MXNet anvĂ€nder en parameterserveransats. Den anvĂ€nder en uppsĂ€ttning parameterservrar för att samla in gradienter frĂ„n varje arbetare, utföra aggregering och skicka tillbaka de uppdaterade gradienterna till arbetarna för nĂ€sta iterationsoptimering. Att definiera rĂ€tt förhĂ„llande mellan servrar och arbetare Ă€r nyckeln till effektiv skalning. Om det bara finns en parameterserver kan den bli en flaskhals i berĂ€kningarna. Å andra sidan, om för mĂ„nga servrar anvĂ€nds, kan "mĂ„nga-till-mĂ„nga"-anslutningarna blockera alla nĂ€tverksanslutningar.

Vad Àr Horovod

Horovod – en öppen ramverk för distribuerad djupinlĂ€rning, utvecklad av Uber. Den anvĂ€nder effektiva teknologier för samverkan mellan flera GPU:er och noder, sĂ„som NVIDIA Collective Communications Library (NCCL) och Message Passing Interface (MPI) för att fördela och aggreggera modellens parametrar mellan arbetarna. Den optimerar anvĂ€ndningen av nĂ€tverksbandbredd och skalar vĂ€l nĂ€r den arbetar med modeller för djupa neurala nĂ€tverk. För nĂ€rvarande stöder den flera populĂ€ra maskininlĂ€rningsramverk, nĂ€mligen MXNet, Tensorflow, Keras och PyTorch.

Integrering av MXNet och Horovod

MXNet integreras med Horovod via API:er för distribuerad inlÀrning, definierade i Horovod. I Horovod kommunikations-API:er horovod.broadcast(), horovod.allgather() och horovod.allreduce() realiseras med hjÀlp av asynkrona callbacks frÄn MXNet-motorn, som en del av dess uppgiftsschema. PÄ sÄ sÀtt hanteras data beroenden mellan kommunikation och berÀkningar lÀtt av MXNet-motorn, för att undvika prestandaförluster pÄ grund av synkronisering. Objektet distributed optimizer, definierat i Horovod horovod.DistributedOptimizer utvidgar Optimizer i MXNet pÄ ett sÀtt sÄ att det anropar motsvarande API:er frÄn Horovod för distribuerad uppdatering av parametrar. Alla dessa implementationsdetaljer Àr transparenta för slutanvÀndarna.

Snabbstart

Du kan snabbt börja trÀna ett litet konvolutionellt neuralt nÀtverk pÄ MNIST-datasetet med MXNet och Horovod pÄ din MacBook.
För att börja, installera mxnet och horovod frÄn PyPI:

pip install mxnet
pip install horovod

Obs: Om du fĂ„r ett fel under pip install horovod, kan det hĂ€nda att du behöver lĂ€gga till variabeln MACOSX_DEPLOYMENT_TARGET=10.vv, dĂ€r vv – Ă€r detta versionen av din MacOS-version, till exempel för MacOSX Sierra behöver du skriva MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Installera sedan OpenMPI hÀrifrÄn.

Till slut, ladda ner testscriptet mxnet_mnist.py hÀrifrÄn och kör följande kommandon i terminalen pÄ din MacBook i arbetskatalogen:

mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py

SÄ hÀr kör du trÀningen pÄ tvÄ kÀrnor av din processor. Utdata kommer att se ut ungefÀr sÄ hÀr:

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

Prestandademonstration

Vid trÀning av ResNet50-v1 modellen pÄ ImageNet-datasetet pÄ 64 GPU:er med Ätta instanser p3.16xlarge EC2, dÀr var och en innehÄller 8 GPU NVIDIA Tesla V100 pÄ AWS-molnet, nÄdde vi en trÀningsbandbredd pÄ 45000 bilder/sek (d.v.s. antalet trÀnade exempel per sekund). TrÀningen avslutades efter 44 minuter efter 90 epoker med bÀsta noggrannhet pÄ 75,7%.

Vi jÀmförde detta med distribuerad trÀning av MXNet med en metod som anvÀnder parameterservrar pÄ 8, 16, 32 och 64 GPU med en server med en parameter och förhÄllandet mellan servrar och arbetare 1 till 1 respektive 2 till 1. Resultatet kan ni se i Figur 1 nedan. PÄ y-axeln till vÀnster speglar staplarna antalet bilder för trÀning per sekund, linjerna visar skalningsprestanda (d.v.s. förhÄllandet mellan faktisk bandbredd och idealisk) pÄ y-axeln till höger. Som ni ser pÄverkar valet av antal servrar skalningsprestanda. Om parameterservern Àr en, faller skalningsprestandan till 38% vid 64 GPU. För att uppnÄ samma skalningsprestanda som med Horovod mÄste antalet servrar ökas dubbelt i förhÄllande till antalet arbetare.

Distribuerad inlÀrning med Apache MXNet och Horovod
Figur 1. JÀmförelse av distribuerad trÀning med anvÀndning av MXNet med Horovod och med parameterserver.

I Tabell 1 nedan jÀmförde vi den slutliga kostnaden för instansen vid utförande av experiment pÄ 64 GPU. AnvÀndning av MXNet tillsammans med Horovod ger bÀsta bandbredd med lÀgsta kostnader.

Distribuerad inlÀrning med Apache MXNet och Horovod
Tabell 1. JÀmförelse av kostnader mellan Horovod och parameterserver med förhÄllandet servrar till arbetare 2 till 1.

Steg för att Äterskapa

I följande steg kommer vi att förklara hur man Äterskapar resultatet av distribuerad trÀning med hjÀlp av MXNet och Horovod. För att lÀra dig mer om distribuerad trÀning med MXNet, lÀs detta inlÀgg.

Steg 1

Skapa en 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 trÀning. Du mÄste ocksÄ installera bibliotek för trÀning pÄ GPU. För vÄra instanser valde vi Ubuntu 16.04 Linux, med GPU-driver 396.44, CUDA 9.2, cuDNN-bibliotek 7.2.1, NCCL-kommunikator 2.2.13 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öjlighet att arbeta med Horovod API i ditt trÀningsskript för MXNet. NedanstÄende skript baserat pÄ MXNet Gluon API kan anvÀndas som en enkel mall. Raderna som Àr markerade med fet stil behövs om du redan har ett relevant trÀningsskript. HÀr Àr nÄgra kritiska Àndringar som mÄste göras för trÀning med Horovod:

  • StĂ€ll in kontexten enligt Horovods lokala rang (rad 8) för att sĂ€kerstĂ€lla att trĂ€ningen utförs pĂ„ rĂ€tt grafikkĂ€rna.
  • Överför initiala parametrar frĂ„n en arbetare till alla (rad 18) för att se till att alla arbetare börjar med samma initiala parametrar.
  • Skapa Horovod DistributedOptimizer (rad 25) för att uppdatera parametrar distribuerat.

För att fÄ det fullstÀndiga skriptet, hÀnvisa till exempel pÄ Horovod-MXNet MNIST och ImageNet.

1  import mxnet as mx
2  import horovod.mxnet as hvd
3
4  # Horovod: initiera Horovod
5  hvd.init()
6
7  # Horovod: lÄsa en GPU för att anvÀndas av lokal rang
8  context = mx.gpu(hvd.local_rank())
9
10 # Bygg model
11 model = ...
12
13 # Initiera parametrar
14 model.initialize(initializer, ctx=context)
15 params = model.collect_params()
16
17 # Horovod: sÀnd ut parametrar
18 hvd.broadcast_parameters(params, root_rank=0)
19
20 # Skapa optimizer
21 optimizer_params = ...
22 opt = mx.optimizer.create('sgd', **optimizer_params)
23
24 # Horovod: omslut optimizer med DistributedOptimizer
25 opt = hvd.DistributedOptimizer(opt)
26
27 # Skapa trÀnare och förlustfunktion
28 trainer = mx.gluon.Trainer(params, opt, kvstore=None)
29 loss_fn = ...
30
31 # TrÀna modellen
32 for epoch in range(num_epoch):
33    ...

Steg 3

Logga in pÄ en av arbetarna för att starta distribuerad trÀning med hjÀlp av MPI-direktiv. I detta exempel startas distribuerad trÀning pÄ fyra instanser med 4 GPU:er vardera, vilket totalt blir 16 GPU:er i klustret. En stochastic gradient descent (SGD) optimizer kommer att anvÀndas med följande hyperparametrar:

  • mini-batch size: 256
  • learning rate: 0.1
  • momentum: 0.9
  • weight decay: 0.0001

NÀr vi skalade frÄn en GPU till 64 GPU:er skalade vi linjÀrt inlÀrningshastigheten i förhÄllande till antalet GPU:er (frÄn 0,1 för 1 GPU till 6,4 för 64 GPU), medan vi behöll antalet bilder per GPU pÄ 256 (frÄn ett paket om 256 bilder för 1 GPU till 16 384 för 64 GPU). Parametrarna weight decay och momentum justerades efter antalet GPU:er. Vi anvÀnde blandad precisionstrÀning med datatypen float16 för framÄtpassagen och float32 för gradienter, för att pÄskynda float16-berÀkningar 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 har vi granskat en skalbar metod för distribuerad modellutbildning med hjÀlp av Apache MXNet och Horovod. Vi visade effektiviteten av skalning och kostnadseffektivitet i jÀmförelse med metoden med en parameter-server pÄ datasetet ImageNet, dÀr modellen ResNet50-v1 utbildades. Vi beskrev ocksÄ de steg genom vilka du kan Àndra ett befintligt skript för att starta trÀningen pÄ flera instanser med hjÀlp av Horovod.

Om du precis har börjat arbeta med MXNet och djupinlÀrning, gÄ till installationssidan MXNe, för att först bygga MXNet. Vi rekommenderar ocksÄ starkt att lÀsa artikeln MXNet pÄ 60 minuter, för att komma igÄng.

Om du redan har arbetat med MXNet och vill prova distribuerad utbildning med Horovod, kika pÄ installationssidan för Horovod, bygg det med MXNet och följ exemplet MNIST eller ImageNet.

*kostnaden berÀknas baserat pÄ timtaxa AWS för EC2-instanser

LÀs mer om kursen «Industriell ML pÄ stora data»

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster