1. 为什么要在 Windows 上折腾 WSL2 跑 AI 开发
1.1 一个真实场景:双系统切换的痛
我最早做深度学习项目时,用的是 Windows + Ubuntu 双系统方案。每次要跑训练就得重启切到 Linux,想查个资料又得切回 Windows,一天下来光重启就浪费不少时间。后来试过纯 Windows 环境装 PyTorch,CUDA 版本、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 2004+ | Windows 11 22H2+ |
| 显卡 | NVIDIA GTX 10 系以上 | RTX 20 系以上 |
| 显存 | 4GB | 8GB 以上 |
| 内存 | 8GB | 16GB 以上 |
| 磁盘空间 | 40GB 可用 | 100GB SSD |
| CPU | 支持虚拟化 | 支持 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] memory=24GB processors=12 swap=8GB localhostForwarding=true这里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.list:
sudo 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是否存在。存在的话把它加到 PATH:
export 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 python=3.10 -y conda activate pytorchPython 3.10 是当前 PyTorch 支持最稳的版本,3.11 和 3.12 部分库还没跟上。
4.2 PyTorch 安装:pip 还是 conda
PyTorch 官方推荐 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到 PATH |
torch.cuda.is_available()为 False | 装了 CPU 版 PyTorch | 用--index-url重装 |
| CUDA 版本不匹配 | PyTorch 和 Toolkit 版本不对应 | 查官网兼容表重装 |
libcudart.so找不到 | LD_LIBRARY_PATH 未配置 | 添加 CUDA lib64 路径 |
| 显存不足报错 | Windows 侧占用显存 | 关闭图形程序或减小 batch size |
conda: command not found | conda 未初始化 | 执行conda init bash后重开终端 |
4.4 实测性能对比
我在 RTX 4070 Ti + i7-13700K + 32GB DDR5 的配置上做了个简单对比,跑 ResNet-50 训练,batch size 64:
| 环境 | 单 epoch 耗时 | GPU 利用率 |
|---|---|---|
| 纯 Windows + CUDA | 42s | 85% |
| WSL2 + CUDA | 38s | 92% |
| 纯 Ubuntu 双系统 | 36s | 95% |
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 file="D:\wsl\Ubuntu-22.04\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit坑三:端口转发失效。WSL2 里的服务(比如 Jupyter)默认 Windows 侧可以通过localhost访问,但有时候会失效。检查.wslconfig里localhostForwarding=true是否开启,或者直接用 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,两边都装驱动必出问题。