De oersetting fan it artikel waard taret op 'e foarjûn fan it begjin fan' e kursus
Ferspraat training op meardere komputereksimplaren mei hege prestaasjes kinne de trainingstiid fan moderne djippe neurale netwurken ferminderje op grutte hoemannichten gegevens fan wiken nei oeren of sels minuten, wêrtroch dizze trainingstechnyk foarkomt yn praktyske tapassingen fan djip learen. Brûkers moatte begripe hoe't jo gegevens diele en syngronisearje kinne oer meardere eksimplaren, wat op syn beurt in grutte ynfloed hat op skaaleffisjinsje. Derneist moatte brûkers ek witte hoe't se in trainingsskript kinne ynsette dat op ien eksimplaar rint nei meardere eksimplaren.
Yn dit artikel sille wy prate oer in rappe en maklike manier om learen te fersprieden mei de iepen djippe learbibleteek Apache MXNet en it Horovod ferspraat learkader. Wy sille de prestaasjesfoardielen fan it Horovod-ramt dúdlik demonstrearje en demonstrearje hoe't jo in MXNet-trainingsskript skriuwe, sadat it op in ferspraat manier wurket mei Horovod.
Wat is Apache MXNet
is in iepen-boarne djippe learramt dat wurdt brûkt om djippe neurale netwurken te meitsjen, te trenen en yn te setten. MXNet abstraheret de kompleksiteiten dy't ferbûn binne mei it ymplementearjen fan neurale netwurken, is heul performant en skalberber, en biedt API's foar populêre programmeartalen lykas , , , , , , en oaren.
Ferspraat training yn MXNet mei parameterserver
brûkt in parameter tsjinner oanpak. It brûkt in set parameterservers om gradiënten fan elke arbeider te sammeljen, aggregaasje út te fieren en bywurke gradienten werom te stjoeren nei arbeiders foar de folgjende optimisaasje-iteraasje. It bepalen fan de juste ferhâlding fan servers oan arbeiders is de kaai foar effektive skaalfergrutting. As d'r mar ien parameterserver is, kin it in knelpunt yn 'e berekkeningen blike te wêzen. Oarsom, as tefolle tsjinners wurde brûkt, kin in protte-to-in protte kommunikaasje alle netwurkferbiningen ferstoppe.
Wat is Horovod
is in iepen ferspraat djippe learramt ûntwikkele by Uber. It brûkt effisjinte cross-GPU en cross-node technologyen lykas NVIDIA Collective Communications Library (NCCL) en Message Passing Interface (MPI) om modelparameters te fersprieden en te aggregearjen oer vorecs. It optimisearret it gebrûk fan netwurkbânbreedte en skaalt goed by it wurkjen mei modellen foar djippe neurale netwurken. It stipet op it stuit ferskate populêre kaders foar masine-learen, nammentlik , Tensorflow, Keras en PyTorch.
MXNet en Horovod yntegraasje
MXNet yntegreart mei Horovod fia de Distributed Learning API's definieare yn Horovod. Horovod kommunikaasje APIs horovod.broadcast(), horovod.allgather() и horovod.allreduce() ymplementearre mei asynchrone callbacks fan 'e MXNet-motor, as ûnderdiel fan syn taakgrafyk. Op dizze manier wurde gegevensôfhinklikens tusken kommunikaasje en berekkening maklik behannele troch de MXNet-motor om prestaasjesferlies te foarkommen fanwege syngronisaasje. Ferspraat optimizer foarwerp definiearre yn Horovod horovod.DistributedOptimizer wreidet út Optimizer yn MXNet sadat it de korrespondearjende Horovod APIs neamt foar ferspraat parameter updates. Al dizze ymplemintaasjedetails binne transparant foar ein brûkers.
Snelle start
Jo kinne fluch begjinne mei it trainen fan in lyts konvolúsjoneel neural netwurk op 'e MNIST-dataset mei MXNet en Horovod op jo MacBook.
Ynstallearje earst mxnet en horovod fan PyPI:
pip install mxnet
pip install horovodOpmerking: As jo in flater tsjinkomme tidens pip ynstallearje horovodmiskien moatte jo in fariabele tafoegje MACOSX_DEPLOYMENT_TARGET=10.vvwêr vv - dit is de ferzje fan jo MacOS-ferzje, bygelyks foar MacOSX Sierra moatte jo skriuwe MACOSX_DEPLOYMENT_TARGET=10.12 pip ynstallearje horovod
Dan ynstallearje OpenMPI .
Download oan 'e ein it testskript mxnet_mnist.py en fier de folgjende kommando's yn 'e MacBook-terminal yn' e wurkmap:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyDit sil training útfiere op twa kearnen fan jo prosessor. De útfier sil de folgjende wêze:
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.870000Performance Demo
By it trainen fan in ResNet50-v1-model op in ImageNet-dataset op 64 GPU's mei acht eksimplaren p3.16x grut EC2, elk mei 8 NVIDIA Tesla V100 GPU's op AWS-wolk, hawwe wy in trainingstrochfier fan 45000 ôfbyldings / sek berikt (dus it oantal trained samples per sekonde). Training foltôge yn 44 minuten nei 90 epoken mei in bêste krektens fan 75.7%.
Wy fergelike dit mei de ferdielde trainingsoanpak fan MXNet fan it brûken fan parameterservers op 8, 16, 32 en 64 GPU's mei in inkele parameterserver en in server-to-worker-ferhâlding fan respektivelik 1 oant 1 en 2 oant 1. Jo kinne it resultaat sjen yn figuer 1 hjirûnder. Op 'e y-as oan' e lofterkant fertsjintwurdigje de balken it oantal ôfbyldings om per sekonde te trenen, de linen wjerspegelje de skaalfergrutting (dat is de ferhâlding fan werklike oant ideale trochstreaming) op 'e y-as rjochts. Sa't jo sjen kinne, beynfloedet de kar fan it oantal tsjinners de effektiviteit fan skaalfergrutting. As d'r mar ien parameterserver is, sakket de skaalfergrutting nei 38% op 64 GPU's. Om deselde skaalfergrutting te berikken as mei Horovod, moatte jo it oantal tsjinners ferdûbelje relatyf oan it oantal arbeiders.

