RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED 问题解决记录

问题描述:

在运行 PyTorch 代码时遇到以下 Bug:

/opt/conda/conda-bld/pytorch_1634272128894/work/aten/src/ATen/native/cuda/NLLLoss2d.cu:95: nll_loss2d_forward_kernel: block: [0,0,0], thread: [225,0,0] Assertion `t >= 0 && t < n_classes` failed.
.
.
loss.backward()
.
.
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

定位发现,在 loss.backward() 处出现了这个问题。查询错误信息:

RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

发现网上的解决方法五花八门:

  1. 报错:RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
  2. RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR
  3. 【pytorch】cuDNN error: CUDNN_STATUS_INTERNAL_ERROR终终终终于解决了!
  4. pytorch运行错误:RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR
  5. Pytorch CUDA报错,CUDNN_STATUS_INTERNAL_ERROR的解决办法
  6. CUDNN_STATUS_INTERNAL_ERROR问题解决方案
  7. 记录利用CrossEntropyLoss()做图像分割任务踩过的坑~

总结起来可能是以下方面的问题:

  1. 版本兼容问题(显卡驱动,CUDA,cudnn版本)
  2. 显存溢出问题(改batch size,num_worker,设置一块GPU,禁用cudnn)
  3. 清理缓存(Pycharm 和 nvidia缓存)
  4. 类别数设置有误

原因分析:

报这个错误的原因可谓是五花八门,网上大都是认为版本不兼容导致的,所以很多人(包括我自己)一直在不停地将PyTorch、CUDA 和 cudnn 升级降级,以期解决问题,结果往往是无功而返。

实际上遇到此类问题,先不着急升级降级,应当尝试此类问题是不是因为GPU导致的

为了判定是否是GPU上的问题,可以先把程序设置到CPU上跑,发现还是报错如下:

Traceback (most recent call last):
.
.
.
  File "/home/.conda/envs/pt2/lib/python3.8/site-packages/torch/nn/modules/loss.py", line 1150, in forward
    return F.cross_entropy(input, target, weight=self.weight,
  File "/home/.conda/envs/pt2/lib/python3.8/site-packages/torch/nn/functional.py", line 2846, in cross_entropy
    return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing)
IndexError: Target 3 is out of bounds.

定位到计算loss函数报错,此时笔者才意识到,本人设置模型输出的类别数忘记和数据集的类别数相对应。


解决方案:

将模型输出的类别数设置为数据集对应的类别数。


启示:

遇到GPU上相关的问题时,先不着急检查GPU相关的设置,应当将模型挂载到CPU上,看模型本身是否有Bug。

来源:yyywxk

物联沃分享整理
物联沃-IOTWORD物联网 » RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED 问题解决记录

发表评论