Ubuntu 16.04 切换 多个 cuda 版本

在安装了多个cuda版本后,可能会遇到版本冲突,或者cuda 版本和torch版本不兼容的情况。这个时候就需要手动切换cuda版本。

第一次修改

首先,我们先检查一下当前的cuda版本。

$ cat /usr/local/cuda/version.txt 
CUDA Version 10.0.130

然后,在/usr/local/目录下查看自己安装的cuda版本,如下图所示:

$ ll /usr/local
total xx
drwxr-xr-x 12 root root 4096 9月  11 19:49 ./
drwxr-xr-x 13 root root 4096 2月  21  2020 ../
drwxr-xr-x  2 root root 4096 2月  27  2019 bin/
lrwxrwxrwx  1 root root   20 2月  21  2020 cuda -> /usr/local/cuda-10.0/
drwxr-xr-x 19 root root 4096 2月  21  2020 cuda-10.0/
drwxr-xr-x 18 root root 4096 2月  21  2020 cuda-9.0/
……

很明显,local下有两个cuda,一个cuda-10.0,一个cuda-9.0。
而cuda是一个软链接,它指向我们指定的cuda版本(注意上面在设置环境变量时,使用的是cuda,而不是cuda-9.0和cuda-10.0,这主要是为了方便我们切换cuda版本,可以让我们不用每次都去该环境变量的值)

当然,也可以使用stat命令查看当前cuda软链接指向的哪个cuda版本,如下所示:

$ cd /usr/local
$ stat cuda
  File: 'cuda' -> '/usr/local/cuda-10.0'
  Size: 20        	Blocks: 0          IO Block: 4096   symbolic link
Device: 812h/2066d	Inode: 265431      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-09-14 12:20:28.671881347 +0800
Modify: 2020-02-21 11:38:25.425305519 +0800
Change: 2020-02-21 11:38:25.425305519 +0800
 Birth: -

可以看到,文件类型是symbolic link,而指向的目录正是/usr/local/cuda-10.0,当我们想使用cuda-9.0版本时,只需要删除该软链接,然后重新建立指向cuda-9.0版本的软链接即可(注意名称还是cuda,因为要与bashrc文件里设置的保持一致)

sudo rm -rf cuda
sudo ln -s /usr/local/cuda-9.0 /usr/local/cuda

如果需要切换cuda 版本,只需要改动建立软链接时cdua的正确路径即可。

这个时候再看一下当前cuda版本是否和修改后的一致,确认无误。

$ cat /usr/local/cuda/version.txt 
CUDA Version 9.0.176

二次修改:nvcc -V与 /usr/local/cuda/version.txt 版本不一致

更改cuda版本后,我们发现 nvcc -V依然显示更改前的版本

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130

原因是,之前修改的环境变量中指明了cuda-10,我们可以把环境变量打印出来看看。

$ echo $PATH
/home/sagewang/.local/bin:/usr/local/cuda-10.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin……

因此无论你怎么修改cuda的link,都会导向cuda-10.0。解决办法也很简单,修改~/.barhrc 中的PATH

export PATH=/home/sagewang/.local/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin……

然后保存文件退出,然后source ~/.bashrc

此时,再次检查,确认无误。

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

三次修改: nvidia-smi 与nvcc -V版本不一致

$ nvidia-smi
Mon Sep 14 21:41:06 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.64       Driver Version: 430.64       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
……

然而

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

这两者不一致,原因在于CUDA 有两种API,分别是 运行时 API 和 驱动API,即所谓的 Runtime API 与 Driver API。
nvidia-smi 的结果除了有 GPU 驱动版本型号,还有 CUDA Driver API的型号,这里是 10.0。 而nvcc的结果是对应 CUDA Runtime API。

在安装CUDA 时候会安装3大组件,分别是 NVIDIA 驱动、toolkit 和 samples。

  • NVIDIA 驱动是用来控制 GPU 硬件,toolkit 里面包括nvcc编译器等,samples或者说SDK 里面包括很多样例程序包括查询设备、带宽测试等等。
  • CUDA Driver API是依赖于 NVIDIA 驱动 安装的
  • CUDA Runtime API 是通过CUDA toolkit 安装的。

Q1、undefined symbol: __cudaPopCallConfiguration

在测试网络模型的时候遇到这个问题,详细错误如下

ImportError: ../lib/_ext/resample2d_package/_ext/resample2d/_resample2d.so: undefined symbol: __cudaPopCallConfiguration

经过分析发现,torch 0.4.0和cuda 10.0不兼容导致,切换cuda 9.0即可。

Q2、Conda 安装激活虚拟环境,支持torch0.4+cuda9.0


conda create -n py27 python=2.7
source active py27
pip install -r requirements.txt 
pip install -U pip; pip install setuptools==44.0.0


conda install pytorch=0.4.0 torchvision cudatoolkit=9.0

猜你喜欢

转载自blog.csdn.net/sage_wang/article/details/108587724