Învățare distribuită cu Apache MXNet și Horovod

Traducerea articolului a fost pregătită în ajunul începerii cursului „ML industrial pe date mari”

Antrenamentul distribuit pe mai multe instanțe de calcul de înaltă performanță poate reduce timpul de antrenament al rețelelor neuronale profunde moderne pe cantități mari de date de la săptămâni la ore sau chiar minute, făcând această tehnică de antrenament predominantă în aplicațiile practice ale învățării profunde. Utilizatorii trebuie să înțeleagă cum să partajeze și să sincronizeze datele în mai multe instanțe, ceea ce, la rândul său, are un impact major asupra eficienței scalării. În plus, utilizatorii ar trebui să știe și cum să implementeze un script de antrenament care rulează pe o singură instanță în mai multe instanțe.

În acest articol vom vorbi despre o modalitate rapidă și ușoară de a distribui învățarea folosind biblioteca deschisă de învățare profundă Apache MXNet și cadrul de învățare distribuită Horovod. Vom demonstra în mod clar beneficiile de performanță ale cadrului Horovod și vom demonstra cum să scrieți un script de antrenament MXNet, astfel încât să funcționeze într-o manieră distribuită cu Horovod.

Ce este Apache MXNet

Apache MX Net este un cadru de învățare profundă open-source care este utilizat pentru a crea, antrena și implementa rețele neuronale profunde. MXNet retrage complexitățile asociate cu implementarea rețelelor neuronale, este foarte performant și scalabil și oferă API-uri pentru limbaje de programare populare, cum ar fi Piton, C ++, Clojure, Java, Julia, R, Scala și altele.

Instruire distribuită în MXNet cu server de parametri

Modul standard de învățare distribuită în MXNet folosește o abordare de server de parametri. Utilizează un set de servere de parametri pentru a colecta gradienți de la fiecare lucrător, pentru a efectua agregare și pentru a trimite gradienți actualizați înapoi lucrătorilor pentru următoarea iterație de optimizare. Determinarea raportului corect dintre servere și lucrători este cheia pentru scalarea eficientă. Dacă există un singur server de parametri, se poate dovedi a fi un blocaj în calcule. În schimb, dacă sunt folosite prea multe servere, comunicarea de la mulți la mulți poate înfunda toate conexiunile de rețea.

Ce este Horovod

Horovod este un cadru de învățare profund distribuit și deschis dezvoltat de Uber. Utilizează tehnologii eficiente între GPU și între noduri, cum ar fi Biblioteca de comunicații colective NVIDIA (NCCL) și Interfața de trecere a mesajelor (MPI) pentru a distribui și agrega parametrii modelului între vorecs. Optimizează utilizarea lățimii de bandă a rețelei și se scalează bine atunci când lucrează cu modele de rețele neuronale profunde. În prezent, acceptă mai multe cadre populare de învățare automată, și anume MX Net, Tensorflow, Keras și PyTorch.

Integrarea MXNet și Horovod

MXNet se integrează cu Horovod prin intermediul API-urilor Distributed Learning definite în Horovod. API-uri de comunicare Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementat folosind apeluri inverse asincrone ale motorului MXNet, ca parte a graficului sarcinilor sale. În acest fel, dependențele de date dintre comunicare și calcul sunt ușor de gestionat de motorul MXNet pentru a evita pierderile de performanță din cauza sincronizării. Obiect optimizator distribuit definit în Horovod horovod.DistributedOptimizer se extinde Instrumentul de optimizare a în MXNet, astfel încât să apeleze API-urile Horovod corespunzătoare pentru actualizări distribuite de parametri. Toate aceste detalii de implementare sunt transparente pentru utilizatorii finali.

Pornire rapidă

Puteți începe rapid antrenamentul unei mici rețele neuronale convoluționale pe setul de date MNIST folosind MXNet și Horovod pe MacBook.
Mai întâi, instalați mxnet și horovod din PyPI:

pip install mxnet
pip install horovod

Notă: Dacă întâmpinați o eroare în timpul pip install horovodpoate trebuie să adăugați o variabilă MACOSX_DEPLOYMENT_TARGET=10.vvUnde vv – aceasta este versiunea versiunii dvs. de MacOS, de exemplu, pentru MacOSX Sierra va trebui să scrieți MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Apoi instalați OpenMPI prin urmare.

La sfârșit, descărcați scriptul de testare mxnet_mnist.py prin urmare și rulați următoarele comenzi în terminalul MacBook din directorul de lucru:

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

Aceasta va rula antrenament pe două nuclee ale procesorului dumneavoastră. Ieșirea va fi următoarea:

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 de performanță

Când antrenați un model ResNet50-v1 pe un set de date ImageNet pe 64 de GPU-uri cu opt instanțe p3.16xmărire EC2, fiecare conținând 8 GPU-uri NVIDIA Tesla V100 pe cloud AWS, am atins un randament de antrenament de 45000 de imagini/sec (adică, numărul de mostre antrenate pe secundă). Antrenament finalizat în 44 de minute după 90 de epoci, cu o precizie maximă de 75.7%.

