在 Linux 上用多版本 CUDA 是个常态。尤其是深度学习或者 CUDA 工程开发的时候,不同的项目依赖不同版本的 CUDA,而我们通常系统里默认的 /usr/local/cuda 只指向了当前最新版本。

虽然只需要改几个环境变量就能切,但每次手动调真的太麻烦,于是我写了个小工具:switch-cuda.sh

📦 功能简介

这个 bash 脚本可以:

  • 动态切换当前 bash session 使用的 CUDA 版本
  • 一键恢复系统默认的 CUDA 设置(由 /usr/local/cuda 软链接决定)
  • 无缝集成到 Conda 环境,激活/退出环境时自动切换对应 CUDA 版本

简单实用,适合经常切 CUDA 和用 Conda 的同学。

📖 使用方法

安装

下载 switch-cuda.sh,放到你想要的目录里(推荐你的用户目录,即~/) 。

切换 CUDA

source switch-cuda.sh [VERSION]

注意这里必须用 source,因为它要修改当前 shell 的环境变量。

  • 如果提供了版本号,比如 11.8,会自动调整 PATHLD_LIBRARY_PATHCUDA_HOMECUDA_ROOT 到对应目录下。
  • 如果是 default,就会清除掉环境变量,回归到系统 /usr/local/cuda 的软链接状态。
  • 如果不填参数,就会列出当前系统 /usr/local/ 里的所有 CUDA 版本。

📝 使用示例

$ source switch-cuda.sh 
The following CUDA installations have been found (in '/usr/local'):
* cuda-11.5
* cuda-11.8
* cuda-12.6
$ source switch-cuda.sh 11.8
Switched to CUDA 11.8.
$ source switch-cuda.sh default
CUDA environment has been reset to default.

🍰 Conda 环境集成

你可以通过在 Conda 环境目录下的 etc/conda/activate.detc/conda/deactivate.d 里添加 hook 脚本,让激活环境时自动切换 CUDA 版本,退出时自动恢复默认。

📌 示例配置:

假设:

  • 你的 Conda 环境名字为 YOUR_ENV_NAME, 环境路径是:~/miniconda3/envs/YOUR_ENV_NAME
  • 你的 switch-cuda.sh 脚本路径是:~/Projects/switch-cuda.sh
  • 希望该环境启用的 CUDA 版本是 12.1

📁 创建两个 hook 脚本:

mkdir -p ~/miniconda3/envs/YOUR_ENV_NAME/etc/conda/activate.d
mkdir -p ~/miniconda3/envs/YOUR_ENV_NAME/etc/conda/deactivate.d

激活环境时切换 CUDA

~/miniconda3/envs/YOUR_ENV_NAME/etc/conda/activate.d/set-cuda.sh

#!/bin/bash
source ~/Projects/switch-cuda.sh 12.1

退出环境时恢复默认

~/miniconda3/envs/YOUR_ENV_NAME/etc/conda/deactivate.d/reset-cuda.sh

#!/bin/bash
source ~/Projects/switch-cuda.sh default

🚀 使用方式

现在,每次你执行:

conda activate YOUR_ENV_NAME

就会自动切换到 CUDA 12.1

当你退出环境:

conda deactivate

就会恢复回系统默认的 CUDA 配置。

效果:

  • 进入 Conda 环境 → 自动切换到你设定的 CUDA
  • 退出 Conda 环境 → 自动恢复默认

再也不用每次手动切了。

✅ 为什么不用 conda-cuda?

  • conda 安装的 CUDA Toolkit 只能用在当前环境内,而有些驱动相关功能、NVIDIA-smi、系统级 CUDA 库,还是依赖于 /usr/local/cuda 和动态库路径
  • 我的项目很多要用 aptrunfile 安装的 CUDA,这种方式 conda-cuda 管不到

所以这种软链接+环境变量切换方案更灵活。


如果你有类似需求,或者正被多版本 CUDA 环境管理折磨,不妨试试这个脚本。代码开源在我的 GitHub 👉 switch-cuda

欢迎 Star 和交流!