De vertaling van het artikel is gemaakt aan de vooravond van de start van de cursus
Gedistribueerde training over meerdere high-performance computing-instanties kan de trainingstijd van moderne diepe neurale netwerken voor grote hoeveelheden data terugbrengen van weken tot uren of zelfs minuten. Hierdoor wordt deze trainingstechniek veelgebruikt in praktische toepassingen voor deep learning. Gebruikers moeten begrijpen hoe ze gegevens kunnen delen en synchroniseren tussen meerdere instanties, wat op zijn beurt een grote impact heeft op de schaalbaarheid. Bovendien moeten gebruikers weten hoe ze een trainingsscript dat op één exemplaar wordt uitgevoerd, naar meerdere exemplaren kunnen implementeren.
In dit artikel bespreken we een snelle en eenvoudige manier om gedistribueerd leren uit te voeren met behulp van de open source deep learning-bibliotheek Apache MXNet en het gedistribueerde leerframework Horovod. We laten de prestatievoordelen van het Horovod-framework zien en laten zien hoe u een MXNet-trainingsscript schrijft dat gedistribueerd met Horovod kan worden uitgevoerd.
Wat is Apache MXNet
– een open-source deep learning-framework dat wordt gebruikt om diepe neurale netwerken te bouwen, trainen en implementeren. MXNet abstraheert de complexiteit die gepaard gaat met de implementatie van neurale netwerken, heeft hoge prestaties en schaalbaarheid en biedt API's voor populaire programmeertalen zoals , , , , , , en anderen.
Gedistribueerde training in MXNet met parameterserver
maakt gebruik van de parameterserverbenadering. Hierbij wordt gebruikgemaakt van een set parameterservers om gradiënten van elke worker te verzamelen, aggregatie uit te voeren en bijgewerkte gradiënten terug te sturen naar de workers voor de volgende optimalisatie-iteratie. Het bepalen van de juiste server-werknemerverhouding is essentieel voor effectief schalen. Als er slechts één parameterserver is, kan dit een knelpunt in de berekeningen vormen. Omgekeerd kan de veel-op-veelrelatie ertoe leiden dat alle netwerkverbindingen verzadigd raken als er te veel servers worden gebruikt.
Wat is Horovod
– een open-source gedistribueerd deep learning-framework ontwikkeld bij Uber. Het maakt gebruik van efficiënte multi-GPU- en multi-node-communicatietechnologieën zoals NVIDIA Collective Communications Library (NCCL) en Message Passing Interface (MPI) om modelparameters over wervelingen te distribueren en te aggregeren. Het optimaliseert het gebruik van de netwerkbandbreedte en schaalt goed bij het uitvoeren van diepe neurale netwerkmodellen. Het ondersteunt momenteel verschillende populaire machine learning-frameworks, namelijk: , Tensorflow, Keras en PyTorch.
MXNet en Horovod-integratie
MXNet integreert met Horovod via de gedistribueerde leer-API's die in Horovod zijn gedefinieerd. Horovod-communicatie-API's horovod.broadcast(), horovod.allgather() и horovod.allreduce() worden geïmplementeerd met behulp van asynchrone callbacks van de MXNet-engine, als onderdeel van de taakgrafiek. Hierdoor worden gegevensafhankelijkheden tussen communicatie en berekeningen eenvoudig verwerkt door de MXNet-engine en wordt prestatieverlies door synchronisatie voorkomen. Gedistribueerd optimizerobject gedefinieerd in Horovod horovod.DistributedOptimizer breidt uit Optimizer in MXNet, zodat het de juiste Horovod API's aanroept voor gedistribueerde parameterupdates. Alle implementatiedetails zijn transparant voor eindgebruikers.
Snelle start
Met behulp van MXNet en Horovod op uw MacBook kunt u snel beginnen met het trainen van een klein convolutioneel neuraal netwerk op de MNIST-dataset.
Om te beginnen installeert u mxnet en horovod vanaf PyPI:
pip install mxnet
pip install horovodLet op: Als u tijdens het installeren een fout tegenkomt, pip installatie horovod, moet u mogelijk een variabele toevoegen MACOSX_DEPLOYMENT_TARGET=10.vvWaar vv – dit is de versie van uw MacOS-versie, bijvoorbeeld voor MacOSX Sierra moet u schrijven MACOSX_DEPLOYMENT_TARGET=10.12 pip installatiehorovod
Installeer vervolgens OpenMPI .
Upload aan het einde het testscript mxnet_mnist.py 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.pyDe training wordt uitgevoerd op twee kernen van uw processor. De uitvoer is als volgt:
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.870000Prestatiedemonstratie
Bij het trainen van het ResNet50-v1-model op de ImageNet-dataset op 64 GPU's met acht instanties p3.16xgroot Met EC2, elk met 8 NVIDIA Tesla V100 GPU's op de AWS-cloud, behaalden we een trainingsdoorvoer van 45000 afbeeldingen/sec (d.w.z. het aantal getrainde samples per seconde). De training werd voltooid in 44 minuten na 90 epochs met een maximale nauwkeurigheid van 75.7%.
We vergeleken dit met gedistribueerde training van MXNet met een aanpak waarbij parameterservers werden gebruikt op 8, 16, 32 en 64 GPU's met één parameterserver en een server-werknemerverhouding van respectievelijk 1:1 en 2:1. Het resultaat ziet u in onderstaande figuur 1. Op de y-as aan de linkerkant geven de balken het aantal afbeeldingen aan dat per seconde moet worden getraind. Op de y-as aan de rechterkant geven de lijnen de schaalefficiëntie aan (d.w.z. de verhouding tussen de werkelijke en de ideale doorvoer). Zoals u kunt zien, heeft de keuze van het aantal servers invloed op de schaalbaarheid. Als er maar één parameterserver is, daalt de schaalefficiëntie naar 38% op 64 GPU's. Om dezelfde schaalbaarheid als Horovod te bereiken, moet u het aantal servers verdubbelen in verhouding tot het aantal workers.

