这是个曲折的过程,主要解决cuDNN error: CUDNN_STATUS_INTERNAL_ERROR问题。

【2021-4-10】以为解决了其实并没有

记录一个困扰我几天的坑 ☹,无意中发现了解决的办法,但原因我尚未了解,先作此记录。

事情是这样的:
前两天运行的好好的代码,修改了一点模块后第二次跑的时候始终出现如下错误:

==> training epoch 0/50
train:   0% 0/7151 [00:02<?, ?it/s]
Traceback (most recent call last):
  File "train.py", line 266, in <module>
    main()
  File "train.py", line 228, in main
    current_step=current_step, writer=writer)
  File "train.py", line 116, in train
    loss.backward()
  File "/home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/tensor.py", line 198, in backward
    torch.autograd.backward(self, gradient, retain_graph, create_graph)
  File "/home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/autograd/__init__.py", line 100, in backward
    allow_unreachable=True)  # allow_unreachable flag
RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR (findAlgorithms at /opt/conda/conda-bld/pytorch_1587428266983/work/aten/src/ATen/native/cudnn/Conv.cpp:623)
frame #0: c10::Error::Error(c10::SourceLocation, std::string const&) + 0x4e (0x7f54e50eab5e in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libc10.so)
frame #1: <unknown function> + 0xd73755 (0x7f54e608a755 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #2: <unknown function> + 0xd662fa (0x7f54e607d2fa in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #3: <unknown function> + 0xd676df (0x7f54e607e6df in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #4: <unknown function> + 0xd6b330 (0x7f54e6082330 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #5: at::native::cudnn_convolution_backward_weight(c10::ArrayRef<long>, at::Tensor const&, at::Tensor const&, c10::ArrayRef<long>, c10::ArrayRef<long>, c10::ArrayRef<long>, long, bool, bool) + 0x49 (0x7f54e6082589 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #6: <unknown function> + 0xdd1ee0 (0x7f54e60e8ee0 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #7: <unknown function> + 0xe16158 (0x7f54e612d158 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #8: at::native::cudnn_convolution_backward(at::Tensor const&, at::Tensor const&, at::Tensor const&, c10::ArrayRef<long>, c10::ArrayRef<long>, c10::ArrayRef<long>, long, bool, bool, std::array<bool, 2ul>) + 0x2fc (0x7f54e608323c in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #9: <unknown function> + 0xdd1beb (0x7f54e60e8beb in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #10: <unknown function> + 0xe161b4 (0x7f54e612d1b4 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cuda.so)
frame #11: <unknown function> + 0x29defc6 (0x7f55128bafc6 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cpu.so)
frame #12: <unknown function> + 0x2a2ea54 (0x7f551290aa54 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cpu.so)
frame #13: torch::autograd::generated::CudnnConvolutionBackward::apply(std::vector<at::Tensor, std::allocator<at::Tensor> >&&) + 0x378 (0x7f55124d2f28 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cpu.so)
frame #14: <unknown function> + 0x2ae8215 (0x7f55129c4215 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cpu.so)
frame #15: torch::autograd::Engine::evaluate_function(std::shared_ptr<torch::autograd::GraphTask>&, torch::autograd::Node*, torch::autograd::InputBuffer&) + 0x16f3 (0x7f55129c1513 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cpu.so)
frame #16: torch::autograd::Engine::thread_main(std::shared_ptr<torch::autograd::GraphTask> const&, bool) + 0x3d2 (0x7f55129c22f2 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cpu.so)
frame #17: torch::autograd::Engine::thread_init(int) + 0x39 (0x7f55129ba969 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_cpu.so)
frame #18: torch::autograd::python::PythonEngine::thread_init(int) + 0x38 (0x7f5515d01558 in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/libtorch_python.so)
frame #19: <unknown function> + 0xc819d (0x7f551876c19d in /home/.conda/envs/pytorch/lib/python3.7/site-packages/torch/lib/../../../.././libstdc++.so.6)
frame #20: <unknown function> + 0x7fa3 (0x7f55325d3fa3 in /lib/x86_64-linux-gnu/libpthread.so.0)
frame #21: clone + 0x3f (0x7f55325044cf in /lib/x86_64-linux-gnu/libc.so.6)

