Hāʻawi ʻia ke aʻo ʻana me Apache MXNet a me Horovod

Ua hoʻomākaukau ʻia ka unuhi ʻana o ka ʻatikala ma ka pō o ka hoʻomaka ʻana o ka papa "ML ʻOihana ma ka ʻikepili Nui"

Hiki ke hoʻemi i ka manawa hoʻomaʻamaʻa o nā ʻupena neural hohonu o kēia wā ma ka nui o ka ʻikepili mai nā pule a i nā hola a i ʻole mau minuke, e hoʻonui i kēia ʻano hoʻomaʻamaʻa i nā noi kūpono o ke aʻo hohonu. Pono nā mea hoʻohana e hoʻomaopopo i ke kaʻana like ʻana a me ka hoʻonohonoho ʻana i ka ʻikepili i nā manawa he nui, a he hopena nui ia i ka hana scaling. Eia hou, pono e ʻike nā mea hoʻohana i ka hoʻolālā ʻana i kahi palapala hoʻomaʻamaʻa e holo ana ma kahi manawa hoʻokahi i nā manawa he nui.

Ma kēia ʻatikala e kamaʻilio mākou e pili ana i kahi ala wikiwiki a maʻalahi hoʻi e puʻunaue i ke aʻo ʻana me ka hoʻohana ʻana i ka waihona aʻo hohonu hohonu ʻo Apache MXNet a me ka Horovod distributed learning framework. E hōʻike maopopo mākou i nā pono hana o ka hoʻolālā Horovod a hōʻike i ke kākau ʻana i kahi palapala hoʻomaʻamaʻa MXNet i hana ia ma ke ʻano puʻupuʻu me Horovod.

He aha ka Apache MXNet

ʻO Apache MX Pūnaewele he kumu hoʻonaʻauao hohonu i hoʻohana ʻia no ka hana ʻana, hoʻomaʻamaʻa, a kau i nā ʻupena neural hohonu. Hoʻopuka ʻo MXNet i nā mea paʻakikī e pili ana i ka hoʻokō ʻana i nā ʻupena neural, hana nui a hiki ke hoʻonui ʻia, a hāʻawi i nā API no nā ʻōlelo papahana kaulana e like me Python, C ++, ʻO Clojure, Iawa, Julia, R, Scala me nā mea ʻē aʻe.

Hāʻawi ʻia ka hoʻomaʻamaʻa ʻana ma MXNet me ka server parameter

ʻĀpana hoʻonaʻauao maʻamau ma MXNet hoʻohana i kahi ala kikowaena kikowaena. Hoʻohana ia i kahi pūʻulu o nā kikowaena kikowaena e hōʻiliʻili i nā gradients mai kēlā me kēia limahana, hana i ka hōʻuluʻulu ʻana, a hoʻouna hou i nā gradients hou i nā limahana no ka hoʻonui hou ʻana. ʻO ka hoʻoholo ʻana i ka lakio kūpono o nā kikowaena i nā limahana ke kī i ka scaling pono. Inā hoʻokahi wale nō server parameter, hiki ke lilo i bottleneck i ka helu ʻana. ʻO ka mea ʻē aʻe, inā he nui nā kikowaena i hoʻohana ʻia, hiki i nā kamaʻilio nui-a-nui ke pani i nā pilina pūnaewele āpau.

He aha ka Horovod

Horovod he papa hana hoʻonaʻauao hohonu i wehe ʻia ma Uber. Hoʻohana ia i nā ʻenehana cross-GPU a me nā ʻenehana cross-node e like me NVIDIA Collective Communications Library (NCCL) a me Message Passing Interface (MPI) e puʻunaue a hōʻuluʻulu i nā ʻāpana kumu hoʻohālike ma waena o nā vorecs. Hoʻonui ia i ka hoʻohana ʻana i ka bandwidth network a me nā unahi maikaʻi i ka wā e hana ai me nā ʻōnaehana neural hohonu. Kākoʻo ia i kēia manawa i kekahi mau papa hana aʻo mīkini kaulana, ʻo ia hoʻi MX Net, Tensorflow, Keras, a me PyTorch.

MXNet a me Horovod hoʻohui

Hoʻohui ʻia ʻo MXNet me Horovod ma o ka Distributed Learning API i wehewehe ʻia ma Horovod. Nā API kamaʻilio Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() hoʻohana ʻia me ka hoʻohana ʻana i nā kelepona asynchronous o ka mīkini MXNet, ma ke ʻano o kāna pakuhi hana. Ma kēia ʻano, ʻike maʻalahi ʻia nā hilinaʻi ʻikepili ma waena o ka kamaʻilio a me ka helu ʻana e ka mīkini MXNet e pale aku i nā poho o ka hana ma muli o ka synchronization. Hoʻokaʻawale ʻia kahi mea optimizer i wehewehe ʻia ma Horovod horovod.DistributedOptimizer hoʻonui Optimizer i MXNet no laila e kāhea ʻo ia i nā API Horovod e pili ana no ka hoʻolaha ʻana i nā mea hoʻonui. ʻIke ʻia kēia mau kikoʻī hoʻokō āpau i nā mea hoʻohana hope.

