Verteiltes Lernen mit Apache MXNet und Horovod

Die Übersetzung des Artikels wurde am Vorabend des Kursbeginns erstellt „Industrielles ML auf Big Data“

Verteiltes Training auf mehreren Hochleistungsrechnerinstanzen kann die Trainingszeit moderner tiefer neuronaler Netze für große Datenmengen von Wochen auf Stunden oder sogar Minuten verkürzen, wodurch diese Trainingstechnik in praktischen Anwendungen des tiefen Lernens weit verbreitet ist. Benutzer müssen verstehen, wie sie Daten über mehrere Instanzen hinweg teilen und synchronisieren können, was wiederum große Auswirkungen auf die Skalierungseffizienz hat. Darüber hinaus sollten Benutzer auch wissen, wie sie ein Trainingsskript, das auf einer einzelnen Instanz ausgeführt wird, auf mehreren Instanzen bereitstellen.

In diesem Artikel sprechen wir über eine schnelle und einfache Möglichkeit, Lernen mithilfe der offenen Deep-Learning-Bibliothek Apache MXNet und des Horovod-Frameworks für verteiltes Lernen zu verteilen. Wir werden die Leistungsvorteile des Horovod-Frameworks deutlich demonstrieren und zeigen, wie man ein MXNet-Trainingsskript schreibt, damit es verteilt mit Horovod funktioniert.

Was ist Apache MXNet?

Apache MX-Net ist ein Open-Source-Deep-Learning-Framework, das zum Erstellen, Trainieren und Bereitstellen tiefer neuronaler Netze verwendet wird. MXNet abstrahiert die mit der Implementierung neuronaler Netze verbundenen Komplexitäten, ist hochleistungsfähig und skalierbar und bietet APIs für gängige Programmiersprachen wie z Python, C + +, Clojure, Javac, Julia, R, Scala und andere.

Verteiltes Training in MXNet mit Parameterserver

Standardmäßiges verteiltes Lernmodul in MXNet verwendet einen Parameterserver-Ansatz. Es verwendet eine Reihe von Parameterservern, um Farbverläufe von jedem Worker zu sammeln, eine Aggregation durchzuführen und aktualisierte Farbverläufe für die nächste Optimierungsiteration an die Worker zurückzusenden. Die Bestimmung des richtigen Verhältnisses von Servern zu Workern ist der Schlüssel zu einer effektiven Skalierung. Wenn nur ein Parameterserver vorhanden ist, kann es zu einem Engpass bei den Berechnungen kommen. Wenn umgekehrt zu viele Server verwendet werden, kann die Many-to-Many-Kommunikation alle Netzwerkverbindungen verstopfen.

Was ist Horovod?

Horowod ist ein offenes verteiltes Deep-Learning-Framework, das bei Uber entwickelt wurde. Es nutzt effiziente GPU- und knotenübergreifende Technologien wie NVIDIA Collective Communications Library (NCCL) und Message Passing Interface (MPI), um Modellparameter über Vorecs zu verteilen und zu aggregieren. Es optimiert die Nutzung der Netzwerkbandbreite und lässt sich gut skalieren, wenn mit tiefen neuronalen Netzwerkmodellen gearbeitet wird. Es unterstützt derzeit mehrere beliebte Frameworks für maschinelles Lernen, nämlich MXNet, Tensorflow, Keras und PyTorch.

MXNet- und Horovod-Integration

MXNet lässt sich über die in Horovod definierten Distributed Learning APIs in Horovod integrieren. Horovod-Kommunikations-APIs horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementiert mithilfe asynchroner Rückrufe der MXNet-Engine als Teil ihres Aufgabendiagramms. Auf diese Weise werden Datenabhängigkeiten zwischen Kommunikation und Berechnung von der MXNet-Engine problemlos gehandhabt, um Leistungseinbußen aufgrund der Synchronisierung zu vermeiden. In Horovod definiertes verteiltes Optimierungsobjekt horovod.DistributedOptimizer expandiert Optimierer in MXNet, sodass es die entsprechenden Horovod-APIs für verteilte Parameteraktualisierungen aufruft. Alle diese Implementierungsdetails sind für Endbenutzer transparent.

