Apprendimentu distribuitu cù Apache MXNet è Horovod

A traduzzione di l'articulu hè stata preparata à a vigilia di l'iniziu di u corsu "ML industriale nantu à Big Data"

A furmazione distribuita nantu à parechje istanze di computing d'altu rendiment pò riduce u tempu di furmazione di e reti neurali profonde muderne nantu à una grande quantità di dati da settimane à ore o ancu minuti, facendu chì sta tecnica di furmazione prevale in l'applicazioni pratiche di l'apprendimentu profondu. L'utilizatori devenu capisce cumu sparte è sincronizà e dati in parechje istanze, chì à u turnu hà un impattu maiò in l'efficienza di scala. Inoltre, l'utilizatori anu ancu sapè cumu implementà un script di furmazione chì corre nantu à una sola istanza à parechje istanze.

In questu articulu parleremu di un modu rapidu è faciule per distribuisce l'apprendimentu utilizendu a biblioteca aperta di apprendimentu profonda Apache MXNet è u quadru di apprendimentu distribuitu Horovod. Dimustraremu chjaramente i benefici di u rendiment di u framework Horovod è dimustrà cumu scrive un script di furmazione MXNet in modu chì travaglia in modu distribuitu cù Horovod.

Cosa hè Apache MXNet

Apache MX Net hè un framework di apprendimentu profondu open-source chì hè utilizatu per creà, furmà è implementà rete neurali profonde. MXNet astrae e cumplessità assuciate à l'implementazione di rete neurali, hè altamente performante è scalabile, è offre API per i linguaggi di prugrammazione populari cum'è pitone, C ++, Clojure, Java, Julia, R, Scala è altri.

Formazione distribuita in MXNet cù u servitore di parametri

Modulu di apprendimentu distribuitu standard in MXNet usa un accostu di u servitore di parametri. Utiliza un inseme di servitori di parametri per cullà gradienti da ogni travagliadore, eseguisce l'aggregazione, è mandà gradienti aghjurnati torna à i travagliadori per a prossima iterazione di ottimisazione. A determinazione di u rapportu currettu di i servitori à i travagliadori hè a chjave per una scala efficace. Se ci hè solu un servitore di paràmetri, pò esse un collu di buttiglia in i calculi. À u cuntrariu, si sò usati troppu servitori, a cumunicazione da parechji à parechji pò sbattà tutte e cunnessione di a rete.

Cosa hè Horovod

Horovod hè un framework di apprendimentu profondu distribuitu apertu sviluppatu in Uber. Sfrutta tecnulugii efficaci cross-GPU è cross-node cum'è NVIDIA Collective Communications Library (NCCL) è Message Passing Interface (MPI) per distribuisce è aggregate i parametri di mudelli in vorecs. Ottimizza l'usu di a larghezza di banda di a rete è scala bè quandu travaglia cù mudelli di rete neurale profonda. Attualmente supporta parechji frameworks di apprendimentu automaticu populari, vale à dì MX Net, Tensorflow, Keras è PyTorch.

Integrazione MXNet è Horovod

MXNet s'integra cù Horovod attraversu l'API di apprendimentu distribuitu definite in Horovod. API di cumunicazione Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementatu utilizendu callbacks asincroni di u mutore MXNet, cum'è parte di u so graficu di u so compitu. In questu modu, e dipendenze di dati trà a cumunicazione è a computazione sò facilmente gestite da u mutore MXNet per evità pèrdite di rendiment per via di a sincronizazione. Ughjettu di ottimizzatore distribuitu definitu in Horovod horovod.DistributedOptimizer si espande Optimizer in MXNet in modu chì chjama l'API Horovod currispundenti per l'aghjurnamenti di parametri distribuiti. Tutti questi dettagli di implementazione sò trasparenti per l'utilizatori finali.

Partenza rapida

Pudete rapidamente cumincià à furmà una piccula rete neurale cunvoluzionale nantu à u dataset MNIST utilizendu MXNet è Horovod in u vostru MacBook.
Prima, installate mxnet è horovod da PyPI:

pip install mxnet
pip install horovod

Nota: Sè vo scontru un errore durante pip install horovodforsi avete bisognu di aghjunghje una variabile MACOSX_DEPLOYMENT_TARGET=10.vvinduve vv - Questa hè a versione di a vostra versione MacOS, per esempiu, per MacOSX Sierra avete bisognu di scrive MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Allora installate OpenMPI da quì.

À a fine, scaricate u script di prova mxnet_mnist.py da quì è eseguite i seguenti cumandamenti in u terminal MacBook in u cartulare di travagliu:

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

Questu currerà a furmazione nantu à dui core di u vostru processatore. L'output serà u seguente:

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

Performance Demo

Quandu addestrate un mudellu ResNet50-v1 nantu à un set di dati ImageNet nantu à 64 GPU cù ottu istanze p3.16xlarge EC2, ognuna chì cuntene 8 GPU NVIDIA Tesla V100 in nuvola AWS, avemu ottinutu un rendimentu di furmazione di 45000 images / sec (vale à dì, u numeru di campioni furmati per seconda). A furmazione cumpleta in 44 minuti dopu à 90 epoche cù una megliu precisione di 75.7%.

