Ẹkọ pinpin pẹlu Apache MXNet ati Horovod

Itumọ nkan naa ni a pese sile ni aṣalẹ ti ibẹrẹ ikẹkọ naa "ML ile-iṣẹ lori Data Nla"

Ikẹkọ pinpin lori awọn iṣẹlẹ iširo iṣẹ-giga pupọ le dinku akoko ikẹkọ ti awọn nẹtiwọọki jinlẹ ti ode oni lori awọn oye nla ti data lati awọn ọsẹ si awọn wakati tabi paapaa awọn iṣẹju, ṣiṣe ilana ikẹkọ yii ni ibigbogbo ni awọn ohun elo iṣe ti ẹkọ jinlẹ. Awọn olumulo gbọdọ ni oye bi o ṣe le pin ati muuṣiṣẹpọ data kọja awọn iṣẹlẹ lọpọlọpọ, eyiti o ni ipa pataki lori ṣiṣe iwọnwọn. Ni afikun, awọn olumulo yẹ ki o tun mọ bi o ṣe le fi iwe afọwọkọ ikẹkọ ti o nṣiṣẹ lori apẹẹrẹ kan si awọn iṣẹlẹ pupọ.

Ninu àpilẹkọ yii a yoo sọrọ nipa ọna ti o yara ati irọrun lati pin kaakiri ẹkọ nipa lilo ile-ikawe ikẹkọ jinlẹ ti ṣiṣi Apache MXNet ati Horovod ilana ikẹkọ pinpin. A yoo ṣe afihan awọn anfani iṣẹ ti ilana Horovod ati ṣafihan bi o ṣe le kọ iwe afọwọkọ ikẹkọ MXNet ki o le ṣiṣẹ ni ọna pinpin pẹlu Horovod.

Kini Apache MXNet

Afun MXNet jẹ ilana eto ẹkọ ti o jinlẹ ti ṣiṣi-orisun ti o lo lati ṣẹda, ṣe ikẹkọ, ati ran awọn nẹtiwọọki ti o jinlẹ jinlẹ. MXNet ṣe arosọ awọn idiju ti o ni nkan ṣe pẹlu imuse awọn nẹtiwọọki nkankikan, o ṣiṣẹ gaan ati iwọn, ati pe o funni ni API fun awọn ede siseto olokiki gẹgẹbi Python, C ++, Clojure, Java, Julia, R, Scala ati awọn miiran.

Ikẹkọ pinpin ni MXNet pẹlu olupin paramita

Standard pin eko module ni MXNet nlo a paramita server ona. O nlo ṣeto awọn olupin paramita lati gba awọn gradients lati ọdọ oṣiṣẹ kọọkan, ṣe akojọpọ, ati firanṣẹ awọn gradients imudojuiwọn pada si awọn oṣiṣẹ fun aṣetunṣe iṣapeye atẹle. Ṣiṣe ipinnu ipin ti o pe ti awọn olupin si awọn oṣiṣẹ jẹ bọtini si igbelowọn ti o munadoko. Ti olupin paramita kan ba wa, o le tan lati jẹ igo ni awọn iṣiro naa. Lọna miiran, ti ọpọlọpọ awọn olupin ba lo, ọpọlọpọ-si-ọpọlọpọ ibaraẹnisọrọ le di gbogbo awọn asopọ nẹtiwọki pọ.

Kí ni Horovod

Horovod jẹ ilana ẹkọ ti o jinlẹ pinpin ti o ṣii ni idagbasoke ni Uber. O n ṣe agbekọja-GPU daradara ati awọn imọ-ẹrọ oju-ọna agbelebu gẹgẹbi NVIDIA Collective Communications Library (NCCL) ati Ifiranṣẹ Passing Interface (MPI) lati pin kaakiri ati akojọpọ awọn awoṣe awoṣe kọja awọn iyipo. O ṣe iṣapeye lilo bandiwidi nẹtiwọọki ati awọn irẹjẹ daradara nigbati o n ṣiṣẹ pẹlu awọn awoṣe nẹtiwọọki ti o jinlẹ. Lọwọlọwọ o ṣe atilẹyin ọpọlọpọ awọn ilana ikẹkọ ẹrọ olokiki, eyun MX Net, Tensorflow, Keras, ati PyTorch.

MXNet ati Horovod Integration

MXNet ṣepọ pẹlu Horovod nipasẹ Awọn API Ẹkọ Pinpin ti a ṣalaye ni Horovod. Awọn API ibaraẹnisọrọ Horovod horovod.igbohunsafẹfẹ (), horovod.gbogbo () и horovod.allreduce() imuse nipa lilo asynchronous callbacks ti awọn MXNet engine, gẹgẹ bi ara ti awọn oniwe-ṣiṣe aworan. Ni ọna yii, awọn igbẹkẹle data laarin ibaraẹnisọrọ ati iṣiro jẹ irọrun mu nipasẹ ẹrọ MXNet lati yago fun awọn adanu iṣẹ ṣiṣe nitori mimuuṣiṣẹpọ. Pipin ohun optimizer telẹ ni Horovod horovod.DistributedOptimizer gbooro sii Optimizer ni MXNet ki o pe awọn API Horovod ti o baamu fun awọn imudojuiwọn paramita ti a pin. Gbogbo awọn alaye imuse wọnyi jẹ ṣiṣafihan si awọn olumulo ipari.

