Verspreide leer met Apache MXNet en Horovod

Die vertaling van die artikel is voorberei op die vooraand van die aanvang van die kursus "Industriële ML op Big Data"

Verspreide opleiding oor veelvuldige hoëprestasie-rekenaargevalle kan die opleidingstyd van moderne diep neurale netwerke op groot hoeveelhede data van weke tot ure of selfs minute verminder, wat hierdie opleidingstegniek algemeen maak in praktiese toepassings van diepleer. Gebruikers moet verstaan ​​hoe om data oor verskeie gevalle te deel en te sinchroniseer, wat weer 'n groot impak op skaaldoeltreffendheid het. Daarbenewens moet gebruikers ook weet hoe om 'n opleidingskrip wat op 'n enkele instansie loop, na verskeie instansies te ontplooi.

In hierdie artikel sal ons praat oor 'n vinnige en maklike manier om leer te versprei deur die oop diepleerbiblioteek Apache MXNet en die Horovod-verspreide leerraamwerk te gebruik. Ons sal die prestasievoordele van die Horovod-raamwerk duidelik demonstreer en demonstreer hoe om 'n MXNet-opleidingskrip te skryf sodat dit op 'n verspreide wyse met Horovod werk.

Wat is Apache MXNet

Apache MX Net is 'n oopbron-dieplerraamwerk wat gebruik word om diep neurale netwerke te skep, op te lei en te ontplooi. MXNet onttrek die kompleksiteite wat verband hou met die implementering van neurale netwerke, is hoogs werksaam en skaalbaar, en bied API's vir gewilde programmeertale soos Python, C + +, Clojure, Java, Julia, R, Skaal en ander.

Verspreide opleiding in MXNet met parameterbediener

Standaard verspreide leermodule in MXNet gebruik 'n parameterbedienerbenadering. Dit gebruik 'n stel parameterbedieners om gradiënte van elke werker te versamel, samevoeging uit te voer en opgedateerde gradiënte terug te stuur na werkers vir die volgende optimeringsiterasie. Die bepaling van die korrekte verhouding van bedieners tot werkers is die sleutel tot effektiewe skaal. As daar net een parameterbediener is, kan dit 'n bottelnek in die berekeninge blyk te wees. Omgekeerd, as te veel bedieners gebruik word, kan baie-tot-veel kommunikasie alle netwerkverbindings verstop.

Wat is Horovod

Horovod is 'n oop verspreide diepleerraamwerk wat by Uber ontwikkel is. Dit maak gebruik van doeltreffende kruis-GPU en kruis-node-tegnologieë soos NVIDIA Collective Communications Library (NCCL) en Message Passing Interface (MPI) om modelparameters oor vorecs te versprei en saam te voeg. Dit optimaliseer die gebruik van netwerkbandwydte en skaal goed wanneer met diep neurale netwerkmodelle gewerk word. Dit ondersteun tans verskeie gewilde masjienleerraamwerke, naamlik MX Net, Tensorflow, Keras en PyTorch.

MXNet en Horovod-integrasie

MXNet integreer met Horovod deur die verspreide leer-API's wat in Horovod gedefinieer is. Horovod kommunikasie API's horovod.broadcast(), horovod.allgather() и horovod.allreduce() geïmplementeer deur gebruik te maak van asinchroniese terugroepe van die MXNet-enjin, as deel van sy taakgrafiek. Op hierdie manier word data-afhanklikhede tussen kommunikasie en berekening maklik deur die MXNet-enjin hanteer om prestasieverliese as gevolg van sinchronisasie te vermy. Verspreide optimizer-objek gedefinieer in Horovod horovod.DistributedOptimizer brei uit Optimizer in MXNet sodat dit die ooreenstemmende Horovod API's oproep vir verspreide parameteropdaterings. Al hierdie implementeringsbesonderhede is deursigtig vir eindgebruikers.

Vinnige begin

Jy kan vinnig begin om 'n klein konvolusionele neurale netwerk op die MNIST-datastel op te lei deur MXNet en Horovod op jou MacBook te gebruik.
Installeer eers mxnet en horovod vanaf PyPI:

pip install mxnet
pip install horovod

Let wel: As jy 'n fout teëkom tydens pip installeer horovodmiskien moet jy 'n veranderlike byvoeg MACOSX_DEPLOYMENT_TARGET=10.vvWaar vv – dit is die weergawe van jou MacOS-weergawe, byvoorbeeld vir MacOSX Sierra wat jy sal moet skryf MACOSX_DEPLOYMENT_TARGET=10.12 pip installeer horovod

Installeer dan OpenMPI vandaar.

Laai aan die einde die toetsskrif af mxnet_mnist.py vandaar en voer die volgende opdragte in die MacBook-terminale in die werkgids uit:

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

Dit sal opleiding op twee kerne van jou verwerker laat loop. Die uitset sal die volgende wees:

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

Prestasie Demo

Wanneer 'n ResNet50-v1-model op 'n ImageNet-datastel op 64 GPU's met agt gevalle opgelei word p3.16xgroot EC2, wat elk 8 NVIDIA Tesla V100 GPU's op AWS-wolk bevat, het ons 'n opleidingsdeurset van 45000 44 beelde/sek (d.w.s. die aantal opgeleide monsters per sekonde) behaal. Opleiding voltooi in 90 minute na 75.7 tydperke met 'n beste akkuraatheid van XNUMX%.

