Hajutatud õpe Apache MXNeti ja Horovodiga

Artikli tõlge valmis kursuse alguse eelõhtul "Industrial ML on Big Data"

Jaotatud koolitus mitmel suure jõudlusega andmetöötluseksemplaril võib vähendada kaasaegsete sügavate närvivõrkude koolitusaega suurte andmemahtude korral nädalatest tundideks või isegi minutiteks, muutes selle koolitustehnika levinud süvaõppe praktilistes rakendustes. Kasutajad peavad mõistma, kuidas jagada ja sünkroonida andmeid mitme eksemplari vahel, mis omakorda mõjutab oluliselt skaleerimise tõhusust. Lisaks peaksid kasutajad teadma, kuidas juurutada koolitusskripti, mis töötab ühel eksemplaril, mitmes eksemplaris.

Selles artiklis räägime kiirest ja lihtsast viisist õppe levitamiseks avatud süvaõppeteegi Apache MXNet ja Horovodi hajutatud õpperaamistiku abil. Näitame selgelt Horovodi raamistiku jõudluse eeliseid ja näitame, kuidas kirjutada MXNeti koolitusskripti nii, et see töötaks koos Horovodiga hajutatud viisil.

Mis on Apache MXNet

Apache MX Net on avatud lähtekoodiga süvaõpperaamistik, mida kasutatakse sügavate närvivõrkude loomiseks, koolitamiseks ja juurutamiseks. MXNet võtab kokku närvivõrkude rakendamisega seotud keerukuse, on suure jõudlusega ja skaleeritav ning pakub API-sid populaarsete programmeerimiskeelte jaoks, nagu näiteks Python, C + +, Clojure, Java, Julia, R, Scala ja teised.

Jagatud koolitus MXNetis koos parameetriserveriga

Standardne hajutatud õppemoodul MXNetis kasutab parameetriserveri lähenemist. See kasutab parameetriserverite komplekti, et koguda gradiente igalt töötajalt, teostada liitmist ja saata värskendatud gradiente töötajatele järgmise optimeerimise iteratsiooni jaoks. Serverite ja töötajate õige suhte määramine on tõhusa skaleerimise võti. Kui on ainult üks parameetriserver, võib see osutuda arvutustes kitsaskohaks. Ja vastupidi, kui kasutatakse liiga palju servereid, võib mitu-mitmele suhtlus ummistada kõik võrguühendused.

Mis on Horovod

Horovod on avatud hajutatud süvaõppe raamistik, mis on välja töötatud Uberis. See kasutab tõhusaid GPU ja sõlmedevahelisi tehnoloogiaid, nagu NVIDIA Collective Communications Library (NCCL) ja Message Passing Interface (MPI), et levitada ja koondada mudeli parameetreid vorecide vahel. See optimeerib võrgu ribalaiuse kasutamist ja skaleerib hästi sügava närvivõrgu mudelitega töötamisel. See toetab praegu mitmeid populaarseid masinõppe raamistikke, nimelt MX Net, Tensorflow, Keras ja PyTorch.

MXNeti ja Horovodi integratsioon

MXNet integreerub Horovodiga Horovodis määratletud hajutatud õppe API-de kaudu. Horovodi side API-d horovod.broadcast(), horovod.allgather() и horovod.allreduce() rakendatakse MXNeti mootori asünkroonsete tagasihelistamiste abil selle ülesannete graafiku osana. Sel viisil saab MXNeti mootor hõlpsasti käsitleda andmeside ja arvutuste vahelisi sõltuvusi, et vältida sünkroonimisest tulenevat jõudluse kadu. Horovodis määratletud hajutatud optimeerija objekt horovod.DistributedOptimizer laieneb Optimeerija MXNetis, nii et see kutsub hajutatud parameetrite värskendamiseks vastavaid Horovodi API-sid. Kõik need rakenduse üksikasjad on lõppkasutajatele läbipaistvad.

Kiire algus

Saate kiiresti alustada väikese konvolutsioonilise närvivõrgu treenimist MNIST-i andmestikul, kasutades oma MacBookis MXNeti ja Horovodi.
Esmalt installige PyPI-st mxnet ja horovod:

pip install mxnet
pip install horovod

Märkus. Kui ilmneb tõrge ajal pip install horovodvõib-olla peate lisama muutuja MACOSX_DEPLOYMENT_TARGET=10.vvKus vv – see on teie MacOS-i versiooni versioon, näiteks MacOSX Sierra jaoks peate kirjutama MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Seejärel installige OpenMPI siit.

Lõpuks laadige alla testskript mxnet_mnist.py siit ja käivitage töökataloogis MacBooki terminalis järgmised käsud:

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

See käivitab koolituse teie protsessori kahel tuumal. Väljund on järgmine:

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

Esituse demo

ResNet50-v1 mudeli treenimisel ImageNeti andmestikul 64 GPU-l kaheksa eksemplariga p3.16xsuur EC2, millest igaüks sisaldab 8 NVIDIA Tesla V100 GPU-d AWS-i pilves, saavutasime treeningu läbilaskevõime 45000 44 pilti sekundis (st treenitud näidiste arv sekundis). Treening läbiti 90 minutiga pärast 75.7 epohhi parima täpsusega XNUMX%.