Yara ibere

O le yara bẹrẹ ikẹkọ kekere nẹtiwọọki nkankikan convolutional lori data MNIST nipa lilo MXNet ati Horovod lori MacBook rẹ.
Ni akọkọ, fi sori ẹrọ mxnet ati horovod lati PyPI:

pip install mxnet
pip install horovod

Akiyesi: Ti o ba pade aṣiṣe lakoko pip fi sori ẹrọ horovodboya o nilo lati fi oniyipada kun MACOSX_DEPLOYMENT_TARGET=10.vvnibo vv - Eyi ni ẹya ti ẹya MacOS rẹ, fun apẹẹrẹ, fun MacOSX Sierra iwọ yoo nilo lati kọ MACOSX_DEPLOYMENT_TARGET=10.12 pip fi horovod

Lẹhinna fi OpenMPI sori ẹrọ lati ibi.

Ni ipari, ṣe igbasilẹ iwe afọwọkọ idanwo naa mxnet_mnist.py lati ibi ati ṣiṣe awọn aṣẹ wọnyi ni ebute MacBook ni itọsọna iṣẹ:

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

Eyi yoo ṣiṣẹ ikẹkọ lori awọn ohun kohun meji ti ero isise rẹ. Ijade yoo jẹ atẹle yii:

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

Ririnkiri Performance

Nigbati ikẹkọ awoṣe ResNet50-v1 kan lori data data ImageNet lori 64 GPUs pẹlu awọn iṣẹlẹ mẹjọ p3.16x tobi EC2, ọkọọkan ti o ni 8 NVIDIA Tesla V100 GPUs lori awọsanma AWS, a ṣe aṣeyọri ipasẹ ikẹkọ ti awọn aworan 45000 / iṣẹju-aaya (ie, nọmba awọn ayẹwo ikẹkọ fun iṣẹju keji). Ikẹkọ ti pari ni awọn iṣẹju 44 lẹhin awọn akoko 90 pẹlu iṣedede ti o dara julọ ti 75.7%.

A ṣe afiwe eyi si ọna ikẹkọ pinpin pinpin ti MXNet ti lilo awọn olupin paramita lori 8, 16, 32 ati 64 GPUs pẹlu olupin paramita kan ati olupin si ipin oṣiṣẹ ti 1 si 1 ati 2 si 1, ni atele. O le wo abajade ni Nọmba 1 ni isalẹ. Lori y-axis ni apa osi, awọn ọpa jẹ aṣoju nọmba awọn aworan lati ṣe ikẹkọ fun iṣẹju-aaya, awọn ila ṣe afihan ṣiṣe igbelowọn (iyẹn ni, ipin ti gangan si ipasẹ to dara) lori y-axis ni apa ọtun. Bii o ti le rii, yiyan nọmba awọn olupin yoo ni ipa lori ṣiṣe iwọn. Ti olupin paramita kan ba wa, ṣiṣe igbelowọn silẹ si 38% lori 64 GPUs. Lati ṣaṣeyọri iṣẹ ṣiṣe iwọn kanna bi pẹlu Horovod, o nilo lati ilọpo meji nọmba awọn olupin ti o ni ibatan si nọmba awọn oṣiṣẹ.

Ẹkọ pinpin pẹlu Apache MXNet ati Horovod
Ṣe nọmba 1. Ifiwera ti ẹkọ pinpin nipa lilo MXNet pẹlu Horovod ati pẹlu olupin paramita

Ni Tabili 1 ni isalẹ, a ṣe afiwe idiyele ikẹhin fun apẹẹrẹ nigba ṣiṣe awọn idanwo lori 64 GPUs. Lilo MXNet pẹlu Horovod pese ipalọlọ ti o dara julọ ni idiyele ti o kere julọ.

Ẹkọ pinpin pẹlu Apache MXNet ati Horovod
Tabili 1. Ifiwera iye owo laarin Horovod ati Parameter Server pẹlu olupin si ipin oṣiṣẹ ti 2 si 1.

Awọn igbesẹ lati ẹda

Ni awọn igbesẹ ti o tẹle, a yoo fihan ọ bi o ṣe le ṣe atunṣe abajade ti ikẹkọ pinpin nipa lilo MXNet ati Horovod. Lati kọ ẹkọ diẹ sii nipa ẹkọ pinpin pẹlu MXNet ka yi post.

Igbesẹ 1

