Rückblick: MXNet Deep Learning glänzt mit Gluon

Als ich MXNet v0.7 im Jahr 2016 überprüfte, fand ich, dass es ein vielversprechendes Deep-Learning-Framework mit ausgezeichneter Skalierbarkeit (nahezu linear bei GPU-Clustern), guter automatischer Differenzierung und modernster Unterstützung für CUDA-GPUs ist. Ich hatte auch das Gefühl, dass es Arbeit an seiner Dokumentation und seinen Tutorials brauchte und viel mehr Beispiele in seinem Modellzoo brauchte. Außerdem hätte ich mir eine High-Level-Schnittstelle für MXNet gewünscht, von der ich mir Keras vorgestellt hätte.

Seitdem sind einige Fortschritte zu verzeichnen. MXNet wurde Anfang 2017 unter das Dach der Apache Software Foundation gestellt, und obwohl es in Version 1.3 noch „inkubiert“, fühlt es sich ziemlich gut ausgearbeitet an.

Während an Keras mit einem MXNet-Backend gearbeitet wurde, ist eine andere Schnittstelle auf hoher Ebene viel wichtiger geworden: Gluon. Vor der Integration von Gluon konnten Sie entweder einfachen imperativen Code oder schnellen symbolischen Code in MXNet schreiben, aber nicht beide gleichzeitig. Mit Gluon können Sie das Beste aus beiden Welten auf eine Weise kombinieren, die sowohl mit Keras als auch mit PyTorch konkurriert.

Was ist Gluon für MXNet?

Zu den für Gluon beanspruchten Vorteilen gehören einfacher Code, flexible Modellierung, dynamische Diagramme und hohe Leistung:

  1. Einfacher, leicht verständlicher Code : Gluon bietet einen vollständigen Satz von Plug-and-Play-Bausteinen für neuronale Netzwerke, einschließlich vordefinierter Ebenen, Optimierer und Initialisierer.
  2. Flexible, zwingende Struktur : Gluon erfordert keine starre Definition des neuronalen Netzwerkmodells, sondern bringt den Trainingsalgorithmus und das Modell näher zusammen, um Flexibilität im Entwicklungsprozess zu gewährleisten.
  3. Dynamische Diagramme : Mit Gluon können Entwickler dynamische neuronale Netzwerkmodelle definieren, dh sie können im laufenden Betrieb mit jeder Struktur und unter Verwendung eines beliebigen nativen Steuerungsflusses von Python erstellt werden.
  4. Hohe Leistung : Gluon bietet alle oben genannten Vorteile, ohne die Trainingsgeschwindigkeit des zugrunde liegenden Motors zu beeinträchtigen.

Diese vier Elemente zusammen mit einer erheblich erweiterten Sammlung von Modellbeispielen bringen Gluon / MXNet in eine grobe Parität mit Keras / TensorFlow und PyTorch, um die Entwicklung und die Trainingsgeschwindigkeit zu vereinfachen. Sie können Gluon-Codebeispiele sehen, die diese Eigenschaften auf der Hauptseite von Gluon veranschaulichen und auf der Übersichtsseite für die Gluon-API wiederholen.

Die Gluon-API enthält Funktionen für neuronale Netzwerkschichten, wiederkehrende neuronale Netzwerke, Verlustfunktionen, Datensatzmethoden und Visionsdatensätze, einen Modellzoo und eine Reihe experimenteller neuronaler Netzwerkmethoden. Sie können frei kombinieren Gluon mit Standard MxNet und NumPy Module, zum Beispiel module, autogradund ndarray-sowie mit Python Steuerung fließt.

Gluon bietet eine gute Auswahl an Ebenen zum Erstellen von Modellen, einschließlich Basisebenen (dicht, Dropout usw.), Faltungsebenen, Poolebenen und Aktivierungsschichten. Jedes davon ist ein einzeiliger Anruf. Diese können unter anderem innerhalb von Netzwerkcontainern wie z gluon.nn.Sequential().

Ein HybridSequentialNetzwerk kann zwischengespeichert (in ein symbolisches Diagramm umgewandelt) werden, um eine hohe Leistung zu erzielen. Dabei gilt hybridize()Folgendes:

net = nn.HybridSequential ()

mit net.name_scope ():

    net.add (nn.Dense (256, Aktivierung = "relu"))

    net.add (nn.Dense (128, Aktivierung = "relu"))

    net.add (nn.Dense (2))

net.hybridize ()

Beachten Sie, wie die DenseLayer-Methode einen Aktivierungs-Layernamen als Parameter verwenden kann. Das ist eine von vielen Ähnlichkeiten zwischen Gluon und Keras.

Weder die Sequentialnoch die HybridSequentialContainer sind als Teil der Gluon-API dokumentiert. Wie ich beim Durchsuchen des Quellcodebaums festgestellt habe, sind sie in inkubator-mxnet / python / mxnet / gluon / nn / basic_layers.py implementiert.

Was ist neu in MXNet 1.3?

