1 问题描述:
在GPU运行模型时出现:
RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling
cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)
2 原因分析:
具体有三种原因:
1) CUBLAS的问题
2) 环境变量问题
3) cuda版本问题
另外,如果代码有问题,张量不对齐的话也可能出现该报错。
3 解决方案:
针对每种原因,具体的解决方案如下:
3.1 CUBLAS的问题
报错里会提到CUBLAS_STATUS_INVALID_VALUE
RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling
cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)
pip uninstall nvidia-cublas-cu11
尝试卸载虚拟环境中的CUBLAS相关包试试,具体参考这篇文章
CUBLAS参考文章。
3.2 环境变量问题
在命令行中输入
unset LD_LIBRARY_PATH
unset LD_LIBRARY_PATH 是一个用于清空 Linux 或 Unix 操作系统环境变量 LD_LIBRARY_PATH 的命令。
在 Linux 或 Unix 系统中,LD_LIBRARY_PATH 是一个环境变量,用于指定共享库文件(也称为动态链接库)的搜索路径。当一个程序启动时,系统会在 LD_LIBRARY_PATH 指定的路径下搜索共享库文件。如果 LD_LIBRARY_PATH 没有被设置,系统会使用默认的共享库搜索路径。
使用 unset LD_LIBRARY_PATH 命令可以清空 LD_LIBRARY_PATH 环境变量,这意味着系统将只使用默认的共享库搜索路径。这个命令通常用于解决程序运行时由于错误的 LD_LIBRARY_PATH 设置导致的问题。
具体参考这篇文章
环境变量参考文章
3.3 cuda版本问题
作者是在上述两个方法都无效的情况下,多方查找后发现,可能是本机的cuda版本太高,和torch不兼容,需要下载匹配的cuda重新运行。
首先,咱来说说这三者的区别:
nvcc - V #机器上的cuda版本
nvidia-smi #当前driver可支持的最高版本(必须大于安装的cuda版本)
torch.version.cuda #当前torch支持的最高cuda版本
确保安装时,选择的cuda和torch版本要满足1<3<2(也可以等于),如何不满足则可能会出现题目中的报错。如作者的三个版本分别是11.5,12.2,10.1,分析一下可得当前的cuda11.5比torch支持的cuda版本10.1高了,所以需要重新安装10.1的cuda。
其次,cuda版本在满足上述要求的同时,还需要和环境内的torch和torchvision版本匹配。作者的torch版本为1.4.0,torchvision版本为0.5.0,结合上述cuda10.1版本,在此链接里查询安装命令 查询链接。
可以命令行用conda或pip安装,但作者的镜像似乎有些问题,直接安装没有成功,遂转而第二条曲折道路:
去nvidia官网,CUDA Toolkit Archive,找到符合条件的链接
选择适合系统的下载路径,在服务器上wget下载到目的路径即可
下载完成后cd到_linux.run
文件所在目录中,进行安装。参考文章ubantu安装cuda
先执行一下命令,安装相关依赖:
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
这里作者由于权限需要填写sudo密码。
接着可以开始安装:
sudo sh cuda_10.1.105_418.39_linux.run
请注意如此安装可能也会出现报错,gcc版本不兼容
Failed to verify gcc version.
See log at /var/log/cuda-installer.log for details.
这里需要修改一下安装命令,使用--override
参数:
sudo sh cuda_10.1.105_418.39_linux.run --override
即可解决问题啦!重新安装cuda时cuda的driver是已经有的,记得在这一步把driver安装去掉
安装成功后会出现
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-10.1/
Samples: Installed in /home/zhangyujie/
Please make sure that
- PATH includes /usr/local/cuda-10.1/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-10.1/lib64, or, add /usr/local/cuda-10.1/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-10.1/bin
Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-10.1/doc/pdf for detailed information on setting up CUDA.
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 418.00 is required for CUDA 10.1 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
sudo <CudaInstaller>.run --silent --driver
Logfile is /var/log/cuda-installer.log
到此就快啦!下一步配置cuda相关环境变量。
vim ~/.bashrc #修改配置文件
关于vim的操作不细说了,打开后,在文件结尾添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
保存后退出,使环境变量生效:
source ~/.bashrc
最后,倘若和我一样之前有安装过其他cuda版本,此时需要切换cuda版本,可以通过修改软链接路径来搞定。
在/usr/local/
目录下查看自己安装的cuda版本
cuda是个软链接,cuda-10.1是我们安装的cuda版本。使用stat命令查看当前cuda链接的版本:
如图所示,软链接的是10.1版本,若是要更改链接版本,删除该软链接重新建立对应版本的软链接即可。
sudo rm -rf cuda
sudo ln -s /usr/local/cuda-XXX /usr/local/cuda
好了基本就这样了,历时好几天终于解决了这个问题。痛苦的新手期,第一篇文章,写得一般般还望见谅,希望能够帮到同样问题的小伙伴~♥️
1 http://t.csdnimg.cn/A16bJ
2 http://t.csdnimg.cn/07EW7
3 RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when - lucky的文章 - 知乎 https://zhuanlan.zhihu.com/p/544273448
4 https://cloud.tencent.com/developer/article/1726518?shareByChannel=link
5 http://t.csdnimg.cn/SswhS
6 http://t.csdnimg.cn/Hd7Ae