Hajautettu oppiminen Apache MXNetin ja Horovodin avulla

Artikkelin käännös valmistettiin kurssin alkamisen aattona "Industrial ML on Big Data"

Hajautettu koulutus useissa tehokkaissa laskentatapauksissa voi lyhentää nykyaikaisten syvien hermoverkkojen koulutusaikaa suurilla tietomäärillä viikoista tunteihin tai jopa minuutteihin, mikä tekee tästä koulutustekniikasta yleisen syvän oppimisen käytännön sovelluksissa. Käyttäjien on ymmärrettävä, kuinka tietoja voidaan jakaa ja synkronoida useiden esiintymien välillä, millä puolestaan ​​on suuri vaikutus skaalaustehokkuuteen. Lisäksi käyttäjien tulisi myös tietää, kuinka harjoituskomentosarja, joka suoritetaan yhdellä ilmentymällä, voidaan ottaa käyttöön useisiin esiintymiin.

Tässä artikkelissa puhumme nopeasta ja helposta tavasta jakaa oppimista käyttämällä avointa syväoppimiskirjastoa Apache MXNet ja Horovod hajautettua oppimiskehystä. Esittelemme selkeästi Horovod-kehyksen suorituskykyedut ja osoitamme kuinka kirjoittaa MXNet-harjoitusskripti niin, että se toimii hajautetusti Horovodin kanssa.

Mikä on Apache MXNet

Apache MX Net on avoimen lähdekoodin syväoppimiskehys, jota käytetään syvien hermoverkkojen luomiseen, kouluttamiseen ja käyttöönottoon. MXNet abstraktioi hermoverkkojen toteuttamiseen liittyvistä monimutkaisista ominaisuuksista, on erittäin suorituskykyinen ja skaalautuva ja tarjoaa API:ita suosituille ohjelmointikielille, kuten esim. Python, C + +, Clojure, Jaava, Julia, R, Scala ja muut.

Hajautettu koulutus MXNetissä parametripalvelimella

Tavallinen hajautettu oppimismoduuli MXNetissä käyttää parametripalvelinlähestymistapaa. Se käyttää parametripalvelimia kerätäkseen gradientteja jokaiselta työntekijältä, suorittaakseen koosteen ja lähettääkseen päivitetyt gradientit takaisin työntekijöille seuraavaa optimointiiteraatiota varten. Palvelimien ja työntekijöiden oikean suhteen määrittäminen on avain tehokkaaseen skaalaukseen. Jos parametripalvelinta on vain yksi, se voi osoittautua pullonkaulaksi laskelmissa. Päinvastoin, jos käytetään liikaa palvelimia, monien välinen viestintä voi tukkia kaikki verkkoyhteydet.

Mikä on Horovod

Horovod on Uberin kehittämä avoin hajautettu syväoppimiskehys. Se hyödyntää tehokkaita GPU- ja solmujen välisiä teknologioita, kuten NVIDIA Collective Communications Library (NCCL) ja Message Passing Interface (MPI) malliparametrien jakamiseen ja kokoamiseen voreceihin. Se optimoi verkon kaistanleveyden käytön ja skaalautuu hyvin työskenneltäessä syvän neuroverkkomallien kanssa. Se tukee tällä hetkellä useita suosittuja koneoppimiskehyksiä, nimittäin MX Net, Tensorflow, Keras ja PyTorch.

MXNet- ja Horovod-integraatio

MXNet integroituu Horovodin kanssa Horovodissa määriteltyjen Distributed Learning API:iden kautta. Horovodin viestintäsovellusliittymät horovod.broadcast(), horovod.allgather() и horovod.allreduce() toteutettu käyttämällä MXNet-moottorin asynkronisia takaisinkutsuja osana sen tehtäväkaaviota. Tällä tavalla MXNet-moottori käsittelee helposti tietoliikenteen ja laskennan välisiä riippuvuuksia, jotta vältytään synkronoinnista johtuvilta suorituskyvyn menetyksiltä. Hajautettu optimointiobjekti määritetty Horovodissa horovod.DistributedOptimizer laajenee Optimizer MXNetissä niin, että se kutsuu vastaavat Horovod API:t hajautettuja parametrien päivityksiä varten. Kaikki nämä toteutustiedot ovat läpinäkyviä loppukäyttäjille.

