0%

Ubuntu多cuda版本管理

Ubuntu系统上实现类Anacondacuda版本管理,并根据代码环境高效切换


引言

深度学习的一些久远代码需要的cuda版本较老,可能和目前主流的cuda版本不一致,直接卸载原有cuda手动安装老版本不仅十分麻烦,而且没有必要为了一套代码搞坏电脑配置。

另一方面,Pytorch还相对较好(conda新建环境时会自动下载适配pytorch版本的cudatoolkit),运行tensorflow程序的环境配置就很麻烦,要安装合适的cuda和cuDNN,不同版本tensorflow需要的cuda和cuDNN还不一致,这对于windows这种只能安装一种cuda的操作系统,需要反复卸载重新安装,导致多数Windows的tensorflow开发者配置好一个版本后不愿升级,从某种程度上导致tensorflow的生态相较Pytorch不太友好。

下面就要说到Ubuntu的优势:Ubuntu等Linux发行版操作系统,可以安装多个cuda版本,通过修改软连接,便捷的切换cuda版本(功能类似天然的Anaconda),在配置和运行代码环境及三方包时很方便,可以把更多的精力专注在开发和快速实验上。

预备知识

在安装配置时,会遇到一些常见名词:

  • 显卡驱动:是电脑正常运行的基础,台式机上显卡驱动错误会有很多显示问题(如:屏幕分辨率不一致等),因此不要轻易修改显卡驱动(Windows下载安装相对安全,Ubuntu使用sudo权限容易搞崩系统)。 驱动版本对cuda版本向下兼容,新驱动可以兼容所有旧的cuda版本,故驱动升级对cuda老版本配置无影响(建议升级新驱动)。 nvidai-smi可以查看显卡信息,包括驱动版本号,当前可最高支持的cuda version(这里的版本和实际使用的cuda版本未必一致

  • cuda下载官网 显卡并行加速计算包

    • Pytorch:安装和官网下载命令中cudatoolkit一致或者相近的版本,如:官网cudatoolkit=11.3,这里主机上的nvidai-cudatoolkit版本最好为11.3,当然稍高一点的nvidai-cudatoolkit=11.4|11.5|11.6也是可以的,但10.x和11.x跨大版本的不匹配是不行的

      driver version(nvidia-smi显示的那个)向下兼容runtime version(pytorch binding的那个) pytorch自带runtime,不会用/usr/local下的cuda

    • tensorflow:按照官网配置下载对应的cuda

  • cuDNN:针对cuda实现神经网络推断加速的SDK,选择版本参照tensorflow的建议

安装流程

安装需要版本的cuda

官网下载,选择runfile类型的安装文件,官网下载可能需要翻墙,以cuda_10.1.243_418.87.00_linux.run为例,执行以下命令:

1
2
3
# 运行安装
chmod +x cuda_11.3.0_465.19.01_linux.run
sudo sh ./cuda_11.3.0_465.19.01_linux.run

图文说明参考这里

安装匹配的cuDNN

官网下载,匹配关系按照tensorflow版本看后两列

版本 Python 版本 编译器 构建工具 cuDNN CUDA
tensorflow-2.6.0 3.6-3.9 GCC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.5.0 3.6-3.9 GCC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.4.0 3.6-3.8 GCC 7.3.1 Bazel 3.1.0 8.0 11.0
tensorflow-2.3.0 3.5-3.8 GCC 7.3.1 Bazel 3.1.0 7.6 10.1
tensorflow-2.2.0 3.5-3.8 GCC 7.3.1 Bazel 2.0.0 7.6 10.1
tensorflow-2.1.0 2.7、3.5-3.7 GCC 7.3.1 Bazel 0.27.1 7.6 10.1
tensorflow-2.0.0 2.7、3.3-3.7 GCC 7.3.1 Bazel 0.26.1 7.4 10.0
tensorflow_gpu-1.15.0 2.7、3.3-3.7 GCC 7.3.1 Bazel 0.26.1 7.4 10.0
tensorflow_gpu-1.14.0 2.7、3.3-3.7 GCC 4.8 Bazel 0.24.1 7.4 10.0
tensorflow_gpu-1.13.1 2.7、3.3-3.7 GCC 4.8 Bazel 0.19.2 7.4 10.0
tensorflow_gpu-1.12.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.11.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.10.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.9.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.11.0 7 9
tensorflow_gpu-1.8.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.10.0 7 9
tensorflow_gpu-1.7.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.6.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.5.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.8.0 7 9
tensorflow_gpu-1.4.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.5.4 6 8
tensorflow_gpu-1.3.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.5 6 8
tensorflow_gpu-1.2.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.5 5.1 8
tensorflow_gpu-1.1.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8
  1. 解压

    1
    tar -zxvf cudnn-11.3-linux-x64-v8.2.0.53.tgz

  2. 复制解压得到的全部文件到cuda-toolkit的安装目录下(默认为/usr/local/

    1
    2
    3
    # cudnn作为cuda-toolkit的补充,头文件复制到头文件目录中, lib文件同理
    sudo cp cuda/include/cudnn* /usr/local/cuda-11.3/include
    sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64

  3. 更改头文件权限(可选)

    1
    sudo chmod a+r /usr/local/cuda-11.3/include/cudnn*  /usr/local/cuda-11.3/lib64/libcudnn*

配置环境变量

修改主目录下~/.bashrc文件,在末尾添加,修改后,更换cuda版本后以后无需改动这里的环境配置

1
2
3
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

之后更新一下~/.bashrc文件,使得配置生效

1
source ~/.bashrc

安装检验

  • 驱动安装是否成功:nvidia-smi

  • cuda_toolkit安装是否成功:nvcc -V该版本可以和驱动输出右上角的版本号不同

  • cudnn安装是否成功:

    (老版本) 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

多版本切换

1
2
3
4
5
6
7
8
9
10
11
# 查看当前cuda指向的版本
stat /usr/local/cuda

# 删除原来的cuda映射关系
sudo rm -rf /usr/local/cuda

# 建立新的映射,指定对应的cuda版本
sudo ln -s /usr/local/cuda-11.3 /usr/local/cuda

# 切换完毕检查
nvcc -V # stat也可以