资讯动态

Windows深度学习环境配置:WSL2+CUDA+PyTorch完整攻略

发布时间:2026/10/3 21:05:29 来源:尧图企业网站定制
去年我帮同事配了一台Windows笔记本跑PyTorch对方第一反应是装双系统我劝了半天才改成WSL2 Ubuntu CUDA这条路。结果一个小时不到torch.cuda.is_available()返回True显卡名正常打印模型训练跑起来了Windows那边还能继续干别的活。很多人听到“WSL装CUDA”第一反应是“这不是套娃吗”实际用过之后才会发现这套方案恰恰是当前在Windows上做深度学习性价比最高的路线没有之一。这篇内容不是官方文档的复述而是把我从零到一把WSL里的CUDA环境折腾顺的过程拆开讲为什么选WSL2、哪些install命令会踩坑、驱动和CUDA Toolkit到底是什么关系、多版本CUDA怎么共存、最后怎么接上PyTorch。适合两类人看一类是刚入手Windows笔记本想跑深度学习又不敢动分区表的初学者另一类是被wsl --install卡住、nvcc -V没输出、PyTorch找不到显卡折磨到想砸电脑的“准受害者”。1. 为什么在WSL2里跑CUDA而不是直接装双系统1.1 WSL2的GPU虚拟化与传统双系统的取舍先纠正一个普遍误解WSL2不是一个“装在Windows里的虚拟机软件”它是基于轻量级虚拟化技术打造的一个Linux子系统。因为底层虚拟化方式足够高效Windows 11和较新的Windows 10可以支持WSL2直接访问物理GPU的运算能力CUDA算力基本是“直通”级别不是软件模拟也不是把CUDA调用翻译成DirectML那种间接方案。这就意味着你在Linux环境里可以用上CUDA、cuDNN、TensorRT这些NVIDIA生态原生组件而Windows这边照常上网、打字、用Office。实际测试下来同一个PyTorch模型在纯Ubuntu和WSL2里的训练速度差异一般在3%以内对绝大多数开发任务来说根本感知不到。双系统的劣势恰恰在这里。装完Ubuntu想切回Windows必须重启BIOS里动不动被Windows Boot Manager和GRUB来回折腾遇到驱动不兼容可能直接进不了系统。VMware虚拟机倒是安全但虚机的GPU直通配置麻烦性能损耗也明显。WSL2就踩在两条路的中间保留Windows当日常桌面系统又给你一个几乎原生的Linux命令行环境。1.2 CUDA在WSL2与Windows原生环境的优劣对比有人会问Windows上也能装CUDA Toolkit为什么非要绕到WSL里其实Windows原生CUDA从来没消失过很多生产环境就是直接在Windows跑。但问题在于Windows原生的编译生态、运行时库和很多开源项目对Linux的优化明显更友好不少依赖库在Windows上编译会报一些稀奇古怪的兼容性错误在Ubuntu里一条apt install就完事。进一步讲原生的PyTorch、TensorFlow在Linux下的性能测试得分普遍略高而且大多数深度学习相关的博客教程、GitHub README默认都是Linux命令行。你在WSL2里照着教程敲命令和你在云服务器上操作几乎没区别这对学习成本和排查问题都非常有利。另外WSL2里打开图形界面的程序也可以通过WSLg直接弹出窗口想跑一点带界面的演示程序也没问题。所以我个人的判断很明确如果你工作时我推荐装双系统那不符合使用习惯不如直接上WSL2。1.3 前置条件驱动和系统的关系还有一件事必须先说清楚免得后面踩坑在WSL2里不需要安装Linux版NVIDIA驱动。你只需要在Windows侧装好NVIDIA显卡驱动WSL2会自动把GPU能力透传进子系统。许多教程让你去NVIDIA官网下载Linux的.run驱动在WSL里根本不适用装完反倒坏掉这个点后面我会再展开。所以前置条件非常简洁Windows 10版本19045或Windows 11建议提前更新到最新版本已启用虚拟化功能BIOS里VT-x/AMD-V是开启状态Windows侧NVIDIA驱动版本不要老得离谱2023年后发布的驱动基本都支持WSL2的CUDA透传2. WSL2环境搭建从启用功能到Ubuntu落地2.1 启用Windows功能与wsl --install的坑在Windows 11上安装WSL已经简化成一条命令。以管理员身份打开PowerShell或终端执行wsl --install这条命令会自动启用“适用于Linux的Windows子系统”和“虚拟机平台”两个Windows功能然后下载并安装默认的Ubuntu发行版整个过程理论上一条龙。但我在实际给好几台机器安装时发现它也有装一半卡住的时候。所以更稳妥的做法是分步执行先打开功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart这里有个很容易被忽略的点dism命令执行完必须重启系统否则后续wsl --install时会报各种莫名其妙的状态错误。我见过同事在没重启的状态下强行继续结果安装出来的WSL环境始终处于半残状态最后全卸了重来。重启之后执行wsl --set-default-version 2默认版本号必须锁到2因为WSL1不支持CUDA透传。如果你用的是老版本Windows 10这一步可能会提示需要先安装内核更新包按提示下载安装即可。2.2 Ubuntu镜像选择与安装提速接着安装发行版。最简单的方式是wsl --install -d Ubuntu-22.04或者先看一下有哪些在线发行版wsl --list --online这里我多说一句网络上经常有人推荐Ubuntu 24.04说是新版本但我个人做CUDA开发仍然倾向于Ubuntu 22.04 LTS。主要原因是NVIDIA官方CUDA仓库对22.04的支持时间最长很多深度学习预编译包也优先支持22.04的glibc版本。做开发图稳定不用追着最新版跑。如果你遇到wsl --install速度极慢大概率是默认下载源节点正在抽风。对策有两个一个是直接用微软官方提供的发行版安装包离线装另一个是从Windows商店搜索Ubuntu点击安装。离线安装包是一个.appx或.appxbundle文件下载完放到某个目录后执行Add-AppxPackage .\Ubuntu.appxbundle这种方法的好处是网络压力小也方便在局域网里分发安装。装好之后首次启动会让你创建Linux用户名和密码注意密码输入时是不显示任何字符的有些人以为键盘坏了。2.3 常见安装错误wsl/installdistro的处理我在热搜词里看到那条很长的错误代码“wsl/installdistro/service/registerdistro/createvm/hcs/error_file_n”第一次看到的人基本都懵了其实它就对应一个核心问题安装过程中创建虚拟机失败。这类错误的排查链路一般是这样先确认“虚拟机平台”功能有没有真正启用用命令查一下状态。PowerShell里执行Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform如果State不是Enabled问题就出在这里。再检查Windows的“虚拟机管理程序”相关服务是否被第三方安全软件禁用。有些系统优化工具会关掉Hyper-V相关的服务导致WSL运行不了虚拟化。还要确认BIOS里的CPU虚拟化开关。Intel的机器是Intel Virtualization TechnologyAMD的机器是SVM Mode这个必须处于开启状态。最后一个常见因素是你系统的Windows版本太老WSL2需要的内核组件不全。此时可以在管理员PowerShell执行wsl --update或者手动下载最新的WSL2内核更新包。如果上面几步都排除后依然报错我试过最暴力但有效的办法是wsl --unregister Ubuntu-22.04 wsl --shutdown然后重启Windows再次wsl --install -d Ubuntu-22.04。如果依然失败八成是Windows系统本身有损坏可以考虑运行sfc /scannow修复系统文件。注意在删除环境前先把WSL里自己写的重要代码备份出来。3. 在Ubuntu中安装NVIDIA驱动与CUDA Toolkit3.1 驱动、CUDA、cuDNN三者关系很多新手看到“安装CUDA”就把这三者混为一谈等到排查问题的时候根本不知道是谁出毛病。我用最简单的方式解释一下驱动是连接操作系统和GPU硬件的桥梁。在WSL2场景里驱动只需要装Windows侧WSL里不需要单装驱动。CUDA Toolkit是一整套面向开发者的库和工具链里面有编译器nvcc、运行时库、数学库等。装它是为了能编译和运行CUDA程序。cuDNN是NVIDIA专门为深度学习设计的深度神经网络加速库PyTorch、TensorFlow这些框架会在底层调用它来加速卷积和循环网络运算。驱动是地基CUDA Toolkit是开发工具包cuDNN则是针对深度学习的性能加速包。三者的版本关系是cuDNN要适配CUDA版本而CUDA Toolkit要求驱动版本不低于某个值。在WSL2里Windows侧驱动如果足够新那CUDA版本基本不用太担心。3.2 CUDA 12.x安装步骤在WSL2里安装CUDA Toolkit最标准的做法是用NVIDIA官方为WSL-Ubuntu场景准备的repo而不是下载通用Linux安装包。步骤非常简单wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt-get update之后如果只需要固定版本的工具链比如CUDA 12.8就装sudo apt-get install -y cuda-toolkit-12-8如果懒得纠结版本直接sudo apt-get install -y cuda这样会把最新版CUDA Toolkit装到/usr/local目录并且自动创建/usr/local/cuda这个软链接指向当前默认版本。安装过程和安装普通软件没区别就是包体积比较大有好几个GB耐心等就好。有一个技巧一定不要去NVIDIA官网下载以“.run”结尾的Linux驱动安装包来装。因为在WSL2里Linux驱动已经由Windows侧的驱动透传提供再装Linux原生驱动会覆盖或干扰WSL内的GPU配置轻则nvidia-smi报错重则整个WSL环境起不来。我就见过有人照着“Linux通用安装教程”执行到最后WSL直接进不去只能重建发行版。3.3 环境变量配置与验证装完CUDA Toolkit不配置环境变量等于白装。系统不会自动帮你把nvcc加入PATH所以需要编辑用户配置文件echo export PATH/usr/local/cuda/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc然后验证nvcc -V正常会输出类似nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2023 NVIDIA Corporation Built on ... Cuda compilation tools, release 12.8, V12.8.xx接着运行nvidia-smi这里能直接看到显卡型号和驱动版本显示的信息基本和Windows下的nvidia-smi一致。如果这一步有输出说明整个WSL2的GPU透传链路是通的这是整个环境里最关键的验证点。需要说明的是NVCC版本和nvidia-smi里显示的CUDA Version不一定是同一个数字比如驱动支持的CUDA版本可能是12.4而你工具链装的是12.8。这不一定是错的驱动只要支持运行时版本新版工具链也可以向下兼容很多场景。但如果你要跑某些老项目版本匹配就很重要下章会讲多版本共存的办法。4. 多版本CUDA共存与PyTorch集成4.1 CUDA多版本切换深度学习项目非常挑CUDA版本。有些老代码基于CUDA 11.8写的硬编到12.8上编译就是过不了有些新库又要求至少12.1。你不可能每换一个项目就重装一次系统所以多版本CUDA共存是一件必须掌握的事。安装方式类似比如需要12.4版本sudo apt-get install -y cuda-toolkit-12-4安装完成后/usr/local下会出现cuda-12.4、cuda-12.8两个目录以及一个符号链接cuda。默认链接指向哪个由apt的包管理决定一般是最新装的那个。手动切换有几种方式我常用的一个是修改环境变量export CUDA_HOME/usr/local/cuda-12.4 export PATH/usr/local/cuda-12.4/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH这个方法灵活但每次开新终端都要执行一遍。想做得更规范可以用update-alternatives机制sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.4 1 sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.8 2 sudo update-alternatives --config cuda之后想切换版本就执行sudo update-alternatives --config cuda再按数字选然后重新source一下bashrc。需要注意的是PyTorch这类框架是在编译时链接了特定CUDA运行时单纯切换系统CUDA版本不会改变已经安装的PyTorch所依赖的CUDA版本所以双管齐下才是正道系统里按项目区分CUDA工具链Python环境里按项目区分PyTorch的CUDA变体。4.2 PyTorch与CUDA版本匹配安装PyTorch时最容易踩的坑就是装错了wheel包导致torch.cuda.is_available()永远是False。从PyTorch官网找到对应CUDA版本的安装命令以CUDA 12.8为例pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128如果你想用CUDA 12.4就把末尾换成cu124。如果你的显卡是特别老的型号比如GTX 10系那就需要退到CUDA 11.8命令末尾用cu118。装完之后多花十秒钟验证一下python -c import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果输出True和显卡型号代表整条链路全部打通。如果输出False排查顺序是看Windows侧驱动能不能跑nvidia-smi看WSL里能不能跑nvidia-smi看PyTorch是不是装了CPU-only版本最后看是不是动态库缺依赖用ldconfig -p | grep cudart查一下运行时库是否在系统路径里4.3 在VSCode中使用WSL进行开发环境配好了命令行能用但大多数人最终还是在VSCode里写代码。VSCode和WSL的配合相当成熟你只需要安装一个名为“WSL”的微软官方扩展。装好后VSCode左下角会出现一个远程连接按钮点击就能在WSL环境里打开新的窗口。我这个习惯强烈建议你养成所有项目文件都放在WSL内部文件系统里而不是放在/mnt/c/Windows路径下。因为WSL访问Windows文件的效率比访问自己的ext4文件系统慢一个量级尤其是大量小文件读写时比如加载数据集、渲染缓存放/mnt/c下训练速度可能慢得离谱。如果需要从Windows资源管理器把文件拷进WSL直接访问\\wsl$\路径即可。用VSCode的WSL远程开发还有个优势终端自动落到Ubuntu环境Python解释器自动识别调试器断点也能正常工作整个体验跟在一台Linux服务器上开发没区别。5. 常见问题排查与性能验证5.1 性能测试与NVIDIA驱动无法加载配置完成后第一件事就是做一个最简单的性能验证。推荐直接用PyTorch跑一个矩阵乘法看看GPU占用python -c import torch x torch.randn(10000, 10000, devicecuda) y torch.randn(10000, 10000, devicecuda) print(torch.matmul(x, y).sum().item()) 如果程序能正常运行并输出数值说明从用户态应用、PyTorch、CUDA运行时、驱动到GPU硬件的完整链路全部正常。我遇到过最多的一类问题就是nvidia-smi报错常见现象是NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver.这种错误在WSL2里99%的原因不是WSL本身而是Windows侧驱动坏了或者版本太旧。解决办法是去NVIDIA官网下载最新的驱动重装装完重启Windows再进WSL执行nvidia-smi就正常了。如果重装驱动后还是不行检查一下Windows设备管理器里显卡是否被禁用。还有一种情况是nvidia-smi能运行但显示显卡名称/驱动信息为“未知”之类。这大多是因为Windows侧的驱动是Windows Update自动推送的兼容驱动功能不全换成NVIDIA官方完整驱动即可解决。5.2 .wslconfig调优与系统资源分配深度模型训练时显存和内存消耗都很大。WSL2默认内存占用是可变的但有时候Windows对WSL的内存上限设置得太保守跑大模型时直接被OOM杀掉。合理的做法是在Windows用户目录下创建或编辑.wslconfig文件然后写入这样一段配置[wsl2] memory12GB processors6 swap4GB配置里的memory是WSL能占用的最大内存processors是CPU核数swap是交换分区大小。改完保存然后在PowerShell里执行wsl --shutdown再重新进WSL配置才会生效。这里我特别提醒一句memory不要设成Windows总内存的全部要给Windows留至少4GB不然两边一起高负载时长时桌面会卡得动不了。5.3 中文输入法和其他细节最后聊几个热搜词里出现、“配好CUDA后依然要面对”的小事。WSL2里的Ubuntu默认没有中文输入法想在里面敲中文非常不方便。装上fcitx5框架后可以再装搜狗输入法的Linux版但配置过程有点繁琐。我的建议是如果只是偶尔写注释用中文在Windows侧输入好复制进WSL就完全够用如果真的有很重的中文输入需求那可以单独花时间配一下fcitx5。另外Ubuntu里编译某些C程序时偶尔会遇到gcc版本不兼容的报错可以根据项目需要切换默认gcc版本。在WSL2里这些操作和在真机Ubuntu里完全一样通过update-alternatives管理版本就行。最后关于存储空间多说一句CUDA Toolkit装几个版本下来轻松吃掉二十几GBPyTorch的conda环境再占几十GB时间一长WSL的虚拟磁盘文件会变得非常大。具体来说vhd文件在C:\Users\你的用户名\AppData\Local\Packages\...目录下。想减小体积可以定期执行sudo apt autoremove sudo apt clean然后回到Windows PowerShell里压缩diskpartwsl --shutdown diskpart # 打开磁盘后 compact vdisk这一套操作下来通常能回收不少磁盘空间。我是被一次系统盘爆红教训后才养成这个整理习惯的你们可以直接略过这个学费。算下来从启用Windows功能到跑通PyTorch的GPU训练正常速度下不会超过半小时。整个过程中最花费时间的反而是下载安装包和等待apt更新。如果非要说我踩过最大的坑那就是一开始多手在WSL里装了Linux驱动结果把环境搞坏只能重建。记住一个核心原则WSL2的驱动归Windows管WSL里只装CUDA Toolkit和各类库这条路线走通了后面的深度学习开发就非常顺畅。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