错误提示: `Loaded runtime CuDNN library: 5005 but source was compiled with 5103` 的含义是什么?

12

我正在尝试使用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编译的。

去掉括号后,错误提示就更容易理解了(虽然我想知道括号在错误信息中的作用以便于调试)。显然,它在UNIX/OS级别上加载了CuDNN库5005,但(for python) TensorFlow是使用5103版本编译的。如果TensorFlow库正在使用根据5103编写的API,而与(CUDA)深度学习库CuDNN对话的"真实"API是5005版本,那么显然就会出现问题。尽管这只是我猜测发生的事情。

我的第一个困惑是,据我所知,不存在名为CuDNN 5005或5103的东西。如果能确切了解错误提示中这部分的含义,那么我就可以开始真正调试了。据我所知,当我使用module list时,我正在使用的是:

cudnn/5.0

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

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

老实说,我不知道 "兼容性版本 XXXX " 是什么意思。也许这是建议安装 CuDNN 版本 5000(不管那是啥)并编译一个使用 CuDNN 版本 5100 的 TensorFlow 版本(不过这还是很困惑,因为没有 CuDNN 的 5000 版本)。有人更准确地知道这些错误的含义吗?并提供他们对我所链接问题的解决方案吗?


这意味着Tensorflow在您的计算机上找到了cuDNN 5.0,但是它期望使用(即编译)cuDNN 5.1。错误输出中可能已经指示了一个简单的解决方法:升级。 - Robert Crovella
@RobertCrovella,你怎么知道那是什么意思?报告了4个数字,所有四个数字都有4位数,而cuDNN版本并不像那样报告。这真的很令人困惑和不清楚,希望找到如何清晰地读取这样的错误信息。 - Charlie Parker
1
@CharlieParker 这就是人们如何以编程方式对版本进行编码的方法。为了将5.1.03放入整数中,您需要删除点。有时,您会在点的位置上放置0,以防需要超过10个次要或100个补丁版本。TensorFlow开发人员只是在打印消息时没有费心将其格式化为人类可读形式。不要在其中寻找基本智慧,版本控制只是一种(愚蠢的)约定。有关更多信息,请参见[semver](http://semver.org/)。 - Ivan Aksamentov - Drop
这就像开车,然后仪表盘上出现了某种红色指示灯。它只是一个没有任何解释的红色指示灯。当这个问题在开发人员必须满足截止日期的情况下出现时,这是一个致命的事件。错误消息不仅非常令人困惑,而且没有任何帮助。这种错误消息就像引擎盖下面的零件。可能是成千上万个引擎零件中的任何一个出了问题。这只是一个糟糕和令人沮丧的错误消息。 - Nguai al
2个回答

21

这是正在进行的大致描述。

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主要版本(据我所知,这不保证完全正确,但这是大致的想法)。因此,任何具有51xx版本号的这些库都将具有5100的兼容性版本,以指示它们属于(并且应该)兼容5.1主要版本。

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

当一个程序(例如tensorflow)被设计为使用cuDNN时,通常会编码为适用于特定版本的cuDNN。在某些情况下,这可以在编译时处理,通过“针对”特定版本的cuDNN进行编译(及其关联的API,即构建tensorflow时使用的头文件)。因此,在编译时,像tensorflow这样的程序可以确定其编译所使用的cuDNN API版本,该版本是一个4位数字版本(尽管通常只有兼容性版本即四位数字版本的前两位真正重要)。

在运行时,你的计算机上某个地方加载了特定版本的cuDNN库(例如Linux上的.so文件)。可以确定、查询和报告该库的版本。如果实际库版本与tensorflow编译时使用的cuDNN库版本不匹配(至少从兼容性版本的角度来看),那么这表明可能会出现问题,因此当tensorflow运行时会指出:

 

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

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

子版本级别的差异应该不太重要。如果知道自己在做什么,即使您的tensorflow是针对版本5103编译的,使用cuDNN运行时版本5107也可能没有问题。这只是一个假设性的例子,但这表明库中存在一些不打算改变适当功能或行为或API接口的差异。例如,它可能只是5103的修复了bug的版本(这是一个虚构的例子)。

在理想情况下,您应该针对您使用的cuDNN版本构建tensorflow。然而,如果您已经下载了预编译的tensorflow软件包,则可能会看到这种类型的消息(因为您可能单独下载了cuDNN)。在这种情况下,您应该至少尝试将您正在使用的cuDNN主要版本与tensorflow期望的兼容性版本匹配。在这个特定的例子中,您没有这样做。

4
抱歉,能否详细说明一下 - 我需要哪些设置命令来解决这个问题? - Massyanya
感谢您的启示。我在使用Colab时遇到了这个错误信息。那么可以假设Google Colab没有正确同步cuDNN和tensorflow吗? - Nguai al

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接