无法创建cudnn句柄:CUDNN_STATUS_INTERNAL_ERROR

时间:2017-03-31 19:08:07

标签: tensorflow cudnn

我在配备GeForce GT 750M的Macbook Pro上安装了tensorflow 1.0.1 GPU版本。还安装了CUDA 8.0.71和cuDNN 5.1。我运行的tf代码可以很好地处理非CPU张量流,但是在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

22 个答案:

答案 0 :(得分:13)

我已经设法通过删除我的主文件夹中的.nv文件夹来实现它:

sudo rm -rf ~/.nv/

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

  • 操作系统:Ubuntu 18.04
  • GPU:GeForce RTX 2070
  • Nvidia驱动程序:430.26
  • Tensorflow:2.0
  • 库登: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)

答案 3 :(得分:3)

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

  1. 完全删除cuDNN:

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

    执行此操作后,导入tensorflow会导致错误。

  2. 下载相应的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版本。

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

  4. 希望这有助于某人。

答案 4 :(得分:3)

对我来说,第四可以很好地解决问题。 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)

答案 5 :(得分:2)

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

  • 操作系统:Ubuntu 14.04
  • GPU:GTX 1050Ti
  • Nvidia Driver:375.66
  • Tensorflow:1.3.0
  • Cudnn:6.0.21(cudnn-8.0-linux-x64-v6.0.deb)
  • Cuda:8.0.61
  • Keras:2.0.8

我如何解决这个问题如下:

  1. 我将cudnn文件复制到适当的位置 ( / usr / local / cuda / include / usr / local / cuda / lib64
  2. 我将环境变量设置为:

    malloc()
  3. 我还运行* export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64" * export CUDA_HOME=/usr/local/cuda 来缓存运行时链接器的共享库。
  4. 我希望这些步骤也能帮助即将发疯的人。

答案 6 :(得分:2)

这对我有用:

export TF_FORCE_GPU_ALLOW_GROWTH='true'

答案 7 :(得分:2)

尝试一下

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

答案 8 :(得分:2)

添加以下代码对我有用:

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 :(得分:1)

我通过使用以下几行调整 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。

答案 10 :(得分:1)

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

我观察到: cuDNN v7.0.3的{​​{1}} Cuda 7.*的{​​{1}} cuDNN v7.1.2代表Cuda 9.0,依此类推。

因此,还要为您的cuda配置检查TensorFlow的正确版本。 例如,使用cuDNN v7.3.1Cuda 9.1的{​​{1}} tensorflow-gpu及以上TF v1.4

因此,您所需要做的就是重新安装相应的cudnn版本。 希望对您有帮助!

答案 11 :(得分:1)

对于在 Jupyter笔记本电脑中遇到此问题的任何人:

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

答案 12 :(得分:0)

尝试重新启动机器。它对我有用。

答案 13 :(得分:0)

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

sudo reboot

然后,重新运行代码

答案 14 :(得分:0)

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

  • tensorflow 2.1
  • CUDA 10.1
  • cudnn 7.6.5

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

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

这与可用于加载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句柄。

答案 17 :(得分:0)

以我为例,在检查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内存快满的时刻。 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和使用缓存)。我希望我的回答可以帮助其他人。

答案 18 :(得分:0)

请记住关闭您的tensorboard终端/ cmd或其他与目录有交互作用的终端。然后,您可以在应有的状态下重新开始训练。

答案 19 :(得分:0)

对我来说,按照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 :(得分:0)

当我在安装了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是特定于版本的。

答案 21 :(得分:0)

我也遇到了同样的问题:

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 与命令配合使用是可以的。