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
Paskirstytas mokymas MXNet su parametrų serveriu
Kas yra Horovodas
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
Pabaigoje atsisiųskite bandomąjį scenarijų mxnet_mnist.py
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.
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 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
Ž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.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į
Jei jau dirbote su MXNet ir norite išbandyti paskirstytą mokymąsi su Horovod, pažiūrėkite
*kaina skaičiuojama remiantis
Sužinokite daugiau apie kursą
Šaltinis: www.habr.com