【问题标题】:could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR无法创建 cudnn 句柄: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

标签: tensorflow cudnn


【解决方案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 和使用缓存)。希望我的回答能帮到别人。

【讨论】:

【解决方案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):

            1. 完全移除 cuDNN:

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

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

            1. 下载适当的 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 版本。

            1. 重新启动计算机。就我而言,问题消失了。如果错误仍然存​​在,请考虑安装另一个版本的 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

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

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

              2. 我将环境变量设置为:

                * export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
                * export CUDA_HOME=/usr/local/cuda
                
              3. 我还运行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'
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2019-09-24
                                    • 2019-02-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多