1. 为什么我最终把 AI 开发环境搬进了 WSL2
1.1 从双系统到 WSL2 的折腾史
搞深度学习这几年,环境问题一直是最让人头疼的事。最早我是 Windows 和 Ubuntu 双系统,每次想跑个模型都得重启切换,写代码在 Windows 上,训练又得跑到 Linux 下,文件传来传去,路径还老出问题。后来试过纯 Linux 桌面,驱动、输入法、办公软件各种水土不服,坚持了不到两个月又装回了 Windows。
直到 WSL2 成熟之后,我才算找到了一个真正舒服的方案:Windows 负责日常办公和写代码,WSL2 里的 Ubuntu 负责跑训练和推理,两边文件系统互通,GPU 也能直接调用。这套组合用下来,最大的感受就是“不用再为环境折腾了”。
这篇文章要聊的,就是怎么在 WSL2 里从零搭一套能跑 PyTorch、能调用 CUDA 的 AI 开发环境。核心关键词就几个:WSL2、Linux、GPU、PyTorch、CUDA。适合谁看?如果你手上是一台带 NVIDIA 显卡的 Windows 机器,想搞深度学习又不想放弃 Windows 生态,那这套方案基本就是为你准备的。哪怕你之前没怎么碰过 Linux,跟着走也能搭起来。
1.2 这套方案到底解决了什么问题
先说清楚 WSL2 的本质。它不是虚拟机软件那种“模拟”出来的 Linux,而是微软在 Windows 内核里做的一个兼容层,底层用的是真正的 Linux 内核(由微软维护编译)。所以你拿到的就是一个货真价实的 Linux 环境,apt、systemd、bash全都能用,和你在物理机上装的 Ubuntu 体验几乎一致。
GPU 直通是这套方案的关键。WSL2 支持把 Windows 上的 NVIDIA 显卡直接透传给 Linux 子系统,靠的是微软和 NVIDIA 合作搞的WSLg + GPU-PV(GPU 半虚拟化)技术。简单说,你不需要在 WSL2 里再单独装一遍显卡驱动,只要 Windows 侧的驱动够新,WSL2 里就能直接nvidia-smi看到显卡。这一点比传统虚拟机强太多,传统虚拟机要么不支持 GPU 直通,要么配置极其麻烦。
解决了什么问题?三个:一是环境隔离,AI 项目的依赖经常打架,放在 WSL2 里随便折腾,搞崩了直接删掉重建,不影响 Windows 主系统;二是开发效率,VS Code 可以直接连进 WSL2,代码补全、调试、终端全在一条链路里;三是性能,GPU 直通之后训练速度和原生 Linux 差距很小,我实测下来大概在 95% 以上。
2. 部署前的准备工作与方案选型
2.1 硬件与系统的前置条件
这套方案对硬件有硬性要求,先对照检查一遍,不满足的话后面会卡住。
| 项目 | 要求 | 说明 |
|---|---|---|
| 操作系统 | Windows 10 版本 2004 及以上,或 Windows 11 | 版本太低不支持 WSL2 |
| 显卡 | NVIDIA GTX 10 系及以上 | 需要支持 CUDA,AMD 和 Intel 显卡走不了这套 |
| 显卡驱动 | Windows 侧驱动版本 470 以上 | 越新越好,建议直接官网下最新 |
| 内存 | 建议 16GB 以上 | WSL2 默认最多用一半内存,训练吃内存 |
| 磁盘 | 预留 50GB 以上 | 镜像、CUDA、PyTorch 加起来很占地方 |
| CPU | 支持虚拟化 | 需要在 BIOS 里开启 |
这里有个坑要提前说:WSL2 里不要装显卡驱动。很多人习惯性地在 Linux 里apt install nvidia-driver,结果直接把 GPU 直通搞崩了。WSL2 的显卡驱动是 Windows 侧提供的,Linux 里只需要装 CUDA Toolkit,驱动部分会自动从 Windows 透传过来。这个逻辑和物理机 Linux 完全相反,一定要记住。
2.2 为什么选 Ubuntu 22.04 而不是别的发行版
WSL2 支持很多发行版,Ubuntu、Debian、Fedora、openSUSE 都有。我推荐Ubuntu 22.04 LTS,理由很实在:
- 生态最全:PyTorch、CUDA 的官方文档默认就是 Ubuntu,遇到问题搜出来的答案也大多是 Ubuntu 的。
- LTS 稳定:22.04 是长期支持版,支持到 2027 年,不用频繁升级。
- 软件源新:22.04 自带的 GCC、Python 版本比较新,装 PyTorch 不容易遇到编译问题。
Ubuntu 24.04 也可以,但有些 CUDA 版本对它的支持还在跟进,稳妥起见先用 22.04。至于 Debian,软件源偏保守,装新版 CUDA 容易缺依赖;Fedora 更新太快,稳定性差一点。所以综合下来,22.04 是最省心的选择。
2.3 安装 WSL2 的正确姿势
网上很多教程还在教你手动开启“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个功能,然后重启,再下载内核更新包。这套流程在 Win11 上已经过时了,现在一条命令搞定。
以管理员身份打开 PowerShell,执行:
wsl --install这条命令会自动完成:启用所需功能、下载最新内核、安装 Ubuntu 默认发行版、设置 WSL2 为默认版本。执行完重启一次电脑,然后 Ubuntu 会自动启动,让你设置用户名和密码。
如果你已经装过 WSL 想重装,或者想指定发行版,可以这样:
# 查看可用的发行版列表 wsl --list --online # 安装指定发行版 wsl --install -d Ubuntu-22.04 # 查看已安装的发行版 wsl --list --verbose # 设置默认版本为 WSL2 wsl --set-default-version 2注意:
wsl --install在部分 Win10 老版本上可能不生效,这时候才需要走手动开启功能的老流程。判断方法很简单,执行命令报错就说明版本太老,先升级系统。
安装完成后,第一次进入 Ubuntu 会让你创建用户。这个用户是普通用户,不是 root,后面装 CUDA 需要 sudo 权限,密码记牢。
2.4 迁移到非系统盘,避免 C 盘爆掉
WSL2 默认把发行版装在 C 盘,一个 Ubuntu 镜像加上后面装的 CUDA、PyTorch,轻松吃掉几十 GB。C 盘紧张的话,强烈建议迁移到其他盘。
迁移流程分三步。先关闭 WSL:
wsl --shutdown然后导出镜像到目标盘,比如 D 盘:
# 导出,注意路径 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,需要改回你自己的用户。编辑/etc/wsl.conf,加上:
[user] default=你的用户名然后wsl --shutdown重启一次就恢复正常了。这一步我踩过坑,导入后直接是 root,一开始还以为是权限出问题了,其实就是默认用户没配。
3. GPU 直通与 CUDA 环境搭建
3.1 验证 GPU 是否成功直通
WSL2 装好之后,第一件事是确认 GPU 能不能被识别。在 WSL2 的 Ubuntu 终端里执行:
nvidia-smi如果输出了一张表格,显示显卡型号、驱动版本、CUDA Version,那就说明直通成功了。这里显示的 CUDA Version 是驱动支持的最高版本,不是你实际装的版本,别搞混。
如果报command not found,说明 Windows 侧的驱动没装好或者版本太老。回到 Windows,去 NVIDIA 官网下载最新的 Game Ready 或 Studio 驱动装上,重启 WSL2 再试。还有一种情况是nvidia-smi能跑但显示不了显卡,那多半是 Windows 驱动版本低于 470,升级即可。
提示:WSL2 里永远不要执行
apt install nvidia-driver-xxx,装了必崩。如果手贱装了,卸载掉再重启 WSL2 就能恢复。
3.2 CUDA Toolkit 的安装与版本选择
CUDA Toolkit 是编译和运行 CUDA 程序的基础,PyTorch 的 GPU 版本依赖它。版本选择有个原则:跟着 PyTorch 走,不要盲目追新。
先确定你要装的 PyTorch 版本,然后去 PyTorch 官网看它对应的 CUDA 版本。比如 PyTorch 2.1 默认对应 CUDA 11.8,PyTorch 2.2 开始支持 CUDA 12.1。选一个匹配的就行,不用装最新的 CUDA 12.4。
安装 CUDA Toolkit 有两种方式,我推荐用官方 runfile 或者 apt 源。以 CUDA 11.8 为例,用 apt 源的方式:
# 下载并安装 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-get update # 安装 CUDA Toolkit sudo apt-get install -y cuda-toolkit-11-8注意这里用的是wsl-ubuntu的源,不是普通的ubuntu源。WSL2 的 CUDA 包和物理机略有不同,用错源可能装不上或者装完不能用。
装完之后配置环境变量,编辑~/.bashrc:
export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc生效。验证一下:
nvcc --version能输出版本信息就说明 CUDA Toolkit 装好了。
3.3 cuDNN 的配置
cuDNN 是 NVIDIA 的深度神经网络加速库,PyTorch 底层会用到。现在 cuDNN 也走 apt 源了,比早年手动下载解压方便太多:
sudo apt-get install -y libcudnn8 libcudnn8-dev装完不需要手动配置路径,apt 会自动放到系统库目录。验证的话可以写个小程序,但一般装完 PyTorch 能跑起来就说明 cuDNN 没问题。
这里有个版本匹配的坑:cuDNN 的版本要和 CUDA 对应。CUDA 11.8 对应 cuDNN 8.7 以上,apt 源会自动处理依赖,所以直接用 apt 装最省心。手动下载 cuDNN 压缩包那种老方法,很容易版本对不上,不推荐。
3.4 环境变量配置的完整清单
把环境变量集中整理一下,方便你对照。编辑~/.bashrc,追加以下内容:
# CUDA export CUDA_HOME=/usr/local/cuda-11.8 export PATH=$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH # cuDNN(apt 安装的一般不需要,手动装的才需要) # export LD_LIBRARY_PATH=/usr/local/cudnn/lib64:$LD_LIBRARY_PATH配置完执行source ~/.bashrc,然后echo $CUDA_HOME确认一下。环境变量这东西,配错了后面 PyTorch 找不到 CUDA 就是它的问题,所以这一步别偷懒。
4. PyTorch 安装与 GPU 验证实操
4.1 用 conda 还是 venv 管理环境
Python 环境管理这块,我强烈建议用conda(Miniconda),而不是系统自带的 venv。原因有三个:
- conda 能管理 Python 版本本身,venv 只能管理包;
- conda 装科学计算相关的包(numpy、scipy)有预编译版本,不用现场编译;
- 多项目隔离方便,一个项目一个环境,互不干扰。
Miniconda 比 Anaconda 轻量,没有一堆用不上的预装包,推荐装 Miniconda:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh一路回车,最后选 yes 让它初始化 shell。重开终端后conda --version能输出版本就行。
4.2 创建独立的 PyTorch 环境
不要直接在 base 环境里装 PyTorch,养成好习惯,一个项目一个环境:
# 创建环境,指定 Python 版本 conda create -n pytorch python=3.10 -y # 激活环境 conda activate pytorchPython 版本选 3.10 比较稳,3.11、3.12 有些库还没跟上。激活之后命令行前面会出现(pytorch),说明进对环境了。
4.3 安装 PyTorch 的正确命令
去 PyTorch 官网的 Get Started 页面,选好你的配置(PyTorch 版本、CUDA 版本、pip 还是 conda),它会生成对应的安装命令。以 CUDA 11.8 为例,pip 方式:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118注意--index-url这个参数,它指向 PyTorch 官方的 CUDA 专用源。不加的话默认从 PyPI 装,装出来的是 CPU 版本,白忙活。
conda 方式:
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia两种方式都行,pip 装得快一点,conda 依赖处理更稳。我一般用 pip,因为 PyTorch 官方现在主推 pip 安装。
注意:安装过程中如果卡在下载,多半是网络问题。可以换国内镜像源,但 CUDA 版本的包国内镜像不一定全,建议还是用官方源,耐心等。
4.4 验证 GPU 是否真的可用
装完之后必须验证,别以为装完就万事大吉。写个测试脚本:
import torch # 检查 CUDA 是否可用 print("CUDA available:", torch.cuda.is_available()) # 查看 CUDA 版本 print("CUDA version:", torch.version.cuda) # 查看显卡数量 print("GPU count:", torch.cuda.device_count()) # 查看显卡名称 if torch.cuda.is_available(): print("GPU name:", torch.cuda.get_device_name(0)) # 做个实际运算测试 if torch.cuda.is_available(): x = torch.randn(1000, 1000).cuda() y = torch.randn(1000, 1000).cuda() z = torch.mm(x, y) print("Matrix multiply on GPU done:", z.shape)如果CUDA available输出 True,显卡名称也对,矩阵乘法能跑通,那恭喜你,环境搭好了。如果输出 False,往下看排查部分。
4.5 一个完整的训练小例子
光验证还不够,跑个真实的小训练确认一下。用 MNIST 手写数字识别,几行代码就能跑:
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 设备 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print("Using device:", device) # 数据 transform = transforms.Compose([transforms.ToTensor()]) train_set = datasets.MNIST("./data", train=True, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True) # 简单模型 model = nn.Sequential( nn.Flatten(), nn.Linear(784, 128), nn.ReLU(), nn.Linear(128, 10) ).to(device) # 训练 optimizer = optim.Adam(model.parameters(), lr=0.001) criterion = nn.CrossEntropyLoss() for epoch in range(2): for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() if batch_idx % 200 == 0: print(f"Epoch {epoch} Batch {batch_idx} Loss {loss.item():.4f}")跑起来之后用nvidia-smi看,能看到 python 进程占用显存,说明 GPU 真的在工作。这个例子虽然简单,但把数据加载、模型、训练循环、GPU 迁移全串起来了,是个很好的起点。
5. 常见问题排查与性能调优
5.1 高频问题速查表
实际搭环境过程中,下面这些问题我基本都遇到过,整理成表方便对照:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
nvidia-smi找不到命令 | Windows 驱动没装或太老 | 升级 Windows 侧 NVIDIA 驱动到 470+ |
torch.cuda.is_available()返回 False | 装了 CPU 版 PyTorch | 用--index-url重装 CUDA 版 |
| CUDA 版本和 PyTorch 不匹配 | 版本选错 | 按 PyTorch 官网对应关系重装 |
| WSL2 启动报“尚未准备就绪” | 虚拟化功能没开 | BIOS 开虚拟化,Windows 功能里开虚拟机平台 |
| 磁盘空间不足 | 镜像装在 C 盘 | 迁移到其他盘 |
| 训练速度慢 | 内存分配不足 | 配置.wslconfig调大内存 |
apt update慢 | 默认源在国外 | 换国内镜像源 |
5.2 WSL2 内存和 CPU 限制的调整
WSL2 默认最多用主机一半的内存,训练大模型时经常不够。可以在 Windows 用户目录下创建.wslconfig文件(路径是C:\Users\你的用户名\.wslconfig),内容如下:
[wsl2] memory=32GB processors=8 swap=8GB localhostForwarding=truememory根据你主机内存来,16GB 主机给 8GB,32GB 主机给 24GB 比较合适。processors是分配的 CPU 核心数。改完执行wsl --shutdown重启生效。
注意:不要把所有内存都给 WSL2,Windows 本身也要用。给太多会导致 Windows 卡顿,给太少训练又不够,一般给总内存的 60% 到 75% 比较平衡。
5.3 文件系统性能的坑
WSL2 访问 Windows 文件(/mnt/c/...)和访问 Linux 原生文件(~/...)性能差距巨大。我实测过,同样读一个几万张图片的数据集,放在/mnt/c下比放在~/下慢好几倍。
所以有个铁律:AI 项目的代码和数据,全部放在 WSL2 的 Linux 文件系统里,不要放在/mnt/c或/mnt/d。Windows 那边想看文件,通过\\wsl$\Ubuntu-22.04\home\你的用户名这个路径访问就行。
如果数据集特别大,又不想复制两份,可以考虑用符号链接,但性能还是不如原生。最彻底的办法是数据也放 Linux 侧,Windows 侧需要时通过网络路径访问。
5.4 网络下载慢的解决思路
WSL2 里apt、pip、conda下载慢是常态。apt换源最简单,编辑/etc/apt/sources.list,把archive.ubuntu.com换成国内镜像。pip 可以配置~/.pip/pip.conf:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple但注意,装 PyTorch CUDA 版时不要用这个镜像,因为 CUDA 包国内镜像不全,还是得用 PyTorch 官方源。可以临时用-i参数指定,或者装完 PyTorch 再配镜像。
conda 换源稍微麻烦点,要改.condarc文件。不过 conda 现在用得少了,pip 基本够用。
5.5 几个提升开发体验的小技巧
最后分享几个我用了很久的技巧,能明显提升日常开发效率。
VS Code 远程连接:装个 WSL 扩展,直接在 VS Code 里Ctrl+Shift+P输入WSL: Connect to WSL,就能连进 WSL2。代码补全、调试、终端全在 VS Code 里,体验和本地开发几乎一样。Python 解释器选 WSL2 里 conda 环境的那个,就能直接用 GPU。
Jupyter Lab 远程访问:在 WSL2 里启动 Jupyter Lab,Windows 浏览器直接访问localhost:8888就能用。因为 WSL2 和 Windows 共享 localhost,不需要额外配置端口转发。启动命令:
jupyter lab --no-browser --port=8888快照备份:环境搭好之后,用wsl --export导出一份备份。以后环境搞崩了,直接wsl --import恢复,几分钟搞定,比重装快多了。这个习惯我强烈建议养成,尤其是装 CUDA 这种容易出问题的环节之前,先备份一份。
GPU 显存监控:训练时想看显存占用,开个终端跑watch -n 1 nvidia-smi,每秒刷新一次,比反复敲命令方便。
这套 WSL2 + GPU 直通的环境,我从去年用到现在,跑过 BERT 微调、Stable Diffusion 推理、YOLO 训练,稳定性没得说。唯一要注意的就是别在 WSL2 里装显卡驱动,以及数据放 Linux 侧,这两点记住了基本不会踩大坑。环境搭好之后,剩下的精力就可以安心放在模型和算法上了,这才是正经事。