figuer 1. Fergeliking fan ferdield learen mei help fan MXNet mei Horovod en mei parameter tsjinner
Yn Tabel 1 hjirûnder fergelykje wy de definitive kosten per eksimplaar by it útfieren fan eksperiminten op 64 GPU's. It brûken fan MXNet mei Horovod leveret de bêste trochfier tsjin de leechste kosten.

Tabel 1. Kosten ferliking tusken Horovod en Parameter Server mei in tsjinner oan arbeider ratio fan 2 oan 1.
Stappen om te reprodusearjen
Yn 'e folgjende stappen sille wy jo sjen litte hoe't jo it resultaat fan ferdielde training kinne reprodusearje mei MXNet en Horovod. Om mear te learen oer ferspraat learen mei MXNet lês .
stap 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. Также вы можете использовать , wêr't dizze bibleteken al foarôf ynstallearre binne.
stap 2
Foegje de mooglikheid ta om te wurkjen mei de Horovod API oan jo MXNet-trainingsskript. It ûndersteande skript basearre op de MXNet Gluon API kin brûkt wurde as in ienfâldich sjabloan. De fette rigels binne nedich as jo al in oerienkommende trainingsskript hawwe. Hjir binne in pear krityske wizigingen dy't jo moatte meitsje om te learen mei Horovod:
- Stel de kontekst neffens de pleatslike Horovod-rang (rigel 8) om te begripen dat training wurdt útfierd op 'e juste grafyske kearn.
- Pass initial parameters fan ien arbeider nei alle (rigel 18) om te soargjen dat alle arbeiders begjinne mei deselde initial parameters.
- Meitsje in Horovod DistributedOptimizer (rigel 25) om de parameters op in ferspraat wize te aktualisearjen.
Om it folsleine skript te krijen, ferwize asjebleaft nei de Horovod-MXNet-foarbylden и .
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 ...stap 3
Meld jo oan by ien fan 'e arbeiders om te begjinnen mei ferdielde training mei de MPI-rjochtline. Yn dit foarbyld rint ferspraat training op fjouwer eksimplaren mei elk 4 GPU's, en in totaal fan 16 GPU's yn it kluster. De Stochastic Gradient Descent (SGD) optimizer sil brûkt wurde mei de folgjende hyperparameters:
- mini-batch grutte: 256
- lear rate: 0.1
- ympuls: 0.9
- gewicht ferfal: 0.0001
Wylst wy skaalber binne fan ien GPU nei 64 GPU's, skaalden wy it trainingsnivo lineêr neffens it oantal GPU's (fan 0,1 foar 1 GPU nei 6,4 foar 64 GPU's), wylst wy it oantal ôfbyldings per GPU op 256 hâlde (fan in batch fan 256 ôfbyldings foar 1 GPU oant 16 foar 384 GPU's). It gewicht ferfal en momentum parameters feroare doe't it oantal GPUs tanommen. Wy brûkten mingde presyzje-training mei it float64-gegevenstype foar de foarútpass en float16 foar gradiënten om de float32-berekkeningen te fersnellen stipe troch NVIDIA Tesla GPU's.
$ 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.pykonklúzje
Yn dit artikel seagen wy nei in skaalbere oanpak foar ferspraat modeltraining mei Apache MXNet en Horovod. Wy demonstrearren de skaalfergrutting en kosten-effektiviteit yn ferliking mei de parameter-server-oanpak op 'e ImageNet-dataset wêrop it ResNet50-v1-model waard oplaat. Wy hawwe ek stappen opnommen dy't jo kinne brûke om in besteand skript te feroarjen om training mei meardere eksimplaren út te fieren mei Horovod.
As jo gewoan begjinne mei MXNet en djip learen, gean dan nei de ynstallaasjeside om earst MXNet te bouwen. Wy riede ek sterk oan om it artikel te lêzen om te begjinnen.
As jo al mei MXNet hawwe wurke en wolle besykje ferspraat learen mei Horovod, sjoch dan ris nei , bouwe it fan MXNet en folgje it foarbyld of .
* kosten wurde berekkene basearre op AWS foar EC2-ynstânsjes
Learje mear oer de kursus
Boarne: www.habr.com
