Distribueret læring med Apache MXNet og Horovod

Oversættelsen af ​​artiklen blev udarbejdet på tærsklen til kursets start "Industriel ML på Big Data"

Distribueret træning på flere højtydende computerinstanser kan reducere træningstiden for moderne dybe neurale netværk på store mængder data fra uger til timer eller endda minutter, hvilket gør denne træningsteknik udbredt i praktiske anvendelser af deep learning. Brugere skal forstå, hvordan man deler og synkroniserer data på tværs af flere instanser, hvilket igen har en stor indflydelse på skaleringseffektiviteten. Derudover bør brugere også vide, hvordan man implementerer et træningsscript, der kører på en enkelt instans til flere instanser.

I denne artikel vil vi tale om en hurtig og nem måde at distribuere læring ved hjælp af det åbne dybe læringsbibliotek Apache MXNet og Horovods distribuerede læringsramme. Vi vil tydeligt demonstrere ydeevnefordelene ved Horovod-rammen og demonstrere, hvordan man skriver et MXNet-træningsscript, så det fungerer på en distribueret måde med Horovod.

Hvad er Apache MXNet

Apache MX Net er en open source-deep learning-ramme, der bruges til at skabe, træne og implementere dybe neurale netværk. MXNet abstraherer kompleksiteten forbundet med implementering af neurale netværk, er yderst performant og skalerbar og tilbyder API'er til populære programmeringssprog som f.eks. Python, C + +, Clojure, Java, Julia, R, Scala og andre.

Distribueret træning i MXNet med parameterserver

Standard distribueret læringsmodul i MXNet bruger en parameterserver-tilgang. Den bruger et sæt parameterservere til at indsamle gradienter fra hver arbejder, udføre aggregering og sende opdaterede gradienter tilbage til arbejdere til næste optimeringsiteration. At bestemme det korrekte forhold mellem servere og arbejdere er nøglen til effektiv skalering. Hvis der kun er én parameterserver, kan det vise sig at være en flaskehals i beregningerne. Omvendt, hvis der bruges for mange servere, kan mange-til-mange kommunikation tilstoppe alle netværksforbindelser.

Hvad er Horovod

Horovod er en åben distribueret deep learning-ramme udviklet hos Uber. Det udnytter effektive cross-GPU og cross-node teknologier såsom NVIDIA Collective Communications Library (NCCL) og Message Passing Interface (MPI) til at distribuere og aggregere modelparametre på tværs af vorecs. Det optimerer brugen af ​​netværksbåndbredde og skalerer godt, når du arbejder med dybe neurale netværksmodeller. Det understøtter i øjeblikket flere populære maskinlæringsrammer, nemlig MX Net, Tensorflow, Keras og PyTorch.

MXNet og Horovod integration

MXNet integreres med Horovod gennem de distribuerede lærings-API'er, der er defineret i Horovod. Horovod kommunikation API'er horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementeret ved hjælp af asynkrone tilbagekald af MXNet-motoren, som en del af dens opgavegraf. På denne måde håndteres dataafhængigheder mellem kommunikation og beregning let af MXNet-motoren for at undgå ydeevnetab på grund af synkronisering. Distribueret optimeringsobjekt defineret i Horovod horovod.DistributedOptimizer udvider sig Optimizer i MXNet, så det kalder de tilsvarende Horovod API'er for distribuerede parameteropdateringer. Alle disse implementeringsdetaljer er gennemsigtige for slutbrugere.

Hurtig start

Du kan hurtigt begynde at træne et lille foldet neuralt netværk på MNIST-datasættet ved hjælp af MXNet og Horovod på din MacBook.
Installer først mxnet og horovod fra PyPI:

pip install mxnet
pip install horovod

Bemærk: Hvis du støder på en fejl under pip installer horovodmåske skal du tilføje en variabel MACOSX_DEPLOYMENT_TARGET=10.vvHvor vv – dette er versionen af ​​din MacOS-version, for eksempel til MacOSX Sierra skal du skrive MACOSX_DEPLOYMENT_TARGET=10.12 pip-installation horovod

Installer derefter OpenMPI dermed.

Til sidst skal du downloade testscriptet mxnet_mnist.py dermed og kør følgende kommandoer i MacBook-terminalen i arbejdsmappen:

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

Dette vil køre træning på to kerner af din processor. Outputtet 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

Performance Demo

Når du træner en ResNet50-v1-model på et ImageNet-datasæt på 64 GPU'er med otte instanser p3.16xlarge EC2, der hver indeholder 8 NVIDIA Tesla V100 GPU'er på AWS-skyen, opnåede vi en træningsgennemstrømning på 45000 billeder/sek. (dvs. antallet af trænede prøver pr. sekund). Træning gennemført på 44 minutter efter 90 epoker med en bedste nøjagtighed på 75.7%.

