Размеркаванае навучанне з Apache MXNet і Horovod

Пераклад артыкула падрыхтаваны напярэдадні старту курса "Прамысловы ML на вялікіх дадзеных"

Размеркаванае навучанне на некалькіх высокапрадукцыйных вылічальных экзэмплярах можа скараціць час навучання сучасных глыбокіх нейронавых сетак на вялікім аб'ёме дадзеных з некалькіх тыдняў да гадзін ці нават хвілін, што робіць гэтую тэхніку навучання пераважнай у пытаннях практычнага выкарыстання глыбокага навучання. Карыстальнікі павінны разумець, як дзяліцца і сінхранізаваць дадзеныя на некалькіх асобніках, што ў сваю чаргу аказвае вялікі ўплыў на эфектыўнасць маштабавання. Акрамя гэтага, карыстачы таксама павінны ведаць, як разгарнуць на некалькіх асобніках навучальны скрыпт, які працуе на адным асобніку.

У гэтым артыкуле мы пагаворым пра хуткі і просты спосаб размеркаванага навучання з выкарыстаннем адкрытай бібліятэкі для глыбокага навучання Apache MXNet і фрэймворка размеркаванага навучання Horovod. Мы наглядна пакажам перавагі фрэймфорка Horovod у пытаннях прадукцыйнасці і прадэманструем, як напісаць навучальны скрыпт MXNet так, каб ён працаваў размеркавана з Horovod.

Што такое Apache MXNet

Apache MX Net – адкрыты фрэймворк для глыбокага навучання, які выкарыстоўваецца для стварэння, навучання і разгортвання глыбокіх нейронавых сетак. MXNet абстрагуе складанасці, звязаныя з рэалізацыяй нейронавых сетак, валодае высокай прадукцыйнасцю і маштабаванасцю, а таксама прапануе API для папулярных моў праграмавання, такіх як Пітон, C + +, Clojure, ява, Юлія, R, маштаб і іншых.

Размеркаванае навучанне ў MXNet з серверам параметраў

Стандартны модуль размеркаванага навучання ў MXNet выкарыстоўвае падыход сервера параметраў (parameter server). Ён выкарыстоўвае набор сервераў параметраў для збору градыентаў з кожнага воркера, выканання агрэгацыі і адпраўкі абноўленых градыентаў назад ворекрам для наступнай ітэрацыі аптымізацыі. Вызначэнне правільнага суадносін сервераў да воркерам - заклад эфектыўнага маштабавання. Калі сервер параметраў усяго адзін, ён можа апынуцца бутэлькавым рыльцам у правядзенні вылічэнняў. І наадварот, калі выкарыстоўваецца занадта шмат сервераў, то сувязь "многія-да-многім" можа забіць усе сеткавыя злучэнні.

Што такое Horovod

Horovod – адкрыты фрэймворк размеркаванага глыбокага навучання, распрацаваны ў Uber. Ён выкарыстоўвае эфектыўныя тэхналогіі ўзаемадзеяння паміж некалькімі GPU і вузламі, такія як NVIDIA Collective Communications Library (NCCL) і Message Passing Interface (MPI) для размеркавання і агрэгавання параметраў мадэлі паміж ворекрамі. Ён аптымізуе выкарыстанне прапускной здольнасці сеткі і добра маштабуецца пры працы з мадэлямі глыбокіх нейронавых сетак. У цяперашні час ён падтрымлівае некалькі папулярных фрэймворкаў машыннага навучання, а менавіта MX Net, Tensorflow, Keras, і PyTorch.

Інтэграцыя MXNet і Horovod

MXNet інтэгруецца з Horovod праз API размеркаванага навучання, вызначаныя ў Horovod. У Horovod камунікацыйныя API horovod.broadcast(), horovod.allgather() и horovod.allreduce() рэалізаваны з дапамогай асінхронных коллбэкаў рухавічка MXNet, як частка яго графа задач. Такім чынам, залежнасці дадзеных паміж камунікацыяй і вылічэннямі з лёгкасцю апрацоўваюцца рухавіком MXNet, каб пазбегнуць страт прадукцыйнасці з-за сінхранізацыі. Аб'ект distributed optimizer, вызначаны ў Horovod horovod.DistributedOptimizer пашырае Аптымізатар у MXNet такім чынам, каб ён выклікаў адпаведныя API Horovod для размеркаванага абнаўлення параметраў. Усе гэтыя дэталі рэалізацыі празрыстыя для канчатковых карыстальнікаў.

Хуткі старт

Вы можаце хутка пачаць навучаць невялікую згортачную нейронавую сетку на наборы дадзеных MNIST з дапамогай MXNet і Horovod на вашым MacBook.
Для пачатку ўсталюеце mxnet і horovod з PyPI:

pip install mxnet
pip install horovod

Заўвага: Калі ў вас узнікае памылка падчас pip install 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 GPU з васьмю асобнікамі p3.16xlarge EC2, кожны з якіх утрымоўвае 8 GPU NVIDIA Tesla V100 на AWS cloud, мы дасягнулі прапускной здольнасці навучання 45000 малюнкаў/сек (г.зн. колькасць навучаных сэмплаў у секунду). Навучанне завяршалася за 44 хвіліны пасля 90 эпох з лепшай дакладнасцю 75.7%.

