Apprendimento distribuito con Apache MXNet e Horovod

La traduzione dell'articolo è stata preparata alla vigilia dell'inizio del corso "ML industriale sui Big Data"

L'addestramento distribuito su più istanze di calcolo ad alte prestazioni può ridurre il tempo di addestramento delle moderne reti neurali profonde su grandi quantità di dati da settimane a ore o addirittura minuti, rendendo questa tecnica di addestramento prevalente nelle applicazioni pratiche del deep learning. Gli utenti devono comprendere come condividere e sincronizzare i dati tra più istanze, il che a sua volta ha un impatto notevole sulla scalabilità dell'efficienza. Inoltre, gli utenti dovrebbero anche sapere come distribuire uno script di training eseguito su una singola istanza su più istanze.

In questo articolo parleremo di un modo semplice e veloce per distribuire l'apprendimento utilizzando la libreria aperta di deep learning Apache MXNet e il framework di apprendimento distribuito Horovod. Dimostreremo chiaramente i vantaggi in termini di prestazioni del framework Horovod e dimostreremo come scrivere uno script di formazione MXNet in modo che funzioni in modo distribuito con Horovod.

Cos'è Apache MXNet

Rete Apache MX è un framework di deep learning open source utilizzato per creare, addestrare e distribuire reti neurali profonde. MXNet astrae le complessità associate all'implementazione delle reti neurali, è altamente performante e scalabile e offre API per i linguaggi di programmazione più diffusi come Python, C++, Clojure, Java, Julia, R, Scala e altri.

Formazione distribuita in MXNet con server parametri

Modulo di apprendimento distribuito standard in MXNet utilizza un approccio basato sul server dei parametri. Utilizza una serie di server di parametri per raccogliere i gradienti da ciascun lavoratore, eseguire l'aggregazione e inviare nuovamente i gradienti aggiornati ai lavoratori per la successiva iterazione di ottimizzazione. Determinare il rapporto corretto tra server e lavoratori è la chiave per una scalabilità efficace. Se è presente un solo server dei parametri, potrebbe risultare un collo di bottiglia nei calcoli. Al contrario, se vengono utilizzati troppi server, la comunicazione molti-a-molti può intasare tutte le connessioni di rete.

Cos'è Horovod

Horovod è un framework di deep learning distribuito e aperto sviluppato da Uber. Sfrutta efficienti tecnologie cross-GPU e cross-node come NVIDIA Collective Communications Library (NCCL) e Message Passing Interface (MPI) per distribuire e aggregare i parametri del modello tra vorec. Ottimizza l'uso della larghezza di banda della rete e si adatta bene quando si lavora con modelli di rete neurale profonda. Attualmente supporta diversi framework di apprendimento automatico popolari, vale a dire MXNet, Tensorflow, Keras e PyTorch.

Integrazione MXNet e Horovod

MXNet si integra con Horovod tramite le API di apprendimento distribuito definite in Horovod. API di comunicazione Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementato utilizzando callback asincroni del motore MXNet, come parte del suo grafico delle attività. In questo modo, le dipendenze dei dati tra comunicazione e calcolo vengono facilmente gestite dal motore MXNet per evitare perdite di prestazioni dovute alla sincronizzazione. Oggetto ottimizzatore distribuito definito in Horovod horovod.DistributedOptimizer espande Optimizer in MXNet in modo che chiami le API Horovod corrispondenti per gli aggiornamenti dei parametri distribuiti. Tutti questi dettagli di implementazione sono trasparenti per gli utenti finali.

Inizio veloce

Puoi iniziare rapidamente ad addestrare una piccola rete neurale convoluzionale sul set di dati MNIST utilizzando MXNet e Horovod sul tuo MacBook.
Innanzitutto, installa mxnet e horovod da PyPI:

pip install mxnet
pip install horovod

Nota: se si verifica un errore durante pip installa horovodforse è necessario aggiungere una variabile MACOSX_DEPLOYMENT_TARGET=10.vvDove vv – questa è la versione della tua versione di MacOS, ad esempio, per MacOSX Sierra dovrai scrivere MACOSX_DEPLOYMENT_TARGET=10.12 pip installazione horovod

Quindi installa OpenMPI quindi.

Alla fine, scarica lo script di test mxnet_mnist.py quindi ed esegui i seguenti comandi nel terminale del MacBook nella directory di lavoro:

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

Questo eseguirà l'addestramento su due core del tuo processore. L'output sarà il 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

Dimostrazione delle prestazioni

Quando si addestra un modello ResNet50-v1 su un set di dati ImageNet su 64 GPU con otto istanze p3.16xgrande EC2, ciascuno contenente 8 GPU NVIDIA Tesla V100 sul cloud AWS, abbiamo raggiunto un throughput di addestramento di 45000 immagini/sec (ovvero il numero di campioni addestrati al secondo). Allenamento completato in 44 minuti dopo 90 epoche con una precisione massima del 75.7%.

