Превод чланка припремљен је уочи почетка курса
Дистрибуирана обука на више рачунарских инстанци високих перформанси може смањити време обуке модерних дубоких неуронских мрежа на великим количинама података од недеља до сати или чак минута, чинећи ову технику обуке преовлађујућом у практичним применама дубоког учења. Корисници морају да разумеју како да деле и синхронизују податке на више инстанци, што заузврат има велики утицај на ефикасност скалирања. Поред тога, корисници би такође требало да знају како да примене скрипту за обуку која се покреће на једној инстанци на више инстанци.
У овом чланку ћемо говорити о брзом и једноставном начину дистрибуције учења користећи отворену библиотеку дубоког учења Апацхе МКСНет и Хоровод дистрибуирани оквир за учење. Јасно ћемо демонстрирати предности перформанси оквира Хоровод и показати како написати МКСНет скрипту за обуку тако да ради на дистрибуиран начин са Хороводом.
Шта је Апацхе МКСНет
Дистрибуирана обука у МКСНет са сервером параметара
Шта је Хоровод
МКСНет и Хоровод интеграција
МКСНет се интегрише са Хороводом преко АПИ-ја за дистрибуирано учење дефинисаних у Хороводу. Хоровод комуникациони АПИ-ји хоровод.броадцаст(), хоровод.аллгатхер() и хоровод.аллредуце() имплементиран коришћењем асинхроних повратних позива МКСНет механизма, као део његовог графа задатака. На овај начин, МКСНет механизам лако управља зависношћу података између комуникације и израчунавања како би се избегао губитак перформанси услед синхронизације. Дистрибуирани објекат оптимизатора дефинисан у Хороводу хоровод.ДистрибутедОптимизер проширује се Оптимизер у МКСНет-у тако да позива одговарајуће Хоровод АПИ-је за дистрибуирана ажурирања параметара. Сви ови детаљи имплементације су транспарентни за крајње кориснике.
Брзи почетак
Можете брзо да почнете да тренирате малу конволуциону неуронску мрежу на скупу података МНИСТ користећи МКСНет и Хоровод на вашем МацБоок-у.
Прво, инсталирајте мкнет и хоровод из ПиПИ:
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 модел. Такође смо укључили кораке које можете користити да модификујете постојећу скрипту за покретање обуке са више инстанци користећи Хоровод.
Ако тек почињете да користите МКСНет и дубоко учење, идите на страницу за инсталацију
Ако сте већ радили са МКСНет-ом и желите да испробате дистрибуирано учење са Хороводом, погледајте
*трошак се обрачунава на основу
Сазнајте више о курсу
Извор: ввв.хабр.цом