Naipamahagi ang Pag-aaral gamit ang Apache MXNet at Horovod

Ang pagsasalin ng artikulo ay inihanda sa bisperas ng pagsisimula ng kurso "Industrial ML sa Big Data"

Ang naipamahagi na pagsasanay sa maraming mga instance ng high-performance na computing ay maaaring mabawasan ang oras ng pagsasanay ng mga modernong deep neural network sa malaking halaga ng data mula linggo hanggang oras o kahit minuto, na ginagawang laganap ang diskarteng ito ng pagsasanay sa mga praktikal na aplikasyon ng malalim na pag-aaral. Dapat maunawaan ng mga user kung paano magbahagi at mag-synchronize ng data sa maraming pagkakataon, na may malaking epekto sa kahusayan sa pag-scale. Bilang karagdagan, dapat ding malaman ng mga user kung paano mag-deploy ng script ng pagsasanay na tumatakbo sa isang pagkakataon hanggang sa maraming pagkakataon.

Sa artikulong ito ay pag-uusapan natin ang tungkol sa isang mabilis at madaling paraan upang maipamahagi ang pag-aaral gamit ang open deep learning library na Apache MXNet at ang Horovod distributed learning framework. Malinaw naming ipapakita ang mga benepisyo sa pagganap ng framework ng Horovod at ipapakita kung paano magsulat ng script ng pagsasanay sa MXNet upang gumana ito sa isang distributed na paraan kasama ang Horovod.

Ano ang Apache MXNet

Apache MX Net ay isang open-source deep learning framework na ginagamit para gumawa, magsanay, at mag-deploy ng mga deep neural network. Inalis ng MXNet ang mga kumplikadong nauugnay sa pagpapatupad ng mga neural network, ay lubos na gumaganap at nasusukat, at nag-aalok ng mga API para sa mga sikat na programming language tulad ng Sawa, C + +, Clojure, Java, Julia, R, Scala и других.

Ibinahagi ang pagsasanay sa MXNet na may parameter server

Standard distributed learning module sa MXNet gumagamit ng parameter server approach. Gumagamit ito ng isang hanay ng mga server ng parameter upang mangolekta ng mga gradient mula sa bawat manggagawa, magsagawa ng pagsasama-sama, at magpadala ng mga na-update na gradient pabalik sa mga manggagawa para sa susunod na pag-ulit ng pag-optimize. Ang pagtukoy sa tamang ratio ng mga server sa mga manggagawa ay ang susi sa epektibong pag-scale. Kung mayroon lamang isang server ng parameter, maaari itong maging isang bottleneck sa mga kalkulasyon. Sa kabaligtaran, kung masyadong maraming mga server ang ginagamit, ang many-to-many na komunikasyon ay maaaring makabara sa lahat ng mga koneksyon sa network.

Ano ang Horovod

Horovod ay isang open distributed deep learning framework na binuo sa Uber. Ginagamit nito ang mahusay na cross-GPU at mga cross-node na teknolohiya tulad ng NVIDIA Collective Communications Library (NCCL) at Message Passing Interface (MPI) upang ipamahagi at pagsama-samahin ang mga parameter ng modelo sa mga vorec. Ino-optimize nito ang paggamit ng bandwidth ng network at mahusay na sumusukat kapag nagtatrabaho sa mga modelo ng malalim na neural network. Kasalukuyan itong sumusuporta sa ilang sikat na machine learning frameworks, ibig sabihin MX Net, Tensorflow, Keras, at PyTorch.

Pagsasama ng MXNet at Horovod

Sumasama ang MXNet sa Horovod sa pamamagitan ng mga Distributed Learning API na tinukoy sa Horovod. Mga API ng komunikasyon sa Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() ipinatupad gamit ang mga asynchronous na callback ng MXNet engine, bilang bahagi ng task graph nito. Sa ganitong paraan, ang mga dependency ng data sa pagitan ng komunikasyon at pag-compute ay madaling pangasiwaan ng MXNet engine upang maiwasan ang pagkawala ng pagganap dahil sa pag-synchronize. Ibinahagi ang optimizer object na tinukoy sa Horovod horovod.DistributedOptimizer lumalawak Optimizer sa MXNet upang tawagan nito ang kaukulang mga Horovod API para sa mga distributed na update sa parameter. Ang lahat ng mga detalye ng pagpapatupad na ito ay transparent sa mga end user.

