11

我试图将 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)

老实说,我不知道“兼容版本 XXXX”是什么意思。也许它建议为 CuDNN 安装 5000 版本(无论这意味着什么)(这仍然令人困惑,因为没有 5000 版本的 CuDNN)并编译使用 CuDNN 版本 5100 的 TensorFlow 版本(不知何故)。

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

4

2 回答 2

19

这是对正在发生的事情的大致描述。

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。但是一个版本可能有一个非零的子版本版本号。这可能有多种原因,例如允许错误修复版本等。

当一个程序(如 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 的错误修复版本(假设。这是一个虚构的例子。)

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

于 2016-12-07T01:55:44.507 回答
1

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

于 2017-05-31T15:46:34.053 回答