Linux 系统 CUDA 多版本共存以及切换
ChrisKim_ZHT
2024年05月24日 13:55
收录于文集
共50篇

今天在安装某国产机器学习框架时,发现其环境要求极为刁钻,仅支持三个 CUDA 的版本号。我又不愿意破坏当前的 CUDA 环境,通过查询和实验,发现了一个非常不错的 CUDA 多版本共存方案,可以方便地进行 CUDA 版本的切换,下面进入教程。

教程以 Windows 下的 Ubuntu WSL2 为例,正常的 Linux 该方法也一样通用。


本文转自我的个人博客,前往可获得最佳排版体验。 原文链接:https://www.zouht.com/3754.html 本文使用:CC BY-NC-SA 4.0 许可


1 安装较新版本显卡驱动

由于每个 CUDA 版本都有显卡驱动版本号限制,低版本的显卡驱动是不支持高版本 CUDA 的,反之是兼容的。因此建议安装一个较新版本的显卡驱动(至少要支持你想运行的最高版本的 CUDA),这样系统中将要安装的多个 CUDA 版本就都能正常运行了。

  • 当前系统的显卡驱动版本可使用 nvidia-smi 指令查询

  • CUDA 要求的驱动版本可在文档的表三查阅:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html

  • NVIDIA 显卡驱动可在官网下载:https://www.nvidia.com/download/index.aspx

显卡驱动的具体安装不展开赘述,如果你不会安装,那么建议查询显卡驱动安装相关教程。

2 安装需要的 CUDA 版本

前往 CUDA 的下载官网:https://developer.nvidia.com/cuda-toolkit-archive

选择自己需要的 CUDA 版本,选择对应的系统进行下载,建议选择 .run 形式的安装器。以 root 权限运行 .run 安装器,根据提示进行安装即可。过程中需要注意取消勾选显卡驱动,不要重新安装驱动,因为我们上一步已经安装过了。

如果你有多个需要的 CUDA 版本,那就依次下载安装即可,后文我们再介绍如何进行版本切换。

3 安装对应的 cuDNN 库

前往 cuDNN 的下载官网:https://developer.nvidia.com/cudnn-archive

注意选择和上一步安装的 CUDA 版本适配的 cuDNN 版本,我们需要分别给每个版本的 CUDA 安装对应版本的 cuDNN 库。建议选择 .tar.xz 形式的压缩包。

下载好后,使用  解压 cuDNN 库,然后直接执行以下指令进行安装:(注意在正确位置填上对应的版本号,例如 cuda-12.3)

代码块
Shell
自动换行
复制代码
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-<版本号>/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-<版本号>/lib64
sudo chmod a+r /usr/local/cuda-<版本号>/include/cudnn*.h /usr/local/cuda-<版本号>/lib64/libcudnn*
复制成功

4 配置切换脚本

我们的切换方式原理是软链接。每个 CUDA 版本安装后,会在  创建对应版本的文件夹,例如 ,我们可以创建一个软链接 ,让软链接指向对应版本的 CUDA,我们通过修改软链接的指向就能修改 CUDA 版本了。

我们通过文本编辑器打开用户文件夹下的 ,这里用 vim 为例:

在该文件尾部添加以下内容:

代码块
Shell
自动换行
复制代码
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
function switch_cuda {
    if [[ $1 =~ ^[0-9]+\.[0-9]+$ ]]; then
        sudo rm /usr/local/cuda
        sudo ln -s /usr/local/cuda-$1 /usr/local/cuda
        nvcc --version
    else
        echo invalid version
    fi
}
复制成功

注意,如果你的  内已经有类似于前两行的内容,那么需要删除它,替换为我的写法。

添加后保存该文件,然后使用  刷新该文件。

5 测试多版本切换

上述脚本在 bash 内注册了一个函数叫 switch_cuda,通过调用该函数即可快速切换 CUDA 版本。用法为:switch_cuda xx.x (版本号)

以下是切换的演示,首先将 CUDA 版本切换到了 11.6,然后再切回 12.3: