Prijevod članka pripremljen je uoči početka tečaja
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
Distribuirana obuka u MXNet-u s poslužiteljem parametara
Što je Horovod
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
Na kraju preuzmite test skriptu mxnet_mnist.py
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.
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.
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
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
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
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
Ako ste već radili s MXNetom i želite isprobati distribuirano učenje s Horovodom, pogledajte
*trošak se izračunava na temelju
Saznajte više o tečaju
Izvor: www.habr.com