Distribuert læring med Apache MXNet og Horovod

Oversettelsen av artikkelen ble utarbeidet like før kursstart "Industriell ML på Big Data"

Distribuert opplæring på flere høyytelses databehandlingsinstanser kan redusere treningstiden til moderne dype nevrale nettverk på store datamengder fra uker til timer eller til og med minutter, noe som gjør denne treningsteknikken utbredt i praktiske anvendelser av dyp læring. Brukere må forstå hvordan de deler og synkroniserer data på tvers av flere instanser, noe som igjen har stor innvirkning på skaleringseffektiviteten. I tillegg bør brukere også vite hvordan de skal distribuere et opplæringsskript som kjører på en enkelt forekomst til flere forekomster.

I denne artikkelen vil vi snakke om en rask og enkel måte å distribuere læring ved å bruke det åpne dyplæringsbiblioteket Apache MXNet og Horovods distribuerte læringsrammeverk. Vi vil tydelig demonstrere ytelsesfordelene til Horovod-rammeverket og demonstrere hvordan du skriver et MXNet-treningsskript slik at det fungerer på en distribuert måte med Horovod.

Hva er Apache MXNet

Apache MX Nett er en åpen kildekode for dyp læringsramme som brukes til å lage, trene og distribuere dype nevrale nettverk. MXNet abstraherer kompleksiteten knyttet til implementering av nevrale nettverk, er svært ytende og skalerbar, og tilbyr APIer for populære programmeringsspråk som f.eks. Python, C + +, Clojure, Java, Julia, R, Skala og andre.

Distribuert opplæring i MXNet med parameterserver

Standard distribuert læringsmodul i MXNet bruker en parameterserver-tilnærming. Den bruker et sett med parameterservere for å samle gradienter fra hver arbeider, utføre aggregering og sende oppdaterte gradienter tilbake til arbeidere for neste optimaliseringsiterasjon. Å bestemme riktig forhold mellom servere og arbeidere er nøkkelen til effektiv skalering. Hvis det kun er én parameterserver, kan det vise seg å være en flaskehals i beregningene. Omvendt, hvis for mange servere brukes, kan mange-til-mange kommunikasjon tette opp alle nettverksforbindelser.

Hva er Horovod

Horovod er et åpent distribuert dyplæringsrammeverk utviklet ved Uber. Den utnytter effektive cross-GPU og cross-node-teknologier som NVIDIA Collective Communications Library (NCCL) og Message Passing Interface (MPI) for å distribuere og samle modellparametere på tvers av vorecs. Den optimerer bruken av nettverksbåndbredde og skalerer godt når du arbeider med dype nevrale nettverksmodeller. Den støtter for tiden flere populære rammeverk for maskinlæring, nemlig MX Nett, Tensorflow, Keras og PyTorch.

MXNet og Horovod-integrasjon

MXNet integreres med Horovod gjennom API-ene for distribuert læring som er definert i Horovod. Horovod kommunikasjons-APIer horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementert ved å bruke asynkrone tilbakeringinger av MXNet-motoren, som en del av oppgavegrafen. På denne måten håndteres dataavhengigheter mellom kommunikasjon og beregning enkelt av MXNet-motoren for å unngå ytelsestap på grunn av synkronisering. Distribuert optimeringsobjekt definert i Horovod horovod.DistributedOptimizer utvides Optimizer i MXNet slik at den kaller de tilsvarende Horovod APIene for distribuerte parameteroppdateringer. Alle disse implementeringsdetaljene er transparente for sluttbrukere.

Rask start

Du kan raskt begynne å trene et lite konvolusjonelt nevralt nettverk på MNIST-datasettet ved å bruke MXNet og Horovod på din MacBook.
Installer først mxnet og horovod fra PyPI:

pip install mxnet
pip install horovod

Merk: Hvis du støter på en feil under pip installer horovodkanskje du må legge til en variabel MACOSX_DEPLOYMENT_TARGET=10.vvDer vv – dette er versjonen av MacOS-versjonen din, for eksempel for MacOSX Sierra må du skrive MACOSX_DEPLOYMENT_TARGET=10.12 pip-installasjon horovod

Installer deretter OpenMPI derav.

Last ned testskriptet på slutten mxnet_mnist.py derav og kjør følgende kommandoer i MacBook-terminalen i arbeidskatalogen:

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

Dette vil kjøre trening på to kjerner av prosessoren. Utgangen vil være følgende:

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

Ytelsesdemo

Når du trener en ResNet50-v1-modell på et ImageNet-datasett på 64 GPUer med åtte forekomster s3.16xlarge EC2, som hver inneholder 8 NVIDIA Tesla V100 GPUer på AWS-skyen, oppnådde vi en treningsgjennomstrømning på 45000 44 bilder/sek. (dvs. antall trente prøver per sekund). Trening fullført på 90 minutter etter 75.7 epoker med en beste nøyaktighet på XNUMX %.

