Gedistribueerd leren met Apache MXNet en Horovod

De vertaling van het artikel is gemaakt aan de vooravond van de start van de cursus "Industriële ML op Big Data"

Gedistribueerde training op meerdere krachtige computerinstanties kan de trainingstijd van moderne diepe neurale netwerken op grote hoeveelheden gegevens verkorten van weken tot uren of zelfs minuten, waardoor deze trainingstechniek gangbaar wordt in praktische toepassingen van deep learning. Gebruikers moeten begrijpen hoe ze gegevens over meerdere instanties kunnen delen en synchroniseren, wat op zijn beurt een grote impact heeft op de schaalefficiëntie. Bovendien moeten gebruikers ook weten hoe ze een trainingsscript dat op één exemplaar wordt uitgevoerd, op meerdere exemplaren moeten implementeren.

In dit artikel zullen we het hebben over een snelle en gemakkelijke manier om leren te distribueren met behulp van de open deep learning-bibliotheek Apache MXNet en het Horovod gedistribueerde leerframework. We zullen duidelijk de prestatievoordelen van het Horovod-framework demonstreren en demonstreren hoe je een MXNet-trainingsscript schrijft, zodat het op een gedistribueerde manier met Horovod werkt.

Wat is Apache MXNet

Apache MX Net is een open-source deep learning-framework dat wordt gebruikt voor het creëren, trainen en inzetten van diepe neurale netwerken. MXNet abstraheert de complexiteit die gepaard gaat met het implementeren van neurale netwerken, is zeer performant en schaalbaar en biedt API's voor populaire programmeertalen zoals Python, C + +, Clojure, Java, Julia, R, Scala en anderen.

Gedistribueerde training in MXNet met parameterserver

Standaard gedistribueerde leermodule in MXNet maakt gebruik van een parameterserverbenadering. Het maakt gebruik van een set parameterservers om gradiënten van elke werker te verzamelen, aggregatie uit te voeren en bijgewerkte gradiënten terug te sturen naar werkrollen voor de volgende optimalisatie-iteratie. Het bepalen van de juiste verhouding tussen servers en werknemers is de sleutel tot effectieve schaalvergroting. Als er maar één parameterserver is, kan dit een knelpunt in de berekeningen blijken te zijn. Omgekeerd, als er te veel servers worden gebruikt, kan veel-op-veel-communicatie alle netwerkverbindingen verstoppen.

Wat is Horovod

Horovod is een open gedistribueerd deep learning-framework ontwikkeld bij Uber. Het maakt gebruik van efficiënte cross-GPU- en cross-node-technologieën zoals NVIDIA Collective Communications Library (NCCL) en Message Passing Interface (MPI) om modelparameters over vorecs te distribueren en te aggregeren. Het optimaliseert het gebruik van netwerkbandbreedte en is goed schaalbaar bij het werken met diepe neurale netwerkmodellen. Het ondersteunt momenteel verschillende populaire machine learning-frameworks, namelijk MXNet, Tensorflow, Keras en PyTorch.

MXNet- en Horovod-integratie

MXNet kan worden geïntegreerd met Horovod via de Distributed Learning API's die zijn gedefinieerd in Horovod. Horovod-communicatie-API's horovod.broadcast(), horovod.allgather() и horovod.allreduce() geïmplementeerd met behulp van asynchrone callbacks van de MXNet-engine, als onderdeel van de taakgrafiek. Op deze manier worden gegevensafhankelijkheden tussen communicatie en berekeningen eenvoudig afgehandeld door de MXNet-engine om prestatieverlies als gevolg van synchronisatie te voorkomen. Gedistribueerd optimalisatieobject gedefinieerd in Horovod horovod.DistributedOptimizer breidt uit Optimizer in MXNet zodat het de corresponderende Horovod API's aanroept voor gedistribueerde parameterupdates. Al deze implementatiedetails zijn transparant voor eindgebruikers.

Snelle start

U kunt snel beginnen met het trainen van een klein convolutioneel neuraal netwerk op de MNIST-dataset met behulp van MXNet en Horovod op uw MacBook.
Installeer eerst mxnet en horovod vanuit PyPI:

pip install mxnet
pip install horovod

Opmerking: als u een fout tegenkomt tijdens pip installeer horovodmisschien moet je een variabele toevoegen MACOSX_DEPLOYMENT_TARGET=10.vvWaar vv – dit is de versie van uw MacOS-versie, bijvoorbeeld voor MacOSX Sierra die u moet schrijven MACOSX_DEPLOYMENT_TARGET=10.12 pip installatiehorovod

Installeer vervolgens OpenMPI vandaar.

Download aan het einde het testscript mxnet_mnist.py vandaar en voer de volgende opdrachten uit in de MacBook-terminal in de werkmap:

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

Hiermee wordt training uitgevoerd op twee kernen van uw processor. De uitvoer zal als volgt zijn:

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

Prestatiedemo

Bij het trainen van een ResNet50-v1-model op een ImageNet-dataset op 64 GPU's met acht exemplaren p3.16xgroot EC2, elk met 8 NVIDIA Tesla V100 GPU's in de AWS-cloud, bereikten we een trainingsdoorvoer van 45000 afbeeldingen/sec (d.w.z. het aantal getrainde samples per seconde). Training voltooid in 44 minuten na 90 tijdperken met een beste nauwkeurigheid van 75.7%.

