#KI-Werkstatt
Ein paar ermutigende Worte vorab
Ich hatte noch nie ein Notebook, das so glatt und konsistent funktioniert hat, wie mein neues 15 Zoll Microsoft Surface Book 2. Wirklich cooles Zeug. Es ist schade, dass all diese Sätze mit einem „Aber“ enden. Hier ist das „Aber“ dieser Geschichte:
Wenn man beabsichtigt, Deep Neuronal Networks DNN zu implementieren und zu optimieren, müssen die Berechnungen unbedingt auf der GPU stattfinden. Natürlich können die Berechnungen auch auf der CPU laufen, was sich einfach installieren lässt. Der Nachteil hiervon ist jedoch, dass es sehr lange dauert, bis größere Modelle trainiert sind. Das Geheimnis hinter ausgereifter KI ist, dass die perfekte Konfiguration eines Modells erst nach mehreren Trainingseinheiten erreicht ist – was viel Rechenleistung und damit Zeit beansprucht.
Wenn man KI-Gurus wie François Chollet (den Hersteller des Keras-Frameworks) fragt, würden sie sagen: „Verwende Linux- oder GPU-Cloud-Computer!“ Ich muss diesen ihnen Recht geben; die Installation der GPU-Unterstützung ist auf Linux wirklich einfach und auf Windows super kompliziert.
Nichtsdestotrotz ist es möglich, Deinen Windows 10 zu zwingen, die Tore zur GPU-API zu öffnen, und ich werde in diesem Blogbeitrag zeigen, wie genau das geht. Danach kannst Du Deine neuronalen Netze viel schneller trainieren und holst die Zeit locker wieder rein, die Du jetzt investieren musst.
Zu Beginn ein wichtiger Hinweis: Am Anfang dachte ich, dass ich die empfohlenen Treiber- und Softwareversionen ignorieren kann und habe immer die aktuellsten Versionen genommen. Das war eine wirklich schlechte, frustrierende und zeitraubende Idee. Sobald ich die Versionen verwendet hatte, die ich auch in diesem Beitrag empfehle, war es viel einfacher.
Also hol dir einen Kaffee, leg dir coole Musik auf die Ohren und starte durch
1. Get Python into shape
Zuerst ist es sinnvoll, die Python-Umgebung in eine vordefinierte Form zu bringen.
Wenn man Python nicht bereits installiert hat, kann dies über die Anaconda-Distribution (https://www.anaconda.com/download/#windows) getan werden. Bei dieser Installation sollte man darauf achten, das Bundle für Python 3.xx 64 Bit, und nicht 2.xx zu verwenden.
Zunächst muss pip (pip ist der Python-Paketierungsmanager) auf die aktuellste Version aktualisiert werden:
- Starte die cmd als Administrator
- Run “exe -m pip install –upgrade pip”
- Run “pip –version” zum prüfen der Version. Bei mir ist es “pip 18.1 from c:\programdata\anaconda3\lib\site-packages\pip (python 3.6)”
Ich habe alle TensorFlow und Keras Bibliotheken deinstalliert, wenn sie nicht Version 1.10.0 sind. Kein Witz: Ich empfehle, genau die genannte Version zu verwenden, um Zeit zu sparen. Ansonsten passen die Kombinationen nicht. Run “pip show tensorflow tensorflow-gpu keras”.
Keine Sorge, wenn TensorFlow noch nicht installiert ist, das werden wir später noch tun.
2. Installiere Microsoft Visual Studio 2017
Um genau zu sein: Visual Studio brauche ich eigentlich nicht für die GPU-Unterstützung und kann es später wieder deinstallieren. Es ist jedoch notwendig, Visual Studio zu verwenden, um die GPU-Treiberbeispiele zu kompilieren, und zu überprüfen, ob die Installation erfolgreich war. Es ist der erste große Stopp auf unserem Weg, um testen zu können, ob der Betriebssystemteil einwandfrei funktioniert. Ich lade deshalb die „Visual Studio IDE Community Edition 2017“ herunter:
https://visualstudio.microsoft.com/
Nun wähle ich die zu installierenden Pakete aus. Am Ende gibt es nur eine Sache, die wirklich wichtig ist. Der „Windows 10 SDK (10.0.15063.0)“ muss installiert werden.
3. Windows Update
Dein Windows sollte auf dem neuesten Stand sein. Für mich funktionierte alles viel besser, nachdem ich das letzte NVIDIA-Treiber-Update installiert hatte.
Um herauszufinden, ob der NVIDIA Treiber richtig installiert und konfiguriert ist, kannst Du folgende Schritte machen:
Schritt 1: Öffne im Taskmanager den Reiter „Leistung“:
Der Treiber muss unter „C:\Program Files\NVIDIA Corporation\ installiert sein.
Auch hier ist es wichtig, mit den Versionsnummern pingelig zu sein. Ich habe herausgefunden, dass es nicht viel Versionstoleranz in den Tools gibt.
Im dritten Schritt prüfe ich nun die NVIDIA Einstellungen.
Wenn man mit der rechten Maustaste auf den Desktop klickt, bekommt man den Menüpunkt „NVIDIA Systemsteuerung“ (wenn nicht, dann versuche den Treiber von NVIDIA herunterzuladen und zu installieren. Das funktionierte bei mir nicht, da Windows den Treiber nach jedem Neustart entfernt hat, aber vielleicht….).
4. CUDA 9.0 installieren
CUDA ist das API-Gateway zu Deinem NVIDIA Grafikprozessor, um C++-Zugriff darauf zu haben. Über CUAD kann man ein Deep Neuronal Network massiv parallel berechnen lassen. Allerdings benötigt man genau die Version „cuda_9.0.176.1_windows“ und alle Patches. Es ist ein wenig schwierig, sie zu finden, da es sich bereits um ältere Versionen handelt. Einige Screenshots dazu finden sich hier:
https://developer.nvidia.com/cuda-downloads
Nun lädt man den Basis-Installer und alle Patches herunter.
Dann installiert man den „Base Installer„. Das Programm warnte mich, dass es einen Versionskonflikt gibt. Ich habe diese Warnung aber ignoriert und die Installation fortgesetzt.
Danach konnte ich alle Patches in aufsteigender Reihenfolge installieren.
5. Installiere CUDNN
Für Deep Neuronal Networks cuDNN bauche ich die CUDA Erweiterung, und zwar genau die Version: „cudnn-9.0-windows10-x64-v7.3.0.29„. Es ist etwas schwierig, den Download zu finden, da man zunächst ein Konto bei NVIDIA erstellen muss (Ich habe direkt ein Konto erstellt und nicht meinen Google oder Facebook Account genutzt, da der Login so definitiv funktioniert).
https://developer.nvidia.com/cudnn
Klicke auf „Download cuDNN“
Ich selektiere hier zunächst „I Agree To the Terms oft he…“. Danach wird der Link „Archived cuDNN Releases“ eingeblendet.
cuDNN is eine ZIP Datei, die man einfach entpackt und den Inhalt in das CUDA Installationsverzeichnis kopiert:
- Kopiere .\cuda\bin\cudnn64_7.dll nach C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin
- Kopiere .\cuda\ include\cudnn.h nach C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include
- Kopiere .\cuda\lib\x64\cudnn.lib nach C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\lib\x64
6. Prüfen, ob die CUDA Installation geklappt hat
Ich prüfe nun, ob der Windows-Teil erfolgreich war, damit ich mich danach auf den reinen Python-Teil konzentrieren können. Für die Fehlersuche ist dieser kleine Zwischenschritt extrem hilfreich.
Ich überprüfe zuerst, ob alle System Variablen korrekt gesetzt sind:
Ich kompiliere den CUDA-Beispielcode, um zu überprüfen, ob CUDA ordnungsgemäß installiert wurde. Dazu starte ich Visual Studio und öffne das entsprechende Projekt. Die Sample-Code Projekte sollten hier abgelegt sein.: “C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.0”
- Über den Menüpunkt Date -> Öffnen -> Projek/Projektmappe… lässt sich das Projekt Samples_vs2017.sln” öffnen
- Nachdem die Projektmappe geöffnet wurde, selektiere ich im “Projektmappen-Exporer das Projekt “deviceQuery”
- Nun wähle ich mit einem Rechtsklick im Kontextmenü „Erstellen“ um das Projekt zu bauen. Die Ausgabe sieht so aus:
- Danach beende ich Visual Studio und starte meine cmd
- Das Programm wurde nach C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.0\bin\win64\Debug” kompiliert.
Somit: “cd C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.0\bin\win64\Debug” - Ich starte “deviceQuery.exe”. Die Ausgabe sollte in etwa so aussehen. Wichtig ist hierbei eigentlich nur, dass die GPU unter Device 0 angesprochen wurde
- Lehn Dich zurück und genieße den Anblick!
7. Installation von Keras und Tensorflow
Die letzten Schritte sind nicht mehr schwer. Wenn die deviceQuery.exe von oben ausgeführt werden kann, ist es jetzt nur noch eine Frage der richtigen Versionen. Also:
- Starte die cmd als Administrator
- Installiere TensorFlow 1.10.0.
“pip install tensorflow==1.10.0” - Installiere TensorFlow-gpu 1.10.0
“pip install tensorflow-gpu==1.10.0” - Installiere Keras 2.2.4
“pip install keras==2.2.4”
Ich habe mir folgendes Skript heruntergeladen. Eigentlich handelt es sich dabei nur um eine Art Hello World für TensorFlow-GPU (Achtung: Man sollte sich vorher überzeugen, dass es wirklich harmlos ist und keinen Schaden anrichten kann.)
https://github.com/JJDoneAway/LearnPython/raw/master/GPU_Tweaks/CheckGPU.py
Ich habe das Skript lokal bei mir gespeichert und lasse es nun laufen:
- Öffne deine cmd
- Wechsle in das Verzeichnis mit dem CheckGPU.py Skript
- “python CheckGPU.py”
- Die Ausgabe sollte in etwa wie in Abbildung… Wichtig sind die gelb markierten Zeilen, die zeigen, das die GPU angesprochen wurde.
Da das im Screenshot ein wenig klein ist, habe ich den entscheidenden Text hier nochmal herauskopiert: “Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2044 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060, pci bus id: 0000:02:00.0, compute capability: 6.1)”
Es muss GPU und nicht CPU sein.
8. Keras Code auf der GPU ausführen
Wenn ich jetzt Keras Code laufen lasse, kann es sein, dass der folgende Fehler auftaucht:
InternalError: Blas GEMM launch failed : a.shape=(128, 784), b.shape=(784, 484), m=128, n=484, k=784[[Node: dense_1/MatMul = MatMul[T=DT_FLOAT, _class=[„loc:@training/RMSprop/gradients/dense_1/MatMul_grad/MatMul_1″], transpose_a=false, transpose_b=false, _device=“/job:localhost/replica:0/task:0/device:GPU:0“](_arg_dense_1_input_0_0/_37, dense_1/kernel/read)]]
Um das zu vermeiden, musst man immer folgende Konfiguration in den Code kopieren:
https://github.com/JJDoneAway/LearnPython/raw/master/GPU_Tweaks/KerasConfiguration.py
Wenn man jetzt noch wirklich sicher gehen will, dass der Code auf der GPU läuft, kann man folgendes Python Skript laufen lassen. Dabei handelt es sich um ein Keras Model, das mit 500 Epochen gebaut werden soll. Natürlich macht das fachlich keinen Sinn, es verschafft aber die Zeit, während es läuft, den Task Manager zu öffnen und die die Auslastung der GPU anzusehen.
https://github.com/JJDoneAway/LearnPython/raw/master/GPU_Tweaks/ShowGPUPower.py
“python ShowGPUPower.py”
Wenn Du das Skript mit „Strg“ + „C“ stoppst, wirst Du sehen, dass die Last sofort auf 0 fällt.
Abschließende Bemerkung
Es wäre schöner, wenn es eine einfache Install.exe gäbe, die alles installiert und uns nicht durch dieses finstere Tal der verschiedenen Versionen hetzen würde. Nichtsdestotrotz funktioniert es nun und es ist ja die Menge an Fehlern, die man in seinem Leben schon gemacht oder gesehen hat, die einen zu Senior werden lassen ?
Viel Spaß mit Deinen DNNs!