Prevod članka je bil pripravljen na predvečer začetka tečaja
Porazdeljeno usposabljanje na več visoko zmogljivih računalniških instancah lahko skrajša čas usposabljanja sodobnih globokih nevronskih mrež na velikih količinah podatkov s tednov na ure ali celo minute, zaradi česar ta tehnika usposabljanja prevladuje v praktičnih aplikacijah globokega učenja. Uporabniki morajo razumeti, kako deliti in sinhronizirati podatke med več primerki, kar ima velik vpliv na učinkovitost skaliranja. Poleg tega bi morali uporabniki vedeti tudi, kako uvesti skript za usposabljanje, ki se izvaja na enem primerku, v več primerkih.
V tem članku bomo govorili o hitrem in enostavnem načinu distribucije učenja z uporabo odprte knjižnice globokega učenja Apache MXNet in ogrodja porazdeljenega učenja Horovod. Jasno bomo prikazali prednosti zmogljivosti ogrodja Horovod in prikazali, kako napisati skript za usposabljanje MXNet, tako da bo deloval na porazdeljen način s Horovodom.
Kaj je Apache MXNet
je odprtokodno ogrodje globokega učenja, ki se uporablja za ustvarjanje, usposabljanje in uvajanje globokih nevronskih mrež. MXNet abstrahira zapletenosti, povezane z implementacijo nevronskih mrež, je zelo zmogljiv in razširljiv ter ponuja API-je za priljubljene programske jezike, kot je npr. , , , , , , in drugi.
Porazdeljeno usposabljanje v MXNet s strežnikom parametrov
uporablja pristop strežnika parametrov. Uporablja niz strežnikov parametrov za zbiranje gradientov od vsakega delavca, izvajanje združevanja in pošiljanje posodobljenih gradientov nazaj delavcem za naslednjo ponovitev optimizacije. Določanje pravilnega razmerja med strežniki in delavci je ključ do učinkovitega skaliranja. Če obstaja samo en strežnik parametrov, se lahko izkaže za ozko grlo pri izračunih. Nasprotno, če se uporablja preveč strežnikov, lahko komunikacija veliko proti mnogo zamaši vse omrežne povezave.
Kaj je Horovod
je odprto porazdeljeno ogrodje globokega učenja, ki so ga razvili pri Uberju. Izkorišča učinkovite tehnologije med GPU in med vozlišči, kot sta NVIDIA Collective Communications Library (NCCL) in Message Passing Interface (MPI) za distribucijo in združevanje parametrov modela po vorecih. Optimizira uporabo pasovne širine omrežja in se dobro prilagaja pri delu z modeli globokih nevronskih mrež. Trenutno podpira več priljubljenih ogrodij strojnega učenja, in sicer , Tensorflow, Keras in PyTorch.
Integracija MXNet in Horovod
MXNet se integrira s Horovodom prek API-jev za porazdeljeno učenje, definiranih v Horovodu. Komunikacijski API-ji Horovod horovod.oddaja(), horovod.allgather() и horovod.allreduce() implementiran z uporabo asinhronih povratnih klicev motorja MXNet kot del njegovega grafa opravil. Na ta način odvisnosti podatkov med komunikacijo in računanjem enostavno upravlja motor MXNet, da se izognemo izgubam zmogljivosti zaradi sinhronizacije. Objekt porazdeljenega optimizatorja, definiran v Horovodu horovod.DistributedOptimizer širi Optimizator v MXNet, tako da kliče ustrezne API-je Horovod za porazdeljene posodobitve parametrov. Vse te podrobnosti izvedbe so pregledne za končne uporabnike.
Hiter začetek
Hitro lahko začnete učiti majhno konvolucijsko nevronsko mrežo na naboru podatkov MNIST z uporabo MXNet in Horovod na vašem MacBooku.
Najprej namestite mxnet in horovod iz PyPI:
pip install mxnet
pip install horovodOpomba: če naletite na napako med pip namestiti horovodmorda morate dodati spremenljivko MACOSX_DEPLOYMENT_TARGET=10.vvČe vv – to je različica vaše različice MacOS, na primer za MacOSX Sierra, ki jo boste morali napisati MACOSX_DEPLOYMENT_TARGET=10.12 pip namestitveni horovod
Nato namestite OpenMPI .
Na koncu prenesite testni skript mxnet_mnist.py in zaženite naslednje ukaze v terminalu MacBook v delovnem imeniku:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyTo bo izvajalo usposabljanje na dveh jedrih vašega procesorja. Rezultat bo naslednji:
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.870000Predstavitev uspešnosti
Pri usposabljanju modela ResNet50-v1 na naboru podatkov ImageNet na 64 grafičnih procesorjih z osmimi primerki p3.16 večji EC2, od katerih vsaka vsebuje 8 grafičnih procesorjev NVIDIA Tesla V100 v oblaku AWS, smo dosegli prepustnost usposabljanja 45000 slik/s (tj. število treniranih vzorcev na sekundo). Usposabljanje opravljeno v 44 minutah po 90 epohah z najboljšo natančnostjo 75.7 %.
To smo primerjali s pristopom porazdeljenega usposabljanja MXNet, ki uporablja strežnike parametrov na 8, 16, 32 in 64 grafičnih procesorjih z enim strežnikom parametrov in razmerjem med strežnikom in delavcem 1 proti 1 oziroma 2 proti 1. Rezultat si lahko ogledate na sliki 1 spodaj. Na osi y na levi vrstice predstavljajo število slik za urjenje na sekundo, črte odražajo učinkovitost skaliranja (to je razmerje med dejansko in idealno prepustnostjo) na osi y na desni. Kot lahko vidite, izbira števila strežnikov vpliva na učinkovitost skaliranja. Če obstaja samo en strežnik parametrov, učinkovitost skaliranja pade na 38 % na 64 grafičnih procesorjih. Če želite doseči enako učinkovitost skaliranja kot pri Horovodu, morate podvojiti število strežnikov glede na število delavcev.