Võrdlesime seda MXNeti hajutatud koolitusmeetodiga, mille kohaselt kasutatakse parameetriservereid 8, 16, 32 ja 64 GPU-l ühe parameetriga serveriga ning serveri ja töötaja suhe on vastavalt 1:1 ja 2:1. Tulemust näete alloleval joonisel 1. Vasakpoolsel y-teljel tähistavad tulbad sekundis treenitavate piltide arvu, jooned peegeldavad skaleerimise efektiivsust (st tegeliku ja ideaalse läbilaskevõime suhet) paremal y-teljel. Nagu näete, mõjutab serverite arvu valik skaleerimise efektiivsust. Kui on ainult üks parameetriserver, langeb skaleerimise efektiivsus 38 GPU puhul 64%-ni. Samasuguse skaleerimise efektiivsuse saavutamiseks nagu Horovodi puhul peate serverite arvu töötajate arvuga võrreldes kahekordistama.

Hajutatud õpe Apache MXNeti ja Horovodiga
Joonis 1. Hajutatud õppe võrdlus MXNeti ja Horovodi ja parameetriserveriga

Allolevas tabelis 1 võrdleme eksemplari lõplikku maksumust katsete tegemisel 64 GPU-ga. MXNeti kasutamine koos Horovodiga tagab parima läbilaskevõime madalaima kuluga.

Hajutatud õpe Apache MXNeti ja Horovodiga
Tabel 1. Horovodi ja parameetriserveri kulude võrdlus serveri ja töötaja suhtega 2:1.

Paljundamise sammud

Järgmistes sammudes näitame teile, kuidas MXNeti ja Horovodi abil hajutatud treeningu tulemusi reprodutseerida. MXNeti abil hajutatud õppimise kohta lisateabe saamiseks lugege see postitus.

Samm 1

Hajusõppe kasutamiseks looge homogeensete eksemplaride klaster MXNeti versiooniga 1.4.0 või uuemaga ja Horovodi versiooniga 0.16.0 või uuemaga. Samuti peate installima teegid GPU koolituseks. Meie juhtumite jaoks valisime Ubuntu 16.04 Linuxi koos GPU draiveriga 396.44, CUDA 9.2, cuDNN 7.2.1 teegi, NCCL 2.2.13 kommunikaatori ja OpenMPI 3.1.1-ga. Samuti saate kasutada Amazoni süvaõppe AMI, kus need teegid on juba eelinstallitud.

Samm 2

Lisage oma MXNeti treeningskriptile võimalus töötada koos Horovodi API-ga. Allolevat MXNet Gluoni API-l põhinevat skripti saab kasutada lihtsa mallina. Paksus read on vajalikud, kui teil on juba vastav koolitusskript. Siin on mõned olulised muudatused, mida peate Horovodiga õppimiseks tegema:

  • Seadke kontekst vastavalt kohalikule Horovodi auastmele (rida 8), et mõista, et koolitus viiakse läbi õigel graafikatuumal.
  • Edastage algparameetrid ühelt töötajalt kõigile (rida 18), et kõik töötajad alustaksid samade algparameetritega.
  • Looge Horovod DistributedOptimizer (rida 25), et värskendada parameetreid hajutatud viisil.

Täieliku skripti saamiseks vaadake Horovod-MXNeti näiteid 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    ...

Samm 3

MPI direktiivi abil hajutatud koolituse alustamiseks logige sisse ühe töötaja juurde. Selles näites töötab hajutatud koolitus neljal eksemplaril, millest igaühes on 4 GPU-d ja klastris kokku 16 GPU-d. Stochastic Gradient Descent (SGD) optimeerijat kasutatakse järgmiste hüperparameetritega:

  • minipartii suurus: 256
  • õppimise määr: 0.1
  • hoog: 0.9
  • kaalulangus: 0.0001

Kui me skaleerisime ühelt GPU-lt 64-le GPU-le, skaleerisime treeningkiirust lineaarselt vastavalt GPU-de arvule (0,1-lt 1 GPU-le 6,4-le 64-le GPU-le), hoides samal ajal piltide arvu GPU kohta 256-l (kogust 256 pilti 1 GPU jaoks kuni 16 384 pilti 64 GPU jaoks). Kaalu vähenemise ja impulsi parameetrid muutusid GPU-de arvu suurenedes. NVIDIA Tesla GPU-de toetatud float16 arvutuste kiirendamiseks kasutasime segatud täpsustreeningut andmetüübiga float32 edasipääsu jaoks ja float16 gradientide jaoks.

$ 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

Järeldus

Selles artiklis vaatlesime hajutatud mudelikoolituse skaleeritavat lähenemisviisi Apache MXNeti ja Horovodi abil. Näitasime skaleerimise tõhusust ja kulutasuvust võrreldes parameetriserveri lähenemisviisiga ImageNeti andmekogumis, mille põhjal ResNet50-v1 mudelit koolitati. Oleme lisanud ka sammud, mida saate kasutada olemasoleva skripti muutmiseks, et käivitada Horovodi abil mitme eksemplari koolitust.

Kui te alles alustate MXNeti ja süvaõppega, minge installilehele MXNeet kõigepealt ehitada MXNet. Samuti soovitame tungivalt artiklit lugeda MXNet 60 minutigaalustamiseks.

Kui olete juba MXNetiga töötanud ja soovite Horovodiga hajutatud õpet proovida, siis vaadake Horovodi paigaldusleht, looge see MXNetist ja järgige eeskuju MNIST või IMAGEnet.

*kulu arvutatakse lähtuvalt tunnitasud AWS EC2 eksemplaride jaoks

Lisateavet kursuse kohta "Industrial ML on Big Data"

Allikas: www.habr.com

Lisa kommentaar