Oversettelsen av artikkelen ble utarbeidet like før kursstart
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
Distribuert opplæring i MXNet med parameterserver
Hva er Horovod
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
Last ned testskriptet på slutten mxnet_mnist.py
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.
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.
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
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
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
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
Hvis du allerede har jobbet med MXNet og ønsker å prøve distribuert læring med Horovod, så ta en titt på
*kostnaden er beregnet ut fra
Lær mer om kurset
Kilde: www.habr.com