Ṣẹda iṣupọ ti awọn iṣẹlẹ isokan pẹlu ẹya MXNet 1.4.0 tabi ga julọ ati ẹya Horovod 0.16.0 tabi ga julọ lati lo ẹkọ ti o pin. Iwọ yoo tun nilo lati fi awọn ile-ikawe sori ẹrọ fun ikẹkọ GPU. Fun awọn apẹẹrẹ wa, a yan Ubuntu 16.04 Linux, pẹlu GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 ikawe, NCCL 2.2.13 asoro ati OpenMPI 3.1.1. Bakannaa o le lo Amazon Jin Learning AMI, nibiti awọn ile-ikawe wọnyi ti ti fi sii tẹlẹ.

Igbesẹ 2

Ṣafikun agbara lati ṣiṣẹ pẹlu Horovod API si iwe afọwọkọ ikẹkọ MXNet rẹ. Iwe afọwọkọ ti o wa ni isalẹ ti o da lori MXNet Gluon API le ṣee lo bi awoṣe ti o rọrun. Awọn ila ni igboya nilo ti o ba ti ni iwe afọwọkọ ikẹkọ ti o baamu. Eyi ni awọn ayipada pataki diẹ ti o nilo lati ṣe lati kọ ẹkọ pẹlu Horovod:

  • Ṣeto ọrọ-ọrọ ni ibamu si ipo Horovod agbegbe (ila 8) lati ni oye pe ikẹkọ ni a ṣe lori mojuto awọn aworan ti o pe.
  • Ṣe awọn paramita akọkọ lati ọdọ oṣiṣẹ kan si gbogbo (ila 18) lati rii daju pe gbogbo awọn oṣiṣẹ bẹrẹ pẹlu awọn aye ibẹrẹ kanna.
  • Ṣẹda Horovod PinpinOptimizer (ila 25) lati ṣe imudojuiwọn awọn paramita ni ọna pinpin.

Lati gba iwe afọwọkọ ni kikun, jọwọ tọka si awọn apẹẹrẹ Horovod-MXNet MNISTI и 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    ...

Igbesẹ 3

Wọle si ọkan ninu awọn oṣiṣẹ lati bẹrẹ ikẹkọ pinpin ni lilo itọsọna MPI. Ni apẹẹrẹ yii, ikẹkọ pinpin n ṣiṣẹ lori awọn iṣẹlẹ mẹrin pẹlu 4 GPU kọọkan, ati lapapọ 16 GPUs ninu iṣupọ. Iṣapeye Sitochastic Gradient Descent (SGD) yoo ṣee lo pẹlu awọn hyperparameter wọnyi:

  • iwọn kekere: 256
  • eko oṣuwọn: 0.1
  • ipa: 0.9
  • ibajẹ iwuwo: 0.0001

Bi a ṣe ṣe iwọn lati GPU kan si 64 GPUs, a ṣe iwọn laini iwọn ikẹkọ ni ibamu si nọmba awọn GPU (lati 0,1 fun 1 GPU si 6,4 fun 64 GPUs), lakoko ti o tọju nọmba awọn aworan fun GPU ni 256 (lati ipele kan ti Awọn aworan 256 fun 1 GPU si 16 fun 384 GPUs). Idibajẹ iwuwo ati awọn aye ipa ti yipada bi nọmba GPU ṣe pọ si. A lo ikẹkọ konge adalu pẹlu iru data float64 fun iwọle siwaju ati float16 fun awọn gradients lati mu iyara awọn iṣiro float32 ni atilẹyin nipasẹ 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

ipari

Ninu nkan yii, a wo ọna iwọn si ikẹkọ awoṣe ti a pin kaakiri nipa lilo Apache MXNet ati Horovod. A ṣe afihan ṣiṣe igbelowọn ati ṣiṣe idiyele ni akawe si ọna olupin paramita lori dataset ImageNet lori eyiti awoṣe ResNet50-v1 ti kọ ẹkọ. A tun ti ṣafikun awọn igbesẹ ti o le lo lati ṣe atunṣe iwe afọwọkọ ti o wa tẹlẹ lati ṣiṣẹ ikẹkọ ọpọlọpọ-apeere nipa lilo Horovod.

Ti o ba kan bẹrẹ pẹlu MXNet ati ẹkọ ti o jinlẹ, lọ si oju-iwe fifi sori ẹrọ MXNelati kọ MXNet akọkọ. A tun ṣeduro pataki kika nkan naa MXNet ni iṣẹju 60lati bẹrẹ.

Ti o ba ti ṣiṣẹ tẹlẹ pẹlu MXNet ati pe o fẹ gbiyanju ikẹkọ pinpin pẹlu Horovod, lẹhinna wo Horovod fifi sori iwe, Kọ lati MXNet ki o si tẹle apẹẹrẹ MNISTI tabi IMAGEnet.

* iye owo ti wa ni iṣiro da lori wakati awọn ošuwọn AWS fun EC2 Awọn iṣẹlẹ

Kọ ẹkọ diẹ sii nipa ẹkọ naa "ML ile-iṣẹ lori Data Nla"

orisun: www.habr.com

Fi ọrọìwòye kun