CUDA和CUDNN版本切换

0 背景

在用不同框架做深度学习时,难免会遇到需要不同版本的cuda和cudnn版本的情况,如果把原来版本的卸载掉重新安装新版本,则会影响其它框架的使用,最好的方法是在主机上安装多个版本的cuda和cudnn,需要用到哪种就切换到哪种,这样就免去了重复卸载安装的工作。

cuda:由NVIDIA推出的通用并行计算架构,包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 利用CUDA编写出的程序可以在NVIDIA显卡上跑的飞起。进行CUDA开发需要依次安装驱动、toolkit、SDK三个软件。深度学习玩家通常只需要安装显卡驱动和toolkit即可。[可参考]

cudnn:用于加速DL的算子库。安装时只需要下载对应的tar包,解压后将头文件(include/cudnn*.h)和库(lib64/libcudnn*)复制到cuda对应文件夹下即可。

1 安装目录和版本查看

安装的cuda一般在 /usr/local/ ,通常建立一个软链接,将cuda链接到需要的版本。

进入cuda,可见include和lib64分别链接到实际使用的头文件目录和库目录。

旧版的/usr/local/cuda/ 路径下一般有一个version.txt文档,里面记录了cuda的版本信息,因此可用cat /usr/local/cuda/version.txt 命令查看版本信息【新版的改为version.json,所以可直接查看该文件,或者使用 nvcc -V 命令】

如果安装了多个cuda,实际使用的可能不是/usr/local/cuda/下边的版本,这个时候可以使用nvcc -V指令来查看实际使用的cuda版本。

同理,cudnn的信息在其头文件 cudnn_version.h 里。

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2          #旧版
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2  #新版

3 cuda环境变量和版本切换

3.1 ~/.bashrc中环境变量

在~/.bashrc中,通常按照下面习惯1来设置环境变量,但这个代码存在一个BUG,即在LD_LIBRARY_PATH不存在时,LD_LIBRARY_PATH会被赋值为":/usr/local/cuda/lib64"而不是"/usr/local/cuda/lib64",有一个冒号的区别。这个BUG对于pytorch来说无所谓,哪怕不加,pytorch也会通过/usr/local/cuda找到外部的CUDA(pytorch查找CUDA的过程)。但对于一些兼容性没那么好的代码而言,环境变量是最重要的。因此最好使用习惯2来添加环境变量。【可参考

## 设置习惯1,有bug
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

## 设置习惯2,推荐
if [ $LD_LIBRARY_PATH ]; then
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
else
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64
fi

if [ $PATH ]; then
    export PATH=$PATH:/usr/local/cuda/bin
else
    export PATH=/usr/local/cuda/bin
fi

if [ $CUDA_HOME ]; then
    export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
else
    export CUDA_HOME=/usr/local/cuda
fi
  1. 注意Linux中PATH、 LIBRARY_PATH、 LD_LIBRARY_PATH变量的区别;
  2. 可用 echo $CUDA_HOME 命令来查看该变量的实际值【之前的设置果然中招了】;

3.2 cuda版本切换

方法一:如果只修改自己用户的CUDA版本,则只需要修改环境变量即可,打开~/.bashrc文件,找到cuda的环境变量,将cuda的路径改为自己需要的cuda版本路径,然后 source ~/.bashrc 使之生效。这样的好处是只改了当前用户的cuda版本,其它用户还可以用他们需要的cuda版本,互不影响。

## 可参照3.1的习惯2修改
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.3/lib64
export PATH=$PATH:/usr/local/cuda-11.3/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-11.3

方法二:如果想要把服务器上多用户的CUDA版本都切换了,则删除原有链接,建立新的软链接即可,这样服务器上每个用户的版本都切换了。

sudo rm -rf /usr/local/cuda #删除之前创建的软链接
sudo ln -s /usr/local/cuda-10.0 /usr/local/cuda #创建新 cuda 的软链接,注意修改自己对应的版本
# 可以使用 ls -l 查看软链接情况,带 -> 符号的表明是软链接

4 cudnn版本切换

安装cudnn的方法,就是下载一个对应版本的tar包, 官网下载地址

解压:tar  zxvf  xxx.tgz

然后将所有头文件(include/cudnn*.h)和库(lib64/libcudnn*)复制到cuda对应目录下面。

## 先将原来的cudnn移到指定位置,以便日后恢复
sudo mv /usr/local/cuda-10.0/include/cudnn*   temp/include
sudo mv /usr/local/cuda-10.0/lib64/libcudnn*  temp/lib

## 将所有头文件和库复制到cuda对应目录下
sudo cp include/cudnn*  /usr/local/cuda/include/
sudo cp lib64/libcudnn* /usr/local/cuda/lib64/
  1. cudnn头文件都是以cudnn开头,库文件都是以libcudnn开头,放到cuda中就可以用;

参考:
https://blog.csdn.net/zong596568821xp/article/details/80880204
https://qiyuan-z.github.io/2022/01/04/Ubuntu多版本cuda安装与切换/

posted @ 2024-04-27 12:01  天地辽阔  阅读(246)  评论(0编辑  收藏  举报