Distribuirano učenje uz Apache MXNet i Horovod

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

Distribuirana obuka na višestrukim računarskim instancama visokih performansi može smanjiti vrijeme obuke modernih dubokih neuronskih mreža na velikim količinama podataka od sedmica do sati ili čak minuta, čineći ovu tehniku ​​obuke preovlađujućom u praktičnim primjenama dubokog učenja. Korisnici moraju razumjeti kako dijeliti i sinkronizirati podatke na više instanci, što zauzvrat ima veliki utjecaj na efikasnost skaliranja. Osim toga, korisnici bi također trebali znati kako primijeniti skriptu za obuku koja se izvodi na jednoj instanci na više instanci.

U ovom članku ćemo govoriti o brzom i jednostavnom načinu distribucije učenja koristeći otvorenu biblioteku dubokog učenja Apache MXNet i Horovod distribuirani okvir za učenje. Jasno ćemo demonstrirati prednosti performansi Horovod framework-a i pokazati kako napisati MXNet skriptu za obuku tako da radi na distribuiran način s Horovodom.

Šta je Apache MXNet?

Apache MX Net je okvir za duboko učenje otvorenog koda koji se koristi za kreiranje, obuku i implementaciju dubokih neuronskih mreža. MXNet apstrahuje složenosti povezane sa implementacijom neuronskih mreža, visoko je efikasan i skalabilan i nudi API-je za popularne programske jezike kao što su piton, C ++, Clojure, Java, Julia, R, Scala i drugi.

Distribuirana obuka u MXNet sa serverom parametara

Standardni distribuirani modul za učenje u MXNetu koristi pristup serveru parametara. Koristi skup servera parametara da prikupi gradijente od svakog radnika, izvrši agregaciju i pošalje ažurirane gradijente natrag radnicima za sljedeću iteraciju optimizacije. Određivanje ispravnog odnosa između servera i radnika ključ je za efikasno skaliranje. Ako postoji samo jedan server parametara, može se pokazati kao usko grlo u proračunima. Suprotno tome, ako se koristi previše servera, komunikacija više prema mnogo može začepiti sve mrežne veze.

Šta je Horovod

Horovod je otvoreni distribuirani okvir dubokog učenja razvijen u Uberu. Koristi efikasne 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 vorecove. Optimizira korištenje propusnog opsega mreže i dobro skalira kada se radi s dubokim modelima neuronskih mreža. Trenutno podržava nekoliko popularnih okvira za strojno učenje, naime MX Net, Tensorflow, Keras i PyTorch.

Integracija MXNeta i Horovoda

MXNet se integriše sa Horovodom preko API-ja za distribuirano učenje definisanih u Horovodu. Horovod komunikacioni API-ji horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementiran korištenjem asinhronih povratnih poziva MXNet motora, kao dio njegovog grafa zadataka. Na ovaj način, MXNet motor lako upravlja ovisnostima podataka između komunikacije i računanja kako bi se izbjegao gubitak performansi zbog sinhronizacije. Distribuirani objekt optimizatora definiran u Horovodu horovod.DistributedOptimizer širi se Optimizer u MXNet-u tako da poziva odgovarajuće Horovod API-je za distribuirana ažuriranja parametara. Svi ovi detalji implementacije su transparentni za krajnje korisnike.

Brzi početak

Možete brzo početi trenirati malu konvolucionu neuronsku mrežu na MNIST skupu podataka koristeći MXNet i Horovod na vašem MacBook-u.
Prvo instalirajte mxnet i horovod iz PyPI:

pip install mxnet
pip install horovod

Napomena: Ako naiđete na grešku tokom pip install horovodmožda trebate dodati varijablu MACOSX_DEPLOYMENT_TARGET=10.vvgde vv – ovo je verzija vaše MacOS verzije, na primjer, za MacOSX Sierra morat ćete napisati MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Zatim instalirajte OpenMPI odavde.

Na kraju preuzmite testnu skriptu mxnet_mnist.py odavde 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

Demo performansi

Kada trenirate ResNet50-v1 model na ImageNet skupu podataka na 64 GPU-a sa osam instanci p3.16xlarge EC2, od kojih svaki sadrži 8 NVIDIA Tesla V100 GPU-a na AWS oblaku, postigli smo propusnost treninga od 45000 slika u sekundi (tj. broj obučenih uzoraka u sekundi). Obuka je završena za 44 minuta nakon 90 epoha sa najboljom preciznošću od 75.7%.

