无法创建 cudnn 句柄:CUDNN_STATUS_INTERNAL_ERROR

Posted

技术标签:

【中文标题】无法创建 cudnn 句柄:CUDNN_STATUS_INTERNAL_ERROR【英文标题】:could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR 【发布时间】:2017-08-26 03:45:21 【问题描述】:

我在装有 GeForce GT 750M 的 Macbook Pro 上安装了 tensorflow 1.0.1 GPU 版本。还安装了 CUDA 8.0.71 和 cuDNN 5.1。我正在运行一个在非 CPU tensorflow 上运行良好的 tf 代码,但在 GPU 版本上,我收到此错误(有时它也可以):

name: GeForce GT 750M
major: 3 minor: 0 memoryClockRate (GHz) 0.9255
pciBusID 0000:01:00.0
Total memory: 2.00GiB
Free memory: 67.48MiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GT 750M, pci bus id: 0000:01:00.0)
E tensorflow/stream_executor/cuda/cuda_driver.cc:1002] failed to allocate 67.48M (70754304 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
Training...

E tensorflow/stream_executor/cuda/cuda_dnn.cc:397] could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
E tensorflow/stream_executor/cuda/cuda_dnn.cc:364] could not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM
F tensorflow/core/kernels/conv_ops.cc:605] Check failed: stream->parent()->GetConvolveAlgorithms(&algorithms) 
Abort trap: 6

这里发生了什么?这是张量流中的错误吗?请帮忙。

