A traduzzione di l'articulu hè stata preparata à a vigilia di l'iniziu di u corsu
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
Formazione distribuita in MXNet cù u servitore di parametri
Cosa hè Horovod
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
À a fine, scaricate u script di prova mxnet_mnist.py
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.
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.
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
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à
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
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
Sè avete digià travagliatu cù MXNet è vulete pruvà l'apprendimentu distribuitu cù Horovod, allora fate un ochju à
* u costu hè calculatu basatu annantu à
Sapete più nantu à u corsu
Source: www.habr.com