Wie GPU-Computing Deep Learning vorantreibt
GPU vs. CPU Deep Learning: Trainingsleistung von Faltungsnetzwerken
In der Technologie-Community, insbesondere in der IT, suchen viele von uns nach Wissen und Möglichkeiten, ihre Fähigkeiten weiterzuentwickeln. Nachdem ich mich anhand von Büchern, Videos und Online-Artikeln über Deep Learning informiert hatte, entschied ich, dass der natürliche nächste Schritt darin bestand, praktische Erfahrungen zu sammeln.
Ich begann mit Venkateshs Tutorial zum Erstellen eines Bildklassifizierungsmodells mithilfe eines Convolution Neural Network (CNN) zur Klassifizierung von Katzen- und Hundebildern. Das Problem der „Klassifizierung von Katzen- und Hundebildern“ wird von manchen als ein Beispiel im „Hello World“-Stil für Faltungs- und Deep-Learning-Netzwerke angesehen. Bei Deep Learning geht es jedoch um viel mehr, als nur den „Hello World“-Text mithilfe einer Programmiersprache anzuzeigen.

Abbildung 1: Ursprüngliches „Cat & Dog“-Bildklassifizierungs-Faltungs-Neuronales Netzwerk
Der Tutorial-Code wird mit Python erstellt, das auf Keras ausgeführt wird. Aufgrund der Einfachheit der API habe ich ein Keras-Beispiel ausgewählt. Ich konnte das System nach der Installation von Python und den erforderlichen Bibliotheken (wie TensorFlow) relativ reibungslos zum Laufen bringen. Allerdings wurde mir schnell klar, dass die Ausführung des Codes auf einer VirtualBox-VM (Virtual Machine) auf meiner Workstation schmerzhaft langsam und ineffizient ist . Beispielsweise dauerte die Verarbeitung einer einzelnen Epoche etwa 90 Minuten (d. h. 8.000 Schritte und 32 Bilder pro Schritt), und die Standardeinstellung von 25 Epochen, die zum Trainieren des Netzwerks erforderlich waren, dauerte mehr als eineinhalb Tage. Mir wurde schnell klar, dass der bloße Zeitaufwand, der nötig ist, um die Auswirkungen geringfügiger Änderungen zu sehen, diesen Test nutzlos und viel zu umständlich machen würde.
Ich begann darüber nachzudenken, wie ich diesen Prozess verbessern könnte. Nach weiteren Recherchen wurde mir klar, dass eine leistungsstarke GPU die Lösung sein könnte, nach der ich suchte.
Die Gelegenheit, eine solche GPU zu testen, ergab sich, als ich ein Testgerät der leistungsstarken neuen Tesla V100-GPU von NVIDIA erhielt, die derzeit zu einem etwas atemberaubenden Preis von 9.000 US-Dollar läuft. Nach zwei Wochen mit der GPU habe ich viele Dinge gelernt: einige erwartete und andere völlig unerwartet. Ich habe beschlossen, zwei Blogbeiträge zu schreiben, um das Gelernte zu teilen, in der Hoffnung, dass es anderen helfen kann, die ihre Reise ins Deep Learning beginnen und neugierig sind, was eine GPU für sie tun kann. Noch spannender ist, dass GPU-Server als robuste Option für unsere Produktlinien für dedizierte Server verfügbar sind.
Im ersten Teil des Blogs konzentriere ich mich auf die Trainingsleistung des Faltungsnetzwerks, einschließlich Beobachtungen und Vergleiche der Verarbeitungs- und Trainingsgeschwindigkeiten mit und ohne GPU. Ich werde zum Beispiel Leistungsvergleiche des CIFAR-10 mit den „Katze und Hund“-Bildklassifizierungs-Deep-Convolution-Netzwerken auf der VirtualBox-VM auf meiner Workstation, auf einem dedizierten Bare-Metal-Server ohne GPU und auf einer Maschine mit dem Tesla zeigen V100-GPU.
Nachdem ich die Verarbeitungs- und Trainingsgeschwindigkeit des Netzwerks optimiert hatte, arbeitete ich an der Verbesserung der Validierungsgenauigkeit des Faltungsnetzwerks. Im zweiten Teil des Blogs teile ich die Änderungen, die ich am Venkatesh-Modell vorgenommen habe, wodurch die Validierungsgenauigkeit des CNN von ~80 % auf 94 % erhöht wird.
In diesem Blog wird davon ausgegangen, dass die Leser über grundlegende Kenntnisse der neuronalen und Deep-Learning-Netzwerk-Terminologie verfügen, wie z. B. Validierungsgenauigkeit, Faltungsschicht usw. Viele der Inhalte werden für mehr Klarheit sorgen, wenn man sich an Venkateshs oder ähnlichen Tutorials versucht hat.
Beobachtungen zur Leistung und GPU-Auslastung
Experimentieren Sie mit den Parametern „workers“ und „batch_size“.
Unabhängig davon, ob der Code auf einer VirtualBox-VM oder einer Bare-Metal-CPU und mit einer GPU ausgeführt wird, kann die Änderung dieser beiden Parameter im Keras-Code erhebliche Auswirkungen auf die Trainingsgeschwindigkeiten haben. Bei der VirtualBox-VM beispielsweise verbessert die Erhöhung der Worker auf 4 (Standard ist 1) und der Batch_size auf 64 (Standard ist 32) die Verarbeitungs- und Trainingsgeschwindigkeit von 47 Bildern/Sek. auf 64 Bilder/Sek. Mit der GPU beträgt die Steigerung der Trainingsgeschwindigkeit ungefähr das Dreifache, nachdem diese Parameter von den Standardwerten angepasst wurden.
Für ein kleines Netzwerk wird GPU Computing kaum genutzt
Mir wurde schnell klar, dass es eine Herausforderung ist, die GPU für maschinelles Lernen zu maximieren.
Beim ursprünglichen Bildklassifizierungsnetzwerk „Katze und Hund“ liegt die GPU-Auslastung zwischen 0 und 10 %. Die CPU-Auslastung liegt ebenfalls bei etwa 10 %. Das Experimentieren mit verschiedenen Parametern wie Workern, Batch_size, max_queue_size und sogar dem Speichern der Bilder auf der RAM-Disk ergab keinen signifikanten Unterschied hinsichtlich der GPU-Auslastung und der Trainingsgeschwindigkeit. Nach weiteren Recherchen habe ich jedoch herausgefunden, dass der Engpass in der Eingabepipeline liegt (z. B. Lesen, Dekomprimieren und Erweitern der Bilder), bevor das Training beginnt, das über die CPU abgewickelt wird.
Dennoch erzeugt das System mit einer GPU immer noch viermal höhere Verarbeitungs- und Trainingsgeschwindigkeiten als die Bare-Metal-Hardware ohne GPU (siehe Abschnitt zum Vergleich der Trainingsgeschwindigkeiten unten).

