Kujifunza Kusambazwa na Apache MXNet na Horovod

Tafsiri ya kifungu hicho ilitayarishwa usiku wa kuamkia kozi hiyo "Ml ya Viwanda kwenye Takwimu Kubwa"

Mafunzo yaliyosambazwa juu ya matukio mengi ya utendaji wa juu ya kompyuta yanaweza kupunguza muda wa mafunzo ya mitandao ya kisasa ya neva kwa kiasi kikubwa cha data kutoka kwa wiki hadi saa au hata dakika, na kufanya mbinu hii ya mafunzo kuenea katika matumizi ya vitendo ya kujifunza kwa kina. Watumiaji lazima waelewe jinsi ya kushiriki na kusawazisha data katika matukio mengi, ambayo nayo yana athari kubwa katika kuongeza ufanisi. Kwa kuongeza, watumiaji wanapaswa pia kujua jinsi ya kupeleka hati ya mafunzo ambayo inaendeshwa kwa tukio moja kwa matukio mengi.

Katika makala haya tutazungumza kuhusu njia ya haraka na rahisi ya kusambaza mafunzo kwa kutumia maktaba ya wazi ya kujifunza kwa kina Apache MXNet na mfumo wa kujifunza uliosambazwa wa Horovod. Tutaonyesha kwa uwazi manufaa ya utendaji wa mfumo wa Horovod na kuonyesha jinsi ya kuandika hati ya mafunzo ya MXNet ili ifanye kazi kwa njia iliyosambazwa na Horovod.

Apache MXNet ni nini

Apache MX Net ni mfumo wa ujifunzaji wa kina wa chanzo huria ambao hutumiwa kuunda, kutoa mafunzo na kupeleka mitandao ya kina ya neva. MXNet huondoa ugumu unaohusishwa na utekelezaji wa mitandao ya neural, inafanya kazi sana na inaweza kupanuka, na inatoa API za lugha maarufu za programu kama vile. Chatu, C + +, Kivunja, Java, Julia, R, Scala na wengine.

Mafunzo yaliyosambazwa katika MXNet na seva ya parameta

Moduli ya kawaida ya kujifunza iliyosambazwa katika MXNet hutumia mbinu ya seva ya parameta. Inatumia seti ya seva za vigezo kukusanya mikunjo kutoka kwa kila mfanyakazi, kufanya ujumlisho, na kutuma gradient zilizosasishwa kwa wafanyakazi kwa marudio yanayofuata ya uboreshaji. Kuamua uwiano sahihi wa seva kwa wafanyakazi ni ufunguo wa kuongeza ufanisi. Ikiwa kuna seva moja tu ya kigezo, inaweza kugeuka kuwa kizuizi katika mahesabu. Kinyume chake, ikiwa seva nyingi zinatumiwa, mawasiliano mengi hadi mengi yanaweza kuziba miunganisho yote ya mtandao.

Horovod ni nini

Horovod ni mfumo wazi wa kujifunza kwa kina uliosambazwa katika Uber. Hutumia teknolojia bora ya maingiliano ya GPU na ya njia tofauti kama vile Maktaba ya Mawasiliano ya Pamoja ya NVIDIA (NCCL) na Kiolesura cha Kupitisha Ujumbe (MPI) ili kusambaza na kujumlisha vigezo vya muundo kwenye vorecs. Inaboresha matumizi ya kipimo data cha mtandao na mizani vizuri wakati wa kufanya kazi na miundo ya kina ya mtandao wa neural. Kwa sasa inasaidia mifumo kadhaa maarufu ya kujifunza mashine, ambayo ni Mtandao wa MX, Tensorflow, Keras, na PyTorch.

Ushirikiano wa MXNet na Horovod

MXNet inaungana na Horovod kupitia Distributed Learning APIs zilizofafanuliwa katika Horovod. API za mawasiliano ya Horovod horovod.tangaza(), horovod.allgather() и horovod.allreduce() kutekelezwa kwa kutumia simu zisizo sawa za injini ya MXNet, kama sehemu ya grafu yake ya kazi. Kwa njia hii, utegemezi wa data kati ya mawasiliano na hesabu hushughulikiwa kwa urahisi na injini ya MXNet ili kuepuka hasara za utendakazi kutokana na ulandanishi. Kitu cha kiboreshaji kilichosambazwa kimefafanuliwa katika Horovod horovod.DistributedOptimizer hupanuka Optimizer katika MXNet ili iite API za Horovod zinazolingana kwa sasisho za parameta zilizosambazwa. Maelezo haya yote ya utekelezaji yako wazi kwa watumiaji wa mwisho.

Kuanza kwa haraka

Unaweza haraka kuanza kutoa mafunzo kwa mtandao mdogo wa neva wa kushawishi kwenye mkusanyiko wa data wa MNIST ukitumia MXNet na Horovod kwenye MacBook yako.
Kwanza, sasisha mxnet na horovod kutoka PyPI:

pip install mxnet
pip install horovod

Kumbuka: Ikiwa utapata hitilafu wakati wa bomba kufunga horovodlabda unahitaji kuongeza variable MACOSX_DEPLOYMENT_TARGET=10.vvAmbapo vv - hii ni toleo la toleo lako la MacOS, kwa mfano, kwa MacOSX Sierra utahitaji kuandika MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Kisha usakinishe OpenMPI hivyo.

Mwishoni, pakua hati ya jaribio mxnet_mnist.py hivyo na endesha amri zifuatazo kwenye terminal ya MacBook kwenye saraka ya kufanya kazi:

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

Hii itaendesha mafunzo kwenye cores mbili za kichakataji chako. Matokeo yatakuwa yafuatayo:

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

Onyesho la Utendaji

Wakati wa kufunza mfano wa ResNet50-v1 kwenye hifadhidata ya ImageNet kwenye GPU 64 na matukio nane. p3.16 kwa ukubwa EC2, kila moja ikiwa na GPU 8 za NVIDIA Tesla V100 kwenye wingu la AWS, tulipata mafunzo ya picha 45000/sekunde (yaani, idadi ya sampuli zilizofunzwa kwa sekunde). Mafunzo yalikamilika ndani ya dakika 44 baada ya vipindi 90 kwa usahihi bora wa 75.7%.

Tulilinganisha hii na mbinu ya mafunzo iliyosambazwa ya MXNet ya kutumia seva za vigezo kwenye GPU 8, 16, 32 na 64 zenye seva ya kigezo kimoja na uwiano wa seva kwa mfanyakazi wa 1 hadi 1 na 2 hadi 1 mtawalia. Unaweza kuona matokeo kwenye Kielelezo 1 hapa chini. Kwenye mhimili wa y upande wa kushoto, pau zinawakilisha idadi ya picha za kutoa mafunzo kwa sekunde, mistari huonyesha ufanisi wa kuongeza alama (yaani, uwiano wa matokeo halisi na bora) kwenye mhimili wa y ulio upande wa kulia. Kama unaweza kuona, uchaguzi wa idadi ya seva huathiri ufanisi wa kuongeza. Ikiwa kuna seva moja ya kigezo, ufanisi wa kuongeza utashuka hadi 38% kwenye GPU 64. Ili kufikia ufanisi sawa wa kuongeza kiwango na Horovod, unahitaji kuongeza mara mbili idadi ya seva zinazohusiana na idadi ya wafanyikazi.

Kujifunza Kusambazwa na Apache MXNet na Horovod
Kielelezo 1. Ulinganisho wa kujifunza kusambazwa kwa kutumia MXNet na Horovod na seva ya parameter

Katika Jedwali la 1 hapa chini, tunalinganisha gharama ya mwisho kwa kila tukio wakati wa kufanya majaribio kwenye GPU 64. Kutumia MXNet pamoja na Horovod hutoa matokeo bora kwa gharama ya chini zaidi.

Kujifunza Kusambazwa na Apache MXNet na Horovod
Jedwali 1. Ulinganisho wa gharama kati ya Horovod na Seva ya Kigezo na uwiano wa seva kwa mfanyakazi wa 2 hadi 1.

Hatua za kuzaliana

Katika hatua zinazofuata, tutakuonyesha jinsi ya kuzalisha tena matokeo ya mafunzo yaliyosambazwa kwa kutumia MXNet na Horovod. Ili kujifunza zaidi kuhusu mafunzo yaliyosambazwa na MXNet soma chapisho hili.

Hatua ya 1

Unda kundi la matukio yanayofanana ukitumia toleo la MXNet 1.4.0 au toleo la juu zaidi na toleo la Horovod 0.16.0 au toleo jipya zaidi ili kutumia mafunzo yaliyosambazwa. Utahitaji pia kusakinisha maktaba kwa mafunzo ya GPU. Kwa matukio yetu, tulichagua Ubuntu 16.04 Linux, yenye GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 maktaba, NCCL 2.2.13 communicator na OpenMPI 3.1.1. Pia unaweza kutumia Amazon Deep Learning AMI, ambapo maktaba hizi tayari zimesakinishwa awali.

Hatua ya 2

Ongeza uwezo wa kufanya kazi na API ya Horovod kwenye hati yako ya mafunzo ya MXNet. Hati iliyo hapa chini kulingana na API ya MXNet Gluon inaweza kutumika kama kiolezo rahisi. Mistari yenye herufi nzito inahitajika ikiwa tayari unayo hati ya mafunzo inayolingana. Hapa kuna mabadiliko machache muhimu unayohitaji kufanya ili kujifunza na Horovod:

  • Weka muktadha kulingana na kiwango cha Horovod cha ndani (mstari wa 8) ili kuelewa kuwa mafunzo hufanywa kwa msingi sahihi wa picha.
  • Pitisha vigezo vya awali kutoka kwa mfanyakazi mmoja hadi kwa wote (mstari wa 18) ili kuhakikisha kwamba wafanyakazi wote wanaanza na vigezo sawa vya awali.
  • Unda Horovod DistributedOptimizer (mstari wa 25) kusasisha vigezo kwa njia iliyosambazwa.

Ili kupata hati kamili, tafadhali rejelea mifano ya 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    ...

Hatua ya 3

Ingia kwa mmoja wa wafanyikazi ili kuanza kusambaza mafunzo kwa kutumia agizo la MPI. Katika mfano huu, mafunzo yaliyosambazwa yanaendeshwa kwa matukio manne yenye GPU 4 kila moja, na jumla ya GPU 16 kwenye kundi. Kiboreshaji cha Kushuka kwa Gradient ya Stochastic (SGD) kitatumika pamoja na vigezo vifuatavyo:

  • saizi ndogo ya bechi: 256
  • kiwango cha kujifunza: 0.1
  • kasi: 0.9
  • kuoza kwa uzito: 0.0001

Tulipopanda kutoka GPU moja hadi GPU 64, tuliongeza kiwango cha mafunzo kulingana na idadi ya GPU (kutoka 0,1 kwa GPU 1 hadi 6,4 kwa GPU 64), huku tukiweka idadi ya picha kwa kila GPU kuwa 256 ( kutoka kundi la Picha 256 kwa GPU 1 hadi 16 kwa GPU 384). Vigezo vya kuoza kwa uzito na kasi vilibadilika kadiri idadi ya GPU inavyoongezeka. Tulitumia mafunzo ya usahihi mseto na aina ya data ya float64 kwa pass ya mbele na float16 kwa gradient ili kuharakisha hesabu za float32 zinazotumika na 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

Hitimisho

Katika makala haya, tuliangalia mbinu mbaya ya mafunzo ya mfano yaliyosambazwa kwa kutumia Apache MXNet na Horovod. Tulionyesha ufanisi wa kuongeza kiwango na ufaafu wa gharama ikilinganishwa na mbinu ya seva ya kigezo kwenye mkusanyiko wa data wa ImageNet ambapo muundo wa ResNet50-v1 ulifunzwa. Pia tumejumuisha hatua unazoweza kutumia kurekebisha hati iliyopo ili kuendesha mafunzo ya hali nyingi kwa kutumia Horovod.

Ikiwa ndio kwanza unaanza na MXNet na kujifunza kwa kina, nenda kwenye ukurasa wa usakinishaji MXNekwanza kujenga MXNet. Pia tunapendekeza sana kusoma makala MXNet ndani ya dakika 60ili kuanza.

Ikiwa tayari umefanya kazi na MXNet na unataka kujaribu kujifunza kusambazwa na Horovod, basi angalia Ukurasa wa ufungaji wa Horovod, ijenge kutoka MXNet na ufuate mfano MNIST au ImageNet.

*gharama huhesabiwa kulingana na viwango vya saa AWS kwa Matukio ya EC2

Jifunze zaidi kuhusu kozi "Ml ya Viwanda kwenye Takwimu Kubwa"

Chanzo: mapenzi.com

Kuongeza maoni