What does the error: `Loaded runtime CuDNN library: 5005 but source was compiled with 5103` mean?

What does the error: `Loaded runtime CuDNN library: 5005 but source was compiled with 5103` mean?

我试图将 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)),但我想了解这个错误。我总是在发布(寻求帮助)之前尝试自己解决(编码)问题,但我什至很难开始这个问题,因为错误消息对我来说似乎有点 cryptic/unclear 而我似乎无法找到一个很好的资源来理解错误的含义。

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

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

阅读了一些 github 似乎相关的页面后,我意识到阅读如下错误实际上更有帮助:

Loaded runtime CuDNN library: 5005 but source was compiled with 5103.

删除括号使错误更有意义(尽管我想 understand/know 括号在错误消息中的作用是什么以便于调试)因为它似乎已加载CuDNN 库 5005(在 UNIX/OS 级别)但是 TensorFlow(对于 python)是用我猜的版本 5103 编译的。显然,如果 TensorFlow 库使用的是 API到 5103 但 "real" 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)

老实说,我不知道 "compatibility version XXXX" 是什么意思。也许它建议为 CuDNN 安装 5000 版(无论这意味着什么)(这仍然令人困惑,因为没有 5000 版的 CuDNN)并编译一个使用 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。为了 兼容性 目的,这样的版本应该是 API-与 51xx 的任何其他 cuDNN 库版本兼容,因为它们都属于 5.1 主要版本(这不能保证 AFAIK 严格正确,但这是一般的想法)。因此,这些版本编号为 51xx 的库中的任何一个都将具有 5100 的 兼容性版本 ,以表明它们属于(并且(应该)兼容)5.1 主要版本。

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

当一个程序(如 tensorflow)被设计为使用 cuDNN 时,它通常会被编码为与特定版本的 cuDNN 一起工作。在某些情况下,这可以在编译时通过 "compiling against" 特定的 cuDNN 版本(并且它是关联的 API,即构建 tensorflow 时使用的头文件)来处理。因此,在编译时,像 tensorflow 这样的程序可以确定它编译的 cuDNN API 版本是 4 位数字版本(虽然一般来说,只有兼容版本,即前两位数字4 位数的版本应该很重要)。

在运行时,您的计算机某处加载了特定版本的 cuDNN 库(例如 linux 上的 .so)。可以确定、查询和报告该库的版本。如果该实际库版本与编译 tensorflow 所针对的 cuDNN 库版本不匹配(至少从兼容性版本的角度来看),那么这是一个很好的迹象,表明事情可能无法正常工作,因此 tensorflow 指出这一点 运行:

Loaded runtime CuDNN library: 5005 but source was compiled with 5103.

这是tensorflow告诉你的"hey, I was designed (compiled) to work with cuDNN v5.1 but you are only giving me cuDNN 5.0 to work with"。

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

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

也许你可以下载“cuDNN v5.1 for CUDA 8.0/7.5,然后安装它。