Abbildung 2: Geringe GPU-Auslastung auf dem ursprünglichen Cat & Dog CNN
Die GPU für maschinelles Lernen bei der Arbeit
Nach der Erhöhung der Komplexität des „Katze-und-Hund“-Netzwerks, wodurch die Validierungsgenauigkeit von 80 % auf 94 % verbessert wurde (z. B. durch Erhöhung der Netzwerktiefe), stieg die GPU-Auslastung auf etwa 50 %. Im verbesserten Netzwerk (hinsichtlich der Genauigkeit) verringerte sich die Bildverarbeitungs- und Trainingsgeschwindigkeit auf der GPU um etwa 20 %, auf der CPU jedoch um etwa 85 %. In diesem Netzwerk sind die Verarbeitungs- und Trainingsgeschwindigkeiten auf der GPU etwa 23-mal schneller als auf der CPU.

Abbildung 3: GPU-Auslastung auf verbessertem Cat & Dog CNN
Zu Versuchszwecken habe ich ein (unnötig) tiefes Netzwerk erstellt, indem ich mehr als 30 Faltungsschichten hinzugefügt habe. Ich konnte die GPU-Auslastung auf 100 % maximieren (beachten Sie die Temperatur und Wattzahl von NVIDIA-SMI). Interessanterweise bleiben die Verarbeitungs- und Trainingsgeschwindigkeiten in etwa gleich wie beim verbesserten „Katze-und-Hund“-Netzwerk mit der GPU. Andererseits kann er mit der CPU in diesem tiefen Netzwerk nur etwa drei Bilder/Sek. verarbeiten, was etwa 100-mal langsamer ist als mit einer GPU.

Abbildung 4: GPU-Auslastung auf dem Deep CNN
Vergleiche der Trainingsgeschwindigkeit
CIFAR-10
Der CIFAR-10-Datensatz ist ein häufig verwendeter Bilddatensatz zum Trainieren von GPU-Modellen für maschinelles Lernen. Ich habe das CIFAR-10-Modell mit von Github heruntergeladenen Bildern ausgeführt. Die Standardgröße für „batch_size“ ist 128, und ich habe mit verschiedenen Werten mit und ohne GPU experimentiert. Auf dem Tesla V100 mit Batch_Size 512 konnte ich etwa 15.000 bis 17.000 Beispiele/Sekunde erreichen. Die GPU-Auslastung lag konstant bei ~45 %.
>Im Vergleich zu den von Andriy Lazorenko veröffentlichten Zahlen ist dies ein sehr respektables Ergebnis. Bei Verwendung der gleichen Batchgröße, mit Bare-Metal-Hardware mit zwei Intel Silver 4110-CPUs (insgesamt 16 Kerne) und 128 GB RAM konnte ich mit den AVX2-kompilierten TensorFlow-Binärdateien nur etwa 210 Bilder/Sekunde erhalten. Auf der VirtualBox-VM erhalte ich etwa 90 Bilder/Sekunde.

