Ikaskuntza banatua Apache MXNet eta Horovod-ekin

Ikastaroa hasi bezperan prestatu zen artikuluaren itzulpena "Datu Bigen ML industriala"

Errendimendu handiko konputazio-instantzia anitzetan banatutako prestakuntzak sare neuronal sakon modernoen entrenamendu-denbora murrizten du datu-kopuru handietan asteetatik orduetara edo baita minutuetara ere, prestakuntza-teknika hau ikaskuntza sakonaren aplikazio praktikoetan nagusituz. Erabiltzaileek ulertu behar dute nola partekatu eta sinkronizatu datuak hainbat instantziatan, eta horrek eragin handia du eskalatzeko eraginkortasunean. Horrez gain, erabiltzaileek instantzia bakarrean exekutatzen den prestakuntza-scripta hainbat instantziatara nola zabaldu ere jakin beharko lukete.

Artikulu honetan ikaskuntza banatzeko modu azkar eta erraz bati buruz hitz egingo dugu Apache MXNet deep learning liburutegi irekia eta Horovod banatutako ikaskuntza esparrua erabiliz. Horovod esparruaren errendimendu onurak argi eta garbi erakutsiko ditugu eta MXNet prestakuntza-gidoia nola idatzi erakutsiko dugu, Horovod-ekin modu banatuan funtziona dezan.

Zer da Apache MXNet

Apache MX Net kode irekiko deep learning esparru bat da, neurona-sare sakonak sortzeko, entrenatzeko eta zabaltzeko erabiltzen dena. MXNet-ek sare neuronalak ezartzearekin lotutako konplexutasunak kentzen ditu, errendimendu handikoa eta eskalagarria da eta programazio-lengoaia ezagunetarako APIak eskaintzen ditu, esaterako. Python, C ++, Clojure, Java, Julia, R, Eskala eta beste batzuk.

Prestakuntza banatua MXNet-en parametro zerbitzariarekin

Banatutako ikaskuntza modulu estandarra MXNet-en parametro zerbitzariaren ikuspegia erabiltzen du. Parametro-zerbitzari multzo bat erabiltzen du langile bakoitzaren gradienteak biltzeko, agregazioa egiteko eta gradiente eguneratuak langileei itzultzeko hurrengo optimizazio-iteraziorako. Zerbitzarien eta langileen arteko erlazio zuzena zehaztea da eskalatze eraginkorra izateko gakoa. Parametro-zerbitzari bakarra badago, baliteke kalkuluetan botilen lepoa izatea. Aitzitik, zerbitzari gehiegi erabiltzen badira, askoren arteko komunikazioak sareko konexio guztiak oztopatu ditzake.

Zer da Horovod

Horovod Uber-en garatutako deep learning esparru ireki bat da. GPU eta nodoen arteko teknologia eraginkorrak erabiltzen ditu, hala nola NVIDIA Collective Communications Library (NCCL) eta Message Passing Interface (MPI) bezalako eredu-parametroak vorecs zehar banatzeko eta gehitzeko. Sareko banda-zabaleraren erabilera optimizatzen du eta ondo eskalatzen du sare neuronal sakoneko ereduekin lan egiten denean. Gaur egun, hainbat makina ikasteko esparru ezagun onartzen ditu, alegia MX Net, Tensorflow, Keras eta PyTorch.

MXNet eta Horovod integrazioa

MXNet Horovod-ekin integratzen da Horovod-en definitutako Distributed Learning APIen bidez. Horovod komunikazio APIak horovod.broadcast(), horovod.allgather() ΠΈ horovod.allreduce() MXNet motorraren dei asinkronoak erabiliz inplementatu da, bere ataza grafikoaren zati gisa. Modu honetan, komunikazioaren eta konputazioaren arteko datuen mendekotasunak erraz kudeatzen ditu MXNet motorrak, sinkronizazioaren ondorioz errendimendu-galerak ekiditeko. Horovoden definitutako optimizatzaile banatutako objektua horovod.DistributedOptimizer zabaltzen da Optimizer MXNet-en, dagozkion Horovod APIetara dei ditzan parametroen eguneratze banatuetarako. Ezarpen xehetasun horiek guztiak gardenak dira azken erabiltzaileentzat.

