¿Qué significa el error: `Biblioteca CuDNN cargada en tiempo de ejecución: 5005 pero la fuente se compiló con 5103 ‘?

Estaba intentando usar TensorFlow con GPU y obtuve el siguiente error:

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) 

por supuesto, estoy tratando de corregir este error (aunque esto ya se solicitó . Biblioteca CuDNN cargada en tiempo de ejecución: 5005 (versión de compatibilidad 5000) pero la fuente se compiló con 5103 (versión de compatibilidad 5100) ) pero me gustaría entender el error. Siempre trato de intentar resolver (codificar) los problemas por mí mismo antes de publicar (pedir ayuda), pero me cuesta mucho comenzar con este porque el mensaje de error me parece un poco críptico / confuso y parece que no puedo encontrar un Buen recurso para entender lo que significa el error.

Para comprender el error, me centré en la línea que parece estar donde comienza el error:

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

Después de leer algunas páginas de github que parecían relevantes, me di cuenta de que leer el error de la siguiente manera es más útil:

Biblioteca CuDNN cargada en tiempo de ejecución: 5005 pero la fuente se compiló con 5103.

eliminar el paréntesis hace que el error tenga un poco más de sentido (aunque me gustaría entender / saber cuál es la función del paréntesis en el mensaje de error para facilitar la depuración) ya que parece que ha cargado la biblioteca CuDNN 5005 (al nivel de UNIX / OS) pero el TensorFlow (para python) se compiló con lo que supongo que es la versión 5103. Obviamente, si la biblioteca TensorFlow usa una API de acuerdo con 5103 pero la API “real” para hablar con el (cuda) aprendizaje profundo La biblioteca CuDNN es la versión 5005, está claro que sería un problema. Aunque son solo suposiciones de lo que está pasando.

Mi primera confusión es que, por lo que puedo decir, no hay tal cosa CuDNN 5005 o 5103. Sería asombroso entender lo que esa parte del error significa seguro para que pueda comenzar a depurar esto de verdad. Por lo que puedo decir cuando uso la module list que estoy usando:

 cudnn/5.0 

Mi segunda confusión es el paréntesis que ignoré y lo que significan:

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

Sinceramente, no tengo ni idea de lo que significa la “versión de compatibilidad XXXX”. Tal vez su sugerencia es instalar la versión 5000 (lo que sea que eso signifique) para CuDNN (que aún es confuso porque no hay una versión de CuDNN de 5 mil) y comstackr una versión de TensorFlow (de alguna manera) que use la versión 5100 de CuDNN.

¿Alguien sabe con mayor precisión qué significan exactamente los errores (y proporciona su solución a la pregunta que vinculé?)

Esta es una descripción aproximada de lo que está pasando.

cuDNN tiene versiones principales que están numeradas, por ejemplo, 4.0, 5.0, 5.1, etc.

Estas versiones principales pueden incorporar cambios en la API. Por lo tanto, un progtwig que utiliza cuDNN v4 (es decir, 4.0) puede necesitar algunas modificaciones para trabajar o usar nuevas funciones en cuDNN v5 (es decir, 5.0).

La versión principal está codificada en los dos primeros dígitos del número de versión de 4 dígitos. Por lo tanto, un número de versión de 4 dígitos de cuDNN de 5103 significa que pertenece a la versión principal 5.1 y tiene un número de subversión de 03. Para propósitos de compatibilidad , dicha versión debe ser compatible con API con cualquier otra versión de biblioteca 51 cuDNN de 51xx. todos pertenecen a la versión principal 5.1 (no se garantiza que esto sea estrictamente cierto AFAIK, pero es la idea general). Por lo tanto, cualquiera de estas bibliotecas con número de versión 51xx tendría una versión de compatibilidad de 5100, para indicar que pertenecen a (y son (deberían ser) compatibles con) la versión principal 5.1.

Entonces, cuando nos referimos a una versión de compatibilidad (con qué versión principal es compatible con esta biblioteca) solo necesitamos especificar los dos primeros dígitos: 5000 indica 5.0, 5100 indica 5.1. Pero es posible que un lanzamiento tenga un número de versión de sub-lanzamiento que no sea cero. Podría haber una variedad de razones para esto, por ejemplo, para permitir versiones de corrección de errores y similares.

Cuando un progtwig (como tensorflow) está diseñado para usar cuDNN, generalmente se codificará para que funcione con una versión particular de cuDNN. En algunos casos, esto se puede manejar en tiempo de comstackción, “comstackndo contra” una versión cuDNN pariticular (y su API asociada, es decir, los archivos de encabezado utilizados al crear tensorflow). Por lo tanto, en el momento de la comstackción, un progtwig como tensorflow puede determinar contra qué versión de la API cuDNN se compiló, y esa es una versión de 4 dígitos (aunque en términos generales, solo la versión compatible es la de los dos primeros dígitos del código de 4 dígitos). la versión debería importar realmente).

En el tiempo de ejecución, tiene una versión particular de la biblioteca cuDNN (por ejemplo, .so en linux) cargada en su máquina en algún lugar. La versión de esa biblioteca se puede determinar, consultar y reportar. Si esa versión de la biblioteca real no coincide (al menos desde la perspectiva de la versión de compatibilidad) con la versión de la biblioteca cuDNN con la que se compiló tensorflow, entonces es una buena indicación de que las cosas pueden no funcionar, por lo que tensorflow lo señala cuando se está ejecutando :

Biblioteca CuDNN cargada en tiempo de ejecución: 5005 pero la fuente se compiló con 5103.

Esto es tensorflow que le dice “hey, yo estaba diseñado (comstackdo) para trabajar con cuDNN v5.1 pero solo me está dando cuDNN 5.0 para trabajar con”.

Las diferencias a nivel de sub-versión deberían ser menos significativas. Si sabe lo que está haciendo, puede estar bien usar la versión 5107 en tiempo de ejecución de cuDNN incluso si su tensorflow se compiló con la versión 5103. Esto es solo un ejemplo hipotético, pero eso indicaría que hay alguna diferencia en la biblioteca que no estaba destinado a cambiar la funcionalidad o el comportamiento adecuado, o la interfaz API. Podría ser solo una versión corregida de errores de 5103, por ejemplo (hipotéticamente. Este es un ejemplo imaginario).

En el caso ideal, generaría tensorflow contra la versión de cuDNN que está usando. Sin embargo, si ha descargado paquetes de tensorflow pre-construidos, entonces puede ser testigo de este tipo de mensaje (ya que presumiblemente descargó cuDNN por separado). En ese caso, al menos debe buscar coincidir con la versión principal de cuDNN que está utilizando con la versión de compatibilidad que espera tensorflow. En este ejemplo particular, no estás haciendo eso.

Quizás pueda descargar “cuDNN v5.1 para CUDA 8.0 / 7.5, y luego instalarlo.