Dysgu Dosbarthedig gydag Apache MXNet a Horovod

Paratowyd y cyfieithiad o'r erthygl ar y noson cyn dechrau'r cwrs "ML diwydiannol ar Ddata Mawr"

Gall hyfforddiant wedi'i ddosbarthu ar nifer o achosion cyfrifiadura perfformiad uchel leihau amser hyfforddi rhwydweithiau niwral dwfn modern ar symiau mawr o ddata o wythnosau i oriau neu hyd yn oed funudau, gan wneud y dechneg hyfforddi hon yn gyffredin mewn cymwysiadau ymarferol o ddysgu dwfn. Rhaid i ddefnyddwyr ddeall sut i rannu a chydamseru data ar draws sawl achos, sydd yn ei dro yn cael effaith fawr ar effeithlonrwydd graddio. Yn ogystal, dylai defnyddwyr hefyd wybod sut i ddefnyddio sgript hyfforddi sy'n rhedeg ar un enghraifft i achosion lluosog.

Yn yr erthygl hon byddwn yn siarad am ffordd gyflym a hawdd o ddosbarthu dysgu gan ddefnyddio'r llyfrgell dysgu dwfn agored Apache MXNet a fframwaith dysgu dosbarthedig Horovod. Byddwn yn dangos yn glir fanteision perfformiad fframwaith Horovod ac yn dangos sut i ysgrifennu sgript hyfforddi MXNet fel ei bod yn gweithio mewn modd gwasgaredig gyda Horovod.

Beth yw Apache MXNet

Apache MX Net yn fframwaith dysgu dwfn ffynhonnell agored a ddefnyddir i greu, hyfforddi a defnyddio rhwydweithiau niwral dwfn. Mae MXNet yn crynhoi'r cymhlethdodau sy'n gysylltiedig Γ’ gweithredu rhwydweithiau niwral, mae'n berfformiadol iawn ac yn raddadwy, ac yn cynnig APIs ar gyfer ieithoedd rhaglennu poblogaidd fel Python, C + +, Clojure, Java, Julia, R, Scala ac eraill.

Dosbarthu hyfforddiant yn MXNet gyda gweinydd paramedr

Modiwl dysgu dosbarthedig safonol yn MXNet yn defnyddio dull gweinydd paramedr. Mae'n defnyddio set o weinyddion paramedr i gasglu graddiannau gan bob gweithiwr, perfformio agregu, ac anfon graddiannau wedi'u diweddaru yn Γ΄l at weithwyr ar gyfer yr iteriad optimeiddio nesaf. Penderfynu ar y gymhareb gywir o weinyddion i weithwyr yw'r allwedd i raddio effeithiol. Os mai dim ond un gweinydd paramedr sydd, gall fod yn dagfa yn y cyfrifiadau. I'r gwrthwyneb, os defnyddir gormod o weinyddion, gall llawer i lawer o gyfathrebu rwystro pob cysylltiad rhwydwaith.

Beth yw Horovod

Horovod yn fframwaith dysgu dwfn gwasgaredig agored a ddatblygwyd yn Uber. Mae'n trosoledd technolegau traws-GPU a thraws-nodyn effeithlon fel Llyfrgell Cyfathrebu Cyfunol NVIDIA (NCCL) a Rhyngwyneb Pasio Negeseuon (MPI) i ddosbarthu a chyfuno paramedrau model ar draws vorecs. Mae'n gwneud y defnydd gorau o led band rhwydwaith a graddfeydd yn dda wrth weithio gyda modelau rhwydwaith niwral dwfn. Ar hyn o bryd mae'n cefnogi sawl fframwaith dysgu peiriannau poblogaidd, sef MX Rhwyd, Tensorflow, Keras, a PyTorch.

Integreiddio MXNet a Horovod

Mae MXNet yn integreiddio Γ’ Horovod trwy'r APIs Dysgu Dosbarthedig a ddiffinnir yn Horovod. APIs cyfathrebu Horovod horovod.broadcast(), horovod.allgather() ΠΈ horovod.allreduce() wedi'i weithredu gan ddefnyddio galwadau anghydamserol o'r injan MXNet, fel rhan o'i graff tasg. Yn y modd hwn, mae'n hawdd trin dibyniaethau data rhwng cyfathrebu a chyfrifiant gan yr injan MXNet er mwyn osgoi colledion perfformiad oherwydd cydamseru. Gwrthrych optimizer wedi'i ddosbarthu wedi'i ddiffinio yn Horovod horovod.DistributedOptimizer yn ehangu Optimizer yn MXNet fel ei fod yn galw'r APIs Horovod cyfatebol ar gyfer diweddariadau paramedr dosbarthedig. Mae'r holl fanylion gweithredu hyn yn dryloyw i ddefnyddwyr terfynol.

Cychwyn cyflym

Gallwch chi ddechrau hyfforddi rhwydwaith niwral convolutional bach yn gyflym ar set ddata MNIST gan ddefnyddio MXNet a Horovod ar eich MacBook.
Yn gyntaf, gosodwch mxnet a horovod o PyPI:

pip install mxnet
pip install horovod

Nodyn: Os byddwch yn dod ar draws gwall yn ystod pip gosod horovodefallai bod angen i chi ychwanegu newidyn MACOSX_DEPLOYMENT_TARGET=10.vvlle vv – dyma'r fersiwn o'ch fersiwn MacOS, er enghraifft, ar gyfer MacOSX Sierra bydd angen i chi ysgrifennu MACOSX_DEPLOYMENT_TARGET=10.12 pip gosod horovod

Yna gosod OpenMPI felly.

Ar y diwedd, lawrlwythwch y sgript prawf mxnet_mnist.py felly a rhedeg y gorchmynion canlynol yn nherfynell MacBook yn y cyfeiriadur gweithio:

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

Bydd hyn yn rhedeg hyfforddiant ar ddau graidd o'ch prosesydd. Bydd yr allbwn fel a ganlyn:

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 Perfformiad

Wrth hyfforddi model ResNet50-v1 ar set ddata ImageNet ar 64 GPU gydag wyth achos p3.16xlarge EC2, pob un yn cynnwys 8 GPU NVIDIA Tesla V100 ar gwmwl AWS, fe wnaethom gyflawni trwygyrch hyfforddi o 45000 o ddelweddau yr eiliad (hy, nifer y samplau hyfforddedig yr eiliad). Cwblhawyd yr hyfforddiant mewn 44 munud ar Γ΄l 90 cyfnod gyda chywirdeb gorau o 75.7%.

Cymharwyd hyn Γ’ dull hyfforddi gwasgaredig MXNet o ddefnyddio gweinyddion paramedr ar 8, 16, 32 a 64 GPU gydag un gweinydd paramedr a chymhareb gweinydd i weithiwr o 1 i 1 a 2 i 1, yn y drefn honno. Gallwch weld y canlyniad yn Ffigur 1 isod. Ar yr echelin-y ar y chwith, mae'r bariau'n cynrychioli nifer y delweddau i'w hyfforddi fesul eiliad, mae'r llinellau'n adlewyrchu'r effeithlonrwydd graddio (hynny yw, cymhareb y trwybwn gwirioneddol i ddelfrydol) ar yr echelin-y ar y dde. Fel y gallwch weld, mae'r dewis o nifer y gweinyddwyr yn effeithio ar effeithlonrwydd graddio. Os mai dim ond un gweinydd paramedr sydd, mae'r effeithlonrwydd graddio yn gostwng i 38% ar 64 GPU. Er mwyn cyflawni'r un effeithlonrwydd graddio Γ’ Horovod, mae angen i chi ddyblu nifer y gweinyddwyr o'i gymharu Γ’ nifer y gweithwyr.

Dysgu Dosbarthedig gydag Apache MXNet a Horovod
Ffigur 1. Cymharu dysgu gwasgaredig gan ddefnyddio MXNet Γ’ Horovod a gyda gweinydd paramedr

Yn Nhabl 1 isod, rydym yn cymharu'r gost derfynol fesul achos wrth redeg arbrofion ar 64 GPU. Mae defnyddio MXNet gyda Horovod yn darparu'r trwybwn gorau am y gost isaf.

Dysgu Dosbarthedig gydag Apache MXNet a Horovod
Tabl 1. Cymhariaeth cost rhwng Horovod a Parameter Server gyda chymhareb gweinydd i weithiwr o 2 i 1.

Camau i atgynhyrchu

Yn y camau nesaf, byddwn yn dangos i chi sut i atgynhyrchu canlyniad hyfforddiant dosbarthedig gan ddefnyddio MXNet a Horovod. I ddysgu mwy am ddysgu gwasgaredig gyda MXNet darllenwch y swydd hon.

Cam 1

Creu clwstwr o achosion homogenaidd gyda fersiwn MXNet 1.4.0 neu uwch a fersiwn Horovod 0.16.0 neu uwch i ddefnyddio dysgu dosranedig. Bydd angen i chi hefyd osod llyfrgelloedd ar gyfer hyfforddiant GPU. Ar gyfer ein hachosion, fe wnaethom ddewis Ubuntu 16.04 Linux, gyda GPU Driver 396.44, CUDA 9.2, llyfrgell cuDNN 7.2.1, cyfathrebwr NCCL 2.2.13 ac OpenMPI 3.1.1. Hefyd gallwch chi ddefnyddio Amazon Deep Learning AMI, lle mae'r llyfrgelloedd hyn eisoes wedi'u gosod ymlaen llaw.

Cam 2

Ychwanegwch y gallu i weithio gydag API Horovod i'ch sgript hyfforddi MXNet. Gellir defnyddio'r sgript isod sy'n seiliedig ar API Gluon MXNet fel templed syml. Mae angen y llinellau mewn print trwm os oes gennych chi sgript hyfforddi gyfatebol yn barod. Dyma rai newidiadau hanfodol y mae angen i chi eu gwneud i ddysgu gyda Horovod:

  • Gosodwch y cyd-destun yn Γ΄l rheng leol Horovod (llinell 8) i ddeall bod hyfforddiant yn cael ei berfformio ar y craidd graffeg cywir.
  • Pasio paramedrau cychwynnol o un gweithiwr i bawb (llinell 18) i sicrhau bod pob gweithiwr yn dechrau gyda'r un paramedrau cychwynnol.
  • Creu Horovod Optimizer Dosbarthedig (llinell 25) i ddiweddaru'r paramedrau mewn modd gwasgaredig.

I gael y sgript lawn, cyfeiriwch at yr enghreifftiau Horovod-MXNet MNIST ΠΈ DelweddNet.

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    ...

Cam 3

Mewngofnodwch i un o'r gweithwyr i ddechrau hyfforddiant dosbarthedig gan ddefnyddio'r gyfarwyddeb MPI. Yn yr enghraifft hon, mae hyfforddiant dosbarthedig yn rhedeg ar bedwar achos gyda 4 GPU yr un, a chyfanswm o 16 GPU yn y clwstwr. Bydd y optimizer Disgyniad Graddiant Stochastic (SGD) yn cael ei ddefnyddio gyda'r hyperparamedrau canlynol:

  • maint swp bach: 256
  • cyfradd dysgu: 0.1
  • momentwm: 0.9
  • pydredd pwysau: 0.0001

Wrth i ni raddio o un GPU i 64 GPUs, gwnaethom raddio'r gyfradd hyfforddi yn llinol yn Γ΄l nifer y GPUs (o 0,1 ar gyfer 1 GPUs i 6,4 ar gyfer 64 GPUs), tra'n cadw nifer y delweddau fesul GPU yn 256 (o swp o 256 delwedd ar gyfer 1 GPU i 16 ar gyfer 384 GPU). Newidiodd y paramedrau pydredd pwysau a momentwm wrth i nifer y GPUs gynyddu. Fe wnaethom ddefnyddio hyfforddiant manwl-gywir cymysg gyda'r math data float64 ar gyfer y tocyn blaen a fflΓ΄t16 ar gyfer graddiannau i gyflymu'r cyfrifiadau arnofio32 a gefnogir gan GPUs NVIDIA Tesla.

$ 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

Casgliad

Yn yr erthygl hon, buom yn edrych ar ddull graddadwy o hyfforddiant model gwasgaredig gan ddefnyddio Apache MXNet a Horovod. Fe wnaethom ddangos yr effeithlonrwydd graddio a chost-effeithiolrwydd o'i gymharu Γ’'r dull gweinydd paramedr ar set ddata ImageNet y hyfforddwyd model ResNet50-v1 arni. Rydym hefyd wedi cynnwys camau y gallwch eu defnyddio i addasu sgript bresennol i redeg hyfforddiant aml-achlysur gan ddefnyddio Horovod.

Os ydych chi newydd ddechrau gyda MXNet a dysgu dwfn, ewch i'r dudalen gosod MXNei adeiladu MXNet yn gyntaf. Rydym hefyd yn argymell yn gryf darllen yr erthygl MXNet mewn 60 munudi ddechrau.

Os ydych chi eisoes wedi gweithio gyda MXNet ac eisiau rhoi cynnig ar ddysgu dosranedig gyda Horovod, edrychwch arno Tudalen gosod Horovod, ei adeiladu o MXNet a dilyn yr enghraifft MNIST neu DelweddNet.

*cyfrifir y gost ar sail cyfraddau fesul awr AWS ar gyfer Enghreifftiau EC2

Dysgwch fwy am y cwrs "ML diwydiannol ar Ddata Mawr"

Ffynhonnell: hab.com

Ychwanegu sylw