开始也没查这个错误,就想会不会是我加的模块的问题,于是换回了前两天刚跑过的版本,发现也还是报同样的错误。我就奇了怪了,刚刚还能跑的怎么过会就不能跑了,然后我又想着会不会是改程序的时候不小心改了其他的什么地方,于是又从github上clone了最最原始的代码,但是竟然还是出现这个错误!

于是我搜了一波。
https://www.codenong.com/62067849/
这里面提到了几种可能性:
1、内存不足
2、嵌入中的无效索引
3、cudatoolkit版本问题
后两种肯定不可能,毕竟之前运行过,第一种我检查了一下也不存在。
https://www.codeleading.com/article/65534006361/https://blog.csdn.net/Mao_Jonah/article/details/112472913
这里说可能是cuda设置的问题,可以通过

torch.cuda.set_device(0)

或者

os.environ['CUDA_VISIBLE_DEVICES'] = "0"

来解决。但明显也不属于这种情况。

后来找了一些其他回答、重新配了下环境,都没有解决我的问题,所以就准备先搁着以后再说。

结果今天在阅读代码的时候突然发现每个文件夹里都多了个___pycache__文件夹(用pycharm连接服务器时在pycharm的Remote Host上看到的),之前没见过觉得很奇怪,就把这些文件夹都删了。
图中的__pycache__
结果再次运行之前那个代码的时候就莫得问题了!
至于原因,还未研究,以后再补充☺

按照https://blog.csdn.net/yitiaodashu/article/details/79023987这篇博客里的说法:

Python程序运行时不需要编译成二进制代码,而直接从源码运行程序,简单来说是,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码
解释器的具体工作:
1、完成模块的加载和链接;
2、将源代码编译为PyCodeObject对象(即字节码),写入内存中,供CPU读取;
3、从内存中读取并执行,结束后将PyCodeObject写回硬盘当中,也就是复制到.pyc或.pyo文件中,以保存当前目录下所有脚本的字节码文件。

之后若再次执行该脚本,它先检查【本地是否有上述字节码文件】和【该字节码文件的修改时间是否在其源文件之后】,是就直接执行,否则重复上述步骤。

那有的小伙伴就有疑问了,__pycache__文件夹的意义何在呢?
因为第一次执行代码的时候,Python解释器已经把编译的字节码放在__pycache__文件夹中,这样以后再次运行的话,如果被调用的模块未发生改变,那就直接跳过编译这一步,直接去__pycache__文件夹中去运行相关的*.pyc 文件,大大缩短了项目运行前的准备时间。

所以可能是*.pyc文件的问题?


【2021-4-14更新】不行了

现在又不行了,还是老问题,报错一模一样。
查了一堆博客,唯一对我有用的就是解决RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED这篇博客中说的,设置:

torch.backends.cudnn.enabled = False

但是这样设置训练的速度会变慢。
怀疑是版本的问题,但还不知道是哪个东西的版本不对。


【2021-4-16更新】又行了

神奇的事情发生了,今天再次跑了一下这个程序,竟然可以正常运行了。但我啥也没改过,代码和环境都和前两天一样,奇奇怪怪。
PS:看来之前删了__pycache__应该不起任何作用,只是正巧碰上了它正常的时候。


【2021-4-21更新】又不行了,最终解决

今天在啥都没改动过的前提下又又又不行了。。
最后通过修改pytorch版本终于解决了这个问题!
重装了环境,换了CUDA11.1对应的PyTorch版本。
在这里插入图片描述

conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c conda-forge

猜测原因可能是:原本服务器上的CUDA版本是11.1,虽然我之前自己装了个CUDA 10.2的版本,但可能安装的有问题,导致pytorch版本与CUDA版本不对应。(纯属猜测)
在这里插入图片描述
(但是为什么之前有的时候却可以训练呢??迷惑)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