Am comparat acest lucru cu abordarea de instruire distribuită a MXNet de utilizare a serverelor de parametri pe 8, 16, 32 și 64 de GPU-uri cu un singur server cu parametri și un raport de server la lucrător de 1 la 1 și, respectiv, 2 la 1. Puteți vedea rezultatul în figura 1 de mai jos. Pe axa y din stânga, barele reprezintă numărul de imagini de antrenat pe secundă, liniile reflectă eficiența de scalare (adică raportul dintre debitul real și cel ideal) pe axa y din dreapta. După cum puteți vedea, alegerea numărului de servere afectează eficiența de scalare. Dacă există un singur server de parametri, eficiența de scalare scade la 38% pe 64 de GPU-uri. Pentru a obține aceeași eficiență de scalare ca și în cazul Horovod, trebuie să dublați numărul de servere în raport cu numărul de lucrători.

Învățare distribuită cu Apache MXNet și Horovod
Figura 1. Comparația învățării distribuite folosind MXNet cu Horovod și cu serverul de parametri

În tabelul 1 de mai jos, comparăm costul final pe instanță atunci când rulăm experimente pe 64 de GPU. Utilizarea MXNet cu Horovod oferă cel mai bun debit la cel mai mic cost.

Învățare distribuită cu Apache MXNet și Horovod
Tabelul 1. Comparația costurilor între Horovod și Parameter Server cu un raport de server la lucrător de 2 la 1.

pasi pentru reproducere

În următorii pași, vă vom arăta cum să reproduceți rezultatul antrenamentului distribuit folosind MXNet și Horovod. Pentru a afla mai multe despre învățarea distribuită cu MXNet, citiți acest post.

Pasul 1

Creați un cluster de instanțe omogene cu MXNet versiunea 1.4.0 sau o versiune ulterioară și Horovod versiunea 0.16.0 sau o versiune ulterioară pentru a utiliza antrenament distribuit. De asemenea, va trebui să instalați bibliotecile pentru antrenamentul GPU. Pentru instanțele noastre, am ales Ubuntu 16.04 Linux, cu driver GPU 396.44, CUDA 9.2, biblioteca cuDNN 7.2.1, NCCL communicator 2.2.13 și OpenMPI 3.1.1. De asemenea, puteți utiliza Amazon Deep Learning AMI, unde aceste biblioteci sunt deja preinstalate.

Pasul 2

Adăugați capacitatea de a lucra cu API-ul Horovod la scriptul de antrenament MXNet. Scriptul de mai jos bazat pe MXNet Gluon API poate fi folosit ca un șablon simplu. Rândurile cu caractere aldine sunt necesare dacă aveți deja un script de antrenament corespunzător. Iată câteva modificări critice pe care trebuie să le faci pentru a învăța cu Horovod:

  • Setați contextul în funcție de rangul local Horovod (linia 8) pentru a înțelege că antrenamentul se efectuează pe nucleul grafic corect.
  • Transmiteți parametrii inițiali de la un lucrător la toți (linia 18) pentru a vă asigura că toți lucrătorii încep cu aceiași parametri inițiali.
  • Creați un Horovod DistributedOptimizer (linia 25) pentru a actualiza parametrii într-o manieră distribuită.

Pentru a obține scriptul complet, vă rugăm să consultați exemplele 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    ...

Pasul 3

Conectați-vă la unul dintre lucrători pentru a începe instruirea distribuită folosind directiva MPI. În acest exemplu, instruirea distribuită rulează pe patru instanțe cu câte 4 GPU-uri fiecare și un total de 16 GPU-uri în cluster. Optimizatorul Stochastic Gradient Descent (SGD) va fi utilizat cu următorii hiperparametri:

  • dimensiune mini-lot: 256
  • rata de învățare: 0.1
  • impuls: 0.9
  • scădere în greutate: 0.0001

Pe măsură ce am scalat de la un GPU la 64 de GPU, am scalat liniar rata de antrenament în funcție de numărul de GPU (de la 0,1 pentru 1 GPU la 6,4 pentru 64 de GPU), păstrând în același timp numărul de imagini per GPU la 256 ( dintr-un lot de 256 de imagini pentru 1 GPU până la 16 pentru 384 de GPU). Parametrii de scădere a greutății și de impuls s-au schimbat pe măsură ce numărul de GPU-uri a crescut. Am folosit antrenament mixt de precizie cu tipul de date float64 pentru trecerea înainte și float16 pentru gradienți pentru a accelera calculele float32 acceptate de GPU-urile 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

Concluzie

În acest articol, am analizat o abordare scalabilă a instruirii modelelor distribuite folosind Apache MXNet și Horovod. Am demonstrat eficiența scalării și rentabilitatea în comparație cu abordarea serverului de parametri pe setul de date ImageNet pe care a fost antrenat modelul ResNet50-v1. Am inclus, de asemenea, pași pe care îi puteți folosi pentru a modifica un script existent pentru a rula antrenament cu mai multe instanțe folosind Horovod.

Dacă abia ați început să utilizați MXNet și deep learning, accesați pagina de instalare MXNepentru a construi mai întâi MXNet. De asemenea, vă recomandăm insistent să citiți articolul MXNet în 60 de minutepentru a incepe.

Dacă ați lucrat deja cu MXNet și doriți să încercați învățarea distribuită cu Horovod, atunci aruncați o privire la Pagina de instalare Horovod, construiți-l din MXNet și urmați exemplul MNIST sau IMAGEnet.

*costul se calculează pe baza tarifele orare AWS pentru instanțe EC2

Aflați mai multe despre curs „ML industrial pe date mari”

Sursa: www.habr.com

Cumpărați găzduire de încredere pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără găzduire web fiabilă cu protecție DDoS, servere VPS VDS | ProHoster