RuntimeError:cuDNN 错误:CUDNN_STATUS_NOT_INITIALIZED 使用 pytorch

Posted

技术标签:

【中文标题】RuntimeError:cuDNN 错误:CUDNN_STATUS_NOT_INITIALIZED 使用 pytorch【英文标题】:RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED using pytorch 【发布时间】:2021-06-09 19:27:34 【问题描述】:

我正在尝试运行一个简单的 pytorch 示例代码。使用 CPU 可以正常工作。但是在使用 GPU 时,我收到以下错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py", line 889, in _call_impl
    result = self.forward(*input, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py", line 263, in forward
    return self._conv_forward(input, self.weight, self.bias)
  File "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py", line 260, in _conv_forward
    self.padding, self.dilation, self.groups)
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

我尝试运行的代码如下:

import torch
from torch import nn
m = nn.Conv1d(16, 33, 3, stride=2)
m=m.to('cuda')
input = torch.randn(20, 16, 50)
input=input.to('cuda')
output = m(input)

我正在使用 CUDA 10.2 版的 NVIDIA docker 中运行此代码,我的 GPU 是 RTX 2070

【问题讨论】:

一个与您的问题无关的提示。请不要使用 python 关键字作为变量,因为这会导致一些非常丑陋和困难的问题。 import torch.cuda / torch.cuda.is_available() ? 我在 CUDA 10.2 上遇到了完全相同的问题。你解决了吗? @GuojunZhang 我用nvidia docker的pytorch容器解决了。 【参考方案1】:

我也在使用 Cuda 10.2。将torch 和torchvision 升级到最新版本(torch-1.8.0 和torchvision-0.9.0)时,我遇到了完全相同的错误。你用的是哪个版本?

我想这不是最好的解决方案,但通过降级到 torch-1.7.1 和 torchvision-0.8.2 就可以了。

【讨论】:

【参考方案2】:

关于这个here有一些讨论。我有同样的问题,但使用 cuda 11.1 为我解决了。

这是确切的 pip 命令

pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html

【讨论】:

【参考方案3】:

就我而言,它实际上与 PyTorch/CUDA/cuDNN 版本无关。每当第一次执行卷积时,PyTorch 都会延迟初始化 cuDNN。但是,在我的情况下,没有足够的 GPU 内存来初始化 cuDNN,因为 PyTorch 本身已经将整个内存保存在其内部缓存中。可以在执行第一个卷积之前使用“torch.cuda.empty_cache()”手动释放缓存。更简洁的解决方案是在开始时通过模拟卷积强制 cuDNN 初始化:

def force_cudnn_initialization():
    s = 32
    dev = torch.device('cuda')
    torch.nn.functional.conv2d(torch.zeros(s, s, s, s, device=dev), torch.zeros(s, s, s, s, device=dev))

在程序一开始就调用上述函数为我解决了这个问题。

【讨论】:

【参考方案4】:

在我的例子中,这个错误是在尝试估计损失时发生的。 我使用了混合 bce-dice 损失。 事实证明,我的输出是线性的,而不是 sigmoid。 然后我使用下面的 sigmoid 预测并且工作正常。

output = torch.nn.Sigmoid()(output)
loss = criterion1(output, target)

【讨论】:

以上是关于RuntimeError:cuDNN 错误:CUDNN_STATUS_NOT_INITIALIZED 使用 pytorch的主要内容,如果未能解决你的问题,请参考以下文章

RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR

RuntimeError: cudnn RNN backward can only be called in training mode

Linux环境cudnn安装

Linux环境cudnn安装

Linux环境cudnn安装

Cuda Cudnn安装