Artikli tõlge valmis kursuse alguse eelõhtul
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
Jagatud koolitus MXNetis koos parameetriserveriga
Mis on Horovod
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
Lõpuks laadige alla testskript mxnet_mnist.py
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.
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.
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
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
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
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
Kui olete juba MXNetiga töötanud ja soovite Horovodiga hajutatud õpet proovida, siis vaadake
*kulu arvutatakse lähtuvalt
Lisateavet kursuse kohta
Allikas: www.habr.com