Hoʻomaka wikiwiki

Hiki iā ʻoe ke hoʻomaka koke i ke aʻo ʻana i kahi pūnaewele neural convolutional liʻiliʻi ma ka ʻikepili MNIST me ka hoʻohana ʻana iā MXNet a me Horovod ma kāu MacBook.
ʻO ka mua, e hoʻokomo i ka mxnet a me ka horovod mai PyPI:

pip install mxnet
pip install horovod

Nānā: Inā loaʻa iā ʻoe kahi hewa i ka wā pip hoʻokomo horovodpono paha ʻoe e hoʻohui i kahi loli MACOSX_DEPLOYMENT_TARGET=10.vvkahi vv - ʻo kēia ka mana o kāu mana MacOS, no ka laʻana, no MacOSX Sierra pono ʻoe e kākau MACOSX_DEPLOYMENT_TARGET=10.12 pip hoʻokomo horovod

A laila e hoʻokomo iā OpenMPI mai kēia wahi.

I ka hopena, hoʻoiho i ka palapala hōʻike mxnet_mnist.py mai kēia wahi a holo i kēia mau kauoha ma ka pahu MacBook ma ka papa kuhikuhi hana:

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

E holo ana kēia i ka hoʻomaʻamaʻa ʻana ma nā cores ʻelua o kāu kaʻina hana. ʻO kēia ka hopena:

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

Hōʻikeʻike hana

Ke hoʻomaʻamaʻa ʻana i kahi hiʻohiʻona ResNet50-v1 ma kahi waihona ImageNet ma 64 GPU me ʻewalu mau manawa. p3.16x nui EC2, loaʻa kēlā me kēia me 8 NVIDIA Tesla V100 GPU ma ke ao AWS, ua loaʻa iā mākou kahi hoʻomaʻamaʻa aʻo ʻana o 45000 kiʻi/sec (ʻo ia hoʻi, ka helu o nā laʻana i aʻo ʻia i kekona). Hoʻopau ka hoʻomaʻamaʻa ʻana ma 44 mau minuke ma hope o 90 mau manawa me ka pololei o 75.7%.

Ua hoʻohālikelike mākou i kēia me ke ala hoʻomaʻamaʻa puʻupuʻu a MXNet no ka hoʻohana ʻana i nā kikowaena parameter ma 8, 16, 32 a me 64 GPU me kahi kikowaena kikowaena hoʻokahi a me kahi server i ka ratio limahana o 1 a 1 a me 2 i 1, kēlā me kēia. Hiki iā ʻoe ke ʻike i ka hopena ma ka Figure 1 ma lalo nei. Ma ka axis y ma ka hema, hōʻike nā kī i ka helu o nā kiʻi e hoʻomaʻamaʻa i kēlā me kēia kekona, e hōʻike ana nā laina i ka pono hoʻonui (ʻo ia hoʻi, ka ratio o ka hana maoli a me ka hiki ke kūpono) ma ka axis ma ka ʻākau. E like me kāu e ʻike ai, ʻo ke koho ʻana o ka helu o nā kikowaena e pili ana i ka pono scaling. Inā hoʻokahi wale nō kikowaena kikowaena, hāʻule ka hana scaling i 38% ma 64 GPU. No ka hoʻokō ʻana i ka pono scaling like me Horovod, pono ʻoe e pālua i ka helu o nā kikowaena pili i ka helu o nā limahana.

Hāʻawi ʻia ke aʻo ʻana me Apache MXNet a me Horovod
Kiʻi 1. Ka hoʻohālikelike ʻana o ke aʻo ʻana i puʻunaue ʻia me MXNet me Horovod a me ka server parameter

Ma ka Papa 1 ma lalo nei, hoʻohālikelike mākou i ke kumukūʻai hope no kēlā me kēia manawa ke holo nei i nā hoʻokolohua ma 64 GPU. ʻO ka hoʻohana ʻana iā MXNet me Horovod e hāʻawi i ka throughput maikaʻi loa ma ke kumukūʻai haʻahaʻa.

Hāʻawi ʻia ke aʻo ʻana me Apache MXNet a me Horovod
Papa 1. Hoʻohālikelike kumu kūʻai ma waena o Horovod a me Parameter Server me kahi kikowaena o ka limahana limahana o 2 a 1.

Nā ʻanuʻu e hana hou

Ma nā ʻanuʻu aʻe, e hōʻike mākou iā ʻoe pehea e hana hou ai i ka hopena o ka hoʻomaʻamaʻa ʻana me ka hoʻohana ʻana iā MXNet a me Horovod. E aʻo hou e pili ana i ke aʻo ʻana me MXNet heluhelu keia pou.

pani 1

