La traducció de l'article es va preparar la vigília de l'inici del curs
La formació distribuïda en múltiples instàncies de computació d'alt rendiment pot reduir el temps d'entrenament de les xarxes neuronals profundes modernes en grans quantitats de dades des de setmanes fins a hores o fins i tot minuts, fent que aquesta tècnica d'entrenament prevalgui en aplicacions pràctiques d'aprenentatge profund. Els usuaris han d'entendre com compartir i sincronitzar dades en múltiples instàncies, cosa que al seu torn té un impacte important en l'eficiència de l'escala. A més, els usuaris també haurien de saber com implementar un script d'entrenament que s'executi en una sola instància a diverses instàncies.
En aquest article parlarem d'una manera ràpida i senzilla de distribuir l'aprenentatge mitjançant la biblioteca oberta d'aprenentatge profund Apache MXNet i el marc d'aprenentatge distribuït d'Horovod. Demostrarem clarament els avantatges de rendiment del marc d'Horovod i demostrarem com escriure un script d'entrenament MXNet perquè funcioni de manera distribuïda amb Horovod.
Què és Apache MXNet
és un marc d'aprenentatge profund de codi obert que s'utilitza per crear, entrenar i desplegar xarxes neuronals profundes. MXNet resumeix les complexitats associades a la implementació de xarxes neuronals, té un alt rendiment i escalable, i ofereix API per a llenguatges de programació populars com ara , , , , , , i altres.
Formació distribuïda en MXNet amb servidor de paràmetres
utilitza un enfocament de servidor de paràmetres. Utilitza un conjunt de servidors de paràmetres per recollir gradients de cada treballador, realitzar l'agregació i enviar gradients actualitzats als treballadors per a la següent iteració d'optimització. Determinar la proporció correcta de servidors i treballadors és la clau per a un escalat efectiu. Si només hi ha un servidor de paràmetres, pot resultar un coll d'ampolla en els càlculs. Per contra, si s'utilitzen massa servidors, la comunicació de molts a molts pot obstruir totes les connexions de xarxa.
Què és Horovod
és un marc d'aprenentatge profund distribuït obert desenvolupat a Uber. Aprofita tecnologies eficients entre GPU i entre nodes, com ara NVIDIA Collective Communications Library (NCCL) i Message Passing Interface (MPI) per distribuir i agregar paràmetres del model entre vorecs. Optimitza l'ús de l'ample de banda de la xarxa i s'escala bé quan es treballa amb models de xarxes neuronals profundes. Actualment admet diversos marcs d'aprenentatge automàtic populars, és a dir , Tensorflow, Keras i PyTorch.
Integració MXNet i Horovod
MXNet s'integra amb Horovod mitjançant les API d'aprenentatge distribuït definides a Horovod. API de comunicació d'Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementat mitjançant devolucions de trucada asíncrones del motor MXNet, com a part del seu gràfic de tasques. D'aquesta manera, el motor MXNet gestiona fàcilment les dependències de dades entre la comunicació i la computació per evitar pèrdues de rendiment a causa de la sincronització. Objecte optimitzador distribuït definit a Horovod horovod.DistributedOptimizer s’expandeix Optimizer a MXNet perquè cridi a les API d'Horovod corresponents per a actualitzacions de paràmetres distribuïdes. Tots aquests detalls d'implementació són transparents per als usuaris finals.
Inici ràpid
Podeu començar ràpidament a entrenar una petita xarxa neuronal convolucional al conjunt de dades MNIST mitjançant MXNet i Horovod al vostre MacBook.
Primer, instal·leu mxnet i horovod des de PyPI:
pip install mxnet
pip install horovodNota: si trobeu un error durant pip install horovodpotser haureu d'afegir una variable MACOSX_DEPLOYMENT_TARGET=10.vvOn vv – aquesta és la versió de la vostra versió de MacOS, per exemple, per a MacOSX Sierra haureu d'escriure MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod
A continuació, instal·leu OpenMPI .
Al final, descarregueu l'script de prova mxnet_mnist.py i executeu les ordres següents al terminal del MacBook al directori de treball:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyAixò executarà l'entrenament en dos nuclis del vostre processador. La sortida serà la següent:
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.870000Demostració de rendiment
En entrenar un model ResNet50-v1 en un conjunt de dades ImageNet en 64 GPU amb vuit instàncies p3.16xgran EC2, cadascuna conté 8 GPU NVIDIA Tesla V100 al núvol AWS, vam aconseguir un rendiment d'entrenament de 45000 imatges/s (és a dir, el nombre de mostres entrenades per segon). L'entrenament es va completar en 44 minuts després de 90 èpoques amb una millor precisió del 75.7%.
Ho vam comparar amb l'enfocament d'entrenament distribuït de MXNet d'utilitzar servidors de paràmetres en 8, 16, 32 i 64 GPU amb un sol servidor de paràmetres i una proporció de servidor a treballador d'1 a 1 i 2 a 1, respectivament. Podeu veure el resultat a la figura 1 a continuació. A l'eix Y de l'esquerra, les barres representen el nombre d'imatges per entrenar per segon, les línies reflecteixen l'eficiència d'escala (és a dir, la relació entre el rendiment real i ideal) a l'eix Y de la dreta. Com podeu veure, l'elecció del nombre de servidors afecta l'eficiència d'escala. Si només hi ha un servidor de paràmetres, l'eficiència d'escala baixa fins al 38% en 64 GPU. Per aconseguir la mateixa eficiència d'escala que amb Horovod, cal duplicar el nombre de servidors en relació amb el nombre de treballadors.

