5 Tipps für Multi-GPU-Training mit Keras PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

5 Tipps für das Multi-GPU-Training mit Keras

Deep Learning (das beliebteste Schlagwort der späten 2010er Jahre neben Blockchain / Bitcoin und Data Science / Machine Learning) hat es uns in den letzten Jahren ermöglicht, einige wirklich coole Sachen zu machen. Abgesehen von den Fortschritten bei den Algorithmen (die zugegebenermaßen auf Ideen beruhen, die bereits seit den 1990er Jahren als „Data Mining-Ära“ bekannt sind), sind die Hauptgründe für den Erfolg auf die Verfügbarkeit großer kostenloser Datensätze, die Einführung von Open-Source-Bibliotheken und zurückzuführen die Verwendung von GPUs. In diesem Blog-Beitrag werde ich mich auf die letzten beiden konzentrieren und Ihnen einige Tipps geben, die ich auf die harte Tour gelernt habe.

Warum TensorFlow & Keras?

TensorFlow ist eine sehr beliebte Deep Learning-Bibliothek, die von Google entwickelt wurde und mit der Sie schnell komplexe Netzwerke prototypisieren können. Es bietet viele interessante Funktionen wie die automatische Differenzierung (die Sie vor dem Schätzen / Codieren der Gradienten der Kostenfunktionen bewahrt) und die GPU-Unterstützung (mit der Sie mit anständiger Hardware problemlos eine 200-fache Geschwindigkeitsverbesserung erzielen können). Darüber hinaus bietet es eine Python-Oberfläche, sodass Sie schnell Prototypen erstellen können, ohne C- oder CUDA-Code schreiben zu müssen. Zwar gibt es viele andere Frameworks, die anstelle von TensorFlow verwendet werden können, z. B. Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK usw., aber alles hängt von Ihrem Anwendungsfall und Ihren persönlichen Vorlieben ab.

