Paskirstytas mokymasis naudojant „Apache MXNet“ ir „Horovod“.

Straipsnio vertimas buvo parengtas kursų pradžios išvakarėse „Pramoninis ML apie didelius duomenis“

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

„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 Pitonas, C + +, Clojure, Java, Julija, R, Scala ir kiti.

Paskirstytas mokymas MXNet su parametrų serveriu

Standartinis paskirstytas mokymosi modulis MXNet 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

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 MX tinklas, 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 horovod

Pastaba: 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 taigi.

Pabaigoje atsisiųskite bandomąjį scenarijų mxnet_mnist.py taigi 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.py

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

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

Paskirstytas mokymasis naudojant „Apache MXNet“ ir „Horovod“.
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.

Paskirstytas mokymasis naudojant „Apache MXNet“ ir „Horovod“.
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 šis įrašas.

Žingsnis 1

Sukurkite vienarūšių egzempliorių grupę su MXNet 1.4.0 ar naujesne versija ir Horovod versija 0.16.0 ar naujesne versija, kad galėtumėte naudoti paskirstytą mokymąsi. Taip pat turėsite įdiegti bibliotekas GPU mokymui. Savo atvejams pasirinkome Ubuntu 16.04 Linux su GPU tvarkykle 396.44, CUDA 9.2, cuDNN 7.2.1 biblioteka, NCCL 2.2.13 komunikatoriumi ir OpenMPI 3.1.1. Taip pat galite naudoti Amazon Deep Learning AMI, 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 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    ...

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

iš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į MXNepirmiausia sukurti MXNet. Taip pat primygtinai rekomenduojame perskaityti straipsnį MXNet per 60 minučiųpradėti.

Jei jau dirbote su MXNet ir norite išbandyti paskirstytą mokymąsi su Horovod, pažiūrėkite Horovod diegimo puslapis, sukurkite jį iš MXNet ir sekite pavyzdžiu MNIST arba ImageNet.

*kaina skaičiuojama remiantis valandiniai įkainiai AWS EC2 egzemplioriams

Sužinokite daugiau apie kursą „Pramoninis ML apie didelius duomenis“

Šaltinis: www.habr.com

Добавить комментарий