Wer sich mit Deep-Learning Frameworks beschäftigt, kenn das Problem. Man liest von einem spannenden Projekt, überfliegt kurz das Paper und checkt dann das GitHub Repository aus. Mit dem „pip install -r requirements.txt“ fangen dann oft die Probleme an. X ist nicht kompatibel mit Y und Z hat Abhängigkeiten, die nirgendwo eingetragen sind. Auch wenn Anaconda bzw. Miniconda hier eine große Hilfe sind muss man an einigen Stellen immer wieder mit solchen Herausforderungen herumschlagen, bevor man das neue Model, Projekt, etc. ausprobieren kann.
In so einem Fall hilft dann oft nur Google, StackOverflow und die diversen Foren und Discord Channels in denen sich Betroffene austauschen. Leider dämpft das viel zu Oft den Spaß, den man ohne diese Probleme mit den Modellen haben könnte.
Heute habe ich mit einem Tensorflow Problem zu kämpfen. Beim Aufruf der Methode „model. Fit“ erhalte ich folgende Meldung und der Python Prozess wird beendet.
Epoch 1/10 2023-02-07 07:50:09.119154: I tensorflow/stream_executor/cuda/cuda_dnn.cc:384] Loaded cuDNN version 8401 Process finished with exit code -1073740791 (0xC0000409)
Das ist nicht viel und ich schaue erst mal in der Ereignisanzeige nach, ob hier etwas mehr Informationen zum Problem zu finden sind. Aber hier finde ich nur folgendes:
Name der fehlerhaften Anwendung: python.exe, Version: 3.9.12150.1013, Name des fehlerhaften Moduls: cudnn64_8.dll, Version: 6.14.11.6050, Ausnahmecode: 0xc0000409 Fehleroffset: 0x000000000001420d ID des fehlerhaften Prozesses: 0x6d50 Pfad der fehlerhaften Anwendung: C:\Tools\Anaconda3\python.exe Pfad des fehlerhaften Moduls: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin\cudnn64_8.dll Berichtskennung: e63dc213-e2f5-4f6a-810c-541ea5efa6fc Vollständiger Name des fehlerhaften Pakets: Anwendungs-ID, die relativ zum fehlerhaften Paket ist:
Offensichtlich stimmt hier etwas nicht mit der cudnn64_8.dll, aber was genau kann ich nicht erkennen. Bevor ich die Fehlermeldung google, versuche ich es erst mal etwas mehr über das Problem die Herausforderung in Erfahrung zu bringen.
Ich probiere noch ein paar andere Modelle und stelle fest, dass der Fehler scheinbar mit Conv1D bzw. Conv2D Layern zu tun hat. Ein einfaches Netz, das nur aus Dense Layern besteht, läuft ohne Probleme durch, während Conv1D bzw. Conv2D Layer zum Absturz führen.
Als nächstes checke ich, ob ich die cuda_dnn.cc Datei bei mir auf der Platte finde.
Leider kein Erfolg, aber unter https://github.com/tensorflow/tensorflow/blob/r2.10/tensorflow/stream_executor/cuda/cuda_dnn.cc finde ich dann die Datei und kann ich in Zeile 384 folgendes lesen:
OK, da hätte ich doch etwas anderes erwartet. Entweder ich habe nicht Tensorflow Version 2.10 installiert oder das Sourcen im GitHub Repository entsprechen nicht dem, was in der DLL enthalten ist. Diese Zeile kann doch nicht dafür verantwortlich sein, dass ich mich mit dem Fehler „Process finished with exit code -1073740791 (0xC0000409)“ herumschlagen muss.
Ich prüfe noch mal meine TensorFlow Version.
import tensorflow as tf
print(tf.__version__)
2.10.0
Also alles wie erwartet. Aus purer Verzweiflung lasse ich die betroffenen Modelle noch mal unter Linux (Ubuntu 22) laufen und hier gibt es keine Probleme. Es ist also ein reines Windows Problem. 🙁
Was auch immer in cuDNN version 8401 enthalten ist, „LOG(INFO) << „Loaded cuDNN version “ << cudnnGetVersion();“ kann doch nicht dafür sorgen, dass der komplette Python Prozess beendet wird.
Bevor ich nun anfange, TensorFlow selbst zu kompilieren und zu debuggen, schmeiße ich doch lieber mal Google an und checke mal, ob ich der erst bin, dem das passiert ist (Das sollte man eigentlich immer als erstes versuchen, in den meisten Fällen ist man nicht der Erste und wenn es eine Lösung gibt, findet man sie auch irgendwann).
Entgegen meiner Erwartung finde ich nur 16 Suchergebnisse – wie es scheint ist es kein sehr verbreitetes Problem ……
Die 16 Suchergebnisse sind schnell durchgegangen und ich finde eine Reihe von mehr oder wenige sinnvollen Tipps und Lösungsvorschlägen.
1. Die GPU (und damit die Cuda Blbliotheken) nicht benutzen
Eine einfache Lösung, die auf jeden Fall funktioniert, aber nicht was ich suche
import os
# Force CPU usage :-(
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
2. Andere Versionen nutzen
Es gibt diverse Vorschläge für das Kombinieren von unterschiedlichen TensorFlow, CUDA und cuDNN Versionen in allen möglichen und unmöglichen Varianten mit den entsprechenden Antworten über Erfolg und Misserfolg. Auch nicht das, was ich jetzt stundenlang probieren möchte ….
3. Zlib Installation
Auf mehreren Webseiten finde ich die Empfehlung, die ZLib zu installieren:
https://forums.developer.nvidia.com/t/python-crashes-after-cudnn-update/194850/8
https://forums.developer.nvidia.com/t/use-gpu-for-tensorflow-crashes/208849/9
https://stackoverflow.com/questions/70306845/i-cant-train-my-nn-with-tensorflow-using-gpu
Das klingt vielversprechend. Unter https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html in Kapitel „2.1.3 Installing Zlib“ steht es auch: „Zlib is a data compression software library that is needed by cuDNN.“.
Leider ist der Link zum Download der Datei (http://www.winimage.com/zLibDll/zlib123dllx64.zip) ungültig, aber nach einer kurzen Suche finde ich den korrekten Link: http://www.winimage.com/zLibDll/zlib123dll.zip.
Nach dem Entpacken der Zip Datei kopiere ich wie oben beschrieben die zlibwapi.dll Datei in den C:\Windows\system32 Order und starte mein python Script erneut.
Schon sieht die Welt ganz anders aus:
Epoch 1/10
2023-02-07 09:36:02.521363: I tensorflow/stream_executor/cuda/cuda_dnn.cc:384] Loaded cuDNN version 8401
2023-02-07 09:36:03.843286: I tensorflow/stream_executor/cuda/cuda_blas.cc:1614] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.
639/1563 [===========>..................] - ETA: 3s - loss: 1.7384 - accuracy: 0.3545
Das Training beginnt und ich kann mich endlich auf das eigentliche Thema konzentrieren.
Evtl. hilft dieser Erfahrungsbericht dem einen oder anderen dabei, etwas Zeit und Nerven zu sparen, denn eigentlich macht KI und Deep-Learning doch sehr viel Spaß, auch wenn die vielen unterschiedlichen Abhängigkeiten der Bibliotheken untereinander gelegentlich etwas anstrengend sein könnten.