Oversettelsen av artikkelen ble utarbeidet like før kursstart
Distribuert trening på tvers av flere høyytelsesdatabehandlingsinstanser kan redusere treningstiden for moderne dype nevrale nettverk på store mengder data fra uker til timer eller til og med minutter, noe som gjør denne treningsteknikken utbredt i praktiske dyp læringsapplikasjoner. Brukere må forstå hvordan de deler og synkroniserer data på tvers av flere instanser, noe som igjen har stor innvirkning på skaleringseffektiviteten. I tillegg må brukerne også vite hvordan de distribuerer et treningsskript som kjører på én instans til flere instanser.
I denne artikkelen skal vi snakke om en rask og enkel måte å utføre distribuert trening på ved hjelp av åpen kildekode-biblioteket Apache MXNet og det distribuerte treningsrammeverket Horovod. Vi vil tydelig vise fordelene med Horovod-rammeverket når det gjelder ytelse og demonstrere hvordan man skriver et MXNet-treningsskript slik at det fungerer distribuert med Horovod.
Hva er Apache MXNet
– et åpen kildekode-rammeverk for dyp læring som brukes til å bygge, trene og distribuere dype nevrale nettverk. MXNet abstraherer kompleksiteten knyttet til implementering av nevrale nettverk, er svært ytelsessterkt og skalerbart, og tilbyr API-er for populære programmeringsspråk som , , , , , , og andre.
Distribuert opplæring i MXNet med parameterserver
bruker en parameterservertilnærming. Den bruker et sett med parameterservere til å samle inn 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 bare er én parameterserver, kan det bli en beregningsmessig flaskehals. Omvendt, hvis det er for mange servere, kan mange-til-mange-forholdet tette alle nettverkstilkoblinger.
Hva er Horovod
– et åpen kildekode-distribuert rammeverk for dyp læring utviklet hos Uber. Det bruker effektive kommunikasjonsteknologier for flere GPU-er og flere noder, som NVIDIA Collective Communications Library (NCCL) og Message Passing Interface (MPI), for å distribuere og aggregere modellparametere på tvers av virvler. Det optimaliserer bruken av nettverksbåndbredde og skalerer godt når det kjøres modeller for dype nevrale nettverk. Det støtter for tiden flere populære maskinlæringsrammeverk, nemlig , Tensorflow, Keras og PyTorch.
MXNet og Horovod-integrasjon
MXNet integreres med Horovod via de distribuerte lærings-API-ene som er definert i Horovod. I Horovod er kommunikasjons-API-ene horovod.kringkasting(), horovod.allgather() и horovod.allreduce() implementeres ved hjelp av asynkrone tilbakekallinger fra 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. Det distribuerte optimeringsobjektet som er definert i Horovod horovod.DistribuertOptimizer utvides Optimizer i MXNet slik at den kaller de riktige Horovod API-ene 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 hjelp av MXNet og Horovod på MacBook-en din.
For å komme i gang, installer mxnet og horovod fra PyPI:
pip install mxnet
pip install horovodMerk: Hvis du støter på en feil under pip installerer horovod, du må kanskje 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 opp testskriptet til slutt mxnet_mnist.py 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.pyDette vil kjøre treningen på to kjerner i prosessoren din. Utdataene vil være:
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.870000Ytelsesdemonstrasjon
Når jeg trener ResNet50-v1-modellen på ImageNet-datasettet på 64 GPU-er med åtte instanser s3.16xlarge Med EC2, som hver inneholdt 8 NVIDIA Tesla V100 GPU-er i AWS Cloud, oppnådde vi en treningsgjennomstrømning på 45000 44 bilder/sek (dvs. antall trente prøver per sekund). Treningen ble fullført på 90 minutter etter 75.7 epoker med en beste nøyaktighet på XNUMX %.
Vi sammenlignet dette med distribuert trening av MXNet med tilnærmingen å bruke parameterservere på 8, 16, 32 og 64 GPU-er med en enkelt parameterserver og et server-til-arbeider-forhold på henholdsvis 1:1 og 2:1. Du kan se resultatet i figur 1 nedenfor. Y-aksen til venstre viser antall bilder som skal trenes per sekund, og linjene viser skaleringseffektiviteten (dvs. forholdet mellom faktisk og ideell gjennomstrømning) på y-aksen til høyre. Som du kan se, har valget av antall servere en innvirkning på skaleringseffektiviteten. Med en enkelt parameterserver synker skaleringseffektiviteten til 38 % på 64 GPU-er. For å oppnå samme skaleringseffektivitet som Horovod, må du øke antallet servere til det dobbelte av antallet arbeidere.