Nopea aloitus

Voit aloittaa nopeasti pienen konvoluutiohermoverkon harjoittamisen MNIST-tietojoukossa käyttämällä MacBookin MXNetiä ja Horovodia.
Asenna ensin mxnet ja horovod PyPI:stä:

pip install mxnet
pip install horovod

Huomautus: Jos kohtaat virheen aikana pip asennus horovodehkä sinun täytyy lisätä muuttuja MACOSX_DEPLOYMENT_TARGET=10.vvMissä vv – tämä on MacOS-versiosi versio, esimerkiksi MacOSX Sierraa varten sinun on kirjoitettava MACOSX_DEPLOYMENT_TARGET=10.12 pip asennus horovod

Asenna sitten OpenMPI siten.

Lataa lopuksi testiskripti mxnet_mnist.py siten ja suorita seuraavat komennot työhakemiston MacBook-päätteessä:

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

Tämä suorittaa koulutuksen prosessorisi kahdella ytimellä. Tulos on seuraava:

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

Esityksen demo

Harjoitettaessa ResNet50-v1-mallia ImageNet-tietojoukossa 64 GPU:ssa, joissa on kahdeksan esiintymää p3.16xlarge EC2, joista jokainen sisälsi 8 ​​NVIDIA Tesla V100 GPU:ta AWS-pilvessä, saavutimme 45000 44 kuvan sekuntiopetuksen (eli harjoitettujen näytteiden määrän sekunnissa). Harjoittelu suoritettiin 90 minuutissa 75.7 jakson jälkeen parhaalla tarkkuudella XNUMX %.

Vertasimme tätä MXNetin hajautettuun harjoittelutapaan, jossa parametripalvelimia käytetään 8, 16, 32 ja 64 GPU:ssa, joissa on yksi parametripalvelin ja palvelimen ja työntekijän välinen suhde on 1:1 ja 2:1. Voit nähdä tuloksen alla olevasta kuvasta 1. Vasemmalla y-akselilla palkit edustavat sekunnissa harjoitettavien kuvien määrää, viivat heijastavat skaalaustehokkuutta (eli todellisen ja ideaalisen suorituskyvyn suhdetta) oikealla y-akselilla. Kuten näet, palvelimien lukumäärän valinta vaikuttaa skaalaustehokkuuteen. Jos parametripalvelinta on vain yksi, skaalaustehokkuus laskee 38 prosenttiin 64 GPU:lla. Saavuttaaksesi saman skaalaustehokkuuden kuin Horovodilla, sinun on kaksinkertaistettava palvelimien määrä suhteessa työntekijöiden määrään.

Hajautettu oppiminen Apache MXNetin ja Horovodin avulla
Kuva 1. Hajautetun oppimisen vertailu MXNetillä Horovodin ja parametripalvelimen kanssa

Alla olevassa taulukossa 1 vertaamme lopullista hintaa esiintymää kohden suoritettaessa kokeiluja 64 GPU:lla. MXNetin käyttäminen Horovodin kanssa tarjoaa parhaan suorituskyvyn alhaisin kustannuksin.

Hajautettu oppiminen Apache MXNetin ja Horovodin avulla
Taulukko 1. Horovodin ja Parameter Serverin kustannusvertailu palvelimen ja työntekijän välisen suhteen ollessa 2:1.

Vaiheet lisääntymiseen

Seuraavissa vaiheissa näytämme, kuinka voit toistaa hajautetun harjoittelun tulokset MXNetin ja Horovodin avulla. Lue lisää hajautetusta oppimisesta MXNetin avulla Tämä postaus.

Vaihe 1

Luo homogeenisten ilmentymien klusteri MXNet-versiolla 1.4.0 tai uudemmalla ja Horovod-versiolla 0.16.0 tai uudemmalla, jotta voit käyttää hajautettua oppimista. Sinun on myös asennettava kirjastoja GPU-koulutusta varten. Valitsimme tapauksillemme Ubuntu 16.04 Linuxin, jossa on GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 kirjasto, NCCL 2.2.13 kommunikaattori ja OpenMPI 3.1.1. Voit myös käyttää Amazon Deep Learning AMI, jossa nämä kirjastot on jo esiasennettu.