Abbiamo confrontato questo approccio con l'approccio di formazione distribuito di MXNet che utilizza server di parametri su 8, 16, 32 e 64 GPU con un server a parametro singolo e un rapporto server/lavoratore rispettivamente di 1 a 1 e 2 a 1. Puoi vedere il risultato nella Figura 1 qui sotto. Sull'asse y a sinistra, le barre rappresentano il numero di immagini da addestrare al secondo, le linee riflettono l'efficienza di ridimensionamento (ovvero il rapporto tra throughput effettivo e ideale) sull'asse y a destra. Come puoi vedere, la scelta del numero di server influisce sull'efficienza del ridimensionamento. Se è presente un solo parametro server, l'efficienza di scalabilità scende al 38% su 64 GPU. Per ottenere la stessa efficienza di scalabilità di Horovod, è necessario raddoppiare il numero di server rispetto al numero di lavoratori.

Apprendimento distribuito con Apache MXNet e Horovod
Figura 1. Confronto dell'apprendimento distribuito utilizzando MXNet con Horovod e con il server dei parametri

Nella Tabella 1 di seguito confrontiamo il costo finale per istanza quando si eseguono esperimenti su 64 GPU. L'utilizzo di MXNet con Horovod fornisce la migliore produttività al minor costo.

Apprendimento distribuito con Apache MXNet e Horovod
Tabella 1. Confronto dei costi tra Horovod e Parametro Server con un rapporto server/lavoratore di 2 a 1.

Passaggi per riprodursi

Nei passaggi successivi, ti mostreremo come riprodurre il risultato dell'addestramento distribuito utilizzando MXNet e Horovod. Per saperne di più sull'apprendimento distribuito con MXNet leggi questo post.

Passo 1

Crea un cluster di istanze omogenee con MXNet versione 1.4.0 o successiva e Horovod versione 0.16.0 o successiva per utilizzare l'apprendimento distribuito. Dovrai inoltre installare le librerie per l'addestramento della GPU. Per le nostre istanze, abbiamo scelto Ubuntu 16.04 Linux, con GPU Driver 396.44, CUDA 9.2, libreria cuDNN 7.2.1, comunicatore NCCL 2.2.13 e OpenMPI 3.1.1. Inoltre puoi usare AMI di apprendimento profondo di Amazon, dove queste librerie sono già preinstallate.

Passo 2

Aggiungi la possibilità di lavorare con l'API Horovod al tuo script di formazione MXNet. Lo script seguente basato sull'API MXNet Gluon può essere utilizzato come semplice modello. Le righe in grassetto sono necessarie se disponi già di uno script di formazione corrispondente. Ecco alcune modifiche fondamentali che devi apportare per imparare con Horovod:

  • Imposta il contesto in base al rango Horovod locale (riga 8) per capire che l'addestramento viene eseguito sul core grafico corretto.
  • Passare i parametri iniziali da un lavoratore a tutti (riga 18) per garantire che tutti i lavoratori inizino con gli stessi parametri iniziali.
  • Crea un Horovod DistributedOptimizer (riga 25) per aggiornare i parametri in modo distribuito.

Per ottenere lo script completo, fare riferimento agli esempi 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    ...

Passo 3

Accedi a uno degli operatori per avviare la formazione distribuita utilizzando la direttiva MPI. In questo esempio, l'addestramento distribuito viene eseguito su quattro istanze con 4 GPU ciascuna e un totale di 16 GPU nel cluster. L'ottimizzatore Stochastic Gradient Descent (SGD) verrà utilizzato con i seguenti iperparametri:

  • dimensione mini-lotto: 256
  • tasso di apprendimento: 0.1
  • quantità di moto: 0.9
  • decadimento del peso: 0.0001

Passando da una GPU a 64 GPU, abbiamo scalato linearmente la velocità di addestramento in base al numero di GPU (da 0,1 per 1 GPU a 6,4 per 64 GPU), mantenendo il numero di immagini per GPU a 256 (da un batch di 256 immagini per 1 GPU a 16 per 384 GPU). I parametri di decadimento del peso e momentum sono cambiati con l'aumento del numero di GPU. Abbiamo utilizzato un training di precisione misto con il tipo di dati float64 per il passaggio in avanti e float16 per i gradienti per accelerare i calcoli float32 supportati dalle 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

conclusione

In questo articolo abbiamo esaminato un approccio scalabile al training del modello distribuito utilizzando Apache MXNet e Horovod. Abbiamo dimostrato l'efficienza di scalabilità e il rapporto costo-efficacia rispetto all'approccio del server dei parametri sul set di dati ImageNet su cui è stato addestrato il modello ResNet50-v1. Abbiamo anche incluso passaggi che puoi utilizzare per modificare uno script esistente per eseguire la formazione multiistanza utilizzando Horovod.

Se hai appena iniziato con MXNet e il deep learning, vai alla pagina di installazione MXNeper creare prima MXNet. Consigliamo vivamente anche la lettura dell'articolo MXNet in 60 minutiper iniziare.

Se hai già lavorato con MXNet e vuoi provare l'apprendimento distribuito con Horovod, dai un'occhiata a Pagina di installazione di Horovod, crealo da MXNet e segui l'esempio MNIST o IMAGEnet.

*il costo è calcolato in base a tariffe orarie AWS per istanze EC2

Scopri di più sul corso "ML industriale sui Big Data"

Fonte: habr.com

Aggiungi un commento