We hebben dit vergeleken met de gedistribueerde trainingsaanpak van MXNet, waarbij parameterservers worden gebruikt op 8, 16, 32 en 64 GPU's met een enkele parameterserver en een server-werknemerverhouding van respectievelijk 1 op 1 en 2 op 1. Het resultaat ziet u in figuur 1 hieronder. Op de y-as aan de linkerkant vertegenwoordigen de balken het aantal beelden dat per seconde moet worden getraind, de lijnen weerspiegelen de schaalefficiëntie (dat wil zeggen de verhouding tussen werkelijke en ideale doorvoer) op de y-as aan de rechterkant. Zoals u kunt zien, heeft de keuze van het aantal servers invloed op de schaalefficiëntie. Als er slechts één parameterserver is, daalt de schaalefficiëntie tot 38% op 64 GPU's. Om dezelfde schaalefficiëntie te bereiken als bij Horovod, moet u het aantal servers verdubbelen in verhouding tot het aantal werknemers.

Gedistribueerd leren met Apache MXNet en Horovod
Figuur 1. Vergelijking van gedistribueerd leren met MXNet met Horovod en met parameterserver

In Tabel 1 hieronder vergelijken we de uiteindelijke kosten per exemplaar bij het uitvoeren van experimenten op 64 GPU's. Het gebruik van MXNet met Horovod biedt de beste doorvoer tegen de laagste kosten.

Gedistribueerd leren met Apache MXNet en Horovod
Tabel 1. Kostenvergelijking tussen Horovod en Parameter Server met een server-werknemerverhouding van 2 op 1.

stappen om te reproduceren

In de volgende stappen laten we u zien hoe u het resultaat van gedistribueerde training met MXNet en Horovod kunt reproduceren. Lees voor meer informatie over gedistribueerd leren met MXNet deze post.

Stap 1

Maak een cluster van homogene instanties met MXNet versie 1.4.0 of hoger en Horovod versie 0.16.0 of hoger om gedistribueerd leren te gebruiken. U moet ook bibliotheken installeren voor GPU-training. Voor onze instances hebben we gekozen voor Ubuntu 16.04 Linux, met GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 bibliotheek, NCCL 2.2.13 communicator en OpenMPI 3.1.1. Ook jij kunt gebruiken Amazon Deep Learning-AMI, waar deze bibliotheken al vooraf zijn geïnstalleerd.

Stap 2

Voeg de mogelijkheid om met de Horovod API te werken toe aan uw MXNet-trainingsscript. Het onderstaande script, gebaseerd op de MXNet Gluon API, kan als eenvoudig sjabloon worden gebruikt. De vetgedrukte regels zijn nodig als u al over een bijbehorend trainingsscript beschikt. Hier zijn een paar cruciale veranderingen die u moet aanbrengen om met Horovod te leren:

  • Stel de context in volgens de lokale Horovod-rangschikking (regel 8) om te begrijpen dat training wordt uitgevoerd op de juiste grafische kern.
  • Geef initiële parameters door van één werknemer aan iedereen (regel 18) om ervoor te zorgen dat alle werknemers met dezelfde initiële parameters beginnen.
  • Maak een Horovod GedistribueerdeOptimizer (regel 25) om de parameters gedistribueerd bij te werken.

Raadpleeg de Horovod-MXNet-voorbeelden voor het volledige script 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    ...

Stap 3

Log in bij een van de werknemers om gedistribueerde training te starten met behulp van de MPI-richtlijn. In dit voorbeeld wordt de gedistribueerde training uitgevoerd op vier instanties met elk vier GPU's en in totaal 4 GPU's in het cluster. De Stochastic Gradient Descent (SGD)-optimalisatie zal worden gebruikt met de volgende hyperparameters:

  • mini-batchgrootte: 256
  • leersnelheid: 0.1
  • momentum: 0.9
  • gewichtsverval: 0.0001

Terwijl we van één GPU naar 64 GPU's zijn geschaald, hebben we de trainingssnelheid lineair geschaald op basis van het aantal GPU's (van 0,1 voor 1 GPU naar 6,4 voor 64 GPU's), terwijl we het aantal afbeeldingen per GPU op 256 hielden (van een batch van 256 afbeeldingen voor 1 GPU tot 16 voor 384 GPU's). De parameters voor gewichtsverval en momentum veranderden naarmate het aantal GPU's toenam. We hebben gemengde precisietraining gebruikt met het datatype float64 voor de voorwaartse pass en float16 voor gradiënten om de float32-berekeningen te versnellen die worden ondersteund door NVIDIA Tesla GPU's.

$ 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

Conclusie

In dit artikel hebben we gekeken naar een schaalbare benadering van gedistribueerde modeltraining met Apache MXNet en Horovod. We hebben de schaalefficiëntie en kosteneffectiviteit gedemonstreerd in vergelijking met de parameterserverbenadering op de ImageNet-dataset waarop het ResNet50-v1-model was getraind. We hebben ook stappen opgenomen die u kunt gebruiken om een ​​bestaand script te wijzigen om training met meerdere exemplaren uit te voeren met behulp van Horovod.

Als je net begint met MXNet en deep learning, ga dan naar de installatiepagina MXNeom eerst MXNet te bouwen. We raden u ook ten zeerste aan het artikel te lezen MXNet in 60 minutenstarten.

Als je al met MXNet hebt gewerkt en gedistribueerd leren met Horovod wilt proberen, kijk dan eens naar Horovod-installatiepagina, bouw het vanuit MXNet en volg het voorbeeld MNIST of IMAGEnet.

*kosten worden berekend op basis van Uurtarieven AWS voor EC2-instanties

Lees meer over de cursus "Industriële ML op Big Data"

Bron: www.habr.com

Voeg een reactie