Vi sammenlignet dette med MXNets distribuerte opplæringstilnærming med å bruke parameterservere på 8, 16, 32 og 64 GPUer med en enkelt parameterserver og et server-til-arbeiderforhold på henholdsvis 1 til 1 og 2 til 1. Resultatet kan du se i figur 1 nedenfor. På y-aksen til venstre representerer stolpene antall bilder som skal trenes per sekund, linjene gjenspeiler skaleringseffektiviteten (det vil si forholdet mellom faktisk og ideell gjennomstrømning) på y-aksen til høyre. Som du kan se, påvirker valget av antall servere skaleringseffektiviteten. Hvis det bare er én parameterserver, synker skaleringseffektiviteten til 38 % på 64 GPUer. For å oppnå samme skaleringseffektivitet som med Horovod, må du doble antall servere i forhold til antall arbeidere.

Distribuert læring med Apache MXNet og Horovod
Figur 1. Sammenligning av distribuert læring ved bruk av MXNet med Horovod og med parameterserver

I tabell 1 nedenfor sammenligner vi den endelige kostnaden per forekomst når vi kjører eksperimenter på 64 GPUer. Bruk av MXNet med Horovod gir den beste gjennomstrømningen til den laveste kostnaden.

Distribuert læring med Apache MXNet og Horovod
Tabell 1. Kostnadssammenligning mellom Horovod og Parameter Server med et server-til-arbeiderforhold på 2 til 1.

steg for å reprodusere

I de neste trinnene vil vi vise deg hvordan du reproduserer resultatet av distribuert trening ved å bruke MXNet og Horovod. For å lære mer om distribuert læring med MXNet les denne posten.

Trinn 1

Lag en klynge med homogene forekomster med MXNet versjon 1.4.0 eller høyere og Horovod versjon 0.16.0 eller høyere for å bruke distribuert læring. Du må også installere biblioteker for GPU-opplæring. For våre tilfeller valgte vi Ubuntu 16.04 Linux, med GPU-driver 396.44, CUDA 9.2, cuDNN 7.2.1-bibliotek, NCCL 2.2.13-kommunikator og OpenMPI 3.1.1. Du kan også bruke Amazon Deep Learning AMI, hvor disse bibliotekene allerede er forhåndsinstallert.

Trinn 2

Legg til muligheten til å jobbe med Horovod API til MXNet-treningsskriptet ditt. Skriptet nedenfor basert på MXNet Gluon API kan brukes som en enkel mal. Linjene i fet skrift er nødvendig hvis du allerede har et tilsvarende opplæringsmanus. Her er noen viktige endringer du må gjøre for å lære med Horovod:

  • Sett konteksten i henhold til den lokale Horovod-rangeringen (linje 8) for å forstå at trening utføres på riktig grafikkkjerne.
  • Send innledende parametere fra én arbeider til alle (linje 18) for å sikre at alle arbeidere starter med de samme innledende parameterne.
  • Lag en Horovod Distribuert Optimizer (linje 25) for å oppdatere parametrene på en distribuert måte.

For å få hele skriptet, se Horovod-MXNet-eksemplene 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    ...

Trinn 3

Logg på en av arbeiderne for å starte distribuert opplæring ved å bruke MPI-direktivet. I dette eksemplet kjører distribuert opplæring på fire forekomster med 4 GPUer hver, og totalt 16 GPUer i klyngen. Stochastic Gradient Descent (SGD) optimizer vil bli brukt med følgende hyperparametre:

  • mini-batch størrelse: 256
  • læringsrate: 0.1
  • momentum: 0.9
  • vektnedgang: 0.0001

Ettersom vi skalerte fra én GPU til 64 GPUer, skalerte vi treningshastigheten lineært i henhold til antall GPUer (fra 0,1 for 1 GPU til 6,4 for 64 GPUer), mens vi holdt antall bilder per GPU på 256 (fra en gruppe med 256 bilder for 1 GPU til 16 384 for 64 GPUer). Parametrene for vektreduksjon og momentum endret seg etter hvert som antallet GPUer økte. Vi brukte blandet presisjonstrening med float16-datatypen for foroverpasset og float32 for gradienter for å øke hastigheten på float16-beregningene som støttes av NVIDIA Tesla GPUer.

$ 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

Konklusjon

I denne artikkelen så vi på en skalerbar tilnærming til distribuert modelltrening ved bruk av Apache MXNet og Horovod. Vi demonstrerte skaleringseffektiviteten og kostnadseffektiviteten sammenlignet med parameterservertilnærmingen på ImageNet-datasettet som ResNet50-v1-modellen ble trent på. Vi har også inkludert trinn som du kan bruke til å endre et eksisterende skript for å kjøre multi-instans trening med Horovod.

Hvis du akkurat har kommet i gang med MXNet og dyp læring, gå til installasjonssiden MXNeå først bygge MXNet. Vi anbefaler også sterkt å lese artikkelen MXNet på 60 minutterfor å komme i gang.

Hvis du allerede har jobbet med MXNet og ønsker å prøve distribuert læring med Horovod, så ta en titt på Horovod installasjonsside, bygg den fra MXNet og følg eksemplet MNIST eller IMAGEnet.

*kostnaden er beregnet ut fra timepriser AWS for EC2-instanser

Lær mer om kurset "Industriell ML på Big Data"

Kilde: www.habr.com

Legg til en kommentar