Hasiera azkarra

Azkar has zaitezke MNIST datu multzoan sare neuronal konboluzional txiki bat entrenatzen zure MacBook-en MXNet eta Horovod erabiliz.
Lehenik eta behin, instalatu mxnet eta horovod PyPI-tik:

pip install mxnet
pip install horovod

Oharra: Errore bat aurkitzen baduzu pip instalatu horovodagian aldagai bat gehitu behar duzu MACOSX_DEPLOYMENT_TARGET=10.vvNon vv – hau zure MacOS bertsioaren bertsioa da, adibidez, MacOSX Sierrarako idatzi beharko duzu MACOSX_DEPLOYMENT_TARGET=10.12 pip instalatu horovod

Ondoren, instalatu OpenMPI beraz,.

Amaieran, deskargatu probaren gidoia mxnet_mnist.py beraz, eta exekutatu komando hauek laneko direktorioko MacBook terminalean:

mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py

Honek zure prozesadorearen bi nukleotan entrenatuko du. Irteera hau izango da:

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

Performance Demo

ResNet50-v1 modelo bat ImageNet datu-multzo batean entrenatzean zortzi instantziako 64 GPUtan p3.16xhandia EC2, bakoitzak 8 NVIDIA Tesla V100 GPU dituen AWS hodeian, 45000 irudi/seg-eko entrenamenduaren errendimendua lortu dugu (hau da, segundoko entrenatu diren lagin kopurua). Entrenamendua 44 minututan burutu zen 90 garairen ondoren, %75.7ko zehaztasun onenarekin.

Parametro zerbitzariak 8, 16, 32 eta 64 GPUtan erabiltzeko MXNet-en trebakuntza-ikuspegi banatuarekin alderatu dugu parametro bakarreko zerbitzariarekin eta zerbitzari eta langile-erlazioa 1 eta 1 eta 2 eta 1, hurrenez hurren. Emaitza beheko 1. irudian ikus dezakezu. Ezkerreko y ardatzean, barrek segundoko entrenatu beharreko irudi kopurua adierazten dute, lerroek eskalatze-eraginkortasuna islatzen dute (hau da, errendimendu errealaren eta idealaren arteko erlazioa) eskuineko y ardatzean. Ikus dezakezunez, zerbitzari kopurua aukeratzeak eskalatzearen eraginkortasunari eragiten dio. Parametro zerbitzari bakarra badago, eskalatzearen eraginkortasuna % 38ra jaisten da 64 GPUtan. Horovod-ekin duen eskalatze-eraginkortasun bera lortzeko, zerbitzarien kopurua bikoiztu behar duzu langile kopuruaren aldean.

Ikaskuntza banatua Apache MXNet eta Horovod-ekin
1. Irudia. MXNet erabiliz ikasteko banatuaren konparazioa Horovod-ekin eta parametro-zerbitzariarekin

Beheko 1. taulan, instantzia bakoitzeko azken kostua konparatzen dugu esperimentuak 64 GPUtan egiten direnean. MXNet Horovod-ekin erabiltzeak errendimendu onena eskaintzen du kostu txikienean.

Ikaskuntza banatua Apache MXNet eta Horovod-ekin
1. taula. Horovod eta Parameter Server arteko kostuen konparazioa zerbitzariaren eta langilearen arteko erlazioa 2 eta 1ekoa izanik.

Erreproduzitzeko urratsak

Hurrengo urratsetan, banatutako prestakuntzaren emaitza nola erreproduzitu erakutsiko dizugu MXNet eta Horovod erabiliz. MXNet-ekin banatutako ikaskuntzari buruz gehiago jakiteko irakurri mezu hau.

Urratsera 1

