python - 错误: `Loaded runtime CuDNN library: 5005 but source was compiled with 5103` mean?是什么意思

标签 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 页面后,我意识到如下阅读错误实际上更有帮助:

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

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

我的第一个困惑是,据我所知,没有 CuDNN 5005 或 5103 这样的东西。如果能确定那部分错误的含义,我就可以开始尝试调试它了,这真是太棒了真实的。据我所知,当我使用 module list 时,我正在使用:

cudnn/5.0

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

  1. 加载的运行时 CuDNN 库:5005(兼容版本 5000)
  2. 但是源码是用5103编译的(兼容版本5100)

老实说,我不知道“兼容版本 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 一起工作。在某些情况下,这可以在编译时通过“编译”特定的 cuDNN 版本(及其关联的 API,即构建 tensorflow 时使用的头文件)来处理。因此,在编译时,像 tensorflow 这样的程序可以确定它是针对哪个版本的 cuDNN API 编译的,那就是 4 位版本(尽管一般来说,只有兼容版本,即 4 位的前两位)版本真的很重要)。

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

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

这是 tensorflow 告诉你“嘿,我被设计(编译)为与 cuDNN v5.1 一起工作,但你只给我 cuDNN 5.0 来工作”。

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

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

关于python - 错误: `Loaded runtime CuDNN library: 5005 but source was compiled with 5103` mean?是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41005249/

相关文章:

c++ - opencl命令队列是如何工作的,我能问它什么

python - 为什么我的 TensorFlow Convnet(尝试)训练会导致 NaN 梯度?

python - 对不同的错误分类进行不同的权重 keras

tensorflow - Tensorflow 中非矩形图像上的 conv2d

python - 如何避免 AppConfig.ready() 方法在 Django 中运行两次

Python datetime模块无法更改变量参数

python - Pygame 已安装;然而,python 终端显示 "No module named ' pygame' "(Ubuntu 20.04.1)

python - 如何创建包含 gpiozero 的可执行文件?

visual-studio - Cuda 与 cmake

cuda - CUDA 中的纹理内存 : Concept and simple example to demonstrate performance