Schnellstart

Mit MXNet und Horovod auf Ihrem MacBook können Sie schnell mit dem Training eines kleinen Faltungs-Neuronalen Netzwerks auf dem MNIST-Datensatz beginnen.
Installieren Sie zunächst mxnet und horovod von PyPI:

pip install mxnet
pip install horovod

Hinweis: Wenn während des Vorgangs ein Fehler auftritt pip Horovod installierenMöglicherweise müssen Sie eine Variable hinzufügen MACOSX_DEPLOYMENT_TARGET=10.vvWo vv – Dies ist die Version Ihrer MacOS-Version, zum Beispiel für MacOSX Sierra, die Sie schreiben müssen MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod

Dann installieren Sie OpenMPI daher.

Laden Sie abschließend das Testskript herunter mxnet_mnist.py daher und führen Sie die folgenden Befehle im MacBook-Terminal im Arbeitsverzeichnis aus:

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

Dadurch wird das Training auf zwei Kernen Ihres Prozessors ausgeführt. Die Ausgabe wird wie folgt sein:

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

Leistungsdemo

Beim Training eines ResNet50-v1-Modells auf einem ImageNet-Datensatz auf 64 GPUs mit acht Instanzen p3.16xgroß Mit EC2, das jeweils 8 NVIDIA Tesla V100-GPUs in der AWS-Cloud enthält, erreichten wir einen Trainingsdurchsatz von 45000 Bildern/Sekunde (d. h. die Anzahl der trainierten Proben pro Sekunde). Das Training wurde in 44 Minuten nach 90 Epochen mit einer Höchstgenauigkeit von 75.7 % abgeschlossen.

Wir haben dies mit dem verteilten Trainingsansatz von MXNet verglichen, bei dem Parameterserver auf 8, 16, 32 und 64 GPUs mit einem einzelnen Parameterserver und einem Server-zu-Worker-Verhältnis von 1 zu 1 bzw. 2 zu 1 verwendet werden. Das Ergebnis sehen Sie in Abbildung 1 unten. Auf der Y-Achse links stellen die Balken die Anzahl der Bilder dar, die pro Sekunde trainiert werden sollen, während die Linien auf der Y-Achse rechts die Skalierungseffizienz (d. h. das Verhältnis von tatsächlichem zum idealen Durchsatz) widerspiegeln. Wie Sie sehen, wirkt sich die Wahl der Anzahl der Server auf die Skalierungseffizienz aus. Wenn nur ein Parameterserver vorhanden ist, sinkt die Skalierungseffizienz bei 38 GPUs auf 64 %. Um die gleiche Skalierungseffizienz wie bei Horovod zu erreichen, müssen Sie die Anzahl der Server im Verhältnis zur Anzahl der Worker verdoppeln.

Verteiltes Lernen mit Apache MXNet und Horovod
Abbildung 1. Vergleich des verteilten Lernens mit MXNet mit Horovod und mit Parameterserver

In Tabelle 1 unten vergleichen wir die endgültigen Kosten pro Instanz bei der Durchführung von Experimenten auf 64 GPUs. Die Verwendung von MXNet mit Horovod bietet den besten Durchsatz bei niedrigsten Kosten.

Verteiltes Lernen mit Apache MXNet und Horovod
Tabelle 1. Kostenvergleich zwischen Horovod und Parameter Server mit einem Server-zu-Arbeiter-Verhältnis von 2 zu 1.

Schritte zum Reproduzieren

In den nächsten Schritten zeigen wir Ihnen, wie Sie das Ergebnis eines verteilten Trainings mit MXNet und Horovod reproduzieren können. Um mehr über verteiltes Lernen mit MXNet zu erfahren, lesen Sie dieser Beitrag.

Schritt 1

Um verteiltes Training zu nutzen, erstellen Sie einen Cluster homogener Instanzen mit MXNet Version 1.4.0 oder höher und Horovod Version 0.16.0 oder höher. Zusätzlich müssen Sie die Bibliotheken für das GPU-Training installieren. Für unsere Instanzen haben wir Folgendes gewählt: Ubuntu 16.04 LinuxMit GPU-Treiber 396.44, CUDA 9.2, cuDNN-Bibliothek 7.2.1, NCCL-Kommunikator 2.2.13 und OpenMPI 3.1.1. Sie können auch Folgendes verwenden: Amazon Deep Learning AMI, wo diese Bibliotheken bereits vorinstalliert sind.

