MMDetection实战系列4——遇到的BUG及解决办法

1,175 阅读4分钟

Debug

在这里列举一下我在配置中遇到的问题

1. 版本问题

torch cuda mmcv-full的版本必须对应,且cuda的版本不能过低

2.报错:文件找不到

可能是在pip的过程中缺漏了,或者是文件的修改过程错误了,可以再pip一遍看看是不是already requirement

3.ImportError: libcudart.so.10.1: cannot open shared object file: No such file or directory

这是我遇到的最棘手的问题,浪费了我许多个消失,这里先讲产生这个错误的主要原因:当前cuda版本不是10.1,缺少必要文件

我先后尝试了许多种办法:

  1. 以上错误报错原因是libcudart.so.10.1文件没有找到,执行完sudo ln -s /usr/local/cuda-10.0/lib64/libcudart.so.10.0 /usr/lib/libcudart.so.10.1指令后,libcudart.so.10.1其实就已经在usr/lib下了,可以通过cd /usr/lib查看文件,但是这个文件其实是个假文件,既不能下载,也不能打开,点击就报错,据说copy了其他地方的libcudart.so.10.1和libcudart.so.10.1.243这两个文件进去就可以解决,但是我没等到那篇文章的作者给我发这两个文件

  2. 我怀疑是cudatoolkit下载不完整的问题,但是我通过以下指令,发现我的cudatoolkit是有的且完整的

默认目录为:local,进入local:cd /usr/local

输入命令:ls,查看该目录下的文件,可以看到安装的cuda在此处

进入cuda文件:cd cuda-7.5(我的是7.5),此处为安装的东西

查找安装的工具,在bin目录下,进入cuda文件所在目录,然后进入bin目录:cd bin

输入命令:ls,就可以看到cuda toolkit自带的工具了,这些工具可以直接使用。
  1. 最后我怀疑到了正确的地方:系统和cuda的软链接有问题

但是找到了这点后,我依然花了几个小时去解决问题,因为网上切换cuda版本及转换cuda软链接的方法多种多样,我每个都试了一遍,并且在1080,2080,3090的服务器上都尝试了一遍。

以下又是一个分类,记录我使用的多种指令

3.1 先说最后成功的指令

输入命令:

export PATH=/usr/local/cuda-7.5/bin:$PATH

export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH

(此处我使用的是cuda7.5,具体需要根据自己的版本输)

这样路径就添加好了,输入命令:nvcc -V检查路径是否添加成功,如果结果有nvcc则添加成功了。 这样toolkit里面自带的工具都可以直接在终端进行使用了。

3.2

查看当前cuda软链接指向的哪个cuda版本

cd /usr/local
ls
stat cuda

3.2.1. 删除软链接

cd /usr/local/
sudo rm -rf cuda
sudo ln -s /usr/local/cuda-10.0 /usr/local/cuda

3.2.2. 在home/下修改.bashrc的注释,即环境变量 打开.bashrc文件指令:gedit ~/.bashrc

# 将8.0的注释掉,10.0版本的export前面的#去掉即可
export PATH="/usr/local/cuda-10.0/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH"
export CUDA_HOME=/usr/local/cuda

3.2.3. 查看CUDA和CUDNN版本 cat /usr/local/cuda/version.txt

3.2.4.但是当nvcc -V时,还是显示cuda10.0(原版本) 所以我们查看环境变量path,命令:echo $PATH

3.2.5.发现原因:是因为/usr/bin/cuda-10.0(①处)在PATH中相较/usr/local/cuda-10.1(②处)靠前,所以nvcc –V命令会按照PATH顺序,先去①里面找,应该是在这文件夹里的nvcc中找到了10.0版本的cuda,所以就不去别的地方找了,就没有找到②处我们想要的cuda版本;

更改PATH内①和②顺序,采用的方法是将环境变量②位置提前: export PATH=/usr/local/cuda/bin:$PATH

3.2.6.再nvcc -V

3.3 使用update-alternatives实现多版本CUDA切换

# 为cuda配置优先级,数字越大优先级越高:
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-10.0/ 10
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-10.2/ 20

接着使用命令语句: sudo update-alternatives --config cuda选择cuda版本

nvcc-v查看是否更换成功

4.报错:invalid syntax

这个报错是字符错误的意思,可以去对应的文件报错行数的周围找一找有没有缺错标点符号。

最有可能的情况是:你根本就没进入自己的虚拟环境,还在base的环境中,base环境中的python2版本过低,没办法运行一些python3的代码,所以在不兼容的地方报错

5. 虚拟环境

要确保每次自己在运行train.py文件时,一定要进入自建的环境,而不是在base的环境下,base的环境下的python版本为python2的老版本,会报错python版本过低,给人要安装新的python的错觉。

注意看当前环境下的虚拟环境都有哪些,指令:pyenv versions