多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Windows彻底卸载CUDA指南:组件拆解、残留清理与多版本共存

Windows彻底卸载CUDA指南:组件拆解、残留清理与多版本共存 如果你在Windows上装过CUDA多半有过这种经历明明只是手贱想试试新版本特性结果新版没装成旧版也被折腾得七零八落或者因为环境变量被搞乱了想彻底推倒重来。但每次卸载CUDA都像在拆一个和你扯不清关系的合租室友——表面看着人是走了抽屉里、衣柜里、注册表里全是他的东西甚至你都不知道他什么时候在你家里塞了个DriverStore。这篇就聊聊Windows下卸载CUDA这件事从组件拆解、标准卸载流程到残留清理、多版本共存和WSL2特殊场景全给你捋一遍。适合正在排雷的、准备换版本的、以及看到“已安装的应用”里那一排NVIDIA条目就头疼的人。1. 先搞清楚CUDA在Windows上到底装了什么才谈得上卸载很多人卸载不干净根源在于“CUDA”这三个字被用得太笼统了。它从来不是一个独立的单一大软件而是一堆组件的合称。你在NVIDIA官网下载的那个安装包点开之后里面装了至少四类东西各有各的位置各有各的去处。1.1 你看到的“CUDA”其实至少是四套东西第一套是显卡驱动Driver。这是最底层的一块负责让操作系统和GPU通信包含内核模式驱动、用户态驱动等。装好之后任务管理器里的显卡会显示正确型号nvidia-smi命令能用。很多人不知道的是驱动里其实带了一个“CUDA运行时接口”也就是nvcuda.dll这样的动态库。所以哪怕你完全没装过CUDA Toolkit只要装了NVIDIA驱动某些依赖CUDA运行时的程序跑起来也毫无压力。第二套是CUDA Toolkit这才是我们通常在说的“CUDA”。它包含nvcc编译器、cudart运行时库、cublas、cufft这些数学库还有include头文件和一堆开发工具。我们平时说“卸载CUDA”百分之九十指的都是把Toolkit卸掉因为它最占地儿、最影响开发环境也是各种环境变量冲突的源头。第三套是配套工具和扩展。比如NVIDIA Nsight Compute、Nsight Systems这些性能剖分工具以及Visual Studio集成插件。这些不是CUDA编译的核心但安装器会默认勾选卸载的时候如果漏掉它们Visual Studio的项目属性里可能还会残留“NVIDIA CUDA”的构建自定义项点开就报错。第四套是各种服务与后台进程。像NVIDIA Display Container LS、NVIDIA LocalSystem Container这些由驱动安装器管理不属于Toolkit卸载CUDA时不要碰它们否则会动到驱动的根基。1.2 驱动、工具包、Nsight、VS集成的区别关系表我把常见的NVIDIA相关条目和“到底要不要卸载”列个表你在动手前先对号入座一下“已安装的应用”里的条目是什么卸载CUDA Toolkit时需要处理吗NVIDIA Graphics Driver显卡驱动看情况只想卸Toolkit则保留NVIDIA CUDA Toolkit版本号编译器、库、头文件是NVIDIA CUDA Runtime版本号运行时动态库是NVIDIA Nsight Compute / Systems性能分析工具建议一起卸避免残留NVIDIA Visual Studio IntegrationVS插件与构建自定义项建议先卸NVIDIA GeForce Experience游戏面板和驱动更新工具与CUDA无关可不管NVIDIA Frameview SDK / PhysX等游戏相关组件与CUDA无关可不管记住一个原则你卸载CUDA Toolkit目标是“开发环境”不是“显卡驱动”。除非你确定连驱动也要重装否则那些带“Graphics Driver”字样的条目千万别顺手点掉。1.3 环境变量和注册表才是真正的“钉子户”Toolkit装好之后安装器会在系统层面写一堆东西环境变量CUDA_PATH、CUDA_PATH_V11_8之类的版本变量PATH里额外追加的bin和lib\x64路径注册表里记录各组件状态C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\目录下的整套文件还有C:\ProgramData\NVIDIA Corporation\下的下载缓存和日志。这些才是“卸载不干净”的元凶。官方的卸载程序其实写得不算差走的也是注册表卸载流程能删掉大部分自建文件和环境变量但它不会管你在PATH里自己拼进去的路径也管不了VS项目里写死的.targets引用。更麻烦的是新版安装器用NSIS打包卸载时经常在“已安装的应用”里留下一堆半死不活的条目点卸载没反应目录里却还剩一堆文件。这就是为什么网上怨声载道。2. 卸载前先回答三个问题留驱动吗换版本吗有项目正在跑吗很多人拿到这个标题第一反应是打开“已安装的应用”一通点卸载结果点到一半发现深度学习项目跑不了了或者驱动被搞崩了然后来求助说“我什么都没动”。所以正式动手前先做几分钟准备绝对不亏。2.1 先做清单查版本、查设备、查占用打开命令提示符或PowerShell依次敲三个命令# 查看当前的CUDA Toolkit版本 nvcc --version # 查看驱动版本和驱动支持的CUDA版本上限 nvidia-smi # 查看PATH里能搜到的nvcc路径判断是否存在多个版本 where nvccnvcc --version显示的是你PATH里实际生效的Toolkit版本nvidia-smi右上角显示的“CUDA Version”则是“当前驱动最多支持到哪个CUDA运行时版本”这两个数字经常不一样不要混为一谈。然后打开任务管理器切到“性能”标签页看看GPU有没有被占用或者用nvidia-smi查看有没有进程正在显存上跑东西。这一步的价值在于如果你正开着PyTorch训练任务、正在跑本地大模型推理或者某台服务器正依赖本机GPU做计算卸载Toolkit很可能让正在编译的程序直接崩掉。稳妥起见先把相关进程停掉。2.2 决定卸载顺序工具包和驱动谁先谁后这仨问题里最核心的是驱动去留。我按场景拆一下只卸Toolkit驱动保留最常见适合“我想从CUDA 11.8换成12.4”或者“环境变量乱了重装Toolkit”。顺序是先卸VS集成、Nsight再卸Toolkit和Runtime驱动全程不用碰。驱动也要重装比如显卡驱动经常报“驱动已停止响应”打算彻底重装驱动。这时候可以考虑用DDUDisplay Driver Uninstaller进安全模式清驱动之后顺手把Toolkit也卸掉。只卸驱动保留Toolkit基本不存在这种需求驱动都没了Toolkit也没法跑。另外还有一类特殊场景你只是想“换”版本并不想彻底清空系统。这时候建议把新旧版本的需求对比一下比如你要的PyTorch版本只支持CUDA 11.8以下那么新装的12.x就多余。脑子里有个明确的卸载目标后面才不会误伤。2.3 给环境变量和注册表留个底卸载毕竟是有破坏性的操作虽然目标是“清干净”但万一手滑了呢。我习惯在动手前先注册表导出一份、环境变量截图一份。# 导出当前用户和全局环境变量备份PowerShell管理员执行 reg export HKCU\Environment 环境变量备份.reg /y reg export HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 系统环境变量备份.reg /y也可以创建一个系统还原点。控制面板里搜“创建还原点”C盘开一下系统保护建个还原点。出问题直接回滚比自己抠注册表快得多。这一步我每次都会做因为Windows的卸载流程在某些情况下真的会给你“惊喜”。3. 官方卸载流程一个条目一个条目地拆别图省事准备工作做完进入正题。官方卸载流程听起来没技术含量但执行细节里全是坑。3.1 Windows设置里的NVIDIA全家桶怎么识别Win10/Win11下打开“设置 → 应用 → 已安装的应用”搜索“NVIDIA”你会看到一长串东西。这里面真正和CUDA Toolkit强相关的是NVIDIA CUDA Toolkit 12.4或你装的版本NVIDIA CUDA Runtime 12.4NVIDIA Nsight Compute 2024.xNVIDIA Nsight Systems 2024.xNVIDIA Visual Studio Tools或者叫NVIDIA Integration有些老版本还会显示NVIDIA CUDA Documentation、NVIDIA CUDA Samples之类的子组件。这些都是要卸的。如果系统里装过多个Toolkit版本它们会各自显示一个条目版本号不同需要逐个处理。要注意新版Windows的“已安装的应用”列表里很多NVIDIA条目长得差不多尤其是“NVIDIA Graphics Driver”和“NVIDIA CUDA Toolkit”别手滑。我的习惯是先截图存证再用UWP风格的设置项或者干脆去老牌的控制面板“程序和功能”里看反而更容易分辨。3.2 正确的卸载顺序和操作细节卸载顺序上我推荐“先外围后核心”先卸Visual Studio集成相关条目。因为它会修改VS的项目模板文件如果Toolkit先被删了这些插件会变成孤儿。再卸Nsight Compute、Nsight Systems这些独立工具。再卸CUDA Toolkit主体。最后卸CUDA Runtime。为什么要强调顺序因为NSIS安装器在卸载时会尝试清理它自己写入的文件但你从外围拆起可以减少卸载过程中的连锁错误。比如你先卸Runtime再卸Toolkit部分老版本安装器可能会因为找不到依赖项而拒绝继续卸载虽然不常见但没必要赌。点击“卸载”后很多版本的安装器会弹出一个命令行窗口黑屏滚动这是NSIS在做文件删除和环境变量恢复属于正常现象不要看到黑窗口就强制关掉等它跑完。卸载过程中如果弹出需要管理员权限的UAC正常点是不进安全模式的话这就是标准路径。3.3 什么时候才需要DDU它卸的是驱动不是CUDA很多人把DDUDisplay Driver Uninstaller和CUDA卸载混在一起其实它们是两码事。DDU是用来卸载显卡驱动的一款第三方工具在国内硬件圈里几乎是驱动卸载的标准答案但它的职责范围只有显卡驱动并不认识nvcc编译器也不会去清理Toolkit的目录。DDU的意义在于如果你已经决定连驱动一起重装或者驱动半残不残导致nvidia-smi都跑不出来就可以下载DDU进安全模式选择“清除NVIDIA显卡驱动并重启”。这样能最大程度避免驱动文件残留互相打架。正常的CUDA Toolkit卸载不需要DDU至少我没碰到过必须用DDU才能卸掉Toolkit的情况。如果你看到“卸载CUDA必须用DDU”的说法那多半是把驱动和Toolkit混为一谈了。4. 残留清理才是重头戏环境变量、注册表、DriverStore逐个过官方卸载程序跑完之后系统离“干净”还有一段距离。真正决定你卸载成败的恰恰是接下来的手动检查。4.1 环境变量里的CUDA_PATH与PATH痕迹先检查环境变量。按Win R输入sysdm.cpl切到“高级→环境变量”重点看两个地方系统变量里的CUDA_PATH和CUDA_PATH_V*系列变量以及Path里是否还有C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vXX.X\bin、...\lib\x64这类条目。正常卸载后安装器应该会移除它自己加的这些项但“应该”不等于“一定”。尤其是你手动往PATH里加过bin目录去支持某个老项目的卸载程序根本不知道那是它家的只会留着。操作上凡是CUDA_PATH开头的系统变量只要指向的版本目录已经被卸载就一并删掉。Path里和NVIDIA GPU Computing Toolkit相关的路径也全部删除。删除前把内容复制到记事本里保存一份确认清楚再动手。有一个小细节环境变量的修改在已经打开的终端里不会即时生效nvcc --version可能还是能跑到旧路径。改完之后必须新开一个cmd窗口重新测试。4.2 注册表里值得删和千万别随便删的项目注册表这块我建议“只删确定是CUDA Toolkikit的其他一概不动”。打开regedit重点翻这几个位置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall——这里存着“已安装的应用”列表搜索键名或DisplayName里带“NVIDIA CUDA”的项对应版本已经卸载的可以直接删。HKEY_CURRENT_USER\Environment——用户级环境变量如果里面混进了CUDA路径也可以清理。HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation\Installer2——这里是NVIDIA安装器的状态记录里面会有关于CUDA组件的InstallState信息一般不用手动改。我最想强调的是注册表里同时还有很多“NVIDIA”开头的项例如NVIDIA Corporation\Global、NVSvc、DriverStore相关的键这些属于显卡驱动和游戏组件和CUDA Toolkit没关系。删除它们不会让你的CUDA更干净反而可能把显卡驱动搞坏。如果你不确定当前注册表项对应的是什么右键“导出”保存之后去HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall里看这个键有没有DisplayName字段字段内容是“NVIDIA CUDA Toolkit”才动手。4.3 DriverStore、System32、ProgramData里的幸存者文件层面的残留主要在三个地方第一是C盘根目录下的C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\如果卸载失败这里会剩一个或多个v11.8、v12.4之类的版本目录里面文件还一应俱全。我通常直接整个删除因为是纯用户态文件不涉及签名和系统保护。第二是C:\ProgramData\NVIDIA Corporation\目录里面有一些Downloader、NVIDIA InstallLog之类的缓存和日志文件。这些不属于Toolkit本体删了也不影响驱动但如果洁癖发作也可以清掉。个人建议先留着因为如果后续安装新版本时下载器需要断点续传缓存还有用。第三是驱动文件区也就是C:\Windows\System32\DriverStore\FileRepository下面以nv*.inf开头的文件夹。这块要特别提醒不要手动删。DriverStore由Windows组件服务管理手动删一个正在使用的驱动轻则签名验证报错重则下次开机驱动起不来。如果你需要清理驱动请用pnputil或者在设备管理器里卸载设备工具包本身的残留不会出现在DriverStore里。另外C:\Windows\System32下可能残留一些cudart64_*.dll、nvrtc64_*.dll。注意官方Toolkit安装时并不会主动把这些DLL塞进System32它们大多是某些第三方软件或安装脚本自己拷贝进去的“运行时依赖”。如果你确定某个DLL版本对应的CUDA已经删除且没有任何软件在依赖它可以删除但我不建议无差别清空System32里的所有NVIDIA DLL以免误删驱动在用的nvcuda.dll。5. 特殊场景多版本共存、WSL2、卸载失败时怎么办普通情况用上面的流程足够但实际生活里总会冒出几个特殊场景我单独拿出来讲。5.1 多版本CUDA怎么只删其中一个而不破坏另一个因为PyTorch、TensorFlow各版本支持的CUDA版本不一样很多人机器上同时装着CUDA 11.8和12.4靠环境变量CUDA_PATH切换默认版本。这时候卸载要格外小心。假设你要删11.8保留12.4先把系统环境变量里的CUDA_PATH改成指向C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4确保默认nvcc转移到保留版本。再把Path里所有指向v11.8\bin的条目删掉只留v12.4的。不然新版cmd里运行nvcc --version还是会跑到旧版本去。检查CUDA_PATH_V11_8这个变量是否还在在的话删掉。最后再去“已安装的应用”里卸载11.8对应的Toolkit条目。如果顺序反了先卸载再改变量卸载程序删掉11.8目录后Path里指向11.8的残留路径就会变成死链后续装新版本时可能被误判成“还有旧版本”源码编译时也可能找到一堆不存在的路径。5.2 WSL2里的CUDA和Windows侧不是一回事WSL2里装CUDA的人越来越多这里有个高频误区WSL2里看到的nvcc --version和Windows侧的CUDA是完全独立的两套东西。WSL2里跑CUDA程序时真正干活的是Windows侧的GPU驱动但编译器、运行时、库这些用户态组件是装在WSL2文件系统里的Windows的“已安装的应用”里根本看不到它们。所以你在Windows侧把CUDA Toolkit卸载得再干净WSL2终端里输入nvcc --version照样有输出。反过来想清WSL2里的CUDA得在WSL2里卸载# 如果是runfile方式安装的 /usr/local/cuda/bin/nvcc --version sudo /usr/local/cuda/bin/uninstall_cuda_xxx.pl # 如果是apt方式安装的 dpkg -l | grep cuda sudo apt purge cuda-*另外如果在Windows侧把显卡驱动卸载干净了WSL2里的CUDA即使没卸载GPU计算也会失效因为底层的GPU透传依赖Windows驱动。这种情况属于驱动卸载的连带后果不是CUDA工具包能被“清干净”的证明。5.3 卸载程序半路失败/列表残留的处理思路“已安装的应用”里有一个“NVIDIA CUDA Toolkit”点卸载之后窗口一闪而过什么都没发生这是NSIS版本的经典毛病。处理思路别想着硬钢绕过去就行。先看卸载程序本体是否还在。大部分NSIS安装器会把自己放在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vXX.X\bin\下对应版本的uninstall.exe还在的话可以用管理员终端手动执行。如果连这个文件也被删了那就只能手动删目录、清环境变量、再删注册表卸载项。删注册表卸载项是为了让“已安装的应用”里的条目消失不然它一直卡在列表里。还有一个笨但有效的办法重新运行同一个版本CUDA的安装包选择“修复”或“卸载”。NVIDIA的安装器把状态写在InstallLog里有时候你右键卸载没反应重新跑一遍安装器反而能唤醒之前的卸载流程。别觉得绕很多时候最朴素的路径最可靠。6. 卸载后如何验证别把驱动支持的版本当成残留卸载完成不等于万事大吉验证这一步能帮你确认是不是真的干净了也能帮你避免把“正常情况”误判成“残留”。6.1 命令检查nvcc、nvidia-smi、where的解读打开一个新的cmd窗口跑这几条# nvcc应该不存在了 nvcc --version # 确切查看PATH下还有没有nvcc where nvcc # 驱动仍在且右上角仍然显示CUDA Version: 12.X nvidia-smi如果nvcc --version提示“不是内部或外部命令”而where nvcc什么也查不到说明Toolkit主程序卸干净了。nvidia-smi有输出说明驱动完好右上角显示的CUDA版本是驱动支持的版本号不是“你系统里装了CUDA”的证明这点后面还会细说。6.2 环境变量、文件夹、应用列表的最终确认依次检查命令echo %CUDA_PATH%输出空echo %CUDA_PATH_V12_4%如果有残留变量也是空资源管理器里打开C:\Program Files\NVIDIA GPU Computing Toolkit目录不存在或者内部没有版本文件夹再回“已安装的应用”搜NVIDIACUDA Toolkit、Nsight相关条目全部消失。这个流程走完基本可以宣告卸载成功。如果你的Visual Studio里原来配置过CUDA项目还可以顺手打开一个旧项目的属性页看看有没有报错说找不到CudaToolkit.targets。如果之前卸过VS集成这里可能会看到残留的引用一般在“属性管理器”里删掉对应的.props导入项就行。6.3 一个很常见的误区nvidia-smi里的CUDA Version不等于已装CUDA很多人在论坛上问“我明明卸载了CUDA为什么nvidia-smi还显示CUDA Version: 12.4”注意这一行是驱动程序报告的“当前驱动支持的最高CUDA版本”意思是“如果你的程序是12.4版运行时这个驱动带得动”。它和你系统里有没有装CUDA Toolkit是两条完全不同的线。哪怕你这台机器从没装过任何CUDA开发工具只要装了NVIDIA驱动nvidia-smi也会有这么一行。我还有一个容易踩的坑要提醒卸载Toolkit后如果你装了PyTorch官方版torch.cuda.is_available()很可能依然是True。因为PyTorch本身捆绑了CUDA运行时不需要你系统里另外装Toolkit。看到返回True就以为“没卸干净”的人不在少数。这不算残留只是这些程序自带运行时跟系统级CUDA是两码事。我个人现在的习惯是每次卸载前先截一张“已安装的应用”里所有NVIDIA条目的图再导出一份环境变量然后按“先外围、后核心”的顺序一个个拆拆完用where nvcc加echo %CUDA_PATH%做收尾。真出问题也能对着自己的备份回滚。Windows上折腾CUDA版本这事其实最怕的不是卸载而是卸载得不彻底之后带来的“薛定谔的nvcc”——有些程序能跑有些找不到库报错全靠猜。所以耐心点按步骤来比什么都强。
返回列表