Figura 1. Comparació de l'aprenentatge distribuït mitjançant MXNet amb Horovod i amb el servidor de paràmetres
A la taula 1 següent, comparem el cost final per instància quan s'executen experiments en 64 GPU. L'ús de MXNet amb Horovod proporciona el millor rendiment al menor cost.

Taula 1. Comparació de costos entre l'Horovod i el servidor de paràmetres amb una relació servidor/treballador de 2 a 1.
Passos per reproduir
En els següents passos, us mostrarem com reproduir el resultat de la formació distribuïda mitjançant MXNet i Horovod. Per obtenir més informació sobre l'aprenentatge distribuït amb MXNet, llegiu .
Pas 1
Crea un clúster d'instàncies homogènies amb MXNet versió 1.4.0 o superior i Horovod versió 0.16.0 o superior per utilitzar entrenament distribuït. També hauràs d'instal·lar les biblioteques per a l'entrenament de GPU. Per a les nostres instàncies, hem triat Ubuntu 16.04 Linux, amb el controlador GPU 396.44, CUDA 9.2, la biblioteca cuDNN 7.2.1, el comunicador NCCL 2.2.13 i OpenMPI 3.1.1. També podeu utilitzar , on aquestes biblioteques ja estan preinstal·lades.
Pas 2
Afegiu la possibilitat de treballar amb l'API d'Horovod al vostre script d'entrenament MXNet. El següent script basat en l'API MXNet Gluon es pot utilitzar com a plantilla senzilla. Les línies en negreta són necessàries si ja teniu un guió d'entrenament corresponent. Aquí teniu alguns canvis crítics que heu de fer per aprendre amb Horovod:
- Estableix el context segons el rang local d'Horovod (línia 8) per entendre que l'entrenament es realitza amb el nucli de gràfics correcte.
- Passeu els paràmetres inicials d'un treballador a tots (línia 18) per assegurar-vos que tots els treballadors comencen amb els mateixos paràmetres inicials.
- Crea un Horovod DistributedOptimizer (línia 25) per actualitzar els paràmetres de manera distribuïda.
Per obtenir l'script complet, consulteu els exemples d'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 ...Pas 3
Inicieu sessió a un dels treballadors per iniciar la formació distribuïda mitjançant la directiva MPI. En aquest exemple, l'entrenament distribuït s'executa en quatre instàncies amb 4 GPU cadascuna i un total de 16 GPU al clúster. L'optimitzador de descens de gradient estocàstic (SGD) s'utilitzarà amb els hiperparàmetres següents:
- Mida del mini lot: 256
- taxa d'aprenentatge: 0.1
- impuls: 0.9
- decadència de pes: 0.0001
A mesura que vam escalar d'una GPU a 64 GPU, vam escalar linealment la taxa d'entrenament segons el nombre de GPU (de 0,1 per a 1 GPU a 6,4 per a 64 GPU), mantenint el nombre d'imatges per GPU a 256 (d'un lot de 256 imatges per a 1 GPU a 16 per a 384 GPU). Els paràmetres de descens de pes i impuls van canviar a mesura que augmentava el nombre de GPU. Hem utilitzat un entrenament de precisió mixt amb el tipus de dades float64 per a la passada avançada i float16 per als gradients per accelerar els càlculs float32 compatibles amb les GPU 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.pyConclusió
En aquest article, vam analitzar un enfocament escalable per a la formació de models distribuïts mitjançant Apache MXNet i Horovod. Hem demostrat l'eficiència d'escala i la rendibilitat en comparació amb l'enfocament del servidor de paràmetres al conjunt de dades ImageNet en què es va entrenar el model ResNet50-v1. També hem inclòs passos que podeu utilitzar per modificar un script existent per executar l'entrenament multi-instància amb Horovod.
Si acabeu de començar amb MXNet i l'aprenentatge profund, aneu a la pàgina d'instal·lació per crear primer MXNet. També recomanem la lectura de l'article per començar.
Si ja heu treballat amb MXNet i voleu provar l'aprenentatge distribuït amb Horovod, feu una ullada a , creeu-lo des de MXNet i seguiu l'exemple o .
*El cost es calcula en funció de AWS per a instàncies EC2
Més informació sobre el curs
Font: www.habr.com