Vaihe 2

Lisää MXNet-harjoitusskriptiisi mahdollisuus työskennellä Horovod API:n kanssa. Alla olevaa MXNet Gluon API:hen perustuvaa komentosarjaa voidaan käyttää yksinkertaisena mallina. Lihavoidut rivit ovat tarpeen, jos sinulla on jo vastaava koulutusohjelma. Tässä on muutamia tärkeitä muutoksia, jotka sinun on tehtävä oppiaksesi Horovodin kanssa:

  • Aseta konteksti paikallisen Horovodin arvosanan mukaan (rivi 8), jotta ymmärrät, että koulutus suoritetaan oikealla grafiikkaytimellä.
  • Välitä alkuparametrit yhdeltä työntekijältä kaikille (rivi 18) varmistaaksesi, että kaikki työntekijät aloittavat samoilla aloitusparametreilla.
  • Luo Horovod DistributedOptimizer (rivi 25) päivittääksesi parametrit hajautetusti.

Saadaksesi koko käsikirjoituksen, katso Horovod-MXNet-esimerkkejä 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    ...

Vaihe 3

Kirjaudu sisään jollekin työntekijöistä aloittaaksesi hajautetun koulutuksen MPI-direktiivin avulla. Tässä esimerkissä hajautettu koulutus suoritetaan neljässä esiintymässä, joissa kussakin on 4 GPU:ta ja yhteensä 16 GPU:ta klusterissa. Stochastic Gradient Descent (SGD) -optimointityökalua käytetään seuraavien hyperparametrien kanssa:

  • minierän koko: 256
  • oppimisaste: 0.1
  • vauhti: 0.9
  • painon lasku: 0.0001

Kun skaalaimme yhdestä GPU:sta 64 GPU:hun, skaalaimme harjoitusnopeuden lineaarisesti GPU:iden lukumäärän mukaan (0,1:stä 1 GPU:lle 6,4:ään 64 GPU:lle) pitäen samalla kuvien määrän GPU:ta kohden 256:ssa (erästä 256 kuvaa 1 GPU:lle ja 16 384 kuvaa 64 GPU:lle). Painon lasku- ja liikemääräparametrit muuttuivat grafiikkasuorittimien määrän lisääntyessä. Käytimme sekoitettua tarkkuusharjoitusta float16-datatyypin kanssa eteenpäinkulkua varten ja float32-tietotyyppiä gradienteissa nopeuttaaksemme NVIDIA Teslan GPU:iden tukemia float16-laskelmia.

$ 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

Johtopäätös

Tässä artikkelissa tarkastelimme skaalautuvaa lähestymistapaa hajautettuun mallikoulutukseen käyttämällä Apache MXNetiä ja Horovodia. Osoitimme skaalaustehokkuuden ja kustannustehokkuuden verrattuna parametripalvelinlähestymistapaan ImageNet-tietojoukossa, johon ResNet50-v1-malli opetettiin. Olemme myös sisällyttäneet vaiheet, joiden avulla voit muokata olemassa olevaa komentosarjaa, jotta voit suorittaa usean esiintymän harjoittelua Horovodin avulla.

Jos olet vasta aloittamassa MXNetin ja syväoppimisen käyttöä, siirry asennussivulle MXNerakentaa ensin MXNet. Suosittelemme myös artikkelin lukemista MXNet 60 minuutissaaloittaaksesi.

Jos olet jo työskennellyt MXNetin kanssa ja haluat kokeilla hajautettua oppimista Horovodin kanssa, katso Horovodin asennussivu, rakentaa se MXNetistä ja seuraa esimerkkiä MNIST tai IMAGEnet.

*hinta on laskettu tuntihinnat AWS EC2-esiintymille

Lue lisää kurssista "Industrial ML on Big Data"

Lähde: will.com

Lisää kommentti