E hana i pūʻulu o nā ʻano like like me ka mana MXNet 1.4.0 a i ʻole ke kiʻekiʻe a me ka mana ʻo Horovod 0.16.0 a i ʻole ke kiʻekiʻe no ka hoʻohana ʻana i ke aʻo ʻana. Pono ʻoe e hoʻokomo i nā hale waihona puke no ka hoʻomaʻamaʻa GPU. No kā mākou mau hiʻohiʻona, ua koho mākou iā Ubuntu 16.04 Linux, me GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 hale waihona puke, NCCL 2.2.13 communicator a me OpenMPI 3.1.1. Hiki nō hoʻi iā ʻoe ke hoʻohana Amazon Deep Learning AMI, kahi i hoʻokomo mua ʻia kēia mau hale waihona puke.

pani 2

Hoʻohui i ka hiki ke hana me ka Horovod API i kāu palapala hoʻomaʻamaʻa MXNet. Hiki ke hoʻohana ʻia ka palapala ma lalo nei e pili ana i ka MXNet Gluon API ma ke ʻano he maʻalahi. Pono nā laina i ka wiwo ʻole inā loaʻa iā ʻoe kahi palapala aʻo e pili ana. Eia kekahi mau hoʻololi koʻikoʻi e pono ai ʻoe e aʻo me Horovod:

  • E hoʻonohonoho i ka pōʻaiapili e like me ke kūlana Horovod kūloko (laina 8) no ka hoʻomaopopo ʻana ua hana ʻia ke aʻo ʻana ma ke kumu kiʻi pololei.
  • E hāʻawi i nā palena mua mai kekahi limahana i nā mea a pau (laina 18) e hōʻoia i ka hoʻomaka ʻana o nā limahana āpau me nā ʻāpana mua like.
  • Hana i kahi Horovod DistributedOptimizer (laina 25) e hoʻololi i nā ʻāpana ma ke ʻano puʻupuʻu.

No ka loaʻa ʻana o ka palapala piha, e ʻoluʻolu e nānā i nā hiʻohiʻona 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    ...

pani 3

E komo i kekahi o nā limahana e hoʻomaka i ka hoʻomaʻamaʻa ʻana me ka hoʻohana ʻana i ke kuhikuhi MPI. Ma kēia hiʻohiʻona, holo ka hoʻomaʻamaʻa ʻana i ʻehā mau manawa me 4 GPU i kēlā me kēia, a me ka huina o 16 GPU i ka hui. E hoʻohana ʻia ka Stochastic Gradient Descent (SGD) optimizer me nā hyperparameter aʻe:

  • ka nui o ka pūʻulu mini: 256
  • ka helu aʻo: 0.1
  • ka manawa: 0.9
  • pohō kaumaha: 0.0001

I ko mākou piʻi ʻana mai hoʻokahi GPU a i 64 GPU, ua hoʻonui mākou i ka helu hoʻomaʻamaʻa e like me ka helu o nā GPU (mai 0,1 no 1 GPU a i 6,4 no 64 GPU), ʻoiai e mālama ana i ka helu o nā kiʻi no kēlā me kēia GPU ma 256 (mai kahi pūʻulu o 256 kiʻi no 1 GPU a 16 no 384 GPU). Ua hoʻololi ʻia ka palaho kaumaha a me nā ʻāpana momentum i ka hoʻonui ʻana o ka helu o nā GPU. Ua hoʻohana mākou i ka hoʻomaʻamaʻa pololei ʻana me ka ʻano data float64 no ka hele mua a me ka float16 no nā gradients e wikiwiki i nā helu float32 i kākoʻo ʻia e 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

hopena

Ma kēia ʻatikala, ua nānā mākou i kahi ala hiki ke hoʻokaʻawale ʻia i ka hoʻomaʻamaʻa ʻana me Apache MXNet a me Horovod. Ua hōʻike mākou i ka maikaʻi o ka scaling a me ke kumu kūʻai i hoʻohālikelike ʻia i ke ala kikowaena kikowaena ma ka ʻikepili ImageNet kahi i aʻo ʻia ai ke kumu hoʻohālike ResNet50-v1. Ua hoʻokomo pū mākou i nā ʻanuʻu e hiki ai iā ʻoe ke hoʻohana e hoʻololi i kahi palapala i loaʻa e holo i ka hoʻomaʻamaʻa lehulehu me ka hoʻohana ʻana iā Horovod.

Inā ʻoe e hoʻomaka ana me MXNet a me ke aʻo hohonu, e hele i ka ʻaoʻao hoʻonohonoho MXNee kūkulu mua iā MXNet. Manaʻo ikaika mākou e heluhelu i ka ʻatikala MXNet i 60 minukee hoʻomaka.

Inā ua hana mua ʻoe me MXNet a makemake ʻoe e hoʻāʻo i ke aʻo ʻana me Horovod, a laila e nānā ʻaoʻao hoʻokomo ʻo Horovod, kūkulu ia mai MXNet a hahai i ka laʻana MNIST ai ole ia, IMAGEnet.

* helu ʻia ke kumukūʻai ma muli o uku o ka hora AWS no nā EC2

E ʻike hou aku e pili ana i ka papa "ML ʻOihana ma ka ʻikepili Nui"

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka