Հոդվածի թարգմանությունը պատրաստվել է դասընթացի մեկնարկի նախօրեին
Բազմաթիվ բարձր արդյունավետությամբ հաշվողական ինստանսների միջև բաշխված ուսուցումը կարող է կրճատել ժամանակակից խորը նեյրոնային ցանցերի մեծ քանակությամբ տվյալների վրա ուսուցման ժամանակը շաբաթներից մինչև ժամեր կամ նույնիսկ րոպեներ, ինչը այս ուսուցման տեխնիկան դարձնում է տարածված գործնական խորը ուսուցման կիրառություններում: Օգտատերերը պետք է հասկանան, թե ինչպես կիսվել և համաժամեցնել տվյալները բազմաթիվ ինստանսների միջև, ինչը, իր հերթին, մեծ ազդեցություն ունի մասշտաբավորման արդյունավետության վրա: Բացի այդ, օգտատերերը պետք է նաև իմանան, թե ինչպես տեղակայել մեկ ինստանսի վրա աշխատող ուսուցման սկրիպտը բազմաթիվ ինստանսների վրա:
Այս հոդվածում մենք կխոսենք Apache MXNet բաց կոդով խորը ուսուցման գրադարանի և Horovod բաշխված ուսուցման շրջանակի միջոցով բաշխված ուսուցում անցկացնելու արագ և հեշտ եղանակի մասին: Մենք հստակ կցույց տանք Horovod շրջանակի առավելությունները կատարողականի առումով և կցուցադրենք, թե ինչպես գրել MXNet ուսուցման սկրիպտ, որպեսզի այն բաշխված աշխատի Horovod-ի հետ:
Ի՞նչ է Apache MXNet-ը
– բաց կոդով խորը ուսուցման շրջանակ, որն օգտագործվում է խորը նեյրոնային ցանցեր կառուցելու, մարզելու և տեղակայելու համար: MXNet-ը վերացնում է նեյրոնային ցանցերի ներդրման հետ կապված բարդությունները, բարձր արդյունավետությամբ և մասշտաբայնությամբ է, և առաջարկում է API-ներ այնպիսի հայտնի ծրագրավորման լեզուների համար, ինչպիսիք են՝ , , , , , , եւ այլն:
Բաշխված ուսուցում MXNet-ում՝ պարամետրային սերվերի միջոցով
օգտագործում է պարամետրերի սերվերի մոտեցում: Այն օգտագործում է պարամետրերի սերվերների հավաքածու՝ յուրաքանչյուր աշխատողից գրադիենտներ հավաքելու, ագրեգացիա կատարելու և թարմացված գրադիենտները աշխատողներին ուղարկելու համար՝ հաջորդ օպտիմալացման իտերացիայի համար: Սերվերների և աշխատողների ճիշտ հարաբերակցության որոշումը արդյունավետ մասշտաբավորման բանալին է: Եթե կա միայն մեկ պարամետրերի սերվեր, այն կարող է դառնալ հաշվողական խոչընդոտ: Եվ հակառակը, եթե չափազանց շատ սերվերներ կան, շատ-շատ հարաբերությունները կարող են խցանել բոլոր ցանցային կապերը:
Ի՞նչ է Հորովոդը
– Uber-ում մշակված բաց կոդով բաշխված խորը ուսուցման շրջանակ։ Այն օգտագործում է արդյունավետ բազմա-GPU և բազմա-հանգույցային հաղորդակցման տեխնոլոգիաներ, ինչպիսիք են NVIDIA Collective Communications Library (NCCL) և Message Passing Interface (MPI)՝ մոդելի պարամետրերը մրրիկների միջև բաշխելու և ամփոփելու համար։ Այն օպտիմալացնում է ցանցի թողունակության օգտագործումը և լավ մասշտաբավորվում է խորը նեյրոնային ցանցի մոդելներ գործարկելիս։ Այն ներկայումս աջակցում է մի քանի հայտնի մեքենայական ուսուցման շրջանակներ, մասնավորապես՝ , Tensorflow, Keras և PyTorch:
MXNet-ի և Horovod-ի ինտեգրացիա
MXNet-ը ինտեգրվում է Horovod-ի հետ Horovod-ում սահմանված բաշխված ուսուցման API-ների միջոցով։ Horovod-ում հաղորդակցման API-ները horovod.broadcast(), horovod.allgather() и horovod.allreduce() իրականացվում են MXNet շարժիչի ասինխրոն հետկանչերի միջոցով՝ որպես իր առաջադրանքների գրաֆիկի մաս: Այս կերպ, հաղորդակցության և հաշվարկների միջև տվյալների կախվածությունները հեշտությամբ կարգավորվում են MXNet շարժիչի կողմից՝ համաժամեցման պատճառով կատարողականի կորուստներից խուսափելու համար: Horovod-ում սահմանված բաշխված օպտիմիզատորի օբյեկտը horovod.DistributedOptimizer ընդլայնվում է Օպտիմիզատոր MXNet-ում, որպեսզի այն կանչի համապատասխան Horovod API-ները բաշխված պարամետրերի թարմացումների համար: Այս բոլոր իրականացման մանրամասները թափանցիկ են վերջնական օգտագործողների համար:
Արագ մեկնարկ
Դուք կարող եք արագ սկսել փոքր կոնվոլյուցիոն նեյրոնային ցանցի մարզումը MNIST տվյալների բազայի վրա՝ օգտագործելով MXNet-ը և Horovod-ը ձեր MacBook-ի վրա։
Սկսելու համար տեղադրեք mxnet-ը և horovod-ը PyPI-ից։
pip install mxnet
pip install horovodՆշում. Եթե ընթացքում սխալ եք հանդիպում pip տեղադրում horovod, կարող է անհրաժեշտ լինել ավելացնել փոփոխական MACOSX_DEPLOYMENT_TARGET=10.vvՈրտեղ vv – սա ձեր MacOS տարբերակի տարբերակն է, օրինակ՝ MacOSX Sierra-ի համար դուք պետք է գրեք MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod
Այնուհետև տեղադրեք OpenMPI-ն .
Վերջում վերբեռնեք թեստային սկրիպտը mxnet_mnist.py և գործարկեք հետևյալ հրամանները MacBook տերմինալում՝ աշխատանքային գրացուցակում.
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyՍա կգործարկի մարզումը ձեր պրոցեսորի երկու միջուկների վրա։ Արդյունքը կլինի՝
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Կատարողականի ցուցադրություն
ResNet50-v1 մոդելը ImageNet տվյալների բազայի վրա մարզելիս՝ 64 գրաֆիկական պրոցեսորների վրա, որոնք ունեն ութ օրինակ։ p3.16xlarge EC2-ի միջոցով, որոնցից յուրաքանչյուրը պարունակում էր 8 NVIDIA Tesla V100 գրաֆիկական պրոցեսորներ AWS ամպային համակարգում, մենք հասանք 45000 պատկեր/վայրկյան (այսինքն՝ վայրկյանում մարզված նմուշների քանակը) մարզման թողունակության: Մարզումն ավարտվեց 44 դարաշրջանից հետո 90 րոպեում՝ 75.7% լավագույն ճշգրտությամբ:
Մենք սա համեմատեցինք MXNet-ի բաշխված մարզման հետ՝ օգտագործելով պարամետրային սերվերներ 8, 16, 32 և 64 գրաֆիկական պրոցեսորների վրա՝ մեկ պարամետրային սերվերով և համապատասխանաբար 1:1 և 2:1 սերվեր-աշխատող հարաբերակցությամբ: Արդյունքը կարող եք տեսնել ստորև բերված նկար 1-ում: Ձախ կողմում գտնվող y առանցքը ցույց է տալիս վայրկյանում մարզվող պատկերների քանակը, իսկ գծերը՝ աջ կողմում գտնվող y առանցքի մասշտաբավորման արդյունավետությունը (այսինքն՝ իրական և իդեալական թողունակության հարաբերակցությունը): Ինչպես տեսնում եք, սերվերների քանակի ընտրությունը ազդեցություն ունի մասշտաբավորման արդյունավետության վրա: Մեկ պարամետրային սերվերի դեպքում մասշտաբավորման արդյունավետությունը 38 գրաֆիկական պրոցեսորների վրա նվազում է մինչև 64%: Horovod-ի նման մասշտաբավորման արդյունավետությանը հասնելու համար անհրաժեշտ է սերվերների քանակը կրկնապատկել աշխատողների քանակը:

Նկար 1. MXNet-ի միջոցով բաշխված ուսուցման համեմատություն Horovod-ի և պարամետրերի սերվերի հետ
Ստորև բերված աղյուսակ 1-ում մենք համեմատում ենք յուրաքանչյուր օրինակի վերջնական արժեքը՝ 64 GPU-ների վրա փորձարկումները իրականացնելիս: MXNet-ի և Horovod-ի օգտագործումը ապահովում է լավագույն թողունակությունը ամենացածր գնով:

Աղյուսակ 1. Horovod-ի և պարամետրային սերվերի արժեքի համեմատություն՝ 2:1 սերվեր-աշխատող հարաբերակցությամբ։
Վերարտադրման քայլեր
Հաջորդ քայլերում մենք կցույց տանք, թե ինչպես վերարտադրել բաշխված մարզման արդյունքը՝ օգտագործելով MXNet-ը և Horovod-ը: MXNet-ի միջոցով բաշխված մարզման մասին ավելին իմանալու համար կարդացեք .
Քայլ 1
Создайте кластер однородных экземпляров с MXNet версии 1.4.0 или выше и Horovod версии 0.16.0 или выше, чтобы использовать распределенное обучение. Вам также нужно будет установить библиотеки для обучения на GPU. Для наших экземпляров мы выбрали Ubuntu 16.04 Linux, с GPU Driver 396.44, CUDA 9.2, библиотеку cuDNN 7.2.1, коммуникатор NCCL 2.2.13 и OpenMPI 3.1.1. Также вы можете использовать , որտեղ այս գրադարաններն արդեն նախապես տեղադրված են։
Քայլ 2
Բարելավեք ձեր MXNet մարզման սկրիպտը՝ Horovod API-ի հետ աշխատելու համար: Հետևյալ սկրիպտը, որը հիմնված է MXNet Gluon API-ի վրա, կարող է օգտագործվել որպես պարզ ձևանմուշ: Թավատառ տողերը անհրաժեշտ են, եթե դուք արդեն ունեք մարզման սկրիպտ դա անելու համար: Ահա մի քանի կարևոր փոփոխություններ, որոնք դուք պետք է կատարեք Horovod-ով մարզվելու համար.
- Սահմանեք համատեքստը այնպես, որ այն համապատասխանի Horovod-ի տեղային դասակարգմանը (8-րդ տող)՝ ապահովելու համար, որ մարզումը կատարվի ճիշտ GPU միջուկի վրա։
- Սկզբնական պարամետրերը մեկ աշխատողից փոխանցեք բոլորին (18-րդ տող)՝ ապահովելու համար, որ բոլոր աշխատողները սկսեն նույն սկզբնական պարամետրերով։
- Ստեղծել Հորովոդ Բաշխված օպտիմիզատոր (տող 25)՝ պարամետրերը բաշխված եղանակով թարմացնելու համար։
Լրիվ սկրիպտի համար, խնդրում ենք դիմել Horovod-MXNet օրինակներին и .
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 ...Քայլ 3
Մուտք գործեք աշխատողներից մեկում՝ MPI հրահանգի միջոցով բաշխված ուսուցում իրականացնելու համար: Այս օրինակում բաշխված ուսուցումն իրականացվում է չորս օրինակով՝ յուրաքանչյուրում 4 գրաֆիկական պրոցեսորով, կլաստերում ընդհանուր առմամբ 16 գրաֆիկական պրոցեսոր կա: Օգտագործվող օպտիմիզատորը ստոխաստիկ գրադիենտային անկումն է (SGD)՝ հետևյալ հիպերպարամետրերով.
- մինի-խմբաքանակի չափը՝ 256
- ուսուցման տեմպը՝ 0.1
- իմպուլս՝ 0.9
- քաշի անկում՝ 0.0001
Երբ մենք մեկ GPU-ից անցում կատարեցինք 64 GPU-ի, մենք մարզման արագությունը գծային կերպով մեծացրինք GPU-ների քանակին համապատասխան (0,1-ից 1 GPU-ի համար մինչև 6,4 64 GPU-ի համար), միաժամանակ պահպանելով յուրաքանչյուր GPU-ի համար պատկերների քանակը 256-ի վրա (256 GPU-ի համար 1 պատկերի խմբաքանակից մինչև 16 384 GPU-ի համար): Քաշի նվազման և իմպուլսի պարամետրերը փոփոխվեցին GPU-ների քանակի աճին զուգընթաց: Մենք օգտագործեցինք խառը ճշգրտության մարզում՝ float64 տվյալների տիպով՝ առաջ անցնելու համար, և float16՝ գրադիենտների համար՝ NVIDIA Tesla GPU-ների կողմից աջակցվող float32 հաշվարկները արագացնելու համար:
$ 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Ամփոփում
Այս հոդվածում մենք դիտարկել ենք Apache MXNet-ի և Horovod-ի միջոցով բաշխված մոդելի ուսուցման մասշտաբային մոտեցումը: Մենք ցույց ենք տվել մասշտաբայինությունը և ծախսարդյունավետությունը ImageNet տվյալների բազայի վրա՝ համեմատած պարամետրերի սերվերի մոտեցման հետ, որը մարզել է ResNet50-v1 մոդելը: Մենք նաև ցույց ենք տվել այն քայլերը, որոնք կարող եք ձեռնարկել՝ Horovod-ի միջոցով բազմաթիվ օրինակների վրա ուսուցում իրականացնելու համար գոյություն ունեցող սկրիպտը փոփոխելու համար:
Եթե նոր եք սկսում MXNet-ով և խորը ուսուցմամբ զբաղվել, անցեք տեղադրման էջին։ , նախ MXNet կառուցելու համար։ Մենք նաև խորհուրդ ենք տալիս կարդալ հոդվածը սկսելու համար։
Եթե արդեն աշխատել եք MXNet-ի հետ և ցանկանում եք փորձել բաշխված ուսուցումը Horovod-ի հետ, ապա ծանոթացեք։ , կոմպիլացրեք այն MXNet-ով և հետևեք օրինակին կամ .
* արժեքը հաշվարկվում է AWS EC2 օրինակների համար
Իմացեք ավելին դասընթացի մասին
Source: www.habr.com