MXNet v1.3 enthält eine lange Liste neuer Funktionen, Verbesserungen und Fehlerkorrekturen. Zu den Highlights zählen die Möglichkeit, RNN-Schichten (Recurrent Neural Network) für die Leistung zu hybridisieren, neue und aktualisierte vorgefertigte Vision-Modelle, der Modellexport in das ONNX-Format (Open Neural Network Exchange) und die Laufzeitintegration von Nvidia TensorRT in MXNet, um die Inferenz zu beschleunigen . Darüber hinaus bietet die Integration von Intel MKL (Math Kernel Library) in MXNet eine bis zu vierfache Leistungsverbesserung auf Intel-CPUs für intensive Operationen, einschließlich Faltungsknoten.

Die MXNet-Community hat auch der Qualitätssicherung und der kontinuierlichen Integration mehr Aufmerksamkeit geschenkt. Zu den Schritten gehört die Integration der Beispielnotizbücher aus dem Tutorial Deep Learning: The Straight Dope in die nächtlichen CI-Tests.

Installation von MXNet ohne Risse

Wenn Sie bereits eine funktionierende, aktuelle Installation von Python-, MXNet- und Jupyter-Notebooks mit Notedown haben, können Sie mit dem nächsten Abschnitt fortfahren. Ansonsten folgen Sie bitte mit.

Ich kann Ihnen nicht sagen, wie viele Probleme ich mit älteren Versionen der verschiedenen Softwarekomponenten hatte, die obskure Fehler und Störungen durch die Installation anderer Pakete verursachten, bevor ich diese reproduzierbare Sequenz herausfand. Auf diese Weise sollten Sie nur in Ihrem eigenen Code auf Fehler stoßen und andere Deep-Learning-Frameworks, die Sie möglicherweise installiert haben, nicht beschädigen.

Ist dies die einzig mögliche Installationsoption? Nein natürlich nicht. Es ist noch einfacher, MXNet in Amazon SageMaker oder ein Deep Learning AMI unter AWS auszuführen, auf dem bereits alles installiert ist, was Sie benötigen.

Installieren Sie zunächst die neueste Version von Python 3 für Ihre Plattform. (Ich hatte Probleme beim Ausführen von MXNet mit Python 2 oder früheren Builds von Python 3.) Ich empfehle, Python 3 von Python.org zu installieren. Wenn Sie eine Anaconda- oder MiniConda-Umgebung bevorzugen, können Sie Python 3 stattdessen mit einer dieser Umgebungen installieren und möglicherweise den Jupyter-Installationsschritt überspringen.

Stellen Sie sicher, dass Sie über python3die Befehlszeile ausgeführt werden können und dass die neueste Version gemeldet wird. In meiner Installation Ende Oktober 2018 wird python3 -VPython 3.7.1 zurückgegeben. Ihre Version kann später sein.

Dann installieren Sie Jupyter. Ich habe Pip benutzt. Dieser Schritt ist nicht erforderlich, wenn Sie Anaconda installiert haben, das Jupyter standardmäßig installiert.

python3 -m pip install --upgrade pip

python3 -m pip jupyter installieren

Wenn Sie jupyter notebooküber die Befehlszeile ausgeführt werden, sollte ein Browserfenster geöffnet sein und Sie können ein neues Notizbuch mit einem Python 3-Kernel erstellen. Schließen Sie diese beiden Fenster und stoppen Sie den Notebook-Server. Drücken Sie dazu normalerweise zweimal Strg-C in der Befehlszeile.

Installieren Sie Notedown jetzt mit einem Tarball, wie im Gluon-Crashkurs Readme beschrieben. Mit dem Notedown-Plug-In kann Jupyter Notizbücher lesen, die im Markdown-Format gespeichert sind. Dies ist sowohl für den Crash-Kurs als auch für Deep Learning: The Straight Dope nützlich.

pip installiere //github.com/mli/notedown/tarball/master

Testen Sie dies mit Rauch, indem Sie Jupyter mit Notedown ausführen:

jupyter notebook --NotebookApp.contents_manager_class = 'notiert.NotedownContentsManager'

Schließen Sie erneut alle Webseiten und stoppen Sie den Notebook-Server.

Jetzt können wir eine virtuelle Umgebung für MXNet erstellen. Wenn Sie ein Anaconda-Benutzer sind, können Sie stattdessen die virtuelle Umgebung mit conda erstellen. Ich habe die native Python3-Venv-Funktion verwendet, beginnend mit meinem Home-Verzeichnis:

python3 -m venv envs / mxnet

Aktivieren Sie nun die virtuelle Umgebung und installieren Sie MXNet für Ihre Plattform. Ich habe mich für den MXNet-Build mit MKL (Intels Hochleistungsbibliothek für seine CPUs) entschieden, da ich auf einem Mac bin (für den es keine MXNet-Binärdatei für CUDA-GPUs gibt), aber wenn Sie eine aktuelle Nvidia-GPU mit CUDA unter Linux installiert haben oder Windows können Sie eine MXNet-Version mit CUDA- und MKL-Unterstützung installieren. Auf einer Bash-Shell war die MXNet-Installation in der virtuellen Umgebung wie folgt:

Quelle envs / mxnet / bin / aktivieren

pip installiere mxnet-mkl

Die Aktivierung unterscheidet sich geringfügig in der C-Shell und der Fish-Shell, da Sie das Aktivierungsskript direkt ausführen können, anstatt es zu verwenden source. In jedem Fall müssen Sie die Umgebung aktivieren, wenn Sie nach dem Schließen der Shell zu dieser MXNet-Installation zurückkehren möchten. Wenn Sie sich nicht in Ihrem Home-Verzeichnis befinden, lautet der Befehl zur Bash-Aktivierung:

Quelle ~ / envs / mxnet / bin / aktivieren

Testen Sie die MXNet-Installation in der Befehlszeile, indem Sie Python 3 ausführen und die gerade installierte MXNet-Bibliothek importieren. Beachten Sie, dass das (mxnet)Präfix in der Befehlszeile bedeutet, dass wir uns in der virtuellen Umgebung befinden.

(mxnet) Martins-Retina-MacBook: ~ martinheller $ python3

Python 3.7.1 (v3.7.1: 260ec2c36a, 20. Oktober 2018, 03:13:28)

[Clang 6.0 (Clang-600.0.57)] auf Darwin

Geben Sie "Hilfe", "Copyright", "Credits" oder "Lizenz" ein, um weitere Informationen zu erhalten.

>>> mxnet als mx importieren

>>> von mxnet import nd

>>> nd.array (((1,2,3), (5,6,7)))

[[1. 2. 3.]

 [5. 6. 7.]]

>>> ^ D.

(mxnet) Martins-Retina-MacBook: ~ martinheller $

Jetzt können wir MXNet in einem Jupyter-Notebook mit Notedown in der virtuellen Umgebung testen, in der wir MXNet installiert haben:

Nachdem Sie Ihre MXNet-Installation in einem Jupyter-Notebook getestet haben, können Sie den nächsten Schritt ausführen und Gluon ausführlicher testen. Navigieren Sie auf GitHub zum Repo gluon-api / gluon-api und laden Sie das Jupyter-Notizbuch mit dem Beispielcode herunter. Wechseln Sie in das Verzeichnis, in das Sie das Notebook heruntergeladen haben, aktivieren Sie gegebenenfalls Ihre virtuelle MXNet-Umgebung, führen Sie das Jupyter-Notebook aus, öffnen Sie das Beispiel und führen Sie es aus. Es kann eine Weile dauern, bis das Training abgeschlossen ist. Wenn alles in Ordnung ist, sehen Sie ungefähr Folgendes:

Tutorials zum Gluon- und MXNet-Modul

MXNet bietet jetzt eine Reihe von Tutorials sowohl für Gluon als auch für die Modul-API. Ich habe bereits den langen Kurs über Deep Learning mit Gluon, Deep Learning: The Straight Dope und die Kurzversion, den 60-minütigen Gluon Crash Course, erwähnt.

Darüber hinaus gibt es etwa 30 Gluon-Tutorials für Python. Auf der Modul-API-Seite gibt es ungefähr 24 Tutorials für Python, fünf für Scala, zwei für C ++, neun für R und vier für Perl.

Als ich Keras im September dieses Jahres überprüfte, sagte ich: „Wenn ich heute ein neues Deep-Learning-Projekt starten würde, würde ich höchstwahrscheinlich mit Keras recherchieren.“ Da bin ich mir nicht mehr ganz so sicher. Gluon / MXNet ist fast so gut wie Keras / TensorFlow für gründliche Forschungsarbeiten zu CPUs und GPUs.

Im Gegensatz zu TensorFlow unterstützt MXNet derzeit TPUs oder FPGAs nicht und es fehlt ein Äquivalent zu TensorFlows TensorBoard für die Visualisierung von Grafiken. Darüber hinaus verfügt Keras / TensorFlow über ein größeres Ökosystem als Gluon / MXNet.

Keras kann in mehr Umgebungen als Gluon bereitgestellt werden. Sie können jedoch Gluon-Modelle zur Vorhersage auf Android-, iOS-, Raspberry Pi- und Nvidia Jetson-Geräten bereitstellen, zusätzlich zu Computern, die die Modelle trainieren können, und auf TensorRT. Gluon und Keras sind beide derzeit reifer als PyTorch, das sich noch im Beta-Zustand befindet. PyTorch und Gluon können beide Modelle dynamisch erstellen. Keras kann derzeit nicht.

Letztendlich hängt die Wahl des zu verwendenden Deep-Learning-Frameworks möglicherweise von Ihren spezifischen Anforderungen ab - oder davon, was Sie wissen und mögen. Dank Gluon und anderen dramatischen Verbesserungen (in Dokumentation, Tutorials, Modellen usw.) ist MXNet eine ebenso gute Wahl wie TensorFlow oder PyTorch für tiefes Lernen.