wake-up-neo.com

Was bedeutet der Fehler: `Geladene Laufzeit-CuDNN-Bibliothek: 5005, aber Quelle wurde mit 5103 kompiliert`?

Ich habe versucht, TensorFlow mit der GPU zu verwenden und habe den folgenden Fehler erhalten:

I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla K20m, pci bus id: 0000:02:00.0)
E tensorflow/stream_executor/cuda/cuda_dnn.cc:347] Loaded runtime CuDNN library: 5005 (compatibility version 5000) but source was compiled with 5103 (compatibility version 5100).  If using a binary install, upgrade your CuDNN library to match.  If building from sources, make sure the library loaded at runtime matches a compatible version specified during compile configuration.
F tensorflow/core/kernels/conv_ops.cc:457] Check failed: stream->parent()->GetConvolveAlgorithms(&algorithms)

natürlich versuche ich, diesen Fehler zu beheben (obwohl dies bereits gefragt wurde Geladene Laufzeit-CuDNN-Bibliothek: 5005 (Kompatibilitätsversion 5000), aber die Quelle wurde mit 5103 (Kompatibilitätsversion 5100) kompiliert ), aber ich möchte verstehen der Fehler. Ich versuche immer, Probleme selbst zu lösen (Codierung), bevor ich sie poste (um Hilfe bitte), aber es fällt mir schwer, diese zu starten, da die Fehlermeldung mir ein wenig kryptisch/unklar erscheint und ich keine zu finden scheint Gute Ressource, um zu verstehen, was der Fehler bedeutet.

Um den Fehler zu verstehen, habe ich mich auf die Zeile konzentriert, in der der Fehler zu beginnen scheint:

Loaded runtime CuDNN library: 5005 (compatibility version 5000) but source was compiled with 5103 (compatibility version 5100).

Nachdem ich einige relevante Github-Seiten gelesen hatte, stellte ich fest, dass das Lesen des Fehlers wie folgt tatsächlich hilfreicher ist:

Geladene Laufzeit-CuDNN-Bibliothek: 5005, Quelle wurde jedoch mit 5103 kompiliert.

das Entfernen der Klammer macht den Fehler etwas sinnvoller (obwohl ich gerne verstehen/wissen möchte, welche Rolle die Klammer in der Fehlermeldung spielt, um das Debuggen zu vereinfachen), da es den Anschein hat, als hätte sie die CuDNN-Bibliothek 5005 geladen (auf der Ebene von UNIX/OS), aber der TensorFlow (für Python) wurde mit dem kompiliert, was ich vermute, ist Version 5103. Offensichtlich, wenn die TensorFlow-Bibliothek eine API gemäß 5103 verwendet, aber die "echte" API, um mit dem (cuda) Deep Learning zu sprechen Bibliothek CuDNN ist Version 5005, es ist klar, es wäre ein Problem. Obwohl sie nur Vermutungen darüber sind, was los ist.

Meine erste Verwirrung ist, dass es, soweit ich das beurteilen kann, keine solche CuDNN 5005 oder 5103 gibt. Es wäre fantastisch zu verstehen, was dieser Teil des Fehlers sicher bedeutet, damit ich anfangen kann, dies wirklich zu debuggen. Soweit ich wissen kann, wann ich module list verwende, verwende ich:

cudnn/5.0

Meine zweite Verwirrung ist die Klammer, die ich ignoriert habe und was sie bedeuten:

  1. Loaded runtime CuDNN library: 5005 (compatibility version 5000)
  2. but source was compiled with 5103 (compatibility version 5100)

Ich habe ehrlich gesagt keine Ahnung, was die "Kompatibilitätsversion XXXX" bedeutet. Vielleicht ist es ein Vorschlag, Version 5000 (was auch immer das bedeutet) für CuDNN zu installieren (was immer noch verwirrend ist, da es keine fünftausend CuDNN-Versionen gibt) und eine TensorFlow-Version (irgendwie) zu kompilieren, die CuDNN-Version 5100 verwendet.

Weiß jemand genauer, was die Fehler genau bedeuten (und gibt seine Lösung für die Frage an, die ich verlinkt habe?)

8
Charlie Parker

Dies ist eine ungefähre Beschreibung der Vorgänge.

cuDNN verfügt über Hauptversionen, die z. 4.0, 5.0, 5.1 usw.

Diese Hauptversionen können API-Änderungen enthalten. Daher kann ein Programm, das cuDNN v4 (d. H. 4.0) verwendet, einige Änderungen erfordern, um mit neuen Funktionen in cuDNN v5 (d. H. 5.0) zu arbeiten oder diese zu verwenden.