Ons het dit vergelyk met MXNet se verspreide opleidingsbenadering om parameterbedieners op 8, 16, 32 en 64 GPU's te gebruik met 'n enkele parameter bediener en 'n bediener tot werker verhouding van onderskeidelik 1 tot 1 en 2 tot 1. Jy kan die resultaat in Figuur 1 hieronder sien. Op die y-as aan die linkerkant verteenwoordig die stawe die aantal beelde om per sekonde op te lei, die lyne weerspieël die skaaldoeltreffendheid (dit wil sê die verhouding van werklike tot ideale deurset) op die y-as aan die regterkant. Soos u kan sien, beïnvloed die keuse van die aantal bedieners die skaaldoeltreffendheid. As daar net een parameterbediener is, daal die skaaldoeltreffendheid tot 38% op 64 GPU's. Om dieselfde skaaldoeltreffendheid as met Horovod te bereik, moet jy die aantal bedieners verdubbel relatief tot die aantal werkers.

Verspreide leer met Apache MXNet en Horovod
Figuur 1. Vergelyking van verspreide leer met behulp van MXNet met Horovod en met parameterbediener

In Tabel 1 hieronder vergelyk ons ​​die finale koste per geval wanneer eksperimente op 64 GPU's uitgevoer word. Die gebruik van MXNet met Horovod bied die beste deurset teen die laagste koste.

Verspreide leer met Apache MXNet en Horovod
Tabel 1. Koste vergelyking tussen Horovod en Parameter Server met 'n bediener tot werker verhouding van 2 tot 1.

Stappe om voort te plant

In die volgende stappe sal ons jou wys hoe om die resultaat van verspreide opleiding met MXNet en Horovod weer te gee. Om meer te wete te kom oor verspreide leer met MXNet, lees hierdie pos.

Stap 1

Skep 'n groep homogene gevalle met MXNet weergawe 1.4.0 of hoër en Horovod weergawe 0.16.0 of hoër om verspreide leer te gebruik. Jy sal ook biblioteke moet installeer vir GPU-opleiding. Vir ons gevalle het ons Ubuntu 16.04 Linux gekies, met GPU-bestuurder 396.44, CUDA 9.2, cuDNN 7.2.1-biblioteek, NCCL 2.2.13-kommunikeerder en OpenMPI 3.1.1. Jy kan ook gebruik Amazon Deep Learning AMI, waar hierdie biblioteke reeds vooraf geïnstalleer is.

Stap 2

Voeg die vermoë om met die Horovod API te werk by jou MXNet-opleidingskrip. Die onderstaande skrif gebaseer op die MXNet Gluon API kan as 'n eenvoudige sjabloon gebruik word. Die vetgedrukte lyne is nodig as jy reeds 'n ooreenstemmende opleidingskrif het. Hier is 'n paar kritieke veranderinge wat jy moet maak om met Horovod te leer:

  • Stel die konteks volgens die plaaslike Horovod-rang (reël 8) om te verstaan ​​dat opleiding op die korrekte grafiese kern uitgevoer word.
  • Gee aanvanklike parameters van een werker na almal deur (reël 18) om te verseker dat alle werkers met dieselfde aanvanklike parameters begin.
  • Skep 'n Horovod DistributedOptimizer (reël 25) om die parameters op 'n verspreide wyse op te dateer.

Om die volledige skrif te kry, verwys asseblief na die Horovod-MXNet-voorbeelde 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

Meld aan by een van die werkers om verspreide opleiding te begin deur die MPI-voorskrif te gebruik. In hierdie voorbeeld loop verspreide opleiding op vier gevalle met 4 GPU's elk, en 'n totaal van 16 GPU's in die groep. Die Stogastiese Gradient Descent (SGD) optimiseerder sal met die volgende hiperparameters gebruik word:

  • mini-batch grootte: 256
  • leertempo: 0.1
  • momentum: 0.9
  • gewig verval: 0.0001

Soos ons van een GPU na 64 GPU's afgeskaal het, het ons die opleidingstempo lineêr afgeskaal volgens die aantal GPU's (van 0,1 vir 1 GPU's tot 6,4 vir 64 GPU's), terwyl ons die aantal beelde per GPU op 256 gehou het (van 'n bondel van 256 beelde vir 1 GPU tot 16 384 vir 64 GPU's). Die gewigsverval en momentumparameters het verander namate die aantal GPU's toegeneem het. Ons het gemengde presisie-opleiding gebruik met die float16-datatipe vir die voorwaartse pas en float32 vir gradiënte om die float16-berekeninge wat deur NVIDIA Tesla GPU's ondersteun word, te bespoedig.

$ 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

Gevolgtrekking

In hierdie artikel het ons gekyk na 'n skaalbare benadering tot verspreide modelopleiding met behulp van Apache MXNet en Horovod. Ons het die skaaldoeltreffendheid en kostedoeltreffendheid gedemonstreer in vergelyking met die parameterbedienerbenadering op die ImageNet-datastel waarop die ResNet50-v1-model opgelei is. Ons het ook stappe ingesluit wat jy kan gebruik om 'n bestaande skrif te verander om multi-instansie opleiding met Horovod uit te voer.

As jy net begin met MXNet en diep leer, gaan na die installasie bladsy MXNeom eers MXNet te bou. Ons beveel ook sterk aan om die artikel te lees MXNet in 60 minuteom te begin.

As jy reeds met MXNet gewerk het en verspreide leer met Horovod wil probeer, kyk dan na Horovod installasie bladsy, bou dit vanaf MXNet en volg die voorbeeld MNIST of IMAGEnet.

*koste word bereken op grond van uurlikse tariewe AWS vir EC2-gevalle

Kom meer te wete oor die kursus "Industriële ML op Big Data"

Bron: will.com

Voeg 'n opmerking