Aber warum Keras? Für mich ist die direkte Verwendung von TF wie das maschinelle Lernen mit Numpy. Ja, es ist machbar und von Zeit zu Zeit müssen Sie es tun (insbesondere wenn Sie benutzerdefinierte Ebenen / Verlustfunktionen schreiben), aber möchten Sie wirklich Code schreiben, der die komplexen Netzwerke als eine Reihe von Vektoroperationen beschreibt (ja, ich weiß Es gibt übergeordnete Methoden in TF, aber sie sind nicht so cool wie Keras. Was ist auch, wenn Sie in eine andere Bibliothek wechseln möchten? Na dann müssten Sie wahrscheinlich den Code neu schreiben, was scheiße ist. Ta ta taaa, Keras zur Rettung! Mit Keras können Sie Ihre Netzwerke mithilfe von Konzepten auf hoher Ebene beschreiben und Code schreiben, der Backend-unabhängig ist. Dies bedeutet, dass Sie die Netzwerke in verschiedenen Deep-Learning-Bibliotheken ausführen können. Wenige Dinge, die ich an Keras liebe, sind, dass es gut geschrieben ist, eine objektorientierte Architektur hat, leicht beizutragen ist und eine freundliche Gemeinschaft hat. Wenn es Ihnen gefällt, sagen Sie Danke an Francois Chollet für die Entwicklung und Open-Sourcing.

Tipps und Fallstricke für das Multi-GPU-Training

Lassen Sie uns ohne weiteres ein paar Tipps geben, wie Sie das GPU-Training auf Keras optimal nutzen können, und ein paar Fallstricke, die Sie beachten sollten:

1. Das Multi-GPU-Training erfolgt nicht automatisch

Trainingsmodelle auf GPU mit Keras & Tensorflow sind nahtlos. Wenn Sie eine NVIDIA-Karte haben und CUDA installiert haben, erkennen die Bibliotheken diese automatisch und verwenden sie für Schulungen. So cool! Aber was ist, wenn Sie eine verwöhnte Göre sind und mehrere GPUs haben? Nun, leider müssen Sie ein wenig arbeiten, um ein Multi-GPU-Training zu erreichen.
5 Tipps für Multi-GPU-Training mit Keras PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.
Es gibt mehrere Möglichkeiten, ein Netzwerk zu parallelisieren, je nachdem, was Sie erreichen möchten. Die beiden wichtigsten Ansätze sind jedoch die Modell- und Datenparallelisierung. Das erste kann Ihnen helfen, wenn Ihr Modell zu komplex ist, um in eine einzelne GPU zu passen, während das letztere hilft, wenn Sie die Ausführung beschleunigen möchten. Wenn Leute über Multi-GPU-Training sprechen, meinen sie normalerweise Letzteres. Früher war es schwieriger zu erreichen, aber zum Glück hat Keras kürzlich eine Dienstprogrammmethode namens aufgerufen mutli_gpu_model Dies erleichtert das parallele Training / Vorhersagen (derzeit nur mit TF-Backend verfügbar). Die Hauptidee ist, dass Sie Ihr Modell durch die Methode führen und es über verschiedene GPUs kopiert wird. Die ursprüngliche Eingabe wird in Blöcke aufgeteilt, die den verschiedenen GPUs zugeführt werden, und dann als einzelne Ausgabe zusammengefasst. Diese Methode kann zum Erreichen von parallelem Training und Vorhersagen verwendet werden. Beachten Sie jedoch, dass das Training aufgrund der erforderlichen Synchronisation nicht linear mit der Anzahl der GPUs skaliert.

2. Achten Sie auf die Stapelgröße

Wenn Sie ein Multi-GPU-Training durchführen, achten Sie auf die Stapelgröße, da diese mehrere Auswirkungen auf Geschwindigkeit / Speicher, Konvergenz Ihres Modells hat und wenn Sie nicht vorsichtig sind, können Sie Ihre Modellgewichte beschädigen!

Geschwindigkeit / Speicher: Je größer die Charge, desto schneller das Training / die Vorhersage. Dies liegt daran, dass das Ein- und Herausnehmen von Daten von den GPUs mit einem Overhead verbunden ist, sodass kleine Stapel mehr Overhead haben. Auf der anderen Seite, je größer der Stapel, desto mehr Speicher benötigen Sie in der GPU. Insbesondere während des Trainings werden die Eingaben jeder Schicht im Speicher gehalten, da sie für den Back-Propagation-Schritt erforderlich sind. Wenn Sie also Ihre Stapelgröße zu stark erhöhen, kann dies zu Fehlern aufgrund von Speichermangel führen.

Konvergenz: Wenn Sie Stochastic Gradient Decent (SGD) oder einige seiner Varianten zum Trainieren Ihres Modells verwenden, sollten Sie berücksichtigen, dass die Stapelgröße die Konvergenz- und Generalisierungsfähigkeit Ihres Netzwerks beeinträchtigen kann. Typische Chargengrößen bei vielen Computer-Vision-Problemen liegen zwischen 32 und 512 Beispielen. Wie Keskaret al In der Praxis wurde beobachtet, dass bei Verwendung einer größeren Charge (als 512) die Qualität des Modells beeinträchtigt wird, gemessen an seiner Fähigkeit zur Verallgemeinerung. “ Beachten Sie, dass andere unterschiedliche Optimierer unterschiedliche Eigenschaften haben und spezielle verteilte Optimierungstechniken bei dem Problem helfen können. Wenn Sie sich für die mathematischen Details interessieren, empfehle ich Ihnen, Joeri Hermans 'These zu lesen. “Über skalierbares tiefes Lernen und Parallelisierung des Gradientenabstiegs".
5 Tipps für Multi-GPU-Training mit Keras PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.
Verfälschung der Gewichte: Dies ist ein unangenehmes technisches Detail, das verheerende Folgen haben kann. Wenn Sie ein Multi-GPU-Training durchführen, ist es wichtig, alle GPUs mit Daten zu versorgen. Es kann vorkommen, dass der allerletzte Stapel Ihrer Epoche weniger Daten enthält als definiert (da die Größe Ihres Datensatzes nicht genau durch die Größe Ihres Stapels geteilt werden kann). Dies kann dazu führen, dass einige GPUs im letzten Schritt keine Daten empfangen. Leider können einige Keras-Schichten, insbesondere die Batch-Normalisierungsschicht, dies nicht bewältigen, was dazu führt, dass Nanowerte in den Gewichten erscheinen (der laufende Mittelwert und die Varianz in der BN-Schicht). Um die Dinge noch schlimmer zu machen, wird man das Problem während des Trainings nicht beobachten (während die Lernphase 1 ist), da die spezifische Schicht den Mittelwert / die Varianz der Charge in den Schätzungen verwendet. Trotzdem wird bei Vorhersagen (Lernphase auf 0 gesetzt) ​​der laufende Mittelwert / die laufende Varianz verwendet, die in unserem Fall zu Nan werden kann, was zu schlechten Ergebnissen führt. Tun Sie sich selbst einen Gefallen und stellen Sie immer sicher, dass Ihre Stapelgröße festgelegt ist, wenn Sie ein Multi-GPU-Training durchführen. Zwei einfache Möglichkeiten, dies zu erreichen, bestehen darin, Stapel abzulehnen, die nicht der vordefinierten Größe entsprechen, oder die Datensätze innerhalb des Stapels zu wiederholen, bis Sie die vordefinierte Größe erreicht haben. Beachten Sie nicht zuletzt, dass bei einem Setup mit mehreren GPUs die Stapelgröße ein Vielfaches der Anzahl der verfügbaren GPUs auf Ihrem System betragen sollte.

3. GPU-Daten Der Hunger, auch bekannt als die CPUs, kann nicht mit den GPUs mithalten

In der Regel ist der teuerste Teil beim Trainieren / Vorhersagen von Deep-Netzwerken die Schätzung, die auf den GPUs erfolgt. Die Daten werden in den CPUs im Hintergrund vorverarbeitet und regelmäßig den GPUs zugeführt. Trotzdem sollte man nicht unterschätzen, wie schnell die GPUs sind; Es kann vorkommen, dass Ihre CPUs, wenn Ihr Netzwerk zu flach oder der Vorverarbeitungsschritt zu komplex ist, nicht mit Ihren GPUs Schritt halten können oder sie nicht schnell genug mit Daten versorgen. Dies kann zu einer geringen GPU-Auslastung führen, was zu einer Verschwendung von Geld / Ressourcen führt.
5 Tipps für Multi-GPU-Training mit Keras PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.
Keras führt die Schätzungen der Stapel normalerweise parallel durch. Aufgrund von Pythons GIL (Global Interpreter Lock) können Sie in Python jedoch kein echtes Multithreading erzielen. Dafür gibt es zwei Lösungen: Verwenden Sie entweder mehrere Prozesse (beachten Sie, dass es in diesem Fall viele Fallstricke gibt, die ich hier nicht behandeln werde) oder halten Sie Ihren Vorverarbeitungsschritt einfach. In der Vergangenheit habe ich eine Pull-Anfrage an Keras gesendet, um die unnötige Belastung der CPUs während der Image-Vorverarbeitung zu verringern. Daher sollten die meisten Benutzer nicht betroffen sein, wenn sie die Standardgeneratoren verwenden. Wenn Sie benutzerdefinierte Generatoren haben, versuchen Sie, so viel Logik wie möglich in C-Bibliotheken wie Numpy zu übertragen, da einige dieser Methoden tatsächlich vorhanden sind Lassen Sie die GIL los Dies bedeutet, dass Sie den Parallelisierungsgrad erhöhen können. Eine gute Möglichkeit, um festzustellen, ob Sie mit einem GPU-Datenmangel konfrontiert sind, besteht darin, die GPU-Auslastung zu überwachen. Beachten Sie jedoch, dass dies nicht der einzige Grund ist, dies zu beobachten (die Synchronisierung, die während des Trainings über mehrere GPUs hinweg erfolgt, ist auch auf eine geringe Auslastung zurückzuführen ). Typischerweise kann ein Mangel an GPU-Daten erkannt werden, indem GPU-Bursts gefolgt von langen Pausen ohne Auslastung beobachtet werden. In der Vergangenheit habe ich eine Open-Source-Erweiterung für Dstat bereitgestellt, mit der Sie Ihre GPU-Auslastung messen können ursprünglicher Blogbeitrag.

4. Speichern Sie Ihre parallelen Modelle

Angenommen, Sie haben die Methode mutli_gpu_model verwendet, um Ihr Modell zu parallelisieren, das Training ist beendet, und jetzt möchten Sie seine Gewichte beibehalten. Die schlechte Nachricht ist, dass Sie nicht einfach save () aufrufen können. Derzeit hat Keras eine Einschränkung, die Sie nicht zulassen Speichern Sie ein paralleles Modell. Es gibt zwei Möglichkeiten, dies zu umgehen: Rufen Sie entweder save () für die Referenz des Originalmodells auf (die Gewichte werden automatisch aktualisiert) oder Sie müssen das Modell serialisieren, indem Sie die parallelisierte Version zerlegen und alle unnötigen Verbindungen bereinigen. Die erste Option ist viel einfacher, aber in Zukunft plane ich, eine serialize () -Methode als Open Source zu verwenden, die letztere ausführt.

5. Das Zählen der verfügbaren GPUs hat einen bösen Nebeneffekt

Leider gibt es derzeit einen bösen Nebeneffekt auf die Methode tensorflow.python.client.device_lib.list_local_devices (), der dazu führt, dass eine neue TensorFlow-Sitzung erstellt und alle verfügbaren GPUs auf dem System initialisiert werden. Dies kann zu unerwarteten Ergebnissen führen, z. B. zum Anzeigen von mehr GPUs als angegeben oder zum vorzeitigen Initialisieren neuer Sitzungen (Sie können alle Details dazu lesen Pull-Anfrage). Um ähnliche Überraschungen zu vermeiden, wird empfohlen, stattdessen die K.get_session (). List_devices () -Methode von Keras zu verwenden, mit der Sie alle aktuell registrierten GPUs in der Sitzung zurückgeben. Denken Sie zu guter Letzt daran, dass das Aufrufen der list_devices () -Methode irgendwie teuer ist. Wenn Sie also nur an der Anzahl der verfügbaren GPUs interessiert sind, rufen Sie die Methode einmal auf und speichern Sie ihre Nummer in einer lokalen Variablen.

Das ist es! Ich hoffe, Sie fanden diese Liste hilfreich. Wenn Sie andere Fallstricke / Tipps für das GPU-Training auf Keras gefunden haben, teilen Sie diese unten in den Kommentaren mit. 🙂

Zeitstempel:

Mehr von Bezugsbox