Uporedili smo ovo sa MXNet-ovim pristupom distribuirane obuke koji koristi servere parametara na 8, 16, 32 i 64 GPU-a sa jednim serverom parametara i odnosom servera i radnika od 1 prema 1 i 2 prema 1, respektivno. Rezultat možete vidjeti na slici 1 ispod. Na y-osi na lijevoj strani, trake predstavljaju broj slika koje treba trenirati u sekundi, linije odražavaju efikasnost skaliranja (to jest, omjer stvarne i idealne propusnosti) na y-osi s desne strane. Kao što vidite, izbor broja servera utiče na efikasnost skaliranja. Ako postoji samo jedan server parametara, efikasnost skaliranja pada na 38% na 64 GPU-a. Da biste postigli istu efikasnost skaliranja kao kod Horovoda, potrebno je udvostručiti broj servera u odnosu na broj radnika.

Distribuirano učenje uz Apache MXNet i Horovod
Slika 1. Poređenje distribuiranog učenja koristeći MXNet sa Horovodom i sa serverom parametara

U tabeli 1 u nastavku upoređujemo konačnu cijenu po instanci pri izvođenju eksperimenata na 64 GPU-a. Korištenje MXNeta sa Horovodom pruža najbolju propusnost uz najnižu cijenu.

Distribuirano učenje uz Apache MXNet i Horovod
Tabela 1. Poređenje troškova između Horovoda i Parameter Servera s omjerom između servera i radnika 2 prema 1.

Koraci za reprodukciju

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

korak 1

Kreirajte 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, sa GPU drajverom 396.44, CUDA 9.2, cuDNN 7.2.1 bibliotekom, NCCL 2.2.13 komunikatorom i OpenMPI 3.1.1. Takođe možete koristiti Amazon Deep Learning AMI, gdje su ove biblioteke već unaprijed instalirane.

korak 2

Dodajte mogućnost rada sa Horovod API-jem vašoj MXNet skripti za obuku. Donja skripta zasnovana na MXNet Gluon API-ju može se koristiti kao jednostavan šablon. Podebljani redovi su potrebni ako već imate odgovarajuću skriptu za obuku. Evo nekoliko kritičnih promjena koje trebate napraviti da biste učili s Horovodom:

  • Postavite kontekst prema lokalnom rangu Horovoda (red 8) da biste razumjeli da se obuka izvodi na ispravnoj grafičkoj jezgri.
  • Prenesite početne parametre od jednog radnika do svih (red 18) kako biste osigurali da svi radnici počinju s istim početnim parametrima.
  • Napravite Horovod DistributedOptimizer (red 25) da ažurirate parametre na distribuiran 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 da 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 Stochastic Gradient Descent (SGD) će se koristiti 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 sa jednog GPU-a na 64 GPU-a, linearno smo skalirali stopu obuke prema broju GPU-a (od 0,1 za 1 GPU na 6,4 za 64 GPU-a), dok smo zadržali broj slika po GPU-u na 256 (iz serije 256 slika za 1 GPU do 16 za 384 GPU-a). Parametri opadanja težine i momenta su se mijenjali kako se broj GPU-ova povećavao. Koristili smo mješoviti precizan trening sa tipom podataka float64 za prolaz naprijed i float16 za gradijente da bismo ubrzali float32 proračune koje podržavaju NVIDIA Tesla GPU-ovi.

$ 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 članku smo pogledali skalabilan pristup obuci distribuiranog modela koristeći Apache MXNet i Horovod. Pokazali smo efikasnost skaliranja i isplativost u poređenju sa pristupom servera parametara na ImageNet skupu podataka na kojem je obučen ResNet50-v1 model. Također smo uključili korake koje možete koristiti da modificirate postojeću skriptu za pokretanje višeinstancnog treninga koristeći Horovod.

Ako tek počinjete sa MXNet-om i dubokim učenjem, idite na stranicu za instalaciju MXNeda prvo napravi MXNet. Također preporučujemo da pročitate članak MXNet za 60 minutaza početak.

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

*trošak se obračunava na osnovu satnice AWS za EC2 instance

Saznajte više o kursu "Industrijski ML na velikim podacima"

izvor: www.habr.com

Dodajte komentar