Sortu instantzia homogeneoen multzoa MXNet 1.4.0 bertsioa edo handiagoarekin eta Horovod 0.16.0 bertsioa edo handiagoarekin ikaskuntza banatua erabiltzeko. GPU prestakuntzarako liburutegiak ere instalatu beharko dituzu. Gure kasuetarako, Ubuntu 16.04 Linux aukeratu dugu, GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 liburutegiarekin, NCCL 2.2.13 komunikatzailea eta OpenMPI 3.1.1. Era berean, erabil dezakezu Amazon Deep Learning AMI, non liburutegi hauek aurrez instalatuta dauden.

Urratsera 2

Gehitu Horovod APIarekin lan egiteko gaitasuna zure MXNet prestakuntza-gidoiari. MXNet Gluon APIan oinarritutako beheko scripta txantiloi soil gisa erabil daiteke. Lodiz idatzitako lerroak behar dira dagoeneko dagokion prestakuntza-gidoia baduzu. Hona hemen Horovod-ekin ikasteko egin behar dituzun aldaketa kritiko batzuk:

  • Ezarri testuingurua tokiko Horovod mailaren arabera (8. lerroa) entrenamendua nukleo grafiko egokian egiten dela ulertzeko.
  • Pasatu hasierako parametroak langile batetik guztietara (18. lerroa), langile guztiak hasierako parametro berdinekin hasten direla ziurtatzeko.
  • Sortu Horovod bat DistributedOptimizer (25. lerroa) parametroak modu banatuan eguneratzeko.

Script osoa lortzeko, ikusi Horovod-MXNet adibideetara 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    ...

Urratsera 3

Hasi saioa langileetako batean prestakuntza banatua hasteko MPI zuzentaraua erabiliz. Adibide honetan, prestakuntza banatua lau instantziatan exekutatzen da bakoitza 4 GPUrekin, eta guztira 16 GPU klusterrean. Gradiente Estokastikoaren Jaitsiera (SGD) optimizatzailea hiperparametro hauekin erabiliko da:

  • lote txikien tamaina: 256
  • ikaskuntza-tasa: 0.1
  • momentua: 0.9
  • pisuaren gainbehera: 0.0001

GPU batetik 64 GPUra eskalatu genuenez, entrenamendu-tasa linealki eskalatu genuen GPU kopuruaren arabera (0,1etik 1 GPUrako 6,4ra 64 GPUrako), GPU bakoitzeko irudi kopurua 256an mantenduz (sorte batetik. 256 irudi 1 GPUrako 16tik 384 GPUrako). Pisuaren gainbehera eta momentuaren parametroak aldatu egin ziren GPU kopurua handitu ahala. Doitasun-entrenamendu mistoa erabili dugu float64 datu-motarekin aurrera egiteko eta float16 gradienteetarako NVIDIA Tesla GPUek onartzen dituzten float32 kalkuluak bizkortzeko.

$ 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

Ondorioa

Artikulu honetan, Apache MXNet eta Horovod erabiliz banatutako ereduen prestakuntzarako ikuspegi eskalagarria aztertu dugu. ResNet50-v1 eredua trebatu zen ImageNet datu-multzoan parametro zerbitzariaren ikuspegiarekin alderatuta eskalatzeko eraginkortasuna eta kostu-eraginkortasuna frogatu ditugu. Lehendik dagoen script bat aldatzeko erabil ditzakezun urratsak ere sartu ditugu, instantzia anitzeko prestakuntza exekutatzeko, Horovod erabiliz.

MXNet-ekin eta ikaskuntza sakonarekin hasten ari bazara, joan instalazio orrira MXNelehenik MXNet eraikitzeko. Artikulua irakurtzea ere gomendatzen dugu MXNet 60 minututanhasteko.

Dagoeneko MXNet-ekin lan egin baduzu eta Horovod-en ikaskuntza banatua probatu nahi baduzu, begiratu Horovod instalazio orria, eraiki ezazu MXNet-etik eta jarraitu adibidea MNIST edo ImageNet.

*kostua oinarrituta kalkulatzen da orduko tarifak EC2 Instantziarentzako AWS

Ikastaroari buruzko informazio gehiago "Datu Bigen ML industriala"

Iturria: www.habr.com

Gehitu iruzkin berria