Mabilis na pagsisimula

Mabilis mong masisimulan ang pagsasanay ng maliit na convolutional neural network sa MNIST dataset gamit ang MXNet at Horovod sa iyong MacBook.
Una, i-install ang mxnet at horovod mula sa PyPI:

pip install mxnet
pip install horovod

Tandaan: Kung nakatagpo ka ng error habang pip install horovodbaka kailangan mong magdagdag ng variable MACOSX_DEPLOYMENT_TARGET=10.vvSaan vv – ito ang bersyon ng iyong bersyon ng MacOS, halimbawa, para sa MacOSX Sierra kakailanganin mong magsulat MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Pagkatapos ay i-install ang OpenMPI kaya.

Sa dulo, i-download ang test script mxnet_mnist.py kaya at patakbuhin ang sumusunod na mga utos sa terminal ng MacBook sa gumaganang direktoryo:

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

Tatakbo ito ng pagsasanay sa dalawang core ng iyong processor. Ang magiging output ay ang mga sumusunod:

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

Demo ng Pagganap

Kapag nagsasanay ng modelong ResNet50-v1 sa isang dataset ng ImageNet sa 64 na GPU na may walong pagkakataon p3.16x malaki EC2, bawat isa ay naglalaman ng 8 NVIDIA Tesla V100 GPU sa AWS cloud, nakamit namin ang throughput ng pagsasanay na 45000 larawan/sec (ibig sabihin, ang bilang ng mga sinanay na sample bawat segundo). Nakumpleto ang pagsasanay sa loob ng 44 minuto pagkatapos ng 90 panahon na may pinakamahusay na katumpakan na 75.7%.

Ikinumpara namin ito sa ipinamahagi na diskarte sa pagsasanay ng MXNet sa paggamit ng mga parameter server sa 8, 16, 32 at 64 na GPU na may isang server ng parameter at isang server sa ratio ng manggagawa na 1 hanggang 1 at 2 hanggang 1, ayon sa pagkakabanggit. Makikita mo ang resulta sa Figure 1 sa ibaba. Sa y-axis sa kaliwa, kinakatawan ng mga bar ang bilang ng mga larawang sasanayin bawat segundo, ang mga linya ay sumasalamin sa kahusayan sa pag-scale (iyon ay, ang ratio ng aktwal sa perpektong throughput) sa y-axis sa kanan. Tulad ng nakikita mo, ang pagpili ng bilang ng mga server ay nakakaapekto sa kahusayan sa pag-scale. Kung mayroon lamang isang server ng parameter, bumaba ang kahusayan sa pag-scale sa 38% sa 64 na GPU. Upang makamit ang parehong kahusayan sa pag-scale tulad ng sa Horovod, kailangan mong doblehin ang bilang ng mga server na may kaugnayan sa bilang ng mga manggagawa.

Naipamahagi ang Pag-aaral gamit ang Apache MXNet at Horovod
Figure 1. Paghahambing ng distributed learning gamit ang MXNet sa Horovod at sa parameter server

Sa Talahanayan 1 sa ibaba, inihahambing namin ang panghuling gastos sa bawat pagkakataon kapag nagpapatakbo ng mga eksperimento sa 64 na GPU. Ang paggamit ng MXNet sa Horovod ay nagbibigay ng pinakamahusay na throughput sa pinakamababang halaga.

Naipamahagi ang Pag-aaral gamit ang Apache MXNet at Horovod
Talahanayan 1. Paghahambing ng gastos sa pagitan ng Horovod at Parameter Server na may ratio ng server sa manggagawa na 2 hanggang 1.

Mga hakbang sa pagpaparami

Sa mga susunod na hakbang, ipapakita namin sa iyo kung paano i-reproduce ang resulta ng distributed training gamit ang MXNet at Horovod. Para matuto pa tungkol sa distributed learning gamit ang MXNet basahin itong poste.

Hakbang 1