Figur 1. Sammenligning av distribuert trening ved bruk av MXNet med Horovod og med parameterserver
I tabell 1 nedenfor sammenligner vi den endelige kostnaden per instans når eksperimentene kjøres på 64 GPU-er. Bruk av MXNet med Horovod gir best gjennomstrømning til lavest mulig kostnad.

Tabell 1. Kostnadssammenligning mellom Horovod og en parameterserver med et server-til-arbeider-forhold på 2:1.
Fremgangsmåte for å reprodusere
I de følgende trinnene viser vi hvordan du reproduserer det distribuerte treningsresultatet ved hjelp av MXNet og Horovod. For å lære mer om distribuert trening med MXNet, les .
Trinn 1
Opprett en klynge av homogene instanser med MXNet versjon 1.4.0 eller høyere og Horovod versjon 0.16.0 eller høyere for å bruke distribuert trening. Du må også installere bibliotekene for GPU-trening. For våre instanser valgte vi Ubuntu 16.04 Linux, med GPU Driver 396.44, CUDA 9.2, cuDNN library 7.2.1, NCCL communicator 2.2.13 og OpenMPI 3.1.1. Du kan også bruke , der disse bibliotekene allerede er forhåndsinstallert.
Trinn 2
Forbedre MXNet-opplæringsskriptet ditt slik at det fungerer med Horovod API. Følgende skript, basert på MXNet Gluon API, kan brukes som en enkel mal. Linjene i fet skrift er nødvendige hvis du allerede har et opplæringsskript for å gjøre det. Her er noen viktige endringer du må gjøre for å trene med Horovod:
- Angi konteksten slik at den samsvarer med den lokale Horovod-rangeringen (linje 8) for å sikre at treningen utføres på riktig GPU-kjerne.
- Send startparametere fra én arbeider til alle (linje 18) for å sikre at alle arbeidere starter med de samme startparameterne.
- Opprett Horovod Distribuert optimalisering (linje 25) for å oppdatere parametere på en distribuert måte.
For 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 inn på en av arbeiderne for å kjøre distribuert trening ved hjelp av MPI-direktivet. I dette eksemplet kjøres distribuert trening på fire instanser med 4 GPU-er hver, for totalt 16 GPU-er i klyngen. Optimalisatoren som brukes er stokastisk gradient descent (SGD) med følgende hyperparametere:
- mini-batchstørrelse: 256
- læringsrate: 0.1
- momentum: 0.9
- vektforfall: 0.0001
Da vi skalerte fra én GPU til 64 GPU-er, skalerte vi treningshastigheten lineært med antall GPU-er (fra 0,1 for 1 GPU til 6,4 for 64 GPU-er), samtidig som vi holdt antallet bilder per GPU på 256 (fra en gruppe på 256 bilder for 1 GPU til 16 384 for 64 GPU-er). Vektforringelses- og momentumparametrene ble variert etter hvert som antallet GPU-er økte. Vi brukte blandet presisjonstrening med float16-datatypen for foroverpass og float32 for gradienter for å øke hastigheten på float16-beregninger som støttes 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.pyKonklusjon
I denne artikkelen har vi sett på en skalerbar tilnærming til distribuert modelltrening ved hjelp av Apache MXNet og Horovod. Vi viste skalerbarheten og kostnadseffektiviteten sammenlignet med parameterservertilnærmingen på ImageNet-datasettet, som trente ResNet50-v1-modellen. Vi viste også trinnene du kan ta for å endre et eksisterende skript for å kjøre trening på flere instanser ved hjelp av Horovod.
Hvis du akkurat har begynt med MXNet og dyp læring, kan du gå til installasjonssiden. , for først å bygge MXNet. Vi anbefaler også på det sterkeste å lese artikkelen for å komme i gang.
Hvis du allerede har jobbet med MXNet og vil prøve distribuert læring med Horovod, kan du sjekke ut , kompiler den med MXNet og følg eksemplet eller .
*kostnaden er beregnet basert på AWS for EC2-forekomster
Lær mer om kurset
Kilde: www.habr.com
