在 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
,会自动调整PATH
、LD_LIBRARY_PATH
、CUDA_HOME
和CUDA_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.d
和 etc/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
和动态库路径 - 我的项目很多要用
apt
或runfile
安装的 CUDA,这种方式 conda-cuda 管不到
所以这种软链接+环境变量切换方案更灵活。
如果你有类似需求,或者正被多版本 CUDA 环境管理折磨,不妨试试这个脚本。代码开源在我的 GitHub 👉 switch-cuda
欢迎 Star 和交流!