错误:`Loaded runtime CuDNN library: 5005 but source was compiled with 5103` 是啥意思?

Posted

技术标签:

【中文标题】错误:`Loaded runtime CuDNN library: 5005 but source was compiled with 5103` 是啥意思?【英文标题】:What does the error: `Loaded runtime CuDNN library: 5005 but source was compiled with 5103` mean?错误:`Loaded runtime CuDNN library: 5005 but source was compiled with 5103` 是什么意思? 【发布时间】:2017-04-21 16:12:58 【问题描述】:

我尝试将 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

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

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

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

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

【问题讨论】:

这意味着 Tensorflow 在您的机器上找到了 cuDNN 5.0,但希望使用(即针对)cuDNN 5.1 进行编译。错误输出中可能已经指出了一个简单的修复:升级。 @RobertCrovella 你怎么知道这意味着什么?报告了 4 个数字,所有 4 个数字都有 4 个数字,而 cuDNN 版本没有这样报告。它只是真的令人困惑和不清楚,希望找到如何干净地阅读这样的错误。 @CharlieParker 这就是人们以编程方式对版本进行编码的方式。为了将 5.1.03 放入整数,您需要删除点。有时你用 0 代替一个点,以防万一你需要超过 10 个次要版本或 100 个补丁版本。 TensorFlow 开发人员在打印消息时根本没有费心将其格式化回人类可读的形式。不要在其中寻找基本智慧,版本控制只是一个(愚蠢的)约定。参见例如semver了解更多信息 这就像驾驶汽车,然后仪表板上出现某种红灯。这只是一个红灯,没有任何解释。当这个问题作为一个必须在最后期限前完成的开发人员出现时,这是一个致命的事件。错误消息不仅非常混乱,而且导致无处可去。这种错误信息就像引擎盖下的引擎部件。它可能是成千上万的发动机部件中的任何一个都可能出错。处理这只是糟糕且令人沮丧的错误消息。 【参考方案1】:

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

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。在某些情况下,这可以在编译时通过“编译”特定的 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 期望的兼容性版本进行匹配。在这个特定的示例中,您没有这样做。

【讨论】:

抱歉,更详细一点 - 我需要什么设置命令来解决这种情况? 感谢大神赐教。我使用 Colab 收到此错误消息。那么可以假设 Google Colab 没有正确同步 cuDNN 和 tensorflow 吗?【参考方案2】:

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

【讨论】:

以上是关于错误:`Loaded runtime CuDNN library: 5005 but source was compiled with 5103` 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

CuDNN 在二进制安装的 cupy 中不可用

如何避免 System.Runtime.InteropServices.COMException?

dyld: Library not loaded: /usr/lib/libstdc++.6.dylib

PyTorch 模型训练:RuntimeError:cuDNN 错误:CUDNN_STATUS_INTERNAL_ERROR

RuntimeError:cuDNN 错误:CUDNN_STATUS_NOT_INITIALIZED 使用 pytorch

ONNX Runtime 源码阅读:Graph::SetGraphInputsOutputs() 函数