
1. 为什么要在 Windows 上折腾 WSL2 跑 AI 开发1.1 一个真实场景双系统切换的痛我最早做深度学习项目时用的是 Windows Ubuntu 双系统方案。每次要跑训练就得重启切到 Linux想查个资料又得切回 Windows一天下来光重启就浪费不少时间。后来试过纯 Windows 环境装 PyTorchCUDA 版本、cuDNN 版本、Python 版本三者之间的兼容性问题能把人逼疯而且 Windows 下某些库的编译支持确实不如 Linux 完善。WSL2 的出现基本解决了这个矛盾。它本质上是跑在 Hyper-V 轻量级虚拟机里的完整 Linux 内核不是早期 WSL1 那种系统调用翻译层。这意味着你在 WSL2 里跑的是真正的 Linux 内核uname -r出来的是微软自己编译的内核版本号系统调用、文件系统、网络栈都是原生的。对于 AI 开发来说这一点至关重要因为 PyTorch、TensorFlow 这些框架在 Linux 下的表现和 Windows 下完全是两回事。1.2 WSL2 到底能做什么简单说WSL2 让你在 Windows 11 上拥有一个几乎完整的 Linux 环境同时能和 Windows 文件系统互通、能直接用 Windows 的 GPU 驱动、能在 VS Code 里无缝编辑 Linux 下的代码。对于 AI 开发场景核心能力包括GPU 直通通过 WSLg 和 DirectX 底层支持NVIDIA 显卡可以在 WSL2 里直接调用CUDA 程序原生运行内核级兼容完整的 Linux 内核意味着 Docker、systemd需配置、各类编译工具链都能正常工作文件互通Windows 的 D 盘、E 盘可以挂载到/mnt/d、/mnt/e数据不用来回拷贝资源可控内存、CPU 核心数、交换分区都可以通过.wslconfig精细控制适合谁来参考这篇文章如果你是用 Windows 做开发但需要 Linux 环境跑 AI 训练、如果你受够了双系统切换、如果你在 Windows 下装 CUDA 反复失败那这套方案就是为你准备的。即使你之前没接触过 Linux跟着步骤走也能搭起来。1.3 这套方案的核心思路整体架构分三层最底层是 Windows 11 的 Hyper-V 虚拟化平台中间层是 WSL2 的轻量级 Linux 虚拟机最上层是 Ubuntu 发行版 CUDA Toolkit PyTorch。GPU 直通的关键在于 Windows 侧的 NVIDIA 驱动会同时暴露给 WSL2你不需要在 Linux 里再装一遍显卡驱动只需要装 CUDA Toolkit 就行。这一点和纯 Linux 环境不同很多人在这里踩坑后面会详细说。2. 环境准备与 WSL2 安装全流程2.1 系统要求与前置检查在动手之前先确认你的环境满足以下条件项目最低要求推荐配置Windows 版本Windows 10 2004Windows 11 22H2显卡NVIDIA GTX 10 系以上RTX 20 系以上显存4GB8GB 以上内存8GB16GB 以上磁盘空间40GB 可用100GB SSDCPU支持虚拟化支持 SLAT检查虚拟化是否开启任务管理器 → 性能 → CPU → 看“虚拟化”是否为“已启用”。如果是“已禁用”需要进 BIOS 开启 Intel VT-x 或 AMD-V。这一步很多人忽略结果 WSL2 装完启动报错“WSL2 尚未准备就绪”根源就在这里。另外确认 Windows 功能里“虚拟机平台”和“适用于 Linux 的 Windows 子系统”两个可选组件已勾选。Win11 下可以用一条命令搞定wsl --install这条命令会自动启用所需组件、下载内核更新、安装 Ubuntu 默认发行版。但我不建议完全依赖它因为默认安装到 C 盘后期 C 盘爆满会很麻烦。下面讲手动控制安装位置的方法。2.2 把 WSL2 装到 D 盘的正确姿势WSL2 默认把虚拟磁盘文件ext4.vhdx放在C:\Users\你的用户名\AppData\Local\Packages\下面这个文件会随着你装包、下数据不断膨胀几十 GB 很常见。C 盘空间紧张的话必须迁移。思路是先正常安装发行版然后用wsl --export导出为 tar 文件再wsl --import导入到 D 盘指定目录最后删除原发行版。具体操作# 查看已安装的发行版 wsl --list --verbose # 导出现有发行版到 D 盘 wsl --export Ubuntu-22.04 D:\wsl\ubuntu22.tar # 注销原发行版 wsl --unregister Ubuntu-22.04 # 导入到 D 盘指定目录 wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\wsl\ubuntu22.tar --version 2 # 设置默认用户否则默认以 root 登录 ubuntu2204 config --default-user 你的用户名导入完成后D:\wsl\Ubuntu-22.04\ext4.vhdx就是新的虚拟磁盘文件。以后所有数据都写在这里C 盘只占一个几百 MB 的内核文件。注意--import的目录必须是空目录否则会报错。另外导入后原来的默认用户会丢失必须用config --default-user重新指定否则每次进去都是 root权限会乱。2.3 内存与 CPU 资源限制配置WSL2 默认会占用最多 50% 的物理内存如果你有 32GB 内存它可能吃掉 16GB。跑大模型训练时这反而不够用但日常开发时又太浪费。建议在C:\Users\你的用户名\.wslconfig里手动限制[wsl2] memory24GB processors12 swap8GB localhostForwardingtrue这里memory设成 24GB 是给 32GB 物理内存留 8GB 给 Windows 本身。processors设成 12 是假设你有 16 核 CPU留 4 核给系统。swap设成 8GB 是防止内存爆掉时直接 OOM但注意 swap 是磁盘模拟的速度慢只能当保险用。改完配置需要wsl --shutdown重启 WSL 才生效。验证是否生效进 WSL 后free -h看内存总量nproc看 CPU 核心数。2.4 换国内镜像源加速Ubuntu 默认的 apt 源在国外装包速度可能很慢。换成国内镜像源能快很多。以 Ubuntu 22.04 为例编辑/etc/apt/sources.listsudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s|http://archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list sudo sed -i s|http://security.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list sudo apt update sudo apt upgrade -y这里用清华源是因为它同步频率高、覆盖全。换完源之后apt install的速度能从几百 KB/s 提到几 MB/s装 CUDA 相关依赖时体感差别巨大。3. GPU 直通与 CUDA 环境搭建3.1 Windows 侧驱动只装一个就够这是最容易踩坑的地方。很多人以为 WSL2 里要单独装 NVIDIA 驱动结果装完反而冲突。正确做法是只在 Windows 侧装 NVIDIA 驱动WSL2 里绝对不要装显卡驱动。Windows 侧的驱动版本要求 470.76 以上2021 年后的版本基本都满足。装完之后WSL2 会自动通过/usr/lib/wsl/lib/下的库文件访问 GPU。验证方法进 WSL2 执行nvidia-smi如果能看到显卡信息说明直通成功。如果nvidia-smi报“command not found”先检查/usr/lib/wsl/lib/nvidia-smi是否存在。存在的话把它加到 PATHexport PATH/usr/lib/wsl/lib:$PATH echo export PATH/usr/lib/wsl/lib:$PATH ~/.bashrc如果这个文件不存在说明 Windows 驱动版本太旧或者没装对回 Windows 重装最新驱动。3.2 CUDA Toolkit 安装版本选择是关键CUDA 版本必须和 PyTorch 支持的版本对齐。截至我写这篇文章时PyTorch 2.x 稳定支持 CUDA 11.8 和 12.1。选哪个看你的显卡RTX 30 系、40 系建议 CUDA 12.1新特性支持更好RTX 20 系、GTX 16 系CUDA 11.8 更稳更老的卡查 PyTorch 官网的兼容表安装 CUDA Toolkit 有两种方式apt 源安装和 runfile 安装。WSL2 下推荐 apt 方式因为 runfile 会尝试装驱动容易搞乱环境。# 下载 CUDA keyring 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 update # 安装 CUDA Toolkit 12.1 sudo apt install -y cuda-toolkit-12-1注意包名是cuda-toolkit-12-1而不是cuda。装cuda会连带装驱动在 WSL2 下会出问题。装完后配置环境变量echo export PATH/usr/local/cuda-12.1/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc验证nvcc --version应该输出 CUDA 12.1 的版本信息。3.3 cuDNN 安装cuDNN 是 NVIDIA 的深度神经网络加速库PyTorch 底层会调用它。从 CUDA 11 开始cuDNN 也可以通过 apt 装sudo apt install -y libcudnn8 libcudnn8-dev装完验证dpkg -l | grep cudnn能看到版本号即可。cuDNN 版本不需要和 CUDA 严格一一对应大版本匹配就行。3.4 一个容易忽略的点WSL2 的 GPU 显存是动态分配的WSL2 下 GPU 显存不是独占的而是和 Windows 共享。这意味着如果你 Windows 侧开着游戏或者浏览器占用了显存WSL2 里能用的显存会变少。跑大模型训练前建议关掉不必要的图形程序。另外nvidia-smi在 WSL2 下显示的显存总量可能和 Windows 侧不一致这是正常的以实际可用为准。4. PyTorch 环境搭建与验证4.1 Python 环境管理Miniconda 还是 venv我推荐 Miniconda原因是 AI 开发经常需要切换不同版本的 Python 和 CUDA 组合conda 的环境隔离更彻底。venv 虽然轻量但处理 CUDA 相关依赖时不如 conda 省心。wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3 $HOME/miniconda3/bin/conda init bash source ~/.bashrc装完创建专用环境conda create -n pytorch python3.10 -y conda activate pytorchPython 3.10 是当前 PyTorch 支持最稳的版本3.11 和 3.12 部分库还没跟上。4.2 PyTorch 安装pip 还是 condaPyTorch 官方推荐 pip 安装因为 conda 源的更新往往滞后。用官方提供的索引地址pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121这里cu121对应 CUDA 12.1。如果你装的是 CUDA 11.8改成cu118。注意不要用默认的pip install torch那样装的是 CPU 版本白折腾。安装完成后验证import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) print(torch.cuda.get_device_capability(0))torch.cuda.is_available()返回True才算成功。如果返回False按下面的排查表逐项检查。4.3 常见安装失败排查表现象可能原因解决方法nvidia-smi找不到PATH 未配置添加/usr/lib/wsl/lib到 PATHtorch.cuda.is_available()为 False装了 CPU 版 PyTorch用--index-url重装CUDA 版本不匹配PyTorch 和 Toolkit 版本不对应查官网兼容表重装libcudart.so找不到LD_LIBRARY_PATH 未配置添加 CUDA lib64 路径显存不足报错Windows 侧占用显存关闭图形程序或减小 batch sizeconda: command not foundconda 未初始化执行conda init bash后重开终端4.4 实测性能对比我在 RTX 4070 Ti i7-13700K 32GB DDR5 的配置上做了个简单对比跑 ResNet-50 训练batch size 64环境单 epoch 耗时GPU 利用率纯 Windows CUDA42s85%WSL2 CUDA38s92%纯 Ubuntu 双系统36s95%WSL2 的性能损失大约在 5% 左右主要来自虚拟化层的开销。对于大多数开发场景这个损失完全可以接受换来的是不用重启切换系统的便利。5. 日常开发中的实用技巧与避坑经验5.1 文件系统性能别在 /mnt/c 下跑训练WSL2 访问 Windows 文件系统/mnt/c、/mnt/d走的是 9P 协议性能比原生 ext4 差很多。我实测过同样读一个 10GB 的数据集从/mnt/d读比从~/data读慢 3 到 5 倍。所以训练数据一定要放在 WSL2 自己的文件系统里也就是~/下面。如果数据在 Windows 侧先拷进来cp -r /mnt/d/datasets/coco ~/data/coco拷一次虽然花时间但训练时每个 epoch 都省时间总体是赚的。5.2 VS Code 远程开发最舒服的写代码方式在 Windows 侧装 VS Code然后装 “WSL” 扩展。在 WSL2 终端里进到项目目录执行code .VS Code 会自动以远程模式打开 WSL2 里的项目。这样你用的是 Windows 的图形界面但代码运行在 Linux 环境里两全其美。Python 解释器要选 WSL2 里 conda 环境的那个路径大概是~/miniconda3/envs/pytorch/bin/python。选对了解释器调试、补全、Jupyter 都能正常工作。5.3 几个我踩过的坑坑一WSL2 时间不同步。Windows 休眠后 WSL2 的时间会漂移导致 pip 安装时报 SSL 证书错误。解决方法是sudo hwclock -s同步时间或者直接wsl --shutdown重启。坑二磁盘空间不释放。删了 WSL2 里的大文件但 ext4.vhdx 文件在 Windows 侧看还是那么大。这是虚拟磁盘的特性需要手动压缩wsl --shutdown diskpart # 在 diskpart 里执行 select vdisk fileD:\wsl\Ubuntu-22.04\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit坑三端口转发失效。WSL2 里的服务比如 Jupyter默认 Windows 侧可以通过localhost访问但有时候会失效。检查.wslconfig里localhostForwardingtrue是否开启或者直接用 WSL2 的 IP 访问。坑四conda 激活慢。每次开终端 conda 初始化要好几秒。可以在.bashrc里把 conda 初始化块改成延迟加载或者干脆用conda activate手动激活。5.4 大模型微调场景的额外配置如果你要在 WSL2 里微调大模型比如 7B 参数的 LLM显存是瓶颈。几个实用建议用bitsandbytes做 4bit 量化7B 模型显存占用能从 28GB 降到 6GB 左右用gradient_checkpointing换显存代价是训练速度慢 20% 左右batch size 设小一点配合gradient_accumulation_steps模拟大 batch监控显存用watch -n 1 nvidia-smi实时看占用变化另外 WSL2 下nvidia-smi显示的显存占用可能包含 Windows 侧的共享部分实际可用显存以 PyTorch 报的为准。5.5 备份与迁移WSL2 环境搭好一次不容易建议定期备份。用wsl --export导出 tar 文件换电脑时wsl --import导入即可。tar 文件可以压缩20GB 的环境压完大概 8GB 左右。备份频率看你的折腾程度装完 CUDA 和 PyTorch 后备份一次之后每月一次就够。我个人在实际操作中的体会是WSL2 这套方案最大的价值不是性能而是把 Linux 的开发体验和 Windows 的日常使用无缝融合了。你不用再为了跑一个训练脚本重启电脑也不用在 Windows 下忍受各种兼容性问题。GPU 直通这块虽然初次配置有点绕但一旦跑通后续使用和原生 Linux 几乎没区别。唯一要记住的就是那条铁律Windows 侧装驱动WSL2 侧只装 CUDA Toolkit两边都装驱动必出问题。