无法创建cudnn句柄:CUDNN_STATUS_INTERNAL_ERROR

46

我在我的Macbook Pro上安装了带有GeForce GT 750M的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

这里发生了什么?这是tensorflow的一个bug吗?请帮忙。

当我运行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内存已经用完了。 - ruoho ruotsi
在Linux上,我使用“nvidia-smi”,但在macOS上不存在。尝试使用此链接:https://github.com/phvu/cuda-smi - ruoho ruotsi
1
最初看起来像是空间不足,但我在重新启动后再次尝试,发现有足够的空间。这是终端输出。(https://pastebin.com/9D2983ex) - Shimano
好的,如果这是你的问题(或者你的问题),希望TensorFlow的开发人员能够提供一些见解:https://github.com/tensorflow/tensorflow/issues/8879 - ruoho ruotsi
我有完全相同的设置(MBP w/750M GPU)。我能够通过将CUDA驱动程序从8.083降级到8.0.46来解决此错误。我正在运行tensorflow-gpu 1.1.0(也安装了tensorflow 1.0.0,但是运行的是GPU版本)。如果我没有在GPU上释放内存,我的设置有时也会出现故障。 - anon01
显示剩余2条评论
23个回答

45
在Tensorflow 2.0中,我的问题通过设置内存增长得到解决。ConfigProto在TF 2.0中已被弃用,我使用了tf.config.experimental。我的计算机规格是:
  • 操作系统:Ubuntu 18.04
  • GPU:GeForce RTX 2070
  • Nvidia驱动程序:430.26
  • Tensorflow:2.0
  • Cudnn:7.6.2
  • Cuda: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笔记本是一件很酷的事情,这个答案很有帮助。 - Ekho
这对于完全相同的配置有所帮助。我的GPU是GeForce RTX 2070 Super。非常有用。 - feradz
我收到了错误信息:物理设备在初始化后无法被修改。 - cloudscomputes
在我的情况下,使用Fedora操作系统和tensorflow 2.4的Geforce RTX 3070也已经解决了。 - Davide

29

我通过删除我的主文件夹中的.nv文件夹,成功使它运行起来:

sudo rm -rf ~/.nv/

2
不知道为什么会这样,但是这个解决方案也解决了我的问题! - Anoop K. Prabhu
3
目录为~/.nv。 我认为它正在缓存一些二进制文件,当你更新 cudnn 头文件时,旧的二进制文件仍然从缓存中获取,这是此问题的一个原因。 - dgumo
5
这解决了我的问题,但你需要在不使用sudo的情况下运行。 - seleucia

23

在我的情况下,在检查了cuDNN和CUDA版本后,我发现我的GPU内存不足。在另一个bash终端中使用watch -n 0.1 nvidia-smi命令,一旦出现2019-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内存快要满了。这里是截图

因此,我为tensorflow配置了限制以使用我的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并使用缓存)。我希望我的答案能帮助其他人。


1
使用此答案适用于Tensorflow 2.0:https://dev59.com/dlgQ5IYBdhLWcg3wMhFJ#58684421 - jss367

12

以下代码对我有用:

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

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


9
对我而言,第四项可以很好地解决这个问题。 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)

7

听起来有些奇怪,但是请尝试重新启动计算机并重新运行您的模型。如果模型运行良好,则问题可能出在GPU内存分配和tensorflow对可用内存的管理上。在Windows 10上,我有两个终端打开,关闭其中一个后我的问题得到了解决。可能存在一些仍然占用内存的打开线程(僵尸线程)。


在我的情况下,解决方案是这样的。尽管我没有对文件进行任何更改,但错误仍然发生了,在此之前一切都正常,这就是为什么我对包括向现有代码添加文件或行的解决方案持怀疑态度的原因。 - Serjuice

6
这对我有效:
``` export TF_FORCE_GPU_ALLOW_GROWTH='true' ```

1
因为TensorFlow默认情况下会预分配内存(我不知道有多少),这会导致它很快耗尽内存,特别是如果您同时运行许多作业。这将允许内存增长。 - goodcow
有没有一种方式可以永久设置这个?我注意到当我重新启动时必须重新运行它。 - Kenan
你可以将它放在你的.bashrc文件中,或者通过subprocess在你的脚本中调用它。 - goodcow
我想知道将其放置在bashrc中是否会有任何问题,我会这样做。 - Kenan
我也遇到了同样的问题,只有在我的.zshrc中设置了这个ENV变量后才能解决,但我认为这真的很奇怪!!我能够运行ai-benchmark,但是会出现几个关于GPU RAM已满的警告。另外,只有通过设置TF_FORCE_GPU_ALLOW_GROWTH='true'才能运行Tensorflow CNN示例。在这种情况下,我注意到nvidia-smi仅报告使用了很少一部分的RAM,否则它会显示已使用的RAM几乎已满。 - EanX
这个救了我的一天!我在使用RTX 2070时遇到了困难。 - charlie

5

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

我曾经同时运行两个Jupyter笔记本,但当我关闭其中一个时,问题得以解决。


3

试试这个

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)])

2

在我的情况下,问题似乎是由于tensorflow和cudnn版本不匹配引起的。以下内容对我有帮助(我正在使用Ubuntu 16.04和谷歌云上的NVidia Tesla K80,tensorflow 1.5最终与cudnn 7.0.4和cuda 9.0一起工作):

  1. Remove cuDNN completely:

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

这样做后,导入tensorflow应该会出错。

  1. Download appropriate cuDNN version. Note that there is cuDNN 7.0.4 for CUDA 9.0 and cuDNN 7.0.4 for CUDA 8.0. You should choose the one corresponding to your CUDA version. Be careful at this step or you'll get similar problem again. Install cuDNN as usual:

    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版本。

  1. 重新启动计算机。在我的情况下,问题消失了。如果错误仍然存在,请考虑安装另一个版本的tensorflow。

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