Straipsnio vertimas buvo parengtas kursų pradžios išvakarėse
Paskirstytas mokymas naudojant kelis didelio našumo skaičiavimo egzempliorius gali sutrumpinti šiuolaikinių giliųjų neuroninių tinklų mokymo laiką dideliais duomenų kiekiais nuo savaičių iki valandų ar net minučių, todėl ši mokymo technika yra paplitusi praktiniuose gilaus mokymosi taikymuose. Vartotojai turi suprasti, kaip dalytis ir sinchronizuoti duomenis keliuose egzemplioriuose, o tai savo ruožtu turi didelės įtakos mastelio keitimo efektyvumui. Be to, vartotojai taip pat turėtų žinoti, kaip įdiegti mokymo scenarijų, kuris veikia viename egzemplioriuje, keliuose egzemplioriuose.
Šiame straipsnyje kalbėsime apie greitą ir paprastą mokymosi paskirstymo būdą naudojant atvirą giluminio mokymosi biblioteką Apache MXNet ir Horovod paskirstytą mokymosi sistemą. Mes aiškiai parodysime Horovod sistemos našumo pranašumus ir parodysime, kaip parašyti MXNet mokymo scenarijų, kad jis veiktų paskirstytu būdu su Horovod.
Kas yra Apache MXNet
yra atvirojo kodo giluminio mokymosi sistema, kuri naudojama giliesiems neuroniniams tinklams kurti, mokyti ir diegti. MXNet abstrahuoja sudėtingumą, susijusį su neuroninių tinklų diegimu, yra labai našus ir keičiamas bei siūlo API populiarioms programavimo kalboms, tokioms kaip , , , , , , ir kiti.
Paskirstytas mokymas MXNet su parametrų serveriu
naudoja parametrų serverio metodą. Jis naudoja parametrų serverių rinkinį, kad surinktų kiekvieno darbuotojo gradientus, atliktų agregaciją ir atnaujintų gradientų siuntimą darbuotojams, kad jie atliktų kitą optimizavimo iteraciją. Tinkamo serverių ir darbuotojų santykio nustatymas yra veiksmingo mastelio keitimo raktas. Jei yra tik vienas parametrų serveris, tai gali tapti kliūtimi atliekant skaičiavimus. Ir atvirkščiai, jei naudojama per daug serverių, ryšys „daugelis su daugeliu“ gali užkimšti visus tinklo ryšius.
Kas yra Horovodas
yra atvira paskirstyta gilaus mokymosi sistema, sukurta Uber. Jis naudoja efektyvias kelių GPU ir kelių mazgų technologijas, tokias kaip NVIDIA Collective Communications Library (NCCL) ir pranešimų perdavimo sąsaja (MPI), kad paskirstytų ir kauptų modelio parametrus vorecuose. Tai optimizuoja tinklo pralaidumo naudojimą ir gerai keičia mastelį dirbant su giliųjų neuroninių tinklų modeliais. Šiuo metu ji palaiko keletą populiarių mašininio mokymosi sistemų, būtent , Tensorflow, Keras ir PyTorch.
MXNet ir Horovod integracija
MXNet integruojasi su Horovod per paskirstytojo mokymosi API, apibrėžtas Horovod. Horovod komunikacijos API horovod.broadcast(), horovod.allgather() и horovod.allreduce() įdiegta naudojant asinchroninius MXNet variklio atgalinius skambučius kaip užduočių grafiko dalį. Tokiu būdu MXNet variklis lengvai tvarko duomenų priklausomybes tarp ryšio ir skaičiavimo, kad išvengtų našumo praradimo dėl sinchronizavimo. Paskirstytas optimizavimo objektas, apibrėžtas Horovode horovod.DistributedOptimizer plečiasi Optimizatorius MXNet, kad iškviestų atitinkamas Horovod API paskirstytų parametrų naujinimams. Visa ši įgyvendinimo informacija yra skaidri galutiniams vartotojams.
Greita pradžia
Galite greitai pradėti mokyti mažą konvoliucinį neuroninį tinklą MNIST duomenų rinkinyje naudodami MXNet ir Horovod savo MacBook.
Pirmiausia įdiekite mxnet ir horovod iš PyPI:
pip install mxnet
pip install horovodPastaba: jei įvyksta klaida pip įdiegti horovodgal reikia pridėti kintamąjį MACOSX_DEPLOYMENT_TARGET=10.vvKur vv – tai jūsų „MacOS“ versijos versija, pavyzdžiui, „MacOSX Sierra“ jums reikės rašyti MACOSX_DEPLOYMENT_TARGET=10.12 pip įdiegti horovod
Tada įdiekite OpenMPI .
Pabaigoje atsisiųskite bandomąjį scenarijų mxnet_mnist.py ir darbo kataloge esančiame „MacBook“ terminale paleiskite šias komandas:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyTai atliks mokymą dviejuose jūsų procesoriaus branduoliuose. Išvestis bus tokia:
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.870000Spektaklio demonstracija
Treniruojant ResNet50-v1 modelį ImageNet duomenų rinkinyje 64 GPU su aštuoniais egzemplioriais p3.16xdidelis EC2, kurių kiekvienas turi 8 NVIDIA Tesla V100 GPU AWS debesyje, pasiekėme 45000 44 vaizdų per sekundę mokymo pralaidumą (t. y. apmokytų pavyzdžių skaičius per sekundę). Mokymas baigtas per 90 minutes po 75.7 epochų geriausiu XNUMX% tikslumu.
Palyginome tai su MXNet paskirstytu mokymo metodu, kai parametrų serveriai naudojami 8, 16, 32 ir 64 GPU su vieno parametro serveriu ir serverio bei darbuotojo santykiu atitinkamai 1:1 ir 2:1. Rezultatą galite pamatyti 1 paveiksle žemiau. Y ašyje kairėje juostos rodo vaizdų, kuriuos reikia treniruoti per sekundę, skaičių, linijos atspindi mastelio efektyvumą (ty faktinio ir idealaus pralaidumo santykį) y ašyje dešinėje. Kaip matote, serverių skaičiaus pasirinkimas turi įtakos mastelio efektyvumui. Jei yra tik vienas parametrų serveris, 38 GPU mastelio efektyvumas sumažėja iki 64%. Norint pasiekti tokį patį mastelio keitimo efektyvumą kaip ir naudojant Horovod, reikia padvigubinti serverių skaičių, palyginti su darbuotojų skaičiumi.

