Þýðing á greininni var unnin í aðdraganda námskeiðsins
Dreifð þjálfun á mörgum afkastamiklum tölvutilvikum getur dregið úr þjálfunartíma nútíma djúpra tauganeta á miklu magni gagna frá vikum upp í klukkustundir eða jafnvel mínútur, sem gerir þessa þjálfunartækni ríkjandi í hagnýtri notkun djúpnáms. Notendur verða að skilja hvernig á að deila og samstilla gögn í mörgum tilvikum, sem aftur hefur mikil áhrif á mælikvarða skilvirkni. Að auki ættu notendur einnig að vita hvernig á að dreifa þjálfunarforskrift sem keyrir á einu tilviki í mörg tilvik.
Í þessari grein munum við tala um fljótlega og auðvelda leið til að dreifa námi með því að nota opna djúpnámssafnið Apache MXNet og Horovod dreifða námsrammann. Við munum skýrt sýna frammistöðuávinninginn af Horovod rammanum og sýna hvernig á að skrifa MXNet þjálfunarforskrift þannig að það virki á dreifðan hátt með Horovod.
Hvað er Apache MXNet
Dreifð þjálfun í MXNet með breytuþjóni
Hvað er Horovod
MXNet og Horovod samþætting
MXNet samþættist Horovod í gegnum API fyrir dreifð nám sem skilgreint er í Horovod. Horovod samskipti API horovod.broadcast(), horovod.allgather() и horovod.allreduce() útfært með því að nota ósamstillt svarhringingar á MXNet vélinni, sem hluti af verkefnagrafi hennar. Á þennan hátt er gagnaháð milli samskipta og útreikninga auðveldlega meðhöndluð af MXNet vélinni til að forðast tap á afköstum vegna samstillingar. Dreifður fínstillingarhlutur skilgreindur í Horovod horovod.DistributedOptimizer stækkar Fínstillingu í MXNet þannig að það kallar á samsvarandi Horovod API fyrir dreifðar breytuuppfærslur. Allar þessar útfærsluupplýsingar eru gagnsæjar fyrir endanotendur.
Hröð byrjun
Þú getur fljótt byrjað að þjálfa lítið snúið taugakerfi á MNIST gagnapakkanum með því að nota MXNet og Horovod á MacBook þinni.
Settu fyrst upp mxnet og horovod frá PyPI:
pip install mxnet
pip install horovod
Athugið: Ef þú lendir í villu á meðan pip setja horovodkannski þarftu að bæta við breytu MACOSX_DEPLOYMENT_TARGET=10.vvhvar vv – þetta er útgáfan af MacOS útgáfunni þinni, til dæmis fyrir MacOSX Sierra þarftu að skrifa MACOSX_DEPLOYMENT_TARGET=10.12 pip uppsetning horovod
Settu síðan upp OpenMPI
Í lokin skaltu hlaða niður prófunarforskriftinni mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
Þetta mun keyra þjálfun á tveimur kjarna örgjörvans þíns. Úttakið verður eftirfarandi:
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
Sýning um árangur
Þegar þú þjálfar ResNet50-v1 líkan á ImageNet gagnasafni á 64 GPU með átta tilfellum p3.16xstór EC2, sem hver inniheldur 8 NVIDIA Tesla V100 GPU á AWS skýi, náðum þjálfunarafköstum upp á 45000 myndir/sek (þ.e. fjöldi þjálfaðra sýna á sekúndu). Þjálfun lauk á 44 mínútum eftir 90 tímabil með bestu nákvæmni upp á 75.7%.
Við bárum þetta saman við dreifða þjálfunaraðferð MXNet að nota færibreytuþjóna á 8, 16, 32 og 64 GPU með einum breytuþjóni og hlutfalli miðlara á móti starfsmanni 1 til 1 og 2 til 1, í sömu röð. Þú getur séð niðurstöðuna á mynd 1 hér að neðan. Á y-ásnum vinstra megin tákna súlurnar fjölda mynda sem á að þjálfa á sekúndu, línurnar endurspegla mælikvarðahagkvæmni (þ.e. hlutfall raunverulegs og kjörgengis) á y-ásnum hægra megin. Eins og þú sérð hefur val á fjölda netþjóna áhrif á stærðarskilvirkni. Ef það er aðeins einn færibreytuþjónn lækkar stærðarskilvirkni í 38% á 64 GPU. Til að ná sömu stærðarhagkvæmni og með Horovod þarftu að tvöfalda fjölda netþjóna miðað við fjölda starfsmanna.
Mynd 1. Samanburður á dreifnámi með MXNet með Horovod og við breytuþjón
Í töflu 1 hér að neðan berum við saman lokakostnað á hvert tilvik þegar tilraunir eru keyrðar á 64 GPU. Notkun MXNet með Horovod veitir besta afköst með lægsta kostnaði.
Tafla 1. Kostnaðarsamanburður á milli Horovod og Parameter Server með hlutfalli miðlara á móti starfsmanni 2 á móti 1.
Skref til að endurskapa
Í næstu skrefum munum við sýna þér hvernig á að endurskapa niðurstöðu dreifðrar þjálfunar með MXNet og Horovod. Til að læra meira um dreifnám með MXNet lestu
Skref 1
Búðu til þyrping af einsleitum tilvikum með MXNet útgáfu 1.4.0 eða nýrri og Horovod útgáfu 0.16.0 eða nýrri til að nota dreifnám. Þú þarft einnig að setja upp bókasöfn fyrir GPU þjálfun. Fyrir okkar tilvik völdum við Ubuntu 16.04 Linux, með GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 bókasafn, NCCL 2.2.13 communicator og OpenMPI 3.1.1. Einnig er hægt að nota
Skref 2
Bættu getu til að vinna með Horovod API við MXNet þjálfunarforritið þitt. Neðangreind handrit byggt á MXNet Gluon API er hægt að nota sem einfalt sniðmát. Feitletraða línurnar eru nauðsynlegar ef þú ert nú þegar með samsvarandi þjálfunarhandrit. Hér eru nokkrar mikilvægar breytingar sem þú þarft að gera til að læra með Horovod:
- Stilltu samhengið í samræmi við staðbundna Horovod stöðu (lína 8) til að skilja að þjálfun fer fram á réttum grafíkkjarna.
- Sendu upphafsfæribreytur frá einum starfsmanni til allra (lína 18) til að tryggja að allir starfsmenn byrji með sömu upphafsfæribreytur.
- Búðu til Horovod DistributedOptimizer (lína 25) til að uppfæra færibreyturnar á dreifðan hátt.
Til að fá allt handritið, vinsamlegast skoðaðu Horovod-MXNet dæmin
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 ...
Skref 3
Skráðu þig inn á einn af starfsmönnum til að hefja dreifða þjálfun með MPI tilskipuninni. Í þessu dæmi keyrir dreifð þjálfun á fjórum tilfellum með 4 GPU hvorum og alls 16 GPU í klasanum. Stóchastic Gradient Descent (SGD) fínstillingin verður notuð með eftirfarandi ofbreytum:
- Lítil lotustærð: 256
- námshlutfall: 0.1
- skriðþunga: 0.9
- þyngdartap: 0.0001
Þegar við fórum úr einni GPU í 64 GPU, mældum við þjálfunarhraðann línulega í samræmi við fjölda GPUs (frá 0,1 fyrir 1 GPU í 6,4 fyrir 64 GPU), en héldum fjölda mynda á hvern GPU við 256 (úr lotu af 256 myndir fyrir 1 GPU til 16 fyrir 384 GPU). Þyngdarrýrnun og skriðþungabreytur breyttust eftir því sem fjöldi GPUs jókst. Við notuðum blandaða nákvæmniþjálfun með float64 gagnategundinni fyrir framsendinguna og float16 fyrir halla til að flýta fyrir float32 útreikningum sem studdir eru af NVIDIA Tesla GPU.
$ 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
Ályktun
Í þessari grein skoðuðum við stigstærða nálgun við dreifða líkanaþjálfun með Apache MXNet og Horovod. Við sýndum skala skilvirkni og hagkvæmni samanborið við breytu miðlara nálgun á ImageNet gagnapakkanum sem ResNet50-v1 líkanið var þjálfað á. Við höfum einnig sett inn skref sem þú getur notað til að breyta núverandi skriftu til að keyra þjálfun í mörgum tilvikum með Horovod.
Ef þú ert rétt að byrja með MXNet og djúpt nám, farðu á uppsetningarsíðuna
Ef þú hefur þegar unnið með MXNet og vilt prófa dreifnám með Horovod, skoðaðu þá
*kostnaður er reiknaður út frá
Kynntu þér námskeiðið nánar
Heimild: www.habr.com