Distribuirano učenje s Apache MXNet i Horovodom

Prijevod članka pripremljen je uoči početka tečaja "Industrijski ML na velikim podacima"

Distribuirana obuka na više računalnih instanci visokih performansi može smanjiti vrijeme obuke modernih dubokih neuronskih mreža na velikim količinama podataka s tjedana na sate ili čak minute, čineći ovu tehniku ​​obuke prevladavajućom u praktičnim primjenama dubokog učenja. Korisnici moraju razumjeti kako dijeliti i sinkronizirati podatke u više instanci, što zauzvrat ima veliki utjecaj na učinkovitost skaliranja. Osim toga, korisnici bi također trebali znati kako implementirati skriptu za obuku koja se izvodi na jednoj instanci na više instanci.

U ovom ćemo članku govoriti o brzom i jednostavnom načinu distribucije učenja pomoću otvorene biblioteke dubokog učenja Apache MXNet i okvira za distribuirano učenje Horovod. Jasno ćemo demonstrirati prednosti izvedbe okvira Horovod i pokazati kako napisati MXNet skriptu za obuku tako da radi na distribuiran način s Horovodom.

Što je Apache MXNet

Apache MX Net je okvir dubokog učenja otvorenog koda koji se koristi za stvaranje, obuku i implementaciju dubokih neuronskih mreža. MXNet apstrahira složenosti povezane s implementacijom neuronskih mreža, vrlo je učinkovit i skalabilan te nudi API-je za popularne programske jezike kao što su Piton, C + +, Clojure, Java, Julia, R, Skala i drugi.

Distribuirana obuka u MXNet-u s poslužiteljem parametara

Standardni distribuirani modul učenja u MXNet-u koristi pristup poslužitelju parametara. Koristi skup poslužitelja parametara za prikupljanje gradijenata od svakog radnika, izvođenje agregacije i slanje ažuriranih gradijenata natrag radnicima za sljedeću iteraciju optimizacije. Određivanje ispravnog omjera poslužitelja i radnika ključ je učinkovitog skaliranja. Ako postoji samo jedan poslužitelj parametara, može se pokazati da je usko grlo u izračunima. Nasuprot tome, ako se koristi previše poslužitelja, komunikacija više-prema-više može začepiti sve mrežne veze.

Što je Horovod

Horovod je otvoreni distribuirani okvir dubokog učenja razvijen u Uberu. Iskorištava učinkovite cross-GPU i cross-node tehnologije kao što su NVIDIA Collective Communications Library (NCCL) i Message Passing Interface (MPI) za distribuciju i agregaciju parametara modela kroz vorecs. Optimizira korištenje propusnosti mreže i dobro se skalira pri radu s modelima dubokih neuronskih mreža. Trenutno podržava nekoliko popularnih okvira strojnog učenja, naime MX Net, Tensorflow, Keras i PyTorch.

MXNet i Horovod integracija

MXNet se integrira s Horovodom putem API-ja za distribuirano učenje definiranih u Horovodu. Komunikacijski API-ji Horovoda horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementiran korištenjem asinkronih povratnih poziva MXNet motora, kao dio njegovog grafa zadataka. Na ovaj način, ovisnosti podataka između komunikacije i računanja lako obrađuju MXNet motor kako bi se izbjegli gubici performansi zbog sinkronizacije. Objekt distribuiranog optimizatora definiran u Horovodu horovod.DistributedOptimizer širi se optimizaciju u MXNet tako da poziva odgovarajuće Horovod API-je za ažuriranje distribuiranih parametara. Svi ovi detalji implementacije transparentni su krajnjim korisnicima.

Brzi početak

Možete brzo započeti obuku male konvolucijske neuronske mreže na skupu podataka MNIST koristeći MXNet i Horovod na vašem MacBooku.
Prvo instalirajte mxnet i horovod iz PyPI:

pip install mxnet
pip install horovod

Napomena: Ako naiđete na pogrešku tijekom pip instalirati horovodmožda trebate dodati varijablu MACOSX_DEPLOYMENT_TARGET=10.vvGdje vv – ovo je verzija vaše MacOS verzije, na primjer, za MacOSX Sierra koju ćete morati napisati MACOSX_DEPLOYMENT_TARGET=10.12 pip instalirajte horovod

Zatim instalirajte OpenMPI stoga.

Na kraju preuzmite test skriptu mxnet_mnist.py stoga i pokrenite sljedeće naredbe na MacBook terminalu u radnom direktoriju:

mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py

Ovo će pokrenuti obuku na dvije jezgre vašeg procesora. Izlaz će biti sljedeći:

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

Demonstracija izvedbe

Prilikom obuke modela ResNet50-v1 na skupu podataka ImageNet na 64 GPU-a s osam instanci p3.16xveliki EC2, od kojih svaki sadrži 8 NVIDIA Tesla V100 GPU-ova na AWS oblaku, postigli smo protok obuke od 45000 44 slika/s (tj. broj obučenih uzoraka u sekundi). Obuka je završena za 90 minute nakon 75.7 epoha s najboljom točnošću od XNUMX%.