Gumawa ng isang kumpol ng mga magkakatulad na pagkakataon na may MXNet na bersyon 1.4.0 o mas mataas at Horovod na bersyon 0.16.0 o mas mataas para magamit ang distributed learning. Kakailanganin mo ring mag-install ng mga aklatan para sa pagsasanay sa GPU. Para sa aming mga pagkakataon, pinili namin ang Ubuntu 16.04 Linux, na may GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 library, NCCL 2.2.13 communicator at OpenMPI 3.1.1. Maaari mo ring gamitin Amazon Deep Learning AMI, kung saan ang mga aklatang ito ay paunang naka-install.

Hakbang 2

Idagdag ang kakayahang magtrabaho kasama ang Horovod API sa iyong script ng pagsasanay sa MXNet. Ang script sa ibaba batay sa MXNet Gluon API ay maaaring gamitin bilang isang simpleng template. Ang mga linyang naka-bold ay kailangan kung mayroon ka nang kaukulang script ng pagsasanay. Narito ang ilang mahahalagang pagbabago na kailangan mong gawin upang matuto sa Horovod:

  • Itakda ang konteksto ayon sa lokal na ranggo ng Horovod (linya 8) upang maunawaan na ang pagsasanay ay isinasagawa sa tamang graphics core.
  • Ipasa ang mga paunang parameter mula sa isang manggagawa sa lahat (linya 18) upang matiyak na ang lahat ng mga manggagawa ay magsisimula sa parehong mga paunang parameter.
  • Lumikha ng Horovod DistributedOptimizer (linya 25) upang i-update ang mga parameter sa isang distributed na paraan.

Upang makuha ang buong script, mangyaring sumangguni sa mga halimbawa ng Horovod-MXNet 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    ...

Hakbang 3

Mag-log in sa isa sa mga manggagawa para simulan ang distributed training gamit ang MPI directive. Sa halimbawang ito, tumatakbo ang distributed na pagsasanay sa apat na pagkakataon na may 4 na GPU bawat isa, at kabuuang 16 na GPU sa cluster. Ang Stochastic Gradient Descent (SGD) optimizer ay gagamitin sa mga sumusunod na hyperparameter:

  • laki ng mini-batch: 256
  • rate ng pagkatuto: 0.1
  • momentum: 0.9
  • pagkabulok ng timbang: 0.0001

Habang nag-scale kami mula sa isang GPU hanggang 64 na GPU, linearly naming pinalaki ang rate ng pagsasanay ayon sa bilang ng mga GPU (mula 0,1 para sa 1 GPU hanggang 6,4 para sa 64 na GPU), habang pinapanatili ang bilang ng mga larawan sa bawat GPU sa 256 ( mula sa isang batch ng 256 na larawan para sa 1 GPU hanggang 16 para sa 384 na GPU). Nagbago ang mga parameter ng weight decay at momentum habang tumaas ang bilang ng mga GPU. Gumamit kami ng mixed precision training na may float64 data type para sa forward pass at float16 para sa mga gradient para mapabilis ang mga kalkulasyon ng float32 na sinusuportahan ng NVIDIA Tesla GPUs.

$ 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

Konklusyon

Sa artikulong ito, tiningnan namin ang isang scalable na diskarte sa distributed model training gamit ang Apache MXNet at Horovod. Ipinakita namin ang scaling efficiency at cost-effectiveness kumpara sa parameter server approach sa ImageNet dataset kung saan sinanay ang ResNet50-v1 model. Nagsama rin kami ng mga hakbang na magagamit mo upang baguhin ang isang umiiral nang script para magpatakbo ng multi-instance na pagsasanay gamit ang Horovod.

Kung nagsisimula ka pa lang sa MXNet at malalim na pag-aaral, pumunta sa pahina ng pag-install MXNeupang unang bumuo ng MXNet. Lubos din naming inirerekumenda na basahin ang artikulo MXNet sa loob ng 60 minutoupang makapagsimula.

Kung nagtrabaho ka na sa MXNet at gusto mong subukan ang distributed learning sa Horovod, tingnan mo ang Pahina ng pag-install ng Horovod, buuin ito mula sa MXNet at sundin ang halimbawa MNIST o ImageNet.

*Kinakalkula ang gastos batay sa bayad kada oras AWS para sa EC2 Instances

Alamin ang higit pa tungkol sa kurso "Industrial ML sa Big Data"

Pinagmulan: www.habr.com

Magdagdag ng komento