问题描述:
在运行 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
发现网上的解决方法五花八门:
- 报错:RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
- RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR
- 【pytorch】cuDNN error: CUDNN_STATUS_INTERNAL_ERROR终终终终于解决了!
- pytorch运行错误:RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR
- Pytorch CUDA报错,CUDNN_STATUS_INTERNAL_ERROR的解决办法
- CUDNN_STATUS_INTERNAL_ERROR问题解决方案
- 记录利用CrossEntropyLoss()做图像分割任务踩过的坑~
总结起来可能是以下方面的问题:
- 版本兼容问题(显卡驱动,CUDA,cudnn版本)
- 显存溢出问题(改batch size,num_worker,设置一块GPU,禁用cudnn)
- 清理缓存(Pycharm 和 nvidia缓存)
- 类别数设置有误
原因分析:
报这个错误的原因可谓是五花八门,网上大都是认为版本不兼容导致的,所以很多人(包括我自己)一直在不停地将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。