Abbildung 5: CIFAR-10-Ausgabe von Tesla V100

Abbildung 6: CIFAR-10-Trainingsgeschwindigkeiten von VM, Bare Metal mit und ohne GPU
Netzwerke zur Bildklassifizierung von Katzen und Hunden
Die folgende Tabelle zeigt die Verarbeitungs- und Trainingsgeschwindigkeiten der verschiedenen „Katzen- und Hunde“-Netzwerke auf verschiedenen Systemen. Die Parameter für jedes System (z. B. Worker, Batch_size) werden gegenüber den Standardwerten optimiert, um die Leistung zu maximieren. Die Leistungssteigerung durch den Einsatz einer leistungsstarken GPU wie der V100 wird umso deutlicher, je tiefer und komplexer die Netzwerke werden.

Abbildung 7: Trainingsgeschwindigkeiten von CNNs von VMs, Bare Metal mit und ohne GPU
Verbesserung der Genauigkeit eines neuronalen Netzwerks und Deep Learning
Zuvor habe ich die Trainingsleistung bei Verwendung von CPU und GPU in vielen Faltungsnetzwerken verglichen. Ich habe gelernt, dass der Einsatz einer GPU umso mehr Leistungsvorteile bietet, je tiefer und komplexer das Netzwerk ist.
Im zweiten Teil des Blogs beschreibe ich die Änderungen, die ich basierend auf Venkateshs Tutorial am „Cat & Dog“ Convolutional Neural Network (CNN) vorgenommen habe, wodurch die Validierungsgenauigkeit des Netzwerks von 80 % auf 94 % verbessert wird. Ich teile auch die Ergebnisse der Vorhersagen des trainierten Netzwerks anhand zufälliger Bildsätze.

Abbildung 1: Ursprüngliches „Cat & Dog“-Bildklassifizierungs-Faltungs-Neuronales Netzwerk
Verbesserungen am Cat & Dog CNN
Fügen Sie Faltungs- und Max-Pooling-Ebenen hinzu
Ich habe dem ursprünglichen Netzwerk ein Paar Faltungs- (64 Filter) und Max-Pooling-Schichten hinzugefügt. Die zusätzliche Tiefe des Netzwerks verbessert die Validierungsgenauigkeit von 80 % auf 84 %. Es führt zu keiner spürbaren Änderung der Trainingsgeschwindigkeit.

Abbildung 2: Fügen Sie ein Paar Faltungs- und Max-Pool-Schichten hinzu

Abbildung 3: Cat & Dog CNN mit zusätzlichen Faltungs- und Max-Pool-Schichten
Dropout-Ebene hinzufügen
Ich habe eine Dropout-Schicht mit einer Rate von 0,5 hinzugefügt, die zufällig Neuronen aus dem trainierten Netzwerk entfernt, um eine Überanpassung zu verhindern. Das Hinzufügen der Dropout-Ebene verbessert die Validierungsgenauigkeit von 84 % auf 90 %. Es führt zu keiner merklichen Änderung der Trainingsgeschwindigkeit.

Abbildung 4: Fügen Sie eine Dropout-Ebene hinzu
Datenerweiterung
Datenerweiterung ist eine Technik, die Variationen von Trainingsbildern aus den Originalbildern durch Verschiebung, Drehung, Zoom, Scherung, Spiegelung usw. generiert, um das Modell zu trainieren. Weitere Informationen finden Sie in der Keras-Dokumentation der ImageDataGenerator-Klasse. Das ursprüngliche CNN enthält bereits Datenerweiterungen, daher stellt dies per se keine Verbesserung dar, aber ich bin daran interessiert, die Auswirkung der Datenerweiterung auf Genauigkeit und Trainingsgeschwindigkeit zu verstehen.

Abbildung 5: Datenerweiterung
Im Folgenden finden Sie Beispiele für erweiterte Bilder.

