@[TOC](ubuntu16.04 安装多版本cuda(原10.0,新安装10.1),实现任意切换)


前言

需求:单位需要使用yolo-v5训练模型,可所需的pytorch对cuda的依赖版本较高,而仅仅安装单个高版本的cuda又会与原先的项目产生矛盾,所以纠结一下,研究了安装双cuda步骤,记录一下


一、下载cuda地址:

cuda官方下载地址: https://developer.nvidia.com/cuda-toolkit-archive

cudnn官方下载地址:https://developer.nvidia.com/rdp/cudnn-download

我使用的cuda版本与cudnn版本如下所示:

codeshell cuda 多个显卡 cuda能装多个版本吗_pytorch


下图是英伟达显卡驱动与cuda的版本对照:

codeshell cuda 多个显卡 cuda能装多个版本吗_codeshell cuda 多个显卡_02


英伟达显卡驱动需要由较高cuda版本对应的显卡驱动来确定;更新英伟达显卡驱动可以在安装cuda时选择安装,但是本人多次尝试都失败告终,最后使用ubuntu的自带的更新功能成功,如下界面:

codeshell cuda 多个显卡 cuda能装多个版本吗_深度学习_03


codeshell cuda 多个显卡 cuda能装多个版本吗_软链接_04

二、安装cuda10.1

sudo chmod +x cuda_10.1.105_418.39_linux.run  # 为 cuda添加可执行权限
sudo ./cuda_10.1.105_418.39_linux.run  # 安装

稍等片刻后会出现如下安装提示:

codeshell cuda 多个显卡 cuda能装多个版本吗_codeshell cuda 多个显卡_05


codeshell cuda 多个显卡 cuda能装多个版本吗_pytorch_06


3、如果之前安装过另一个版本的cuda,除非你确定想要用这个新版本的cuda,否则这里就建议选n,因为指定该链接后会将cuda指向这个新的版本

codeshell cuda 多个显卡 cuda能装多个版本吗_pytorch_07


4. cuda环境设置:

sudo gedit ~/.bashrc

打开后在末尾添加以下语句

export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda

以上的路径都是指向/usr/local/cuda 软连接,并没有写死指向某一个cuda版本,后面切换时不用改路径了,只改软连接指向就可以。
保存关闭后:

source ~/.bashrc

三、cuda版本切换

切换/usr/local/目录

sudo rm -rf cuda             #删除之前的软链接(原本指向10.0)
sudo ln -s /usr/local/cuda-10.1 /usr/local/cuda  #生成新的软链接,指向10.1

在/usr/local/ 目录下,以下四行命令均可以查看当前cuda软链接指向的哪个cuda版本

stat cuda  # stat /usr/local/cuda 
cat  /usr/local/cuda/version.txt
nvcc --version
nvcc -V 
ls -al  # 在/usr/local目录下查看

codeshell cuda 多个显卡 cuda能装多个版本吗_codeshell cuda 多个显卡_08

当需要cuda10.0时,只需要执行以下语句,将软连接指向cuda10.0即可:

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

补充问题:

1、nvcc -V显示有误

已经切换到了cuda10.1,用stat cuda查看正常,但用nvcc -V 查看的时候仍然显示10.0版本。可能原因是nvcc默认是你以前deb安装时候其他版本的,所以就算操作按上面一步步来,nvcc –V结果还是没变。所以我们可以找到nvcc位置,然后创建/usr/local/cuda/bin/nvcc软链接到原先nvcc位置,操作如下:

which nvcc  # 找到nvcc位置,我的在/usr/local/cuda-10.0/bin/nvcc
sudo ln -s /usr/local/cuda/bin/nvcc /usr/local/cuda-10.0/bin/nvcc # 创建软链接链接到当前cuda的nvcc
nvcc -V # 显示当前cuda版本

在创建软连接时可能还会遇到这个问题,显示ln: 无法创建符号链接’/usr/local/cuda-10.0/bin/nvcc’: 文件已存在
此时,可以把cuda10.0/bin下的nvcc备份一下,然后删除重新创建软连接。

sudo rm -f nvcc  # 在/usr/local/cuda-10.0/bin下删除

2. nvcc -V找不到

nvcc -V  # 出现以下提示

Command 'nvcc' not found, but can be installed with:
sudo apt install nvidia-cuda-toolkit

可能是cuda 装好了,但是 nvcc 所在路径没有加入系统路径中,所以系统找不到 nvcc 。如果cuda 安装好了, nvcc 程序应该在路径 /usr/local/cuda/bin 中,可以直接在该路径下执行:

./nvcc -V

3、卸载掉cuda

1、如果安装的cuda是10.0(使用runfile文件包安装),则使用以下方法卸载

sudo /usr/local/cuda-10.0/bin/uninstall_cuda_10.0.pl

卸载之后,如有一些残留的文件夹,之前安装的是CUDA 10.0。可以一并删除:

sudo rm -rf /usr/local/cuda-10.0/

2、如果安装的cuda是10.1(使用runfile文件包安装),则使用以下方法卸载

cd /usr/local/cuda/bin
sudo ./cuda-uninstaller

3、如果cuda是由deb包安装,则执行以下指令

sudo apt-get remove cuda 
sudo apt autoremove

四、安装cudnn

下载好后直接解压,得到文件夹 cuda,然后复制lib64和include文件夹到usr/local/cuda-10.1

sudo cp cuda/include/cudnn.h /usr/local/cuda-10.1/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.1/lib64/
sudo chmod a+r /usr/local/cuda-10.1/include/cudnn.h /usr/local/cuda-10.1/lib64/libcudnn*

确认是否成功安装:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

如下所示:

codeshell cuda 多个显卡 cuda能装多个版本吗_pytorch_09

补充:在安装完毕后,安装tensorflow后,终端可以正常导入tensorflow包,但是在pycharm导入tensorflow可能会出现以下报错:

ImportError: libcublas.so.10.0:cannot open shared object file:No such file or director

分析原因:

pycharm无法继承.bashrc里面的环境变量,因此才会出现这种问题

解决方法:

打开pycharm,进行如下修改:

Run------>Edit Configuration

codeshell cuda 多个显卡 cuda能装多个版本吗_软链接_10


即:

PYTHONUNBUFFERED=1;LD_LIBRARY_PATH=/usr/local/cuda/lib64