Usporedili smo to s MXNetovim pristupom distribuiranog treninga korištenja poslužitelja parametara na 8, 16, 32 i 64 GPU-a s jednim poslužiteljem parametara i omjerom poslužitelja i radnika od 1 prema 1 odnosno 2 prema 1. Rezultat možete vidjeti na slici 1 u nastavku. Na y-osi s lijeve strane, trake predstavljaju broj slika za treniranje u sekundi, linije odražavaju učinkovitost skaliranja (to jest, omjer stvarnog i idealnog protoka) na y-osi s desne strane. Kao što vidite, izbor broja poslužitelja utječe na učinkovitost skaliranja. Ako postoji samo jedan poslužitelj parametara, učinkovitost skaliranja pada na 38% na 64 GPU-a. Da biste postigli istu učinkovitost skaliranja kao kod Horovoda, trebate udvostručiti broj poslužitelja u odnosu na broj radnika.

Distribuirano učenje s Apache MXNet i Horovodom
Slika 1. Usporedba distribuiranog učenja korištenjem MXNeta s Horovodom i poslužiteljem parametara

U tablici 1 u nastavku uspoređujemo konačnu cijenu po instanci pri izvođenju eksperimenata na 64 GPU-a. Korištenje MXNeta s Horovodom osigurava najbolju propusnost po najnižoj cijeni.

Distribuirano učenje s Apache MXNet i Horovodom
Tablica 1. Usporedba troškova između Horovoda i Parameter Servera s omjerom poslužitelja i radnika od 2 prema 1.

Koraci za reprodukciju

U sljedećim koracima pokazat ćemo vam kako reproducirati rezultat distribuiranog treninga koristeći MXNet i Horovod. Kako biste saznali više o distribuiranom učenju uz MXNet, pročitajte ovaj post.

Korak 1

Stvorite klaster homogenih instanci s MXNet verzijom 1.4.0 ili novijom i Horovod verzijom 0.16.0 ili novijom za korištenje distribuiranog učenja. Također ćete morati instalirati biblioteke za GPU obuku. Za naše primjere odabrali smo Ubuntu 16.04 Linux, s GPU Driver 396.44, CUDA 9.2, bibliotekom cuDNN 7.2.1, NCCL 2.2.13 komunikatorom i OpenMPI 3.1.1. Također možete koristiti Amazon Deep Learning AMI, gdje su te biblioteke već unaprijed instalirane.

Korak 2

Dodajte mogućnost rada s Horovod API-jem svojoj MXNet skripti za obuku. Donja skripta temeljena na MXNet Gluon API-ju može se koristiti kao jednostavan predložak. Redovi podebljani su potrebni ako već imate odgovarajuću skriptu za obuku. Evo nekoliko kritičnih promjena koje morate napraviti da biste učili s Horovodom:

  • Postavite kontekst prema rangu lokalnog Horovoda (redak 8) kako biste shvatili da se obuka izvodi na ispravnoj grafičkoj jezgri.
  • Proslijedite početne parametre od jednog radnika do svih (linija 18) kako biste osigurali da svi radnici počnu s istim početnim parametrima.
  • Napravi Horovod DistributedOptimizer (redak 25) za ažuriranje parametara na distribuirani način.

Da biste dobili potpunu skriptu, pogledajte primjere 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 na jednog od radnika kako biste započeli distribuiranu obuku koristeći MPI direktivu. U ovom primjeru, distribuirana obuka radi na četiri instance sa po 4 GPU-a i ukupno 16 GPU-a u klasteru. Optimizator stohastičkog gradijenta (SGD) koristit će se sa sljedećim hiperparametrima:

  • veličina mini serije: 256
  • stopa učenja: 0.1
  • zamah: 0.9
  • pad težine: 0.0001

Kako smo skalirali s jednog GPU-a na 64 GPU-a, linearno smo skalirali stopu obuke prema broju GPU-a (od 0,1 za 1 GPU do 6,4 za 64 GPU-a), zadržavajući broj slika po GPU-u na 256 (iz serije 256 slika za 1 GPU do 16 za 384 GPU-a). Parametri pada težine i momenta mijenjali su se kako se povećavao broj GPU-a. Koristili smo mješoviti trening preciznosti s tipom podataka float64 za prolaz naprijed i float16 za gradijente kako bismo ubrzali izračune float32 koje podržava NVIDIA Tesla GPU.

$ 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čak

U ovom smo članku pogledali skalabilni pristup obuci distribuiranog modela koristeći Apache MXNet i Horovod. Demonstrirali smo učinkovitost skaliranja i isplativost u usporedbi s pristupom poslužitelja parametara na skupu podataka ImageNet na kojem je obučen model ResNet50-v1. Također smo uključili korake koje možete koristiti za izmjenu postojeće skripte za izvođenje obuke s više instanci pomoću Horovoda.

Ako ste tek počeli koristiti MXNet i duboko učenje, idite na stranicu za instalaciju MXNeda prvo izgradite MXNet. Također toplo preporučujemo čitanje članka MXNet za 60 minutazapočeti.

Ako ste već radili s MXNetom i želite isprobati distribuirano učenje s Horovodom, pogledajte Stranica za instalaciju Horovoda, izgradite ga iz MXNeta i slijedite primjer MNIST ili ImageNet.

*trošak se izračunava na temelju satnice AWS za EC2 instance

Saznajte više o tečaju "Industrijski ML na velikim podacima"

Izvor: www.habr.com

Dodajte komentar