Python “Loaded runtime CuDNN library:5005,但源代码是用5103编译的”错误是什么意思?

Python “Loaded runtime CuDNN library:5005,但源代码是用5103编译的”错误是什么意思?,python,cuda,tensorflow,cudnn,Python,Cuda,Tensorflow,Cudnn,我试图将TensorFlow与GPU一起使用,但出现以下错误: 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 runtim

我试图将TensorFlow与GPU一起使用,但出现以下错误:

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)
当然,我正在尝试修复这个错误(虽然已经有人问过了),但我想了解这个错误。在发布(请求帮助)之前,我总是试图自己解决(编码)问题,但我甚至很难开始这个问题,因为错误消息对我来说似乎有点神秘/不清楚,我似乎找不到好的资源来理解错误的含义

为了理解错误,我将重点放在错误开始的那一行:

Loaded runtime CuDNN library: 5005 (compatibility version 5000) but source was compiled with 5103 (compatibility version 5100).
在阅读了一些似乎相关的github页面后,我意识到,阅读以下错误实际上更有帮助:

已加载运行时CuDNN库:5005,但源代码是用5103编译的

删除括号使错误更有意义(尽管我想了解/知道括号在错误消息中的作用,以便于调试),因为它似乎加载了CuDNN库5005(在UNIX/OS级别),但TensorFlow(用于python)是用我猜想的5103版编译的。显然,如果深度学习lib库使用的是API,但5103的API是“真正的”API,它与CUDA(深度学习库)CUDNN对话5005版本,显然这是个问题。虽然他们只是猜测发生了什么

我的第一个困惑是,据我所知,没有CuDNN 5005或5103这样的东西。如果能够确切地理解错误的这一部分意味着什么,那么我就可以开始真正地调试它了。据我所知,当我使用
模块列表时
我正在使用:

cudnn/5.0
我的第二个困惑是我忽略的括号及其含义:

  • 加载的运行时CuDNN库:5005(兼容版本5000)
  • 但是源代码是用5103(兼容版本5100)编译的。
  • 我真的不知道“兼容性版本XXXX”是什么意思。也许它建议为CuDNN安装版本5000(不管这意味着什么),并编译一个使用CuDNN版本5100的TensorFlow版本(不知为什么)


    是否有人更准确地知道错误的确切含义(并为我链接的问题提供他们的解决方案?

    这是对正在发生的事情的近似描述

    cuDNN有编号的主要版本,例如4.0、5.0、5.1等

    这些主要版本可能包含API更改。因此,使用cuDNN v4(即4.0)的程序可能需要进行一些修改才能使用cuDNN v5(即5.0)中的新功能

    主要版本在4位版本号的前两位编码。因此,cuDNN 4位版本号5103意味着它属于5.1主要版本,子版本号为03。出于兼容性目的,此类版本应与51xx的任何其他cuDNN库版本的API兼容,因为它们都属于5.1主要版本(AFAIK不保证严格如此,但这是一般的想法)。因此,任何版本号为51xx的库都将具有5100的兼容版本,以表明它们属于(并且(应该)兼容)5.1主要版本

    因此,当我们提到一个兼容版本(这个库与哪个主要版本兼容)时,我们只需要指定前两位数字——5000表示5.0,5100表示5.1。但是对于一个发布来说,子发布版本号可能是非零的。这可能有多种原因,例如允许发布bug修复等

    当一个程序(如tensorflow)被设计为使用cuDNN时,它通常会被编码为使用特定版本的cuDNN。在某些情况下,这可以在编译时通过“针对”特定cuDNN版本(及其相关API,即构建tensorflow时使用的头文件)进行“编译”来处理。因此,在编译时,像tensorflow这样的程序可以确定编译它所针对的cuDNN API的版本,这是一个4位版本(尽管一般来说,只有兼容性版本,即4位版本的前两位数字才真正重要)

    在运行时,您的计算机上某处加载了cuDNN库的特定版本(例如linux上的so)。可以确定、查询和报告该库的版本。如果实际的库版本与tensorflow编译时所依据的cuDNN库版本不匹配(至少从兼容版本的角度来看),那么这就很好地表明事情可能不起作用,因此tensorflow在运行时指出:

    已加载运行时CuDNN库:5005,但源代码是用5103编译的

    这是tensorflow,它告诉您“嘿,我被设计(编译)为使用cuDNN v5.1,但您只给我使用cuDNN 5.0”

    子版本级别的差异应不太显著。如果您知道自己在做什么,那么即使您的tensorflow是根据版本5103编译的,也可以使用cuDNN运行时版本5107。这只是一个假设的示例,但这表明库中存在一些差异,这些差异不是为了更改适当的功能或行为,也不是为了更改API接口。例如,它可能只是5103的一个bug修复版本(假设。这是一个虚构的例子)

    在理想的情况下,您可以针对正在使用的cuDNN版本构建tensorflow。但是,如果您下载了预构建的tensorflow软件包,那么您可能会看到这种消息(因为您可能是单独下载cuDNN的)。在这种情况下,您至少应该设法匹配您再次使用的cuDNN主要版本