Vi sammenlignede dette med MXNets distribuerede træningstilgang med at bruge parameterservere på 8, 16, 32 og 64 GPU'er med en enkelt parameterserver og et server-til-arbejderforhold på henholdsvis 1 til 1 og 2 til 1. Du kan se resultatet i figur 1 nedenfor. På y-aksen til venstre repræsenterer søjlerne antallet af billeder, der skal trænes pr. sekund, linjerne afspejler skaleringseffektiviteten (det vil sige forholdet mellem faktisk og ideel gennemstrømning) på y-aksen til højre. Som du kan se, påvirker valget af antallet af servere skaleringseffektiviteten. Hvis der kun er én parameterserver, falder skaleringseffektiviteten til 38 % på 64 GPU'er. For at opnå samme skaleringseffektivitet som med Horovod, skal du fordoble antallet af servere i forhold til antallet af arbejdere.

Distribueret læring med Apache MXNet og Horovod
Figur 1. Sammenligning af distribueret læring ved hjælp af MXNet med Horovod og med parameterserver

I tabel 1 nedenfor sammenligner vi den endelige pris pr. instans, når vi kører eksperimenter på 64 GPU'er. Brug af MXNet med Horovod giver den bedste gennemstrømning til den laveste pris.

Distribueret læring med Apache MXNet og Horovod
Tabel 1. Omkostningssammenligning mellem Horovod og Parameter Server med et forhold mellem server og arbejder på 2 til 1.

Trin til at reproducere

I de næste trin viser vi dig, hvordan du gengiver resultatet af distribueret træning ved hjælp af MXNet og Horovod. Læs mere om distribueret læring med MXNet dette indlæg.

Trin 1

Opret en klynge af homogene instanser med MXNet version 1.4.0 eller nyere og Horovod version 0.16.0 eller nyere for at bruge distribueret læring. Du skal også installere biblioteker til GPU-træning. I vores tilfælde valgte vi Ubuntu 16.04 Linux med GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 bibliotek, NCCL 2.2.13 communicator og OpenMPI 3.1.1. Du kan også bruge Amazon Deep Learning AMI, hvor disse biblioteker allerede er forudinstalleret.

Trin 2

Tilføj muligheden for at arbejde med Horovod API til dit MXNet-træningsscript. Nedenstående script baseret på MXNet Gluon API kan bruges som en simpel skabelon. Linjerne med fed er nødvendige, hvis du allerede har et tilsvarende træningsscript. Her er et par vigtige ændringer, du skal foretage for at lære med Horovod:

  • Indstil konteksten i henhold til den lokale Horovod-rangering (linje 8) for at forstå, at træning udføres på den korrekte grafikkerne.
  • Overfør startparametre fra én arbejder til alle (linje 18) for at sikre, at alle arbejdere starter med de samme startparametre.
  • Opret en Horovod DistributedOptimizer (linje 25) for at opdatere parametrene på en distribueret måde.

For at få det fulde script, se venligst Horovod-MXNet-eksemplerne 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    ...

Trin 3

Log ind på en af ​​arbejderne for at starte distribueret træning ved hjælp af MPI-direktivet. I dette eksempel kører distribueret træning på fire instanser med hver 4 GPU'er og i alt 16 GPU'er i klyngen. Den Stokastiske Gradient Descent (SGD)-optimering vil blive brugt med følgende hyperparametre:

  • mini-batch størrelse: 256
  • indlæringsrate: 0.1
  • momentum: 0.9
  • vægtfald: 0.0001

Da vi skalerede fra én GPU til 64 GPU'er, skalerede vi lineært træningshastigheden i henhold til antallet af GPU'er (fra 0,1 for 1 GPU til 6,4 for 64 GPU'er), mens vi holdt antallet af billeder pr. GPU på 256 (fra en batch af 256 billeder for 1 GPU til 16 for 384 GPU'er). Parametrene for vægtfald og momentum ændrede sig, efterhånden som antallet af GPU'er steg. Vi brugte blandet præcisionstræning med float64-datatypen til det fremadrettede pass og float16 til gradienter for at fremskynde float32-beregningerne understøttet af 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

Konklusion

I denne artikel så vi på en skalerbar tilgang til distribueret modeltræning ved hjælp af Apache MXNet og Horovod. Vi demonstrerede skaleringseffektiviteten og omkostningseffektiviteten sammenlignet med parameterservertilgangen på ImageNet-datasættet, som ResNet50-v1-modellen blev trænet på. Vi har også inkluderet trin, som du kan bruge til at ændre et eksisterende script til at køre multi-instans træning ved hjælp af Horovod.

Hvis du lige er startet med MXNet og deep learning, skal du gå til installationssiden MXNefor først at bygge MXNet. Vi anbefaler også stærkt at læse artiklen MXNet på 60 minutterat komme i gang.

Hvis du allerede har arbejdet med MXNet og vil prøve distribueret læring med Horovod, så tag et kig på Horovod installationsside, byg det fra MXNet og følg eksemplet MNIST eller IMAGEnet.

*omkostninger er beregnet ud fra timepriser AWS til EC2-instanser

Lær mere om kurset "Industriel ML på Big Data"

Kilde: www.habr.com

Tilføj en kommentar