Ubuntu 20.04 多版本CUDA环境搭建与动态切换实战
1. 为什么需要多版本CUDA环境在深度学习开发中不同框架对CUDA版本的要求经常让人头疼。比如PyTorch 1.8可能要求CUDA 11.1而TensorFlow 2.6需要CUDA 11.2。我去年接手一个项目时就遇到过这种情况——团队成员的开发环境五花八门有人用最新版框架跑不动旧模型有人用老版本打不开新训练的权重。最崩溃的是在服务器上反复重装CUDA不仅浪费时间还经常把环境搞崩。多版本共存的核心原理其实很简单每个CUDA Toolkit都安装在独立目录如/usr/local/cuda-11.3通过环境变量控制当前生效的版本。这就像在手机上安装多个微信版本通过快捷方式切换使用哪个。实测发现只要驱动版本兼容建议保持最新同一台机器上可以同时存在CUDA 9.0到12.x的任意组合。2. 安装前的准备工作2.1 检查现有环境首先用这几个命令看看当前状态nvidia-smi # 查看驱动版本 nvcc -V # 查看当前CUDA版本如果已安装 ls /usr/local | grep cuda # 查看已安装的CUDA版本重点注意驱动版本必须支持所有计划安装的CUDA版本。比如NVIDIA 470驱动支持CUDA 11.0-11.4而510驱动支持11.5-11.7。我在公司服务器上就踩过坑——装了CUDA 11.6才发现驱动太旧又得重装驱动。2.2 安装依赖项这些基础包一定要先装好sudo apt update sudo apt install -y build-essential gcc-multilib dkms linux-headers-$(uname -r)特别提醒如果之前装过CUDA建议先清理旧版本sudo apt purge nvidia-cuda* sudo rm -rf /usr/local/cuda*3. 多版本CUDA安装实战3.1 下载指定版本CUDA以CUDA 11.3为例从官网获取runfile安装包wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run chmod x cuda_11.3.0_465.19.01_linux.run关键技巧使用runfile而不是deb包可以更灵活控制安装路径。我对比过两种方式runfile在管理多版本时明显更干净。3.2 交互式安装配置执行安装时务必注意这些选项sudo ./cuda_11.3.0_465.19.01_linux.run按q跳过协议输入accept也行取消勾选Driver已有驱动时必选进入Toolkit Options修改Install Path为/usr/local/cuda-11.3/取消所有子组件如Samples、Nsight安装完成后会看到类似输出Driver: Not Selected Toolkit: Installed in /usr/local/cuda-11.3/ Samples: Not Selected3.3 验证安装检查是否安装成功/usr/local/cuda-11.3/bin/nvcc -V应该显示对应版本信息。如果报错通常是路径问题可以尝试export LD_LIBRARY_PATH/usr/local/cuda-11.3/lib64 export PATH$PATH:/usr/local/cuda-11.3/bin4. 动态切换的终极方案4.1 手动切换原理最简单的切换方式就是修改环境变量export PATH/usr/local/cuda-11.3/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH但每次都要敲命令太麻烦还容易出错。我在团队内部做过调查90%的环境问题都是手动改变量导致的。4.2 自动化切换脚本推荐使用这个经过实战检验的脚本保存为/usr/local/bin/switch-cuda#!/bin/bash versions($(ls /usr/local | grep cuda-[0-9])) if [[ $# -eq 0 ]]; then echo 可用CUDA版本: for v in ${versions[]}; do echo ${v#cuda-} done return fi selected/usr/local/cuda-$1 if [[ ! -d $selected ]]; then echo 错误$selected 不存在 return 1 fi # 清理旧路径 export PATH$(echo $PATH | tr : \n | grep -v /usr/local/cuda- | tr \n :) export LD_LIBRARY_PATH$(echo $LD_LIBRARY_PATH | tr : \n | grep -v /usr/local/cuda- | tr \n :) # 添加新路径 export PATH$selected/bin:$PATH export LD_LIBRARY_PATH$selected/lib64:$LD_LIBRARY_PATH echo 已切换到 CUDA $1使用方法source /usr/local/bin/switch-cuda # 查看可用版本 source /usr/local/bin/switch-cuda 11.3 # 切换到11.34.3 持久化配置建议为了让终端自动记住设置可以在~/.bashrc添加alias cuda-switchsource /usr/local/bin/switch-cuda # 默认使用某个版本 source /usr/local/bin/switch-cuda 11.35. 常见问题排查问题1nvidia-smi显示的CUDA版本与nvcc -V不一致这是正常现象nvidia-smi显示的是驱动支持的最高CUDA版本而nvcc -V才是当前使用的工具链版本。就像JDK和JRE的关系两者可以不同。问题2切换后PyTorch仍报错可能需要重建虚拟环境conda create -n py38 python3.8 conda install pytorch torchvision cudatoolkit11.3 -c pytorch问题3libcudart.so找不到检查环境变量是否生效echo $LD_LIBRARY_PATH ldconfig -p | grep cudart如果还不行试试重建符号链接sudo ln -sf /usr/local/cuda-11.3/lib64/libcudart.so /usr/lib/