错误是什么:`加载的运行时CuDNN库:5005但源代码是用5103编译的意思?

时间:2016-12-06 21:29:27

标签: 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 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))但我想了解错误。我总是尝试在发布之前尝试解决(编码)问题(寻求帮助)但是我很难开始这个问题因为错误信息对我来说似乎有点神秘/不清楚我似乎无法找到了解错误意味着什么的好资源。

为了理解错误,我把注意力集中在似乎是错误开始的那一行:

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编译的。显然,如果TensorFlow库使用的是根据5103的API,而是“真正的”API与(cuda)交谈)深度学习库CuDNN是版本5005,它清楚它会是一个问题。虽然他们只是猜测会发生什么。

我的第一个困惑是,据我所知,没有这样的东西CuDNN 5005或5103.理解错误的那部分意味着什么以便我可以开始尝试调试这个是很棒的真实。据我所知,当我使用module list时,我正在使用:

cudnn/5.0

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

  1. Loaded runtime CuDNN library: 5005 (compatibility version 5000)
  2. but source was compiled with 5103 (compatibility version 5100)
  3. 老实说,我不知道“兼容版本XXXX”是什么意思。也许它的建议是为CuDNN安装5000版本(无论这意味着什么)(由于没有5千万版本的CuDNN,它仍然令人困惑)并编译了使用CuDNN版本5100的TensorFlow版本(不知何故)。

    有人更准确地知道错误的含义(并为我所链接的问题提供解决方案吗?)

2 个答案:

答案 0 :(得分:17)

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

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

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

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

因此,当我们提到兼容版本(此库兼容的主要版本)时,我们只需要指定前两位数字 - 5000表示5.0,5100表示​​5.1。但是,版本可能具有非零的子版本号。可能有多种原因,例如允许错误修复版本等。

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

在运行时,您的计算机上有一个特定版本的cuDNN库(例如Linux上的.so)。可以确定,查询和报告该库的版本。如果实际的库版本不匹配(至少从兼容版本的角度来看)编译了tensorflow的cuDNN库的版本,那么这是一个很好的迹象表明事情可能不起作用,因此tensorflow在运行时指出了这一点:

  

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

这是张量流告诉你“嘿,我被设计(编译)与cuDNN v5.1一起工作,但你只给我cuDNN 5.0使用”。

子版本级别的差异应该不那么重要。如果您知道自己在做什么,即使您的张量流是针对版本5103编译的,也可以使用cuDNN运行时版本5107.这只是一个假设的示例,但这表明库中存在一些差异旨在更改适当的功能或行为,或API接口。例如,它可能只是一个错误修复的5103版本(假设。这是一个想象的例子。)

在理想情况下,您将针对您正在使用的cuDNN版本构建tensorflow。但是,如果您已经下载了预先构建的tensorflow软件包,那么您可能会看到这种消息(因为您可能会单独下载cuDNN)。在这种情况下,您至少应该寻求将您使用的cuDNN主要版本与tensorflow期望的兼容版本相匹配。在这个特定的例子中,你没有这样做。

答案 1 :(得分:1)

也许您可以下载“适用于CUDA 8.0 / 7.5的cuDNN v5.1,然后安装它。