Дистрибуирано учење уз Апацхе МКСНет и Хоровод

Превод чланка припремљен је уочи почетка курса „Индустријски МЛ на великим подацима“

Дистрибуирана обука на више рачунарских инстанци високих перформанси може смањити време обуке модерних дубоких неуронских мрежа на великим количинама података од недеља до сати или чак минута, чинећи ову технику обуке преовлађујућом у практичним применама дубоког учења. Корисници морају да разумеју како да деле и синхронизују податке на више инстанци, што заузврат има велики утицај на ефикасност скалирања. Поред тога, корисници би такође требало да знају како да примене скрипту за обуку која се покреће на једној инстанци на више инстанци.

У овом чланку ћемо говорити о брзом и једноставном начину дистрибуције учења користећи отворену библиотеку дубоког учења Апацхе МКСНет и Хоровод дистрибуирани оквир за учење. Јасно ћемо демонстрирати предности перформанси оквира Хоровод и показати како написати МКСНет скрипту за обуку тако да ради на дистрибуиран начин са Хороводом.

Шта је Апацхе МКСНет

Апацхе МКСНет је оквир за дубоко учење отвореног кода који се користи за креирање, обуку и примену дубоких неуронских мрежа. МКСНет апстрахује сложености повезане са имплементацијом неуронских мрежа, веома је ефикасан и скалабилан и нуди АПИ-је за популарне програмске језике као што су Питон, Ц + +, Цлојуре, Јава, Јулија, R, Сцала и други.

Дистрибуирана обука у МКСНет са сервером параметара

Стандардни дистрибуирани модул за учење у МКСНет-у користи приступ серверу параметара. Користи скуп сервера параметара да прикупи градијенте од сваког радника, изврши агрегацију и пошаље ажуриране градијенте назад радницима за следећу итерацију оптимизације. Одређивање исправног односа између сервера и радника је кључ за ефикасно скалирање. Ако постоји само један сервер параметара, може се испоставити да је то уско грло у прорачунима. Супротно томе, ако се користи превише сервера, комуникација више-према-више може зачепити све мрежне везе.

Шта је Хоровод

Хоровод је отворени дистрибуирани оквир дубоког учења развијен у Уберу. Користи ефикасне цросс-ГПУ и цросс-ноде технологије као што су НВИДИА Цоллецтиве Цоммуницатионс Либрари (НЦЦЛ) и Мессаге Пассинг Интерфаце (МПИ) за дистрибуцију и агрегацију параметара модела кроз ворецове. Оптимизује употребу пропусног опсега мреже и добро се скалира када се ради са моделима дубоких неуронских мрежа. Тренутно подржава неколико популарних оквира за машинско учење, наиме МКСНет, Тенсорфлов, Керас и ПиТорцх.

МКСНет и Хоровод интеграција

МКСНет се интегрише са Хороводом преко АПИ-ја за дистрибуирано учење дефинисаних у Хороводу. Хоровод комуникациони АПИ-ји хоровод.броадцаст(), хоровод.аллгатхер() и хоровод.аллредуце() имплементиран коришћењем асинхроних повратних позива МКСНет механизма, као део његовог графа задатака. На овај начин, МКСНет механизам лако управља зависношћу података између комуникације и израчунавања како би се избегао губитак перформанси услед синхронизације. Дистрибуирани објекат оптимизатора дефинисан у Хороводу хоровод.ДистрибутедОптимизер проширује се Оптимизер у МКСНет-у тако да позива одговарајуће Хоровод АПИ-је за дистрибуирана ажурирања параметара. Сви ови детаљи имплементације су транспарентни за крајње кориснике.

Брзи почетак

Можете брзо да почнете да тренирате малу конволуциону неуронску мрежу на скупу података МНИСТ користећи МКСНет и Хоровод на вашем МацБоок-у.
Прво, инсталирајте мкнет и хоровод из ПиПИ:

pip install mxnet
pip install horovod

Напомена: Ако наиђете на грешку током пип инсталл хороводможда треба да додате променљиву МАЦОСКС_ДЕПЛОИМЕНТ_ТАРГЕТ=10.ввГде vv – ово је верзија ваше МацОС верзије, на пример, за МацОСКС Сиерра ћете морати да напишете МАЦОСКС_ДЕПЛОИМЕНТ_ТАРГЕТ=10.12 пип инсталл хоровод

Затим инсталирајте ОпенМПИ стога.

На крају преузмите тестну скрипту мкнет_мнист.пи стога и покрените следеће команде на МацБоок терминалу у радном директоријуму:

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

Демо перформанси

Када обучавате РесНет50-в1 модел на ИмагеНет скупу података на 64 ГПУ-а са осам инстанци п3.16кларге ЕЦ2, од којих сваки садржи 8 НВИДИА Тесла В100 ГПУ-а на АВС облаку, постигли смо пропусност обуке од 45000 слика/сек (тј. број обучених узорака у секунди). Обука је завршена за 44 минута након 90 епоха са најбољом прецизношћу од 75.7%.