Abbildung 6: Beispiele für erweiterte Bilder
Um die Wirkung der Datenerweiterung zu testen, entferne ich die Scher-, Zoom- und Spiegelvorgänge aus dem Bilddatengenerator. Das Entfernen der Datenerweiterung verringert die Validierungsgenauigkeit von 90 % auf 85 %. Es ist erwähnenswert, dass die Datenerweiterung mit einem Leistungsaufwand verbunden ist. Ohne Datenerweiterung erhöht sich die Trainingsleistung auf der GPU von 425 Bildern/Sek. auf 533 Bilder/Sek.
Erhöhen Sie die Zielbildauflösungen
Das ursprüngliche CNN ändert die Größe aller Bilder auf 64×64, bevor das Modell trainiert wird. Ich habe die Zielauflösungen auf 128×128 erhöht und dem Netzwerk ein weiteres Paar Faltungs- und Max-Pool-Schichten hinzugefügt, um mehr Details der Bilder zu erfassen. Außerdem habe ich die Anzahl der Filter auf allen Ebenen auf 64 erhöht. Das neue CNN mit höheren Zielbildauflösungen und mehr Ebenen verbessert die Validierungsgenauigkeit von 90 % auf 94 %. Es geht auch mit einem Leistungsaufwand einher, der die Trainingsleistung auf der GPU von 425 Bildern/Sek. auf 333 Bilder/Sek. verringert.

Abbildung 7: Validierungsgenauigkeit von 94 %

Abbildung 8: Verbessertes Cat & Dog CNN
Vorhersagen
Der spaßige Teil besteht nun darin, das trainierte Modell zur Vorhersage von Katzen- oder Hundebildern zu verwenden.
Fehler im ursprünglichen CNN-Code
Ich möchte darauf hinweisen, dass dem Vorhersagecode aus Venkateshs Tutorial eine kritische Codezeile fehlt.

Abbildung 9: Beispiel für eine ursprüngliche Vorhersage
Die Verwendung dieses Codes führt dazu, dass die Vorhersage fälschlicherweise in Richtung „Hund“ tendiert. „Der Grund dafür ist, dass das Modell trainiert wird, indem die RGB-Werte vom Bereich 0 bis 255 auf den Bereich 0 bis 1 neu skaliert werden. Damit das Modell beim Training korrekt vorhersagt, müssen wir auch die eingegebenen RGB-Werte von 0 bis 255 auf den Bereich von 0 bis 1 neu skalieren. Ohne Neuskalierung sind die Eingabepixelwerte 255 größer als vom Modell erwartet, wodurch das Ergebnis fälschlicherweise höher in Richtung 1 (d. h. Hund) tendiert.
Eine weitere Beobachtung ist, dass result[0][0] 0,00000xxx für Katze und 0,99999xxx für Hund zurückgeben kann, statt absolut 0 oder 1. Daher habe ich auch die Prüfung auf „>0,5“ statt auf „==1“ geändert. Der geänderte und korrigierte Code ist in der folgenden Abbildung dargestellt.

Abbildung 10: Korrigierter Vorhersagecode mit hervorgehobenen Änderungen
Bilder vorhersagen
Wie „intelligent“ ist CNN? Wie gut kann es Katzen- und Hundebilder vorhersagen, die über die in den Trainings- und Validierungssätzen hinausgehen? Kann man erkennen, dass Tom aus „Tom & Jerry“ eine Katze ist? Wie wäre es mit Pluto und Goofy von Disney? Wie wäre es mit Cat Woman? Wie wäre es mit Wölfen, Tigern und sogar menschlichen Gesichtern? Nachfolgend finden Sie zufällig heruntergeladene Bilder und die Vorhersageergebnisse des Modells.

Abbildung 11: Zufällige Bilder für das Modell zur Vorhersage

Abbildung 12: Ergebnisse der Vorhersage zufälliger Bilder
Abschließend: GPU Deep Learning
Über leistungsstarke GPUs zum Trainieren von Deep-Learning-Netzwerken zu verfügen, ist äußerst vorteilhaft, insbesondere wenn man die Genauigkeit des Modells ernsthaft verbessern möchte. Ohne die signifikante Steigerung der Trainingsgeschwindigkeit durch GPUs, die in der Größenordnung von mehr als dem 100-fachen liegen kann, müsste man beim Experimentieren mit unterschiedlichen Netzwerkarchitekturen und -parametern sehr lange warten, um die Ergebnisse zu beobachten. Das würde den Prozess im Wesentlichen undurchführbar machen.
Meine zweiwöchige Reise mit dem GPU-Leihgerät ging schnell zu Ende. Es war eine unterhaltsame und produktive Lernerfahrung. Ohne die Trainingsgeschwindigkeiten der leistungsstarken NVidia V100 GPU-Karte wären alle Änderungen, Optimierungen und Experimente mit unterschiedlichen Netzwerkarchitekturen, Parametern und Techniken in so kurzer Zeit nicht möglich.