Avemu paragunatu questu cù l'approcciu di furmazione distribuitu di MXNet di utilizà i servitori di paràmetri in 8, 16, 32 è 64 GPU cù un servitore di paràmetru unicu è un rapportu di u servitore à u travagliu di 1 à 1 è 2 à 1, rispettivamente. Pudete vede u risultatu in Figura 1 sottu. Nant'à l'assi y à a manca, i bars rapprisentanu u numeru d'imaghjini per furmà per seconda, i linii riflettenu l'efficienza di scaling (vale à dì, u rapportu di u throughput attuale à l'ideale) nantu à l'assi y à a diritta. Comu pudete vede, l'scelta di u numeru di servitori afecta l'efficienza di scala. Se ci hè solu un servitore di paràmetri, l'efficienza di scaling cade à 38% in 64 GPU. Per ottene a listessa efficienza di scala cum'è cù Horovod, avete bisognu di duppià u numeru di servitori relative à u numeru di travagliadori.

Apprendimentu distribuitu cù Apache MXNet è Horovod
Figura 1. Comparazione di l'apprendimentu distribuitu cù MXNet cù Horovod è cù u servitore di paràmetri

In a Tabella 1 sottu, paragunemu u costu finali per esempiu quandu eseguite esperimenti nantu à 64 GPU. Utilizà MXNet cù Horovod furnisce u megliu throughput à u costu più bassu.

Apprendimentu distribuitu cù Apache MXNet è Horovod
Table 1. Comparazione di costu trà Horovod è Parameter Server cù un servitore à u rapportu di u travagliu di 2 à 1.

Passi per ripruduce

In i prossimi passi, vi mustraremu cumu ripruduce u risultatu di furmazione distribuita cù MXNet è Horovod. Per sapè di più nantu à l'apprendimentu distribuitu cù MXNet leghje stu postu.

mossa 1

Crea un cluster di istanze omogenee cù a versione MXNet 1.4.0 o superiore è a versione Horovod 0.16.0 o superiore per utilizà l'apprendimentu distribuitu. Avete ancu bisognu di installà librerie per a furmazione GPU. Per i nostri casi, avemu sceltu Ubuntu 16.04 Linux, cù GPU Driver 396.44, CUDA 9.2, biblioteca cuDNN 7.2.1, comunicatore NCCL 2.2.13 è OpenMPI 3.1.1. Pudete ancu aduprà Amazon Deep Learning AMI, induve queste librerie sò digià preinstallate.

mossa 2

Aghjunghjite a capacità di travaglià cù l'API Horovod à u vostru script di furmazione MXNet. U scrittore sottu basatu annantu à l'API MXNet Gluon pò esse usatu cum'è un mudellu simplice. I linii in grassu sò necessarii se avete digià un script di furmazione currispundente. Eccu alcuni cambiamenti critichi chì duvete fà per amparà cù Horovod:

  • Stabilite u cuntestu secondu a classificazione Horovod lucale (linea 8) per capisce chì a furmazione hè realizata nantu à u core gràficu currettu.
  • Passà i paràmetri iniziali da un travagliadore à tutti (linea 18) per assicurà chì tutti i travagliadori cumincianu cù i stessi paràmetri iniziali.
  • Crea un Horovod DistributedOptimizer (linea 25) per aghjurnà i paràmetri in una manera distribuita.

Per uttene u script sanu, fate riferimentu à l'esempii di 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    ...

mossa 3

Accedi à unu di i travagliadori per inizià a furmazione distribuita cù a direttiva MPI. In questu esempiu, a furmazione distribuita corre in quattru casi cù 4 GPU ognunu, è un totale di 16 GPU in u cluster. L'ottimizzatore Stochastic Gradient Descent (SGD) serà utilizatu cù i seguenti iperparametri:

  • dimensione mini-batch: 256
  • tassu di apprendimentu: 0.1
  • impulsu: 0.9
  • decadenza di pesu: 0.0001

Cume avemu scalatu da una GPU à 64 GPU, avemu scalatu linearmente a tarifa di furmazione secondu u numeru di GPU (da 0,1 per 1 GPU à 6,4 per 64 GPU), mantenendu u numeru d'imaghjini per GPU à 256 (da un batch di GPU). 256 images per 1 GPU à 16 per 384 GPU). I paràmetri di decadenza di pesu è di momentum cambiavanu cum'è u numeru di GPU aumentava. Avemu usatu furmazione di precisione mista cù u tipu di dati float64 per u passaghju avanti è float16 per i gradienti per accelerà i calculi float32 supportati da 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.py

cunchiusioni

In questu articulu, avemu vistu un approcciu scalabile à a furmazione di mudelli distribuiti cù Apache MXNet è Horovod. Avemu dimustratu l'efficienza di scala è l'efficacità di u costu cumparatu cù l'approcciu di u servitore di paràmetri nantu à u dataset ImageNet nantu à quale u mudellu ResNet50-v1 hè statu furmatu. Avemu ancu inclusu passi chì pudete aduprà per mudificà un script esistente per eseguisce a furmazione multi-istanza cù Horovod.

Sè avete appena principiatu cù MXNet è l'apprendimentu prufondu, andate à a pagina di stallazione MXNeprima di custruisce MXNet. Ricumandemu ancu assai di leghje l'articulu MXNet in 60 minutiper principià.

Sè avete digià travagliatu cù MXNet è vulete pruvà l'apprendimentu distribuitu cù Horovod, allora fate un ochju à Pagina di installazione di Horovod, custruite da MXNet è seguite l'esempiu MNIST o IMAGEnet.

* u costu hè calculatu basatu annantu à tarifi orari AWS per istanze EC2

Sapete più nantu à u corsu "ML industriale nantu à Big Data"

Source: www.habr.com

Add a comment