Мы параўналі гэта з размеркаваным навучаннем MXNet з падыходам выкарыстання сервераў параметраў на 8, 16, 32 і 64 GPU з серверам з адным параметрам і стаўленнем сервераў да воркераў 1 да 1 і 2 да 1 адпаведна. Вынік вы можаце ўбачыць на малюнку 1 ніжэй. Па восі ў злева слупкі адлюстроўваюць колькасць малюнкаў для навучання ў секунду, лініі адлюстроўваюць эфектыўнасць маштабавання (гэта значыць стаўленне фактычнай прапускной здольнасці да ідэальнай) на восі ў справа. Як бачыце выбар колькасці сервераў уплывае на эфектыўнасць маштабавання. Калі сервер параметраў адзін, эфектыўнасць маштабавання падае да 38% на 64 GPU. Для дасягнення такой жа эфектыўнасці маштабавання як з Horovod трэба павялічыць колькасць сервераў у два разы ў адносінах да колькасці воркераў.

Размеркаванае навучанне з Apache MXNet і Horovod
Малюнак 1. Параўнанне размеркаванага навучання з выкарыстаннем MXNet з Horovod і з серверам параметраў

У Табліцы 1 ніжэй мы параўналі выніковы кошт асобніка пры выкананні эксперыментаў на 64 GPU. Выкарыстанне MXNet разам з Horovod забяспечвае найлепшую прапускную здольнасць пры найменшых выдатках.

Размеркаванае навучанне з Apache 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. Таксама вы можаце выкарыстоўваць Amazon Deep Learning AMI, дзе гэтыя бібліятэкі ўжо прадусталяваныя.

Крок 2

Дадайце ў свой навучальны скрыпт MXNet магчымасць працы з API Horovod. Прыведзены ніжэй скрыпт на аснове MXNet Gluon API можна выкарыстоўваць як просты шаблон. Радкі, вылучаныя тоўстым, патрэбныя ў тым выпадку, калі ў вас ужо ёсць які адпавядае навучальны скрыпт. Вось некалькі крытычных змен, якія неабходна ўнесці для навучання з Horovod:

  • Усталюйце кантэкст у адпаведнасці з лакальным рангам Horovod (радок 8), каб разумець, што навучанне выконваецца на правільным графічным ядры.
  • Перадайце пачатковыя параметры ад аднаго воркера да ўсіх (радок 18), каб пераканацца, што ўсе воркеры пачынаюць працу з аднолькавымі пачатковымі параметрамі.
  • Стварыце Horovod DistributedOptimizer (радок 25), каб абнаўляць параметры размеркавана.

Каб атрымаць поўны скрыпт, звернецеся да прыкладаў Horovod-MXNet МНІСТ и 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    ...

Крок 3

Увайдзіце ў адзін з воркераў для запуску размеркаванага навучання з дапамогай дырэктывы MPI. У дадзеным прыкладзе, размеркаванае навучанне запускаецца на чатырох экземплярах з 4 GPU у кожным, і з 16 GPU у кластары па выніку. Будзе выкарыстоўвацца аптымізатар стахастычнага градыентнага спуску (SGD) з наступнымі гіперпараметрамі:

  • mini-batch size: 256
  • learning rate: 0.1
  • momentum: 0.9
  • weight decay: 0.0001

Па меры маштабавання ад аднаго GPU да 64 GPU мы лінейна маштабавалі хуткасць навучання ў адпаведнасці з колькасцю GPU (ад 0,1 для 1 GPU да 6,4 для 64 GPU), захоўваючы пры гэтым колькасць малюнкаў, якія прыпадаюць на адзін GPU, роўным 256 ( ад пакета ў 256 малюнкаў для 1 GPU да 16 для 384 GPU). Параметры weight decay і momentum змяняліся па меры павелічэння колькасці GPU. Мы выкарыстоўвалі змешаную дакладнасць навучання з тыпам дадзеных float64 пры прамым праходзе і float16 для градыентаў, каб паскорыць вылічэнні float32, якія падтрымліваюцца GPU 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

Заключэнне

У гэтым артыкуле мы разгледзелі які маштабуецца падыход да размеркаванага навучання мадэлі з выкарыстаннем Apache MXNet і Horovod. Мы паказалі эфектыўнасць маштабавання і эканамічную эфектыўнасць у параўнанні з падыходам з выкарыстаннем сервера параметраў на наборы дадзеных ImageNet, на якім вучылася мадэль ResNet50-v1. Таксама мы адлюстравалі крокі, з дапамогай якіх вы можаце змяніць ужо існуючы скрыпт, каб запусціць навучанне на некалькіх экзэмплярах з дапамогай Horovod.

Калі вы толькі пачынаеце працаваць з MXNet і глыбокім навучаннем, перайдзіце на старонку ўстаноўкі MXNe, Каб спачатку сабраць MXNet. Таксама настойліва раім пачытаць артыкул MXNet ў 60 хвілін, каб пачаць працу.

Калі вы ўжо працавалі з MXNet і жадаеце паспрабаваць размеркаванае навучанне з Horovod, то зазірніце на старонку ўстаноўкі Horovod, збярыце яго з MXNet і прытрымлівайцеся прыкладу МНІСТ або IMAGEnet.

*кошт разлічваецца на падставе пагадзіннай стаўкі AWS для экзэмпляраў EC2

Даведацца падрабязней аб курсе "Прамысловы ML на вялікіх дадзеных"

Крыніца: habr.com

Дадаць каментар