Slika 1. Primerjava porazdeljenega učenja z uporabo MXNet s Horovodom in s strežnikom parametrov
V tabeli 1 spodaj primerjamo končne stroške na instanco pri izvajanju poskusov na 64 grafičnih procesorjih. Uporaba MXNet s Horovodom zagotavlja najboljšo prepustnost po najnižjih stroških.

Tabela 1. Primerjava stroškov med Horovodom in Parameter Server z razmerjem med strežnikom in delavcem 2 proti 1.
Koraki za razmnoževanje
V naslednjih korakih vam bomo pokazali, kako reproducirati rezultat porazdeljenega usposabljanja z uporabo MXNet in Horovod. Če želite izvedeti več o porazdeljenem učenju z MXNet, preberite .
Korak 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. Также вы можете использовать , kjer so te knjižnice že vnaprej nameščene.
Korak 2
Svojemu skriptu za usposabljanje MXNet dodajte možnost dela z API-jem Horovod. Spodnji skript, ki temelji na API-ju MXNet Gluon, lahko uporabite kot preprosto predlogo. Krepko označene vrstice so potrebne, če že imate ustrezen skript za usposabljanje. Tukaj je nekaj kritičnih sprememb, ki jih morate narediti za učenje s Horovodom:
- Kontekst nastavite glede na lokalni rang Horovod (vrstica 8), da razumete, da se usposabljanje izvaja na pravilnem grafičnem jedru.
- Prenesite začetne parametre od enega delavca vsem (vrstica 18), da zagotovite, da vsi delavci začnejo z enakimi začetnimi parametri.
- Ustvari Horovod DistributedOptimizer (vrstica 25), da posodobite parametre na porazdeljen način.
Če želite dobiti celoten skript, si oglejte primere 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 ...Korak 3
Prijavite se v enega od delavcev, da začnete porazdeljeno usposabljanje z uporabo direktive MPI. V tem primeru se porazdeljeno usposabljanje izvaja na štirih instancah s po 4 grafičnimi procesorji in skupno 16 grafičnimi procesorji v gruči. Optimizator stohastičnega gradienta (SGD) bo uporabljen z naslednjimi hiperparametri:
- velikost mini serije: 256
- stopnja učenja: 0.1
- moment: 0.9
- upad teže: 0.0001
Ko smo stopnjevali z ene GPE na 64 GPE, smo linearno prilagodili stopnjo usposabljanja glede na število GPE (od 0,1 za 1 GPE do 6,4 za 64 GPE), medtem ko smo ohranili število slik na GPE pri 256 (iz serije 256 slik za 1 GPU do 16 za 384 GPE). Parametri upadanja teže in zagona so se spreminjali, ko se je število grafičnih procesorjev povečalo. Uporabili smo mešano natančno usposabljanje s podatkovnim tipom float64 za prehod naprej in float16 za gradiente, da bi pospešili izračune float32, ki jih podpirajo grafični procesorji 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.pyZaključek
V tem članku smo si ogledali razširljiv pristop k usposabljanju porazdeljenega modela z uporabo Apache MXNet in Horovod. Prikazali smo učinkovitost skaliranja in stroškovno učinkovitost v primerjavi s pristopom strežnika parametrov na naboru podatkov ImageNet, na katerem je bil učen model ResNet50-v1. Vključili smo tudi korake, ki jih lahko uporabite za spreminjanje obstoječega skripta za izvajanje usposabljanja z več primerki z uporabo Horovoda.
Če ste šele začeli uporabljati MXNet in poglobljeno učenje, pojdite na stran za namestitev najprej zgraditi MXNet. Prav tako toplo priporočamo branje članka za začetek.
Če ste že delali z MXNet in želite preizkusiti porazdeljeno učenje s Horovodom, si oglejte , ga zgradite iz MXNet in sledite zgledu ali .
*strošek je izračunan na podlagi AWS za primerke EC2
Izvedite več o tečaju
Vir: www.habr.com
