1. 为什么要在 Windows 上折腾 WSL2 跑 AI 开发1.1 一个真实场景双系统切换的痛我最早做深度学习项目的时候用的是 Windows Ubuntu 双系统方案。每次要跑训练就得重启切到 Linux想查个资料又得切回 Windows一天下来光重启就浪费十几分钟。后来换成虚拟机结果 GPU 直通配置复杂不说性能损耗还特别明显训练一个 epoch 的时间比裸机多了将近 40%。直到我把整套开发环境迁移到 WSL2 上才算真正解决了这个“既要 Windows 生态、又要 Linux 内核”的矛盾。WSL2 的本质是在 Windows 里跑了一个轻量级的 Hyper-V 虚拟机里面装的是微软定制编译的真实 Linux 内核。注意这不是模拟层不是 Cygwin 那种翻译层而是货真价实的 Linux 内核。你在里面跑uname -r会看到类似5.15.90.1-microsoft-standard-WSL2的版本号说明你面对的就是一个完整的 Linux 系统。对于 AI 开发来说这意味着你可以直接用 apt 装 CUDA Toolkit、用 pip 装 PyTorch、用 nvidia-smi 查看显卡状态和在一台原生 Ubuntu 机器上几乎没有区别。1.2 WSL2 相比原生 Linux 和虚拟机的取舍很多人会问既然要跑 Linux为什么不直接装 Ubuntu我的回答是——看你图什么。如果你追求极致性能、需要直接操作硬件、或者做嵌入式开发要接各种外设那原生 Linux 确实更合适。但如果你像我一样日常还要用 Windows 上的 Office、微信、各种 GUI 工具同时又需要一个 Linux 环境来跑训练和推理WSL2 就是目前最省心的方案。和传统虚拟机VMware、VirtualBox相比WSL2 的优势在于启动速度快秒级、内存动态分配不用预先划一大块、文件系统互通Windows 的 D 盘可以直接在 Linux 里访问。GPU 直通方面WSL2 通过微软提供的 GPU-PVGPU Paravirtualization技术让 Linux 侧可以直接调用 NVIDIA 显卡不需要像传统虚拟机那样折腾 PCI 直通。实测下来RTX 4090 在 WSL2 里的 CUDA 算力损失大约在 3% 到 8% 之间对于绝大多数训练和推理任务来说完全可以接受。1.3 这套方案适合谁这套方案特别适合以下几类人一是学生和研究者手头只有一台 Windows 笔记本或台式机需要跑 PyTorch 实验二是算法工程师公司配的开发机是 Windows但项目要求 Linux 环境三是刚入门深度学习的同学不想折腾双系统又想体验原生 Linux 开发流程。如果你用的是 AMD 显卡WSL2 的 GPU 支持目前还比较有限建议优先考虑 NVIDIA 显卡。2. 环境准备从零开始的完整清单2.1 硬件与系统前提条件在动手之前先确认你的机器满足以下条件。CPU 需要支持虚拟化技术Intel VT-x 或 AMD-V这个在 BIOS 里要确保开启。内存建议至少 16GB因为 WSL2 默认会占用宿主机一半的内存8GB 的机器跑起来会比较吃力。硬盘方面建议给 WSL2 预留至少 100GB 空间因为 CUDA Toolkit 加上 PyTorch 加上各种依赖轻松就能吃掉几十个 G。系统版本要求 Windows 10 版本 2004 及以上内部版本 19041或者 Windows 11 任意版本。检查方法很简单按 WinR 输入winver就能看到。显卡方面NVIDIA 显卡需要是 GeForce 600 系列及以上驱动版本要求 Windows 端至少 470.76 以上。我实测用的是 Windows 11 RTX 4070 Ti 32GB 内存整个流程跑下来非常顺畅。2.2 开启 WSL2 的完整步骤第一步以管理员身份打开 PowerShell运行以下命令启用必要的 Windows 功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart这两条命令分别启用了 Linux 子系统和虚拟机平台。执行完之后必须重启电脑否则后续步骤会报错。重启后下载并安装 WSL2 内核更新包搜索“WSL2 Linux 内核更新包”即可找到微软官方下载地址安装完成后运行wsl --set-default-version 2这一步是把默认版本设为 WSL2。如果你之前装过 WSL1可以用wsl --set-version 发行版名称 2来单独转换。确认版本用wsl --list --verbose输出里 VERSION 列显示 2 就对了。2.3 安装 Ubuntu 22.04 并迁移到 D 盘打开 Microsoft Store 搜索 Ubuntu 22.04 LTS点击安装。装完之后第一次启动会要求设置用户名和密码这个密码是 sudo 用的记牢。默认情况下 WSL2 的虚拟磁盘文件ext4.vhdx会放在 C 盘随着你装的东西越来越多C 盘空间会被迅速吃掉。我强烈建议把它迁移到 D 盘或其他数据盘。迁移方法如下先关闭 WSLwsl --shutdown然后导出当前发行版wsl --export Ubuntu-22.04 D:\wsl\ubuntu22.04.tar导出完成后注销原来的发行版wsl --unregister Ubuntu-22.04再导入到新位置wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\wsl\ubuntu22.04.tar --version 2导入后默认用户会变成 root需要修改回来。在 WSL 里执行sudo nano /etc/wsl.conf写入以下内容[user] default你的用户名保存后退出在 PowerShell 里执行wsl --shutdown再重新进入用户就恢复成你自己了。这一步踩过的坑是如果忘了改默认用户后面所有文件权限都会变成 rootpip 装包也会各种报错。3. GPU 直通配置让 Linux 侧认出你的显卡3.1 Windows 端驱动安装要点GPU 直通的第一步是在 Windows 宿主机上安装正确的 NVIDIA 驱动。这里有个关键点你只需要在 Windows 上装驱动WSL2 里面不要再单独装驱动。微软和 NVIDIA 合作的方式是Windows 端的驱动会自动把 CUDA 和 OpenGL 的接口透传给 WSL2。去 NVIDIA 官网下载最新的 Game Ready 驱动或者 Studio 驱动都行安装时选择“自定义安装”确保勾选“NVIDIA 图形驱动程序”和“NVIDIA CUDA 相关组件”。装完之后在 PowerShell 里运行nvidia-smi如果能看到显卡信息说明 Windows 端没问题了。注意如果你之前手动装过 WSL 专用的驱动建议先卸载干净否则可能出现版本冲突。3.2 在 WSL2 里验证 GPU 是否可用进入 WSL2 的 Ubuntu 终端直接运行nvidia-smi如果输出和 Windows 端类似显示了显卡型号、驱动版本、CUDA 版本那就说明 GPU 直通成功了。我第一次配置的时候这里卡了很久报错NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver后来发现是 Windows 驱动版本太旧更新到最新版就解决了。还有一个常见问题是nvidia-smi能跑但 CUDA 程序报错这通常是 CUDA Toolkit 版本和驱动不匹配。可以用nvcc --version查看 Toolkit 版本用nvidia-smi右上角显示的 CUDA Version 查看驱动支持的最高版本前者不能高于后者。3.3 CUDA Toolkit 的安装与版本选择在 WSL2 里装 CUDA Toolkit推荐用 NVIDIA 官方 apt 源比 runfile 方式干净。以 CUDA 12.1 为例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 sudo apt-get install -y cuda-toolkit-12-1装完后配置环境变量编辑~/.bashrcexport PATH/usr/local/cuda-12.1/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc生效。验证安装nvcc --version版本选择上我的建议是如果你要用 PyTorch先去 PyTorch 官网看它当前稳定版支持哪个 CUDA 版本然后装对应的 Toolkit。比如 PyTorch 2.1 默认支持 CUDA 11.8 和 12.1那你就装这两个之一别装太新的版本否则 PyTorch 可能还没适配。4. PyTorch 环境搭建与验证4.1 用 Conda 管理 Python 环境WSL2 里我习惯用 Miniconda 来管理环境比系统自带的 Python 干净得多。安装步骤wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh一路回车确认最后选择yes让它初始化 shell。重开终端后创建一个专门的环境conda create -n pytorch python3.10 -y conda activate pytorch这里 Python 版本选 3.10 是因为它在 PyTorch 生态里兼容性最好3.11 和 3.12 有些第三方库还没跟上。踩过的坑是如果你在 PowerShell 里直接敲conda activate报“无法将 conda 项识别”说明你是在 Windows 终端而不是 WSL 终端里操作先wsl进入 Linux 环境再执行。4.2 安装 PyTorch 并验证 CUDA 可用去 PyTorch 官网找到对应 CUDA 版本的安装命令比如 CUDA 12.1 对应的pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121装完之后用一段简单的 Python 代码验证import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果is_available()返回 True并且打印出了你的显卡型号恭喜你整套环境跑通了。如果返回 False先检查nvidia-smi是否正常再检查 PyTorch 版本和 CUDA 版本是否匹配。我遇到过一次是因为 pip 装成了 CPU 版本卸载重装指定 cu121 源就好了。4.3 跑一个真实的训练任务做压力测试光验证is_available()还不够最好跑一个真实的小训练看看稳定性。我用的是 CIFAR-10 加一个简单的 ResNetimport torch import torch.nn as nn import torchvision import torchvision.transforms as transforms device torch.device(cuda if torch.cuda.is_available() else cpu) transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) trainset torchvision.datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtransform) trainloader torch.utils.data.DataLoader(trainset, batch_size128, shuffleTrue, num_workers4) model torchvision.models.resnet18(pretrainedFalse, num_classes10).to(device) criterion nn.CrossEntropyLoss() optimizer torch.optim.SGD(model.parameters(), lr0.01, momentum0.9) for epoch in range(2): running_loss 0.0 for i, data in enumerate(trainloader): inputs, labels data[0].to(device), data[1].to(device) optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() print(fEpoch {epoch1} loss: {running_loss/len(trainloader):.4f})跑起来之后另开一个终端执行nvidia-smi -l 1能看到 GPU 利用率在 80% 以上、显存占用正常就说明 GPU 直通在真实负载下也没问题。5. 常见问题排查与性能调优5.1 WSL2 常见报错速查表报错信息可能原因解决方法wsl2 尚未准备就绪内核更新包未装或虚拟机平台未启用重装内核更新包确认 BIOS 虚拟化已开nvidia-smi无输出或报错Windows 驱动版本过低更新 NVIDIA 驱动到最新版torch.cuda.is_available()返回 FalsePyTorch 装成了 CPU 版卸载后用 cu 源重装conda: command not found在 Windows 终端执行了 Linux 命令先wsl进入 Linux 环境训练时 GPU 利用率低DataLoader 的 num_workers 设置不当调到 4 到 8或改用 pinned memory磁盘空间不足vhdx 文件膨胀迁移到 D 盘或执行wsl --shutdown后压缩5.2 内存与显存调优经验WSL2 默认会占用宿主机最多 50% 的内存如果你有 32GB 内存WSL2 最多能用 16GB。对于大模型微调来说可能不够可以在 Windows 用户目录下创建.wslconfig文件来调整[wsl2] memory24GB processors8 swap8GB改完之后wsl --shutdown重启生效。显存方面WSL2 目前不支持显存超分所以你的模型必须能装进物理显存里。如果显存不够可以考虑用 gradient checkpointing 或者混合精度训练来降低占用。5.3 文件系统性能的坑WSL2 访问 Windows 文件系统比如/mnt/d/的性能比访问 Linux 原生文件系统慢很多尤其是大量小文件读写的时候。所以你的项目代码和数据集最好放在 Linux 侧的家目录下而不是放在/mnt/d/里。我实测过同样一个数据集从/mnt/d/读取比从~/data/读取慢了将近 5 倍训练时 dataloader 直接成了瓶颈。如果数据集太大必须放在 Windows 盘可以考虑用tar打包后在 Linux 侧解压或者用符号链接把常用数据映射过来。另外WSL2 的 vhdx 文件会随着使用不断膨胀定期执行wsl --shutdown然后在 PowerShell 里用Optimize-VHD可以回收空间。6. 几个提升日常效率的实用技巧6.1 用 VS Code 远程连接 WSL2装一个 VS Code 加 Remote - WSL 扩展在 WSL 终端里进入项目目录后执行code .VS Code 会自动以远程模式打开这个目录。这样你既能在 Windows 上用熟悉的编辑器又能享受 Linux 的终端和运行环境。Python 解释器选择 WSL 里的 conda 环境调试、断点、Jupyter Notebook 全都能正常用。6.2 配置 Jupyter Notebook 远程访问在 WSL2 里启动 Jupyterjupyter notebook --no-browser --port8888 --ip0.0.0.0然后在 Windows 浏览器里访问http://localhost:8888就能用了因为 WSL2 和 Windows 共享 localhost。记得把 token 复制出来。如果你想让局域网内其他设备也能访问需要在 Windows 防火墙里放行对应端口。6.3 备份与迁移整套环境配好的环境建议定期备份万一哪天 WSL 崩了可以快速恢复wsl --export Ubuntu-22.04 D:\backup\ubuntu_ai_env.tar恢复的时候用wsl --import就行。整个 tar 包大概几个 G取决于你装了多少东西。我一般每个月备份一次放在移动硬盘里换电脑的时候直接导入省去重新配置的麻烦。这套 WSL2 GPU 直通的方案我从去年用到现在跑了十几个深度学习项目包括图像分类、目标检测和几个大语言模型的微调稳定性完全没问题。唯一需要注意的是 Windows 更新有时候会重置 WSL 的网络配置遇到连不上网的情况先wsl --shutdown重启一下基本都能解决。
阅读完成 · 觉得有帮助?