ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CUDA卸载与重装实战指南:从环境清理到多版本共存

CUDA卸载与重装实战指南:从环境清理到多版本共存 CUDA 卸载与重装实战从踩坑到干净利落的一条龙记录做深度学习或者 GPU 计算的开发者大概率都经历过这种时刻项目代码跑起来突然报错CUDA driver version is insufficient或者安装一个新框架时发现它要求的 CUDA 版本和你机器上的完全对不上。这时候最让人头疼的不是写代码而是怎么把这个庞大的 CUDA 工具链安全地卸载掉、再装上一个合适的版本。尤其是 CUDA 这种“装起来容易卸起来难”的软件卸载不干净就会留下各种后患。本文我就把自己反复折腾 CUDA 卸载重装的完整过程、踩过的坑、以及最终沉淀下来的一套可靠流程整理出来希望能帮你少走弯路。这篇文章适合谁看如果你需要在 Linux 服务器或 Windows 工作机上更换 CUDA 版本、修复损坏的 CUDA 环境、或者想搞清楚多版本 CUDA 到底怎么共存切换那么这篇内容就是为你准备的。1. 先搞清楚CUDA 到底包含什么为什么卸载这么费劲1.1 拆解 CUDA 工具链的组成部分很多人以为 CUDA 就是一个单一的软件包其实不是。一个完整可用的 CUDA 环境由好几层组成理解这一点是成功卸载的前提。第一层是NVIDIA 显卡驱动Driver。它负责操作系统和 GPU 硬件之间的通信同时也是 CUDA 运行时能调用 GPU 的基础。驱动本身自带的 CUDA Driver API 版本决定了你机器能够支持的最高 CUDA 版本。第二层是CUDA Toolkit就是我们常说的“装 CUDA”时下载的那个几个 GB 的安装包。它里面包含编译器nvcc、CUDA 运行时库libcudart、各种数学库cuBLAS、cuFFT、cuDNN 等、头文件以及开发者工具。不同版本的 Toolkit 对应不同的 CUDA 版本号比如 CUDA 11.8、CUDA 12.1 就是指这一层。第三层是深度学习框架或自定义代码比如 PyTorch、TensorFlow它们会依赖特定的 CUDA 运行时版本但通常不是你自己手动装的而是跟框架一起带进来的比如 PyTorch 的 pip 包自带 CUDA 运行时。搞清楚这三层的区别后你就会明白为什么“卸载 CUDA”这件事经常让人困惑——你到底是想卸驱动、卸 Toolkit还是想把环境变量和残留文件清理干净不同目标对应完全不同的操作。我在实操中总结的经验是绝大多数情况下我们需要的只是重新安装 CUDA Toolkit驱动一般不用动除非驱动版本太低导致新版本 Toolkit 根本装不上。1.2 什么情况下你才真的需要卸载重装我见过不少朋友一遇到 CUDA 版本问题就慌下意识想全卸了重来。其实真的没必要先判断一下你是属于下面哪种情况情况一版本冲突需要更换 CUDA 版本。比如你之前装了 CUDA 11.8现在 PyTorch 新版本要求 CUDA 12.1。这时候只需要安装 12.1 的 Toolkit并在环境变量里切换路径即可旧版可以留着完全不冲突。情况二CUDA 安装损坏或残留导致环境异常。比如.run文件安装失败、PATH 环境变量混乱、nvcc -V明明显示有版本但运行程序就是不认。这种时候才需要动手卸载并清理残留。情况三驱动版本太旧需要升级驱动后才能安装更高版本的 CUDA Toolkit。比如你的驱动是 470 系列最高支持 CUDA 11.4但你需要装 CUDA 12.x。这时候不是卸载 CUDA而是升级驱动。判断清楚了再动手就能避免很多无意义的折腾。2. 卸载全流程实录为什么网上很多教程都不靠谱2.1 Linux 系统下 CUDA 卸载的两种情况与正确操作在 Linux 上卸载 CUDA首先要分清楚你当初是怎么装的用的.run安装包还是 deb 包。这和卸载方式直接挂钩。如果你用的是 deb 包安装的那么卸载就相对正规通过包管理器就能处理。我在 Ubuntu 20.04 系统上实测的完整命令是这样# 查看已安装的 cuda 相关包 dpkg -l | grep cuda # 卸载所有 cuda 相关软件包 sudo apt --purge remove *cuda* *cublas* *cufft* *cudnn* *cusolver* *cusparse* *npp* *nvjpeg* nsight* # 清理依赖和缓存 sudo apt autoremove sudo apt autoclean如果你用的是 .run 文件安装的那卸载方式就完全不同了。.run安装器自带卸载脚本存放在/usr/local/cuda/bin/目录下# 卸载 CUDA Toolkit sudo /usr/local/cuda/bin/cuda-uninstaller # 如果还需要卸载 NVIDIA 驱动执行谨慎 sudo /usr/bin/nvidia-uninstall这里有个大坑要专门提醒很多网上教程会直接教人rm -rf /usr/local/cuda*这其实是非常危险的做法。直接删除安装目录确实“看起来”卸载干净了但包管理器里记录的软件信息、动态链接库的注册信息、以及 systemd 相关的配置都会变成孤儿残留。你之前环境变量里写的是/usr/local/cuda/bin一旦这个目录被删除shell 启动时会报各种找不到路径的警告某些编译程序也会因为找不到.so文件而失败。正确的卸载顺序一定是先跑官方卸载脚本再处理残留目录。2.2 Windows 系统下 CUDA 卸载的几个隐藏步骤Windows 上的 CUDA 卸载比 Linux 要繁琐几条街。它不像普通软件那样“添加或删除程序”里删一下就完事因为 Windows 下 CUDA 的组件会分散在很多地方。我先后在 Windows 10 和 Windows 11 上重装过 CUDA整理出了一套靠谱的步骤第一步在“设置—应用”里卸载所有 NVIDIA 相关的组件。注意不是只卸载 “NVIDIA CUDA Toolkit” 这一个而是要把列表里所有带 NVIDIA 前缀的软件都卸载掉顺序有讲究先卸 CUDA Toolkit、CUDA Documentation、NVIDIA PhysX、NVIDIA 图形驱动最后是 NVIDIA GeForce Experience 这类管理软件。第二步删除残留的安装目录。默认安装在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\卸载完成后这个目录往往还会残留直接手动删除。另外C:\Program Files\NVIDIA Corporation目录下也可能有残留的 CUDA 相关子目录同样处理掉。第三步清理环境变量。这一步经常被忽略但恰恰是最影响后续使用的。右键“此电脑 — 属性 — 高级系统设置 — 环境变量”在系统变量中检查PATH变量把指向 CUDA 的条目如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin、...\libnvvp等全部删除。第四步清理注册表。Windows 下的 CUDA 会在注册表里写大量条目不清理的话之后重装可能会遇到奇奇怪怪的问题。按下Win R输入regedit打开注册表编辑器导航到下面几个路径删除 NVIDIA 和 CUDA 相关的项HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation\CUDA HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\NVIDIA Corporation提示修改注册表有风险操作前建议先导出备份。如果你不愿意动注册表至少把前三个步骤做到位大多数情况下也够用了。2.3 清理环境变量和残留文件的完整思路无论是 Linux 还是 Windows卸载 CUDA 后环境变量清理是确保“装新版后不混乱”的关键。Linux 下需要检查的文件有三个~/.bashrc、~/.profile、/etc/profile.d/下可能的 CUDA 脚本。用grep -n cuda ~/.bashrc这样的命令查一下现有配置然后把对应的export PATH...和export LD_LIBRARY_PATH...行前面加上#注释掉或者直接删除。还有个很多人会漏掉的地方是动态链接库缓存。Linux 下 CUDA 安装时会把自己的库目录写入/etc/ld.so.conf或/etc/ld.so.conf.d/下卸载后必须把对应的条目清掉然后执行sudo ldconfig这样系统才能刷新动态链接库缓存否则你之后装新 CUDA 时系统可能还会读到旧的库路径导致版本错乱。3. 重装的完整动作版本选择、获取安装包与安装方式3.1 版本选择不要无脑装最新版先确认你的驱动和框架兼容性重装 CUDA 之前最重要的一件事不是下载最新版本而是搞清楚你到底需要哪个版本。这一步决定了你后面所有操作的成败。首先看你的显卡驱动支持什么版本的 CUDA。在终端执行nvidia-smi输出右上角会显示 “CUDA Version: xx.x”这个数字表示你当前驱动能够支持的最高 CUDA 版本并不是你已经安装的 CUDA Toolkit 版本。很多新手会在这个地方混淆nvidia-smi显示的是驱动能力上限即使你还没装任何 CUDA Toolkit 它也会显示一个版本号。其次看你要用的深度学习框架要求什么 CUDA 版本。以 PyTorch 为例官方安装命令里通常写着cu118、cu121这样的标签表示对应的 CUDA 版本是 11.8、12.1。装 CUDA Toolkit 时应该和框架对齐而不是和驱动对齐。驱动版本只要高于框架要求的版本就行。最后在 NVIDIA 官网下载对应版本时注意CUDA Toolkit 的下载页面会有 “Version” 下拉框里面有时会提供 “Older versions” 链接可以找到历史版本。这里有个小技巧在 Linux 上下载时选择runfile (local)安装方式因为它是脱离包管理器的最灵活方案方便后续卸载和切换在 Windows 上选择exe (local)这样安装包会下载到本地再安装而不是在线拉取稳定性更高。3.2 Linux 下 runfile 安装完整过程倒着拆解因为 runfile 方式最常用也最可控我以 Ubuntu 20.04、安装 CUDA 11.8 为例把安装过程完整走一遍。先给安装包赋予执行权限然后运行chmod x cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run运行后会出现一个交互式界面按空格键跳过“用户许可协议”然后进入组件选择界面。这里有第一个关键选择不要勾选 “Driver” 选项除非你确定需要升级驱动。如果勾选了 Driver安装器可能会覆盖你现有的驱动且一旦和已存在的显卡驱动冲突重启后可能出现图形界面进不去的情况。安装完成后需要配置环境变量。在~/.bashrc文件末尾添加export PATH/usr/local/cuda-11.8/bin${PATH::${PATH}} export LD_LIBRARY_PATH/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}}然后执行source ~/.bashrc使配置生效。安装完成后要确认三个东西nvcc -V看编译器版本/usr/local/cuda软链接是否正确指向/usr/local/cuda-11.8以及用一个小程序测试 nvcc 能否正常编译。在很多 Linux 发行版上还需要安装gcc和g的特定版本因为不同 CUDA 版本对编译器的兼容范围不一样比如 CUDA 11.x 在 Ubuntu 20.04 上适配 gcc 9而 CUDA 12.x 对 gcc 版本的要求会更灵活。3.3 Windows 下安装的注意事项和 Visual Studio 集成问题Windows 下重装 CUDA Toolkit 时最容易翻车的点是Visual Studio 集成。很多人在安装时就见过这个报错“CUDA Visual Studio Integration not supported by this version of Visual Studio”。这个问题的本质在于你本机的 VS 版本超出了当前 CUDA 版本官方支持的列表范围。比如 CUDA 11.8 官方支持 VS 2019 和部分 VS 2022 的早期版本如果你装的是 VS 2022 17.8 以上的版本就可能不被识别。网上能找到的临时解法是修改注册表里 VS 版本相关的内容让 CUDA 安装器“误以为”你的 VS 是支持版本但这个方法在新版 CUDA 上经常失效。我更推荐的做法是安装 CUDA 时在组件选择界面直接取消勾选 “Visual Studio Integration”。相信我你实际开发中几乎用不到这个集成功能——它只是在 VS 里加了一些构建自定义规则让你可以在 MSBuild 中用 CUDA 编译.cu文件但你完全可以通过 CMake 来管理 CUDA 代码效果更好且不依赖 VS 版本。另外Windows 下安装完成后nvidia-smi 同样可以用来验证驱动验证 Toolkit 则是在命令行执行nvcc -V set | findstr CUDA检查环境变量是否正确注入。你会发现新版本 CUDA 的 Windows 安装器通常会自动把路径写入 PATH不用像 Linux 那样手动配置但如果装了多个版本环境变量设定的版本可能不是你想要的需要手动调整 PATH 顺序。3.4 多版本共存与软链接切换这才是终极自由其实真正的实操高手不会频繁卸载重装 CUDA而是让多个版本共存需要哪个切哪个。Linux 下只要空间充足完全可以同时装 CUDA 11.8 和 CUDA 12.1然后通过软链接切换。安装时不用动/usr/local/cuda这个默认软链接安装器会自动创建指向当前版本的链接。手动切换的姿势如下# 查看当前软链接指向 ls -l /usr/local/cuda # 切换到其他版本 sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-12.1 /usr/local/cuda配合.bashrc里写好的PATH和LD_LIBRARY_PATH切换后nvcc -V就会显示对应版本。Windows 下也可以用类似思路安装不同版本后通过修改 PATH 环境变量里 CUDA 路径的排序来控制默认版本。排序在前的路径会优先被找到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin在这个例子中系统默认调用的是 CUDA 12.1。这个方法解决了绝大多数版本冲突问题性能利用率基本没有差别。3.5 WSL2 环境下装 CUDA 的特殊姿势现在很多人喜欢用 WSL2 跑深度学习因为它不用双系统就能在 Windows 下用 Linux 环境。但 WSL2 里装 CUDA 和原生 Linux 有一点本质区别——WSL2 里不需要也绝对不能安装 NVIDIA 驱动。驱动由 Windows 宿主机提供WSL2 内共享宿主机的驱动程序这恰好是我在《CUDA多版本安装》和《WSL2安装cuda》两个相关项目里反复验证过的经验。在 WSL2 内正确的安装逻辑是在 Windows 宿主机上保证nvidia-smi能正常工作。进入 WSL2执行nvidia-smi验证 GPU 是否可见。在 WSL2 内安装 CUDA Toolkit选择适用于 WSL-Ubuntu 的 deb 包或者直接使用 runfile。配置环境变量。注意WSL2 内安装 CUDA Toolkit 时可以使用sudo apt install cuda-toolkit这种方式因为微软的 WSL 仓库里已经做了兼容。相比原生 UbuntuWSL2 下出现驱动冲突的概率要低很多因为你根本不会去碰驱动层。4. 常见报错速查与排查感悟4.1 卸载重装过程中的高频报错和解决方案我把实际遇到过的、以及大量网友在社区反馈过的典型报错整理成了一张速查表方便你对号入座。报错信息发生场景根本原因解决方案gzip: stdin: invalid compressed>function cuda_switch { sudo rm -f /usr/local/cuda sudo ln -s /usr/local/cuda-$1 /usr/local/cuda }然后执行cuda_switch 12.1或cuda_switch 11.8一切干净利落。5. 从卸载到重装的完整参考流程快速抄作业版如果你现在就想动手不想看前面的长篇分析这个精简版流程可以直接照做。我按照 Linux runfile 安装方式整理这也是我目前最推荐的生产环境方案。卸载阶段# 1. 卸载 CUDA Toolkit sudo /usr/local/cuda/bin/cuda-uninstaller # 2. 如果你确定要清理所有旧版残留 sudo rm -rf /usr/local/cuda-* # 3. 清理环境变量 # 编辑 ~/.bashrc删除所有 cuda 相关路径行 # 4. 更新动态链接库缓存 sudo ldconfig安装阶段# 1. 从 NVIDIA 官网下载对应版本的 runfile 安装包 # 2. 校验文件完整性 sha256sum cuda_*.run # 3. 禁用系统自带的 nouveau 驱动如有 # 编辑 /etc/modprobe.d/blacklist-nouveau.conf 写入 # blacklist nouveau # options nouveau modeset0 # 然后执行 sudo update-initramfs -u # 4. 执行安装注意取消勾选 Driver sudo sh cuda_*.run # 5. 配置环境变量追加到 ~/.bashrc export PATH/usr/local/cuda/bin${PATH::${PATH}} export LD_LIBRARY_PATH/usr/local/cuda/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}} # 6. 刷新并验证 source ~/.bashrc nvcc -VWindows 用户替换成对应的图形界面操作即可核心思路一致先卸干净再装新版最后检查环境和版本不要在一块石头上反复绊倒。实操中的体会其实就一句话CUDA 这东西不可怕但要尊重它的内在规律。卸载时把组件拆清楚、残留清干净重装时把版本选对、安装方式选对后面能省下无数头疼时间。我已经用这套流程在四五台设备上完成过 CUDA 环境重建从最开始的一整天折腾到现在的半小时完事中间积累的每一条经验都来自真实踩坑。希望这份记录也能帮你顺利完成自己的 CUDA 迁移之旅。
返回列表