Porazdeljeno učenje z Apache MXNet in Horovod

Prevod članka je bil pripravljen na predvečer začetka tečaja "Industrijsko strojno upravljanje z velikimi podatki"

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

Apache MX Net 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. Python, C + +, Clojure, Java, Julia, R, Lestvica in drugi.

Porazdeljeno usposabljanje v MXNet s strežnikom parametrov

Standardni porazdeljeni učni modul v MXNet 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

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 MX Net, 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 horovod

Opomba: č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 zato.

Na koncu prenesite testni skript mxnet_mnist.py zato 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.py

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

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

Porazdeljeno učenje z Apache MXNet in Horovod
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.

Porazdeljeno učenje z Apache MXNet in Horovod
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 ta objava.

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. Также вы можете использовать Amazon Deep Learning AMI, 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 MNIST и 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    ...

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

Zaključ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 MXNenajprej zgraditi MXNet. Prav tako toplo priporočamo branje članka MXNet v 60 minutahza začetek.

Če ste že delali z MXNet in želite preizkusiti porazdeljeno učenje s Horovodom, si oglejte Stran za namestitev Horovoda, ga zgradite iz MXNet in sledite zgledu MNIST ali ImageNet.

*strošek je izračunan na podlagi urne postavke AWS za primerke EC2

Izvedite več o tečaju "Industrijsko strojno upravljanje z velikimi podatki"

Vir: www.habr.com

Kupite zanesljivo gostovanje za strani z DDoS zaščito, VPS VDS strežniki 🔥 Kupite zanesljivo spletno gostovanje z zaščito DDoS, VPS VDS strežniki | ProHoster