1 pav. Paskirstyto mokymosi palyginimas naudojant MXNet su Horovod ir su parametrų serveriu
Toliau pateiktoje 1 lentelėje palyginame galutinę vieno egzemplioriaus kainą, kai vykdomi eksperimentai su 64 GPU. MXNet naudojimas su Horovod užtikrina geriausią pralaidumą mažiausiomis sąnaudomis.

1 lentelė. Horovod ir Parameter Server sąnaudų palyginimas, kai serverio ir darbuotojo santykis yra 2:1.
Žingsniai norint atkurti
Kituose žingsniuose parodysime, kaip atkurti paskirstytų treniruočių rezultatus naudojant MXNet ir Horovod. Norėdami sužinoti daugiau apie paskirstytą mokymąsi naudojant MXNet, skaitykite .
Žingsnis 1
Sukurkite homogeninių egzempliorių klasterį su „MXNet“ 1.4.0 ar naujesne versija ir „Horovod“ 0.16.0 ar naujesne versija, kad galėtumėte naudoti paskirstytą mokymą. Taip pat turėsite įdiegti bibliotekas GPU mokymui. Savo egzemplioriams pasirinkome Ubuntu 16.04 Linux, su GPU tvarkykle 396.44, CUDA 9.2, cuDNN biblioteka 7.2.1, NCCL komunikatoriumi 2.2.13 ir OpenMPI 3.1.1. Taip pat galite naudoti , kur šios bibliotekos jau iš anksto įdiegtos.
Žingsnis 2
Prie savo MXNet mokymo scenarijaus pridėkite galimybę dirbti su Horovod API. Žemiau esantis scenarijus, pagrįstas MXNet Gluon API, gali būti naudojamas kaip paprastas šablonas. Paryškintos eilutės reikalingos, jei jau turite atitinkamą mokymo scenarijų. Štai keletas svarbių pakeitimų, kuriuos turite atlikti, kad išmoktumėte su Horovod:
- Nustatykite kontekstą pagal vietinį Horovod rangą (8 eilutė), kad suprastumėte, jog treniruotės atliekamos naudojant tinkamą grafikos branduolį.
- Perduokite pradinius vieno darbuotojo parametrus visiems (18 eilutė), kad visi darbuotojai pradėtų nuo tų pačių pradinių parametrų.
- Sukurkite Horovodą DistributedOptimizer (25 eilutė), kad parametrai būtų atnaujinami paskirstytu būdu.
Norėdami gauti visą scenarijų, žr. Horovod-MXNet pavyzdžius и .
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 ...Žingsnis 3
Prisijunkite prie vieno iš darbuotojų, kad pradėtumėte paskirstytus mokymus naudodami MPI direktyvą. Šiame pavyzdyje paskirstytas mokymas vykdomas keturiuose egzemplioriuose su 4 GPU ir iš viso 16 GPU klasteryje. Stochastinio gradiento nusileidimo (SGD) optimizatorius bus naudojamas su šiais hiperparametrais:
- mažos partijos dydis: 256
- mokymosi rodiklis: 0.1
- impulsas: 0.9
- svorio mažėjimas: 0.0001
Kai keitėme mastelį nuo vieno GPU iki 64 GPU, tiesiškai padidinome mokymo greitį pagal GPU skaičių (nuo 0,1 1 GPU iki 6,4 64 GPU), išlaikant vaizdų skaičių vienam GPU 256 (iš daugybės GPU 256 vaizdai 1 GPU iki 16 384 vaizdai 64 GPU). Svorio mažėjimo ir impulso parametrai keitėsi didėjant GPU skaičiui. Naudojome mišrią tikslumo treniruotę su duomenų tipu float16, skirtą važiavimui į priekį, ir float32, skirtą gradientams, kad paspartintume NVIDIA Tesla GPU palaikomus float16 skaičiavimus.
$ 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.pyišvada
Šiame straipsnyje mes apžvelgėme keičiamo masto metodą paskirstytam modelių mokymui naudojant Apache MXNet ir Horovod. „ImageNet“ duomenų rinkinyje, kuriame buvo apmokytas „ResNet50-v1“ modelis, parodėme mastelio keitimo efektyvumą ir ekonomiškumą, palyginti su parametrų serverio metodu. Taip pat įtraukėme veiksmus, kuriuos galite naudoti norėdami modifikuoti esamą scenarijų, kad galėtumėte vykdyti kelių egzempliorių mokymą naudodami Horovod.
Jei tik pradedate naudotis MXNet ir giliai mokytis, eikite į diegimo puslapį pirmiausia sukurti MXNet. Taip pat primygtinai rekomenduojame perskaityti straipsnį pradėti.
Jei jau dirbote su MXNet ir norite išbandyti paskirstytą mokymąsi su Horovod, pažiūrėkite , sukurkite jį iš MXNet ir sekite pavyzdžiu arba .
*kaina skaičiuojama remiantis AWS EC2 egzemplioriams
Sužinokite daugiau apie kursą
Šaltinis: www.habr.com