Die Hauptversion ist in den ersten beiden Ziffern der vierstelligen Versionsnummer kodiert. Eine 4-stellige cuDNN-Versionsnummer von 5103 bedeutet, dass sie zur Hauptversion 5.1 gehört und die Unterversionsnummer 03 hat. Aus Gründen der Kompatibilität sollte eine solche Version mit jeder anderen cuDNN-Bibliotheksversion API-kompatibel sein von 51xx, weil sie alle zur Hauptversion von 5.1 gehören (dies ist keine Garantie für AFAIK, aber es ist die allgemeine Idee). Daher hätte jede dieser Bibliotheken mit der Versionsnummer 51xx eine Kompatibilitätsversion von 5100, um anzuzeigen, dass sie zu der Hauptversion 5.1 gehören (und damit kompatibel sein sollten).

Wenn wir uns also auf eine Kompatibilitätsversion beziehen (mit welcher Hauptversion diese Bibliothek kompatibel ist), müssen wir nur die ersten beiden Ziffern angeben - 5000 bedeutet 5,0, 5100 bedeutet 5,1. Es ist jedoch möglich, dass ein Release eine Unterversionsnummer hat, die nicht Null ist. Hierfür kann es verschiedene Gründe geben, z. B. um Fehlerkorrekturen und ähnliches zuzulassen.

Wenn ein Programm (wie Tensorflow) zur Verwendung von cuDNN entwickelt wurde, wird es im Allgemeinen für die Verwendung mit einer bestimmten Version von cuDNN codiert. In einigen Fällen kann dies zur Kompilierungszeit durch "Kompilieren gegen" eine bestimmte cuDNN-Version (und die zugehörige API, d. H. Header-Dateien, die beim Erstellen von Tensorflow verwendet werden) erledigt werden. Daher kann ein Programm wie tensorflow zur Kompilierungszeit bestimmen, für welche Version der cuDNN-API es kompiliert wurde, und dies ist eine 4-stellige Version (obwohl im Allgemeinen nur die Kompatibilitätsversion, dh die ersten beiden Ziffern der 4-stelligen Version) Version sollte wirklich wichtig sein).

Zur Laufzeit ist irgendwo eine bestimmte Version der cuDNN-Bibliothek (z. B. unter Linux) auf Ihrem Computer geladen. Die Version dieser Bibliothek kann ermittelt, abgefragt und gemeldet werden. Wenn diese tatsächliche Bibliotheksversion (zumindest aus Sicht der Kompatibilitätsversion) nicht mit der Version der cuDNN-Bibliothek übereinstimmt, für die Tensorflow kompiliert wurde, ist dies ein guter Hinweis darauf, dass die Dinge möglicherweise nicht funktionieren, und Tensorflow weist daher darauf hin, wenn es ausgeführt wird :

Geladene Laufzeit-CuDNN-Bibliothek: 5005, Quelle wurde jedoch mit 5103 kompiliert.

Dies ist ein Tensorflow, der Ihnen sagt, "Hey, ich wurde entworfen (kompiliert), um mit cuDNN v5.1 zu arbeiten, aber Sie geben mir nur cuDNN 5.0, mit dem ich arbeiten kann".

Unterschiede auf der Ebene der Unterversion sollten weniger bedeutend sein. Wenn Sie wissen, was Sie tun, ist es möglicherweise in Ordnung, die cuDNN-Laufzeitversion 5107 zu verwenden, auch wenn Ihr Tensorflow mit Version 5103 kompiliert wurde. Dies ist nur ein hypothetisches Beispiel, das jedoch darauf hinweist, dass es einen Unterschied in der Bibliothek gibt, der nicht gegeben ist beabsichtigt, die ordnungsgemäße Funktionalität oder das Verhalten oder die API-Schnittstelle zu ändern. Es könnte sich zum Beispiel nur um eine fehlerbereinigte Version von 5103 handeln (hypothetisch. Dies ist ein imaginäres Beispiel.)

Im Idealfall würden Sie Tensorflow gegen die Version von cuDNN erstellen, die Sie verwenden. Wenn Sie jedoch vorgefertigte Tensorflow-Pakete heruntergeladen haben, können Sie diese Art von Meldung sehen (da Sie vermutlich cuDNN separat heruntergeladen haben). In diesem Fall sollten Sie zumindest versuchen, die von Ihnen verwendete cuDNN-Hauptversion mit der von tensorflow erwarteten Kompatibilitätsversion abzugleichen. In diesem speziellen Beispiel tun Sie das nicht.

15
Robert Crovella

Vielleicht können Sie "cuDNN v5.1 für CUDA 8.0/7.5" herunterladen und dann installieren.

1
user8093049