这是我运行 python 代码时的 GPU 内存空间:

Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 83.477 of 2047.6 MB (i.e. 4.08%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 83.477 of 2047.6 MB (i.e. 4.08%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 83.477 of 2047.6 MB (i.e. 4.08%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 1.1016 of 2047.6 MB (i.e. 0.0538%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 1.1016 of 2047.6 MB (i.e. 0.0538%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 1.1016 of 2047.6 MB (i.e. 0.0538%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 1.1016 of 2047.6 MB (i.e. 0.0538%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 91.477 of 2047.6 MB (i.e. 4.47%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 22.852 of 2047.6 MB (i.e. 1.12%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 22.852 of 2047.6 MB (i.e. 1.12%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 36.121 of 2047.6 MB (i.e. 1.76%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 71.477 of 2047.6 MB (i.e. 3.49%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 67.477 of 2047.6 MB (i.e. 3.3%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 67.477 of 2047.6 MB (i.e. 3.3%) Free
MacBook-Pro:cuda-smi-master xxxxxx$ ./cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 750M (CC 3.0): 67.477 of 2047.6 MB (i.e. 3.3%) Free

【问题讨论】:

请发布您的 nvidia GPU 实用程序和内存数据。我猜你的 GPU 内存不足。 请问如何检查?谢谢 在 Linux 上我使用 'nvidia-smi' 但在 macos 上这不存在。试试这个:github.com/phvu/cuda-smi 一开始似乎空间不足,但我在重新启动后再次尝试,并且有空间。这是终端输出。 (pastebin.com/9D2983ex) 好的,如果这是您(或您)的问题,希望 tensorflow 人员可以提供一些见解:github.com/tensorflow/tensorflow/issues/8879 【参考方案1】:

在 TensorFlow 2.0 中,通过设置内存增长解决了我的问题。 ConfigProto 在 TF 2.0 中已弃用,我使用了 tf.config.experimental。我的电脑规格是:

操作系统:Ubuntu 18.04 GPU:GeForce RTX 2070 Nvidia 驱动程序:430.26 张量流:2.0 库德恩:7.6.2 库达:10.0

我使用的代码是:

physical_devices = tf.config.experimental.list_physical_devices('GPU')
assert len(physical_devices) > 0, "Not enough GPU hardware devices available"
config = tf.config.experimental.set_memory_growth(physical_devices[0], True)

【讨论】:

我使用的是 Pop!_OS 18.04,配备 NVIDIA GeForce RTX 2080、CUDA 10.0、cuDNN 7.6.0 和 TensorFlow 2.0。我只在使用 Jupyter Lab 时遇到过这个问题。因此,可能内核内存占用是有限的,因此我们必须设置内存增长。当我直接从 Python 代码训练模型时,它工作得很好。无论如何,使用 Jupyter 笔记本是一件很酷的事情,这个答案很有帮助。 这有助于完全相同的配置。我有 GPU:GeForce RTX 2070 Super。非常有用。 我有错误信息:物理设备初始化后无法修改 在我的情况下也解决了 Fedora OS 和 tensorflow 2.4 上的 Geforce RTX 3070。【参考方案2】:

我已经设法通过删除主文件夹中的 .nv 文件夹来使其正常工作:

sudo rm -rf ~/.nv/

【讨论】:

不知道这是怎么回事,但这个解决方案也解决了我的问题! 目录是 ~/.nv 我相信它正在缓存一些二进制文件,当您更新 cudnn 头文件时,仍然会从缓存中获取旧的二进制文件,这是导致此问题的原因之一。 这解决了我的问题,但是你需要在没有 sudo 的情况下运行。【参考方案3】:

就我而言,在检查了 cuDNN 和 CUDA 版本后,我发现 我的 GPU 内存不足。在另一个 bash 终端中使用 watch -n 0.1 nvidia-smi2019-07-16 19:54:05.122224: E tensorflow/stream_executor/cuda/cuda_dnn.cc:334] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR 开始的时刻是 GPU 内存几乎满的时刻。 The screenshot

所以我为 tnsorflow 配置了使用我的 gpu 的限制。当我使用tf.keras 模块时,我将以下代码添加到程序的开头:

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9
tf.keras.backend.set_session(tf.Session(config=config));

那么,问题解决了!

您可以更改您的batch_size 或使用更智能的方式输入您的训练数据(例如tf.data.Dataset 和使用缓存)。希望我的回答能帮到别人。

【讨论】:

将此答案用于 Tensorflow 2.0:***.com/a/58684421/2514130【参考方案4】:

添加以下代码对我有用:

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)

在我的环境中,CuDNN 和 Cuda 版本之间没有不匹配。 操作系统:ubuntu-18.04; 张量流:1.14; CuDNN:7.6; cuda:10.1 (418.87.00)。

【讨论】:

【参考方案5】:

对我来说,4th 可以很好地解决问题。 https://blog.csdn.net/comway_Li/article/details/102953634?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2

1.
    config = tf.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 1.0
    session = tf.Session(config=config, ...)

2.
    config = tf.ConfigProto() 
    config.gpu_options.allow_growth = True 
    sess = tf.Session(config=config)

3.
    sudo rm -f ~/.nv 

4.
    from tensorflow.compat.v1 import ConfigProto
    from tensorflow.compat.v1 import InteractiveSession
    #from tensorflow import ConfigProto
    #from tensorflow import InteractiveSession
    config = ConfigProto()
    config.gpu_options.allow_growth = True
    session = InteractiveSession(config=config)

【讨论】:

【参考方案6】:

这听起来很奇怪,请尝试重新启动计算机并重新运行模型。如果模型运行良好,则问题在于您的 GPU 内存分配和可用内存的张量流管理。在 Windows 10 上,我打开了两个终端,关闭了一个终端解决了我的问题。可能有开放的线程(僵尸)仍在保留内存。

【讨论】:

【参考方案7】:

这对我有用:

export TF_FORCE_GPU_ALLOW_GROWTH='true'

【讨论】:

因为默认情况下,tensorflow 会预先分配内存(我不知道多少),这会导致它快速耗尽内存,尤其是在同时运行多个作业的情况下。这允许内存增长 有办法永久设置吗?我注意到我必须在重启时重新运行它 你可以把它放在你的.bashrc或者通过你的脚本调用它subprocess 不知道放在 bashrc 中会不会有什么问题,我会这样做的 我有同样的问题,我只能通过在我的 .zshrc 中设置这个 ENV 变量来解决,但我认为这真的很奇怪!我能够运行 ai-benchmark 但有几个关于 GPU RAM 已满的警告。此外,Tensorflow CNN example 只能通过设置 TF_FORCE_GPU_ALLOW_GROWTH='true' 运行。在这种情况下,我注意到 nvidia-smi 只报告了一小部分已使用的 RAM,否则它显示已使用的 RAM 几乎已满。【参考方案8】:

对于在 Jupyter notebook 中遇到此问题的任何人:

我正在运行两个 jupyter 笔记本。关闭其中一个后,问题就解决了。

【讨论】:

【参考方案9】:

试试这个

gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)
tf.config.experimental.set_virtual_device_configuration(gpus[0], [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=1024)])

【讨论】:

【参考方案10】:

在我的情况下,问题似乎是由 tensorflow 和 cudnn 版本不匹配引起的。 以下对我有帮助(我在 Google Cloud 上使用 NVidia Tesla K80 开发 Ubuntu 16.04,tensorflow 1.5 最终使用 cudnn 7.0.4 和 cuda 9.0):

    完全移除 cuDNN:

    sudo rm /usr/local/cuda/include/cudnn.h
    sudo rm /usr/local/cuda/lib64/libcudnn*
    

这样做后导入 tensorflow 应该会导致错误。

    下载适当的 cuDNN 版本。请注意,CUDA 9.0 有 cuDNN 7.0.4,CUDA 8.0 有 cuDNN 7.0.4。您应该选择与您的 CUDA 版本相对应的那个。在这一步要小心,否则你会再次遇到类似的问题。照常安装 cuDNN:

    tar -xzvf cudnn-9.0-linux-x64-v7.tgz
    cd cuda
    sudo cp -P include/cudnn.h /usr/include
    sudo cp -P lib64/libcudnn* /usr/lib/x86_64-linux-gnu/
    sudo chmod a+r /usr/lib/x86_64-linux-gnu/libcudnn*
    

在此示例中,我为 CUDA 9.0 安装了 cuDNN 7.0.x(x 实际上无关紧要)。注意匹配您的 CUDA 版本。

    重新启动计算机。就我而言,问题消失了。如果错误仍然存​​在,请考虑安装另一个版本的 tensorflow。

【讨论】:

【参考方案11】:

我也遇到同样的错误,我解决了这个问题。我的系统属性如下:

操作系统:Ubuntu 14.04 GPU:GTX 1050Ti Nvidia 驱动程序:375.66 张量流:1.3.0 Cudnn:6.0.21 (cudnn-8.0-linux-x64-v6.0.deb) 库达:8.0.61 Keras:2.0.8

我是如何解决这个问题的:

    我将 cudnn 文件复制到适当的位置 (/usr/local/cuda/include/usr/local/cuda/lib64)

    我将环境变量设置为:

    * export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
    * export CUDA_HOME=/usr/local/cuda
    

    我还运行sudo ldconfig -v command 来缓存运行时链接器的共享库。

【讨论】:

【参考方案12】:

这是 cudnn 兼容问题。检查您使用 GPU 安装的内容,例如 tensorflow-gpu。什么是版本?该版本是否与您的cudnn 的版本兼容,并且 cudnn 是否为您的 cuda 安装了正确的版本?。

我观察到: cuDNN v7.0.3Cuda 7.* cuDNN v7.1.2Cuda 9.0 cuDNN v7.3.1Cuda 9.1 等等。

因此,还要检查您的 cuda 配置的正确版本的 TensorFlow。 例如 - 使用tensorflow-gpuTF v1.4cudnn 7.0.* TF v1.7及以上为cudnn 9.0.*

所以您需要做的就是重新安装适当的 cudnn 版本。 希望对您有所帮助!

【讨论】:

【参考方案13】:

请记住关闭您的 tensorboard 终端/cmd 或其他与目录有交互的终端。然后你就可以重新开始训练了。

【讨论】:

【参考方案14】:

它与可用于加载 GPU 资源以创建 cudnn 句柄的内存部分有关,也称为 per_process_gpu_memory_fraction。 自己减少这个内存分数就可以解决这个错误。

> sess_config = tf.ConfigProto(gpu_options =
> tf.GPUOptions(per_process_gpu_memory_fraction=0.7),
> allow_soft_placement = True)
> 
> with tf.Session(config=sess_config) as sess:
>      sess.run([whatever])

使用尽可能小的分数。 (在代码中,我使用的是0.7,你可以从0.3甚至更小,然后增加直到你得到同样的错误,这就是你的极限。) 将其作为配置传递给您的tf.Session()tf.train.MonitoredTrainingSession() 或主管的sv.managed_session()

这应该允许您的 GPU 为您的 TensorFlow 代码创建一个 cudnn 句柄。

【讨论】:

【参考方案15】:

我遇到了同样的问题(Ubuntu 18.04)。我正在使用:

张量流 2.1 cuda 10.1 cudnn 7.6.5

我解决了它卸载 cuda 及其文件夹,并按照 tensorflow 页面说明通过 apt 安装它: https://www.tensorflow.org/install/gpu?hl=fr#ubuntu_1804_cuda_101

【讨论】:

【参考方案16】:

我通过使用以下几行调整 GPU 内存使用来解决了这个问题:

config = tf.compat.v1.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.7
tf.compat.v1.keras.backend.set_session(
    tf.compat.v1.Session(config=config))

这适用于 TensorFlow 2。

【讨论】:

在 tensorFlow2 中应该这样做:physical_devices = tf.config.experimental.list_physical_devices('GPU') tf.config.experimental.set_memory_growth(physical_devices[0], True)【参考方案17】:

我也遇到了同样的问题:

Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GeForce GTX 1050
major: 6 minor: 1 memoryClockRate (GHz) 1.493 pciBusID 0000:01:00.0
Total memory: 3.95GiB
Free memory: 3.60GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0)
E tensorflow/stream_executor/cuda/cuda_dnn.cc:385] could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
E tensorflow/stream_executor/cuda/cuda_dnn.cc:352] could not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM
F tensorflow/core/kernels/conv_ops.cc:532] Check failed:  stream->parent()->GetConvolveAlgorithms(&algorithms)

Aborted (core dumped)

但在我的情况下,使用 sudo 和命令效果很好。

【讨论】:

【参考方案18】:

我在安装了 CUDA 9.0 的系统上意外安装了 CUDA 9.2 libcudnn7_7.2.1.38-1+cuda9.2_amd64.deb 而不是 libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb 时遇到了这个问题。

我到那里是因为我安装了 CUDA 9.2 并且我已经降级到 CUDA 9.0,而且显然 libcudnn 是特定于版本的。

【讨论】:

【参考方案19】:

对我来说,按照here 的描述重新运行 CUDA 安装解决了这个问题:

# Add NVIDIA package repository
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
sudo apt install ./cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt update

# Install CUDA and tools. Include optional NCCL 2.x
sudo apt install cuda9.0 cuda-cublas-9-0 cuda-cufft-9-0 cuda-curand-9-0 \
    cuda-cusolver-9-0 cuda-cusparse-9-0 libcudnn7=7.2.1.38-1+cuda9.0 \
    libnccl2=2.2.13-1+cuda9.0 cuda-command-line-tools-9-0

在安装过程中apt-get 降级了cudnn7,我认为这是罪魁祸首。可能它被apt-get upgrade 意外更新为与系统其他部分不兼容的版本。

【讨论】:

【参考方案20】:

我遇到了同样的问题,因为我的 GPU 被某个后台僵尸/终止进程耗尽了内存,杀死这些进程对我有用:

ps aux | grep 'Z' # Zombie
ps aux | grep 'T' # Terminated
kill -9 your_zombie_or_terminated_process_id

【讨论】:

【参考方案21】:

重新启动机器对我有用。试试这个:

sudo reboot

然后,重新运行代码

【讨论】:

【参考方案22】:

我遇到了同样的问题并通过添加解决了它:

import os
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'

【讨论】:

以上是关于无法创建 cudnn 句柄:CUDNN_STATUS_INTERNAL_ERROR的主要内容,如果未能解决你的问题,请参考以下文章

无法创建cudnn句柄:CUBLAS_STATUS_ALLOC_FAILED

无法在上下文中使用 cuDNN 无,致命错误:cudnn.h:没有这样的文件或目录

为啥控件的类名不好?不能创建新的 GDI 句柄?

FindWindow函数执行失败,无法找到窗口句柄

无法加载库 cudnn_ops_infer64_8.dll。错误代码 126 请确保 cudnn_ops_infer64_8.dll 在您的库路径中

动态创建jquery-ui可拖动句柄