Упоредили смо ово са МКСНет-овим дистрибуираним приступом обуке који користи сервере параметара на 8, 16, 32 и 64 ГПУ-а са једним сервером параметара и односом између сервера и радника 1 према 1 и 2 према 1, респективно. Резултат можете видети на слици 1 испод. На и-оси са леве стране, траке представљају број слика које треба тренирати у секунди, линије одражавају ефикасност скалирања (то јест, однос стварне и идеалне пропусности) на и-оси са десне стране. Као што видите, избор броја сервера утиче на ефикасност скалирања. Ако постоји само један сервер параметара, ефикасност скалирања пада на 38% на 64 ГПУ-а. Да бисте постигли исту ефикасност скалирања као код Хоровода, потребно је да удвостручите број сервера у односу на број радника.

Дистрибуирано учење уз Апацхе МКСНет и Хоровод
Слика 1. Поређење дистрибуираног учења користећи МКСНет са Хороводом и са сервером параметара

У табели 1 у наставку упоређујемо коначну цену по инстанци када изводимо експерименте на 64 ГПУ-а. Коришћење МКСНета са Хороводом обезбеђује најбољу пропусност по најнижој цени.

Дистрибуирано учење уз Апацхе МКСНет и Хоровод
Табела 1. Поређење трошкова између Хоровода и Параметер Сервера са односом између сервера и радника 2 према 1.

Кораци за репродукцију

У наредним корацима показаћемо вам како да репродукујете резултат дистрибуиране обуке користећи МКСНет и Хоровод. Да бисте сазнали више о дистрибуираном учењу уз МКСНет, прочитајте овај пост.

Корак КСНУМКС

Направите кластер хомогених инстанци са МКСНет верзијом 1.4.0 или новијом и Хоровод верзијом 0.16.0 или новијом да бисте користили дистрибуирано учење. Такође ћете морати да инсталирате библиотеке за ГПУ обуку. За наше примере, изабрали смо Убунту 16.04 Линук, са ГПУ драјвером 396.44, ЦУДА 9.2, цуДНН 7.2.1 библиотеком, НЦЦЛ 2.2.13 комуникатором и ОпенМПИ 3.1.1. Такође можете користити Амазон Дееп Леарнинг АМИ, где су ове библиотеке већ унапред инсталиране.

Корак КСНУМКС

Додајте могућност рада са Хоровод АПИ-јем у своју МКСНет скрипту за обуку. Скрипта у наставку заснована на МКСНет Глуон АПИ-ју може се користити као једноставан шаблон. Подебљани редови су потребни ако већ имате одговарајућу скрипту за обуку. Ево неколико критичних промена које морате да направите да бисте учили са Хороводом:

  • Подесите контекст према локалном рангу Хоровода (ред 8) да бисте разумели да се обука изводи на исправном графичком језгру.
  • Проследите почетне параметре са једног радника на све (ред 18) да бисте осигурали да сви радници почињу са истим почетним параметрима.
  • Направите Хоровод ДистрибутедОптимизер (ред 25) да ажурирате параметре на дистрибуиран начин.

Да бисте добили пуну скрипту, погледајте примере Хоровод-МКСНет МНИСТ и ИмагеНет.

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

Корак КСНУМКС

Пријавите се на једног од радника да бисте започели дистрибуирану обуку користећи МПИ директиву. У овом примеру, дистрибуирана обука ради на четири инстанце са по 4 ГПУ-а и укупно 16 ГПУ-а у кластеру. Оптимизатор стохастичког градијента (СГД) ће се користити са следећим хиперпараметрима:

  • величина мини серије: 256
  • стопа учења: 0.1
  • замах: 0.9
  • смањење тежине: 0.0001

Како смо скалирали са једног ГПУ-а на 64 ГПУ-а, линеарно смо скалирали стопу обуке према броју ГПУ-а (од 0,1 за 1 ГПУ на 6,4 за 64 ГПУ-а), док смо задржали број слика по ГПУ-у на 256 (из серије 256 слика за 1 ГПУ до 16 за 384 ГПУ-а). Параметри опадања тежине и импулса су се мењали како се број ГПУ-а повећавао. Користили смо мешовиту прецизну обуку са типом података флоат64 за пролаз унапред и флоат16 за градијенте да бисмо убрзали прорачуне флоат32 које подржавају НВИДИА Тесла ГПУ-ови.

$ 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

Закључак

У овом чланку смо погледали скалабилан приступ обуци дистрибуираног модела користећи Апацхе МКСНет и Хоровод. Показали смо ефикасност скалирања и исплативост у поређењу са приступом сервера параметара на ИмагеНет скупу података на којем је обучен РесНет50-в1 модел. Такође смо укључили кораке које можете користити да модификујете постојећу скрипту за покретање обуке са више инстанци користећи Хоровод.

Ако тек почињете да користите МКСНет и дубоко учење, идите на страницу за инсталацију МКСНеда прво направи МКСНет. Такође топло препоручујемо да прочитате чланак МКСНет за 60 минутазапочети.

Ако сте већ радили са МКСНет-ом и желите да испробате дистрибуирано учење са Хороводом, погледајте Страница за инсталацију Хоровода, направите га из МКСНета и следите пример МНИСТ или ИмагеНет.

*трошак се обрачунава на основу сатнице АВС за ЕЦ2 инстанце

Сазнајте више о курсу „Индустријски МЛ на великим подацима“

Извор: ввв.хабр.цом

Додај коментар