TensorFlow™ auf Databricks
Verwenden einer GPU
Eine GPU (Graphical Processing Unit) ist eine Komponente der meisten modernen Computer, die der Durchführung von Berechnungen für 3D-Grafiken dient. Ihre häufigste Verwendung besteht darin, diese Aktionen für Videospiele auszuführen und die Bewegung von Polygonen zu berechnen, um dem Benutzer das Spiel anzuzeigen. Eine GPU ist im Grunde eine große Ansammlung kleiner Prozessoren, die hochgradig parallelisierte Berechnungen durchführen. Sie haben im Grunde genommen gerade einen Mini-Supercomputer* am Laufen!
Während jede einzelne CPU in einer GPU recht langsam ist, gibt es viele davon und sie sind auf die numerische Verarbeitung spezialisiert. Daher kann eine GPU viele einfache numerische Verarbeitungsaufgaben gleichzeitig ausführen. Glücklicherweise ist es genau das, was viele Algorithmen für Machine Learning erledigen müssen.
Sie haben keine GPU?
Die meisten modernen Computer (der letzten 10 Jahre) verfügen über eine Art GPU, auch wenn diese in Ihr Motherboard integriert ist. Für die Zwecke dieses Tutorials ist diese Art GPU ausreichend.
Sie müssen wissen, welchen Grafikkartentyp Sie haben. Windows-Benutzer können diese Anweisungen befolgen. Benutzer anderer Systeme müssen in der Dokumentation ihres Systems nachsehen.
Benutzer von Grafikkarten, die nicht von Nvidia sind
Während andere Grafikkarten möglicherweise unterstützt werden, ist dieses Tutorial nur ein Test auf einer aktuellen Nvidia-Grafikkarte. Wenn es sich bei Ihrer Grafikkarte um einen anderen Typ handelt, sollten Sie sich eine Nvidia-Grafikkarte kaufen oder ausleihen. Wenn Ihnen das zu umständlich erscheint, wenden Sie sich an Ihre örtliche Universität oder Schule und fragen Sie, ob sie Ihnen helfen können. Sollte man Ihnen auch dort nicht weiterhelfen können, lesen Sie einfach dieses Tutorial und verwenden Sie stattdessen eine Standard-CPU. Die dabei erworbenen Erkenntnisse können Sie zu einem späteren Zeitpunkt nutzen.
* Hinweis: Nicht wirklich ein Supercomputer, aber in vielerlei Hinsicht ähnlich.
Installieren von GPU-fähigem TensorFlow
Wenn Sie keine GPU-fähige Version von TensorFlow installiert haben, ist dies zunächst erforderlich. In unseren Anweisungen in Lektion 1 ist dies nicht enthalten. Wenn Sie sich also noch nicht um eine GPU-Unterstützung gekümmert haben, dann haben Sie noch keine.
Ich empfehle Ihnen, hierfür eine neue Anaconda-Umgebung zu erstellen, anstatt zu versuchen, Ihre vorherige zu aktualisieren.
Vor dem Start
Rufen Sie die offiziellen TensorFlow-Installationsanweisungen auf und folgen Sie den Anaconda-Installationsanweisungen. Der Hauptunterschied zu dem, was wir in Lektion 1 gemacht haben, besteht darin, dass Sie die GPU-fähige Version von TensorFlow für Ihr System benötigen. Bevor Sie TensorFlow jedoch in dieser Umgebung installieren, müssen Sie Ihren Computer so einrichten, dass er GPU-fähig mit CUDA und CuDNN ist. Die offizielle TensorFlow-Dokumentation beschreibt die dafür notwendigen Schritte detailliert, ich empfehle jedoch dieses Tutorial, wenn Sie versuchen, eine aktuelle Ubuntu-Installation einzurichten. Der Hauptgrund dafür ist, dass CUDA zum Zeitpunkt des Verfassens dieses Artikels (Juli 2016) noch nicht für die neueste Ubuntu-Version erstellt wurde, was bedeutet, dass der Prozess viel umständlicher und weniger automatisch ist.
Verwenden Ihrer GPU
Es ist eigentlich ganz einfach. Zumindest von der Syntax her. Ändern Sie einfach
zu
Diese neue Zeile erstellt einen neuen Kontextmanager, der TensorFlow anweist, diese Aktionen auf der GPU auszuführen.
Sehen wir uns ein konkretes Beispiel an. Der folgende Code erstellt eine Zufallsmatrix mit einer in der Befehlszeile angegebenen Größe. Wir können den Code entweder auf einer CPU oder GPU ausführen, indem wir folgende Befehlszeilenoptionen verwenden:
Sie können dies in der Befehlszeile ausführen, und zwar so:
python matmul.py gpu 1500
Dadurch wird die CPU mit einer Matrix der Größe 1500 im Quadrat verwendet. Verwenden Sie Folgendes, um die gleiche Operation auf der CPU durchzuführen:
python matmul.py cpu 1500
Das erste, was Sie beim Ausführen von GPU-fähigem Code bemerken werden, ist eine deutliche Steigerung der Ausgabe im Vergleich zu einem normalen TensorFlow-Skript. Hier ist, was mein Computer ausgibt, bevor er irgendwelche Ergebnisse der Operationen ausgibt.
Wenn Ihr Code keine ähnliche Ausgabe erzeugt, führen Sie nicht GPU-fähiges TensorFlow aus. Wenn Sie alternativ eine Fehlermeldung wie ImportError: libcudart.so.7.5: cannot open shared object file: No such file or directory
erhalten, dann haben Sie die CUDA-Bibliothek nicht ordnungsgemäß installiert. In diesem Fall müssen Sie noch einmal die Anweisungen zur Installation von CUDA auf Ihrem System befolgen.
Versuchen Sie, den obigen Code sowohl auf der CPU als auch auf der GPU auszuführen und erhöhen Sie dabei die Zahl langsam. Beginnen Sie mit 1500, versuchen Sie es dann mit 3000, dann mit 4500 und so weiter. Sie werden feststellen, dass die CPU ziemlich lange braucht, während die GPU bei dieser Operation sehr, sehr schnell ist!
Wenn Sie über mehrere GPUs verfügen, können Sie eine beliebige verwenden. GPUs sind nullindiziert – der Code oben greift auf die erste GPU zu. Wenn Sie das Gerät in gpu:1
ändern, wird die zweite GPU verwendet und so weiter. Sie können auch einen Teil Ihrer Berechnung an eine GPU und einen Teil an eine andere GPU senden. Darüber hinaus können Sie auf ähnliche Weise auf die CPUs Ihres Computers zugreifen – verwenden Sie einfach cpu:0
(oder eine andere Zahl).
Welche Art von Operationen sollte ich an die GPU senden?
Wenn der Prozessschritt im Allgemeinen wie folgt beschrieben werden kann: „Führe diese mathematische Operation tausende Male durch“, dann senden Sie sie an die GPU. Beispiele hierfür sind die Matrixmultiplikation und die Berechnung der Umkehrung einer Matrix. Tatsächlich sind viele grundlegende Matrix-Operationen erstklassige Kandidaten für GPUs. Als grobe und einfache Faustregel sollten andere Operationen auf der CPU ausgeführt werden.
Der Wechsel von Geräten und die Verwendung von GPUs hat auch seine Nachteile. GPUs haben keinen direkten Zugriff auf den Rest Ihres Computers (außer natürlich auf das Display). Wenn Sie einen Befehl auf einer GPU ausführen, müssen Sie daher zuerst alle Daten auf die GPU kopieren, dann die Operation ausführen und dann das Ergebnis zurück in den Hauptspeicher Ihres Computers kopieren. TensorFlow erledigt dies im Hintergrund, somit ist der Code einfach, aber die Arbeit muss trotzdem gemacht werden.
Nicht alle Operationen können auf GPUs durchgeführt werden. Wenn Sie die folgende Fehlermeldung sehen, versuchen Sie, eine Operation auszuführen, die auf einer GPU nicht möglich ist:
In diesem Fall können Sie das Gerät für diese Operation entweder manuell in eine CPU ändern oder TensorFlow so einstellen, dass das Gerät in diesem Fall automatisch geändert wird. Setzen Sie dazu in der Konfiguration allow_soft_placement
auf True
, was im Rahmen der Sitzungserstellung erfolgt. Der Prototyp sieht folgendermaßen aus:
Ich empfehle außerdem, die Geräteplatzierung bei der Verwendung von GPUs zu protokollieren, damit Sie Probleme im Zusammenhang mit der Nutzung unterschiedlicher Geräte problemlos beheben können. Dadurch ist die Nutzung der Geräte im Protokoll enthalten, sodass Sie sehen können, wann sich Geräte ändern und wie sich dies auf den Graphen auswirkt.
- Richten Sie Ihren Computer so ein, dass er die GPU für TensorFlow verwendet (oder leihen Sie sich einen Computer, wenn Sie keine aktuelle GPU haben).
- Versuchen Sie, die Lösungen der vorherigen Übung auf der GPU auszuführen. Welche Operationen können auf einer GPU ausgeführt werden und welche nicht?
- Erstellen Sie ein Programm, das Operationen sowohl auf der GPU als auch auf der CPU ausführt. Verwenden Sie den Profiling-Code von Lektion 5, um die Auswirkungen des Sendens von Daten an die und des Abrufens von Daten von der GPU abzuschätzen.
- Schicken Sie mir Ihren Code! Ich würde gerne Ihren Code sehen und erfahren, wie Sie TensorFlow verwenden und welche Tricks Sie gefunden haben.