Figuur 1. Vergelijking van gedistribueerde training met behulp van MXNet met Horovod en met parameterserver
In onderstaande tabel 1 vergelijken we de uiteindelijke kosten per instantie bij het uitvoeren van experimenten op 64 GPU's. Door MXNet met Horovod te gebruiken, verkrijgt u de beste doorvoer tegen de laagste kosten.

Tabel 1. Kostenvergelijking tussen Horovod en een parameterserver met een server-werknemerverhouding van 2:1.
Stappen om te reproduceren
In de volgende stappen laten we zien hoe u het gedistribueerde trainingsresultaat kunt reproduceren met behulp van MXNet en Horovod. Wilt u meer weten over gedistribueerd leren met MXNet? Lees dan: .
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 gedistribueerde training te gebruiken. U moet ook de bibliotheken voor GPU-training installeren. Voor onze instanties kozen we ervoor om... Ubuntu 16.04 Linux, met GPU-stuurprogramma 396.44, CUDA 9.2, cuDNN-bibliotheek 7.2.1, NCCL-communicator 2.2.13 en OpenMPI 3.1.1. Je kunt ook gebruikmaken van , 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 volgende script, gebaseerd op de MXNet Gluon API, kan worden gebruikt als een eenvoudige sjabloon. De vetgedrukte regels zijn nodig als u al een bijbehorend trainingsscript hebt. Hier zijn een paar belangrijke wijzigingen die nodig zijn om met Horovod te leren:
- Stel de context in zodat deze overeenkomt met de lokale Horovod-rang (regel 8) om ervoor te zorgen dat de training wordt uitgevoerd op de juiste GPU-kern.
- Geef beginparameters van één worker door aan alle workers (regel 18) om ervoor te zorgen dat alle workers met dezelfde beginparameters beginnen.
- Maak Horovod GedistribueerdeOptimizer (regel 25) om parameters op een gedistribueerde manier bij te werken.
Voor het volledige script verwijzen wij u naar de voorbeelden van Horovod-MXNet и .
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
Meld u aan bij een van de workers om gedistribueerde training uit te voeren met behulp van de MPI-richtlijn. In dit voorbeeld wordt gedistribueerde training uitgevoerd op vier instanties met elk 4 GPU's, voor een totaal van 16 GPU's in het cluster. De stochastische gradiëntafdaling (SGD)-optimizer wordt gebruikt met de volgende hyperparameters:
- mini-batchgrootte: 256
- leertempo: 0.1
- momentum: 0.9
- gewichtsverval: 0.0001
Toen we opschaalden van één GPU naar 64 GPU's, schaalden we de trainingssnelheid lineair 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 naar 16 voor 384 GPU's). De parameters voor gewichtsafname en momentum werden gewijzigd naarmate het aantal GPU's toenam. We gebruikten mixed-precision training met float64-gegevenstype in de forward pass en float16 voor gradiënten om 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.pyConclusie
In dit artikel bekijken we een schaalbare aanpak voor het trainen van gedistribueerde modellen met behulp van Apache MXNet en Horovod. We demonstreren schaalbaarheid en kosteneffectiviteit in vergelijking met de parameterserverbenadering op de ImageNet-dataset die is getraind met het ResNet50-v1-model. We hebben ook stappen opgenomen die u kunt nemen om een bestaand script aan te passen, zodat u training op meerdere instanties kunt uitvoeren met behulp van Horovod.
Als u net begint met MXNet en deep learning, ga dan naar de installatiepagina , om eerst MXNet te bouwen. Wij raden u ook ten zeerste aan het artikel te lezen om te beginnen.
Als u al met MXNet hebt gewerkt en gedistribueerd leren met Horovod wilt uitproberen, bekijk dan , compileer het met MXNet en volg het voorbeeld of .
*kosten worden berekend op basis van AWS voor EC2-instanties
Lees meer over de cursus
Bron: www.habr.com