Schritt 2

Fügen Sie Ihrem MXNet-Trainingsskript die Möglichkeit hinzu, mit der Horovod-API zu arbeiten. Das folgende Skript basierend auf der MXNet Gluon API kann als einfache Vorlage verwendet werden. Die fett gedruckten Zeilen werden benötigt, wenn Sie bereits über ein entsprechendes Trainingsskript verfügen. Hier sind ein paar wichtige Änderungen, die Sie vornehmen müssen, um mit Horovod zu lernen:

  • Stellen Sie den Kontext entsprechend dem lokalen Horovod-Rang (Zeile 8) ein, um zu verstehen, dass das Training auf dem richtigen Grafikkern durchgeführt wird.
  • Übergeben Sie Anfangsparameter von einem Worker an alle (Zeile 18), um sicherzustellen, dass alle Worker mit denselben Anfangsparametern beginnen.
  • Erstelle einen Horovod DistributedOptimizer (Zeile 25), um die Parameter verteilt zu aktualisieren.

Das vollständige Skript finden Sie in den Horovod-MXNet-Beispielen 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    ...

Schritt 3

Melden Sie sich bei einem der Mitarbeiter an, um mit der verteilten Schulung mithilfe der MPI-Richtlinie zu beginnen. In diesem Beispiel wird das verteilte Training auf vier Instanzen mit jeweils 4 GPUs und insgesamt 16 GPUs im Cluster ausgeführt. Der Stochastic Gradient Descent (SGD)-Optimierer wird mit den folgenden Hyperparametern verwendet:

  • Mini-Chargengröße: 256
  • Lernrate: 0.1
  • Impuls: 0.9
  • Gewichtsabnahme: 0.0001

Als wir von einer GPU auf 64 GPUs skalierten, skalierten wir die Trainingsrate linear entsprechend der Anzahl der GPUs (von 0,1 für 1 GPU bis 6,4 für 64 GPUs), während wir die Anzahl der Bilder pro GPU bei 256 behielten (aus einem Stapel von 256 Bilder für 1 GPU bis 16 für 384 GPUs). Die Gewichtsabfall- und Impulsparameter änderten sich mit zunehmender Anzahl der GPUs. Wir haben gemischtes Präzisionstraining mit dem Datentyp float64 für den Vorwärtsdurchlauf und float16 für Gradienten verwendet, um die von NVIDIA Tesla-GPUs unterstützten float32-Berechnungen zu beschleunigen.

$ 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

Fazit

In diesem Artikel haben wir uns einen skalierbaren Ansatz für das verteilte Modelltraining mit Apache MXNet und Horovod angesehen. Wir haben die Skalierungseffizienz und Kosteneffizienz im Vergleich zum Parameterserver-Ansatz am ImageNet-Datensatz demonstriert, auf dem das ResNet50-v1-Modell trainiert wurde. Wir haben auch Schritte eingefügt, mit denen Sie ein vorhandenes Skript ändern können, um ein Multi-Instanz-Training mit Horovod auszuführen.

Wenn Sie gerade erst mit MXNet und Deep Learning beginnen, gehen Sie zur Installationsseite MXNeum zunächst MXNet zu erstellen. Wir empfehlen außerdem dringend, den Artikel zu lesen MXNet in 60 Minutenum anzufangen.

Wenn Sie bereits mit MXNet gearbeitet haben und verteiltes Lernen mit Horovod ausprobieren möchten, dann werfen Sie einen Blick auf Horovod-Installationsseite, erstellen Sie es aus MXNet und folgen Sie dem Beispiel MNIST oder IMAGEnet.

*Die Kosten werden basierend auf berechnet Stundensätze AWS für EC2-Instanzen

Erfahren Sie mehr über den Kurs „Industrielles ML auf Big Data“

Source: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz und VPS-VDS-Servern 🔥 Kaufen Sie zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server | ProHoster