Dreift nám með Apache MXNet og Horovod

Þýðing á greininni var unnin í aðdraganda námskeiðsins "Industrial ML on Big Data"

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

Apache MX net er opinn uppspretta djúpnámsrammi sem er notaður til að búa til, þjálfa og dreifa djúpt taugakerfi. MXNet tekur saman margbreytileikann sem tengist innleiðingu tauganeta, er mjög afkastamikil og stigstærð og býður upp á API fyrir vinsæl forritunarmál eins og Python, C + +, Clojure, Java, julia, R, mælikvarði og aðrir.

Dreifð þjálfun í MXNet með breytuþjóni

Stöðluð dreifð námseining í MXNet notar breytuþjónnálgun. Það notar sett af breytuþjónum til að safna halla frá hverjum starfsmanni, framkvæma samsöfnun og senda uppfærða halla aftur til starfsmanna fyrir næstu endurtekningu á fínstillingu. Að ákvarða rétt hlutfall netþjóna og starfsmanna er lykillinn að skilvirkri stærðarstærð. Ef það er aðeins einn breytuþjónn getur það reynst vera flöskuháls í útreikningunum. Aftur á móti, ef of margir netþjónar eru notaðir, geta mörg til mörg samskipti stíflað allar nettengingar.

Hvað er Horovod

Horovod er opinn dreifður djúpnámsrammi þróaður hjá Uber. Það nýtir skilvirka kross-GPU og krosshnútatækni eins og NVIDIA Collective Communications Library (NCCL) og Message Passing Interface (MPI) til að dreifa og safna saman líkanbreytum yfir vorecs. Það hámarkar notkun netbandbreiddar og skalar vel þegar unnið er með djúpt taugakerfislíkön. Það styður sem stendur nokkra vinsæla vélanámsramma, þ.e MX net, Tensorflow, Keras og PyTorch.

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 þess vegna.

Í lokin skaltu hlaða niður prófunarforskriftinni mxnet_mnist.py þess vegna og keyrðu eftirfarandi skipanir í MacBook flugstöðinni í vinnuskránni:

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.

Dreift nám með Apache MXNet og Horovod
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.

Dreift nám með Apache MXNet og Horovod
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 þessa færslu.

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 Amazon Deep Learning AMI, þar sem þessi bókasöfn eru þegar foruppsett.

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 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    ...

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 MXNeað byggja fyrst MXNet. Við mælum líka eindregið með því að lesa greinina MXNet á 60 mínútumað byrja.

Ef þú hefur þegar unnið með MXNet og vilt prófa dreifnám með Horovod, skoðaðu þá Horovod uppsetningarsíða, byggðu það frá MXNet og fylgdu dæminu MNIST eða ImageNet.

*kostnaður er reiknaður út frá tímagjald AWS fyrir EC2 tilvik

Kynntu þér námskeiðið nánar "Industrial ML on Big Data"

Heimild: www.habr.com

Bæta við athugasemd