WSL2 搭建 AI 开发环境:GPU 直通与 PyTorch 配置实战 1. 为什么我最终把 AI 开发环境整体搬进了 WSL2我折腾 AI 开发环境这件事前后大概有三年多时间。最早是在 Windows 上直接装 Python、装 CUDA、装 PyTorch后来换成双系统再后来试过纯 Linux 主机最后才稳定在 WSL2 这套方案上。说实话一开始我对 WSL2 是有点偏见的觉得它就是个加强版虚拟机跑跑命令行还行真要做 GPU 计算、大模型微调这种重活肯定不靠谱。但实际用下来尤其是 WSL2 支持 GPU 直通之后我的看法彻底变了。现在我这台机器上的状态是Windows 11 作为日常办公和娱乐的主系统WSL2 里跑着一个 Ubuntu 22.04PyTorch、CUDA、cuDNN 全部装好显卡直通可用训练和推理都能正常跑。需要写代码的时候我用 VS Code 通过 Remote-WSL 连进去体验和原生 Linux 几乎没差别。这套方案最大的好处是我不用再为了跑一个深度学习项目去重启电脑切换系统也不用忍受纯 Linux 桌面在办公场景下的各种别扭。这篇文章我想聊的就是这套环境的完整搭建过程。核心关键词是WSL2、Linux、GPU、PyTorch、CUDA我会从整体设计思路讲起然后拆解每一个关键环节包括 WSL2 的安装和迁移、Ubuntu 镜像的选择、GPU 直通的原理和配置、CUDA 和 PyTorch 的版本匹配、常见报错的排查方法。适合的读者是手上有一台带 NVIDIA 显卡的 Windows 机器想跑深度学习但不想折腾双系统的人或者已经在用 WSL2 但 GPU 一直没跑通的人再或者是从 conda 环境迁移过来、对 Linux 命令不太熟的新手。我尽量把每一步的为什么讲清楚而不是只给一串命令让你抄。因为环境配置这件事最怕的就是照抄命令但不知道原理一旦报错就完全懵了。下面进入正题。2. 整体方案设计与选型思路拆解2.1 为什么是 WSL2 而不是双系统或纯 Linux先说说我为什么放弃了双系统。双系统的问题在于切换成本太高。我白天要处理文档、开会、用一些 Windows 独占的软件晚上想跑个模型训练就得重启切到 Linux。训练跑完了想回 Windows 干点别的又得重启。一天来回切几次光重启就浪费不少时间。而且双系统下两个系统的文件系统是隔离的数据同步很麻烦。纯 Linux 主机我也试过。桌面环境用起来确实流畅但办公软件的兼容性、外设驱动、某些行业软件的缺失都是实打实的痛点。我不是没想过一台 Linux 主机 一台 Windows 笔记本的方案但成本高而且两台机器之间同步数据也麻烦。WSL2 的好处在于它把两边的优势捏在了一起。它本质上是运行在 Windows 上的一个轻量级虚拟机跑的是真正的 Linux 内核不是早期 WSL1 那种系统调用翻译层。这意味着它的兼容性和原生 Linux 基本一致Docker、systemd、各种 Linux 工具都能正常跑。同时它和 Windows 的文件系统可以互相访问剪贴板共享网络也打通了。最关键的是从 WSL2 开始微软和 NVIDIA 合作做了 GPU 直通显卡可以在 WSL2 里直接调用。提示WSL1 和 WSL2 是完全不同的架构。WSL1 是系统调用翻译没有真实 Linux 内核GPU 支持基本没有。做 AI 开发必须用 WSL2不要在这上面走弯路。2.2 GPU 直通的原理为什么 WSL2 能用到显卡很多人好奇WSL2 是个虚拟机虚拟机怎么能直接用到物理显卡这背后靠的是GPU 半虚拟化GPU-PV技术。简单说Windows 主机上的显卡驱动会把 GPU 的计算能力通过一个虚拟化层暴露给 WSL2 里的 Linux 内核。WSL2 里不需要装完整的显卡驱动只需要装一个特殊的用户态驱动库libcuda 等它会把 CUDA 调用转发给 Windows 侧的驱动去执行。这个设计的好处是你不需要在 WSL2 里装 NVIDIA 的完整驱动包。Windows 侧装好驱动WSL2 侧装好 CUDA Toolkit 就够了。这也是为什么很多人按老教程在 WSL2 里装驱动会出问题——方向就错了。我用一个生活化的类比来解释Windows 侧的驱动像是总调度中心它认识你的显卡WSL2 侧的 CUDA 库像是驻外办事处它不直接管显卡而是把请求转给总调度中心。两边配合GPU 计算就跑起来了。2.3 版本匹配整套环境里最容易翻车的地方环境配置里最容易出问题的不是安装步骤而是版本匹配。CUDA、显卡驱动、PyTorch 三者之间有严格的对应关系错一个版本就可能出现能 import 但一跑就报错或者根本检测不到 GPU的情况。我的经验是先确定显卡驱动版本再根据驱动版本确定能用的最高 CUDA 版本最后根据 CUDA 版本选 PyTorch。这个顺序不能反。下面这张表是我整理的常见对应关系供参考显卡驱动版本区间支持的最高 CUDA推荐 PyTorch 版本备注525.x 及以上CUDA 12.xPyTorch 2.1新卡首选515.xCUDA 11.7PyTorch 1.13 / 2.0稳定组合510.xCUDA 11.6PyTorch 1.12老环境470.xCUDA 11.4PyTorch 1.10兼容性优先注意这张表是经验值实际以 NVIDIA 官方文档和 PyTorch 官网的匹配表为准。装之前一定去官网核对一遍别嫌麻烦。3. WSL2 安装与 Ubuntu 镜像部署实操3.1 开启虚拟化与安装 WSL2 的完整步骤安装 WSL2 现在比几年前简单太多了一条命令基本能搞定。但前提是你的机器要满足几个条件CPU 支持虚拟化Intel VT-x 或 AMD-VBIOS 里开启了虚拟化Windows 版本足够新Win10 2004 或 Win11。第一步确认虚拟化已开启。打开任务管理器切到性能标签看 CPU 那一栏有没有虚拟化已启用。如果没有需要进 BIOS 开启。这一步很多人会忽略结果后面 WSL2 死活起不来。第二步用管理员权限打开 PowerShell执行安装命令wsl --install这条命令会自动帮你开启适用于 Linux 的 Windows 子系统和虚拟机平台两个功能然后下载并安装 WSL2 内核和默认的 Ubuntu 发行版。装完之后重启电脑。如果你想要指定发行版可以先看看有哪些可选wsl --list --online然后指定安装比如 Ubuntu 22.04wsl --install -d Ubuntu-22.04我推荐用 Ubuntu 22.04 而不是 24.04原因是 22.04 的生态兼容性目前最成熟很多 CUDA 和 PyTorch 的官方文档都是基于它写的踩坑概率低。24.04 虽然新但有些库的适配还没跟上。3.2 把 WSL2 迁移到 D 盘C 盘空间保卫战默认情况下WSL2 的虚拟磁盘文件ext4.vhdx会放在 C 盘的用户目录下。这个文件会随着你装环境、下模型不断膨胀几十个 G 是常态上百 G 也不稀奇。C 盘空间紧张的人一定要把它迁到别的盘。迁移的思路是先导出再导入到新位置最后删掉旧的。具体操作如下。先关闭 WSLwsl --shutdown查看当前发行版名称wsl --list --verbose导出到指定文件比如 D 盘wsl --export Ubuntu-22.04 D:\wsl\ubuntu2204.tar注销原来的发行版wsl --unregister Ubuntu-22.04导入到新位置wsl --import Ubuntu-22.04 D:\wsl\ubuntu2204 D:\wsl\ubuntu2204.tar --version 2导入完成后默认登录用户会变成 root。想改回普通用户需要修改配置文件。在 WSL2 里执行sudo nano /etc/wsl.conf写入以下内容[user] default你的用户名保存后退出在 PowerShell 里执行wsl --shutdown重启即可。提示导出前记得把重要数据备份一下。虽然导出导入一般不会丢数据但万一中途出错有个备份心里踏实。3.3 首次进入后的基础配置第一次进入 Ubuntu先更新软件源sudo apt update sudo apt upgrade -y然后装一些基础工具这些后面都会用到sudo apt install -y build-essential git curl wget vim python3-pip python3-venv这里有个细节Ubuntu 22.04 自带的 Python 是 3.10这个版本对 PyTorch 2.x 是友好的不用特意去换。但如果你有项目需要特定 Python 版本建议用 conda 或者 pyenv 来管理不要动系统自带的 Python否则容易把系统工具搞坏。另外WSL2 默认没有配置 systemd有些服务起不来。如果你需要 systemd比如跑 Docker可以在/etc/wsl.conf里加上[boot] systemdtrue然后重启 WSL。这个配置看需求不是必须的。4. GPU 直通配置与 CUDA 环境搭建4.1 Windows 侧驱动只装这一个就够了GPU 直通的第一步是在 Windows 侧装好 NVIDIA 显卡驱动。这里有个关键点WSL2 里的 CUDA 支持依赖的是 Windows 侧的驱动不是 Linux 侧的驱动。所以你要做的是去 NVIDIA 官网下载 Windows 版的显卡驱动装好。装完之后在 PowerShell 里执行nvidia-smi如果能正常输出显卡信息说明 Windows 侧驱动没问题。这一步是基础Windows 侧都跑不通WSL2 里更别想。注意千万不要在 WSL2 里再装一遍 Linux 版的 NVIDIA 驱动。很多人按网上老教程在 WSL2 里apt install nvidia-driver-xxx结果把环境搞崩。WSL2 里只需要装 CUDA Toolkit驱动由 Windows 侧提供。4.2 在 WSL2 里验证 GPU 是否可见Windows 侧驱动装好后进入 WSL2执行nvidia-smi如果能看到显卡信息说明 GPU 直通已经生效。如果报command not found说明 WSL2 里还没装 CUDA 工具或者驱动没装好。如果报其他错误比如Failed to initialize NVML通常是 Windows 侧驱动版本太老或者 WSL2 内核版本太低。我遇到过一种情况nvidia-smi在 Windows 里正常在 WSL2 里却报错。排查下来是 WSL2 内核太旧执行wsl --update更新内核后就好了。所以遇到问题先更新 WSL2能解决一大半。4.3 CUDA Toolkit 安装用官方源而不是 apt 默认源CUDA Toolkit 的安装我强烈建议用 NVIDIA 官方源而不是 Ubuntu 自带的 apt 源。自带源里的版本往往偏旧而且和 PyTorch 的匹配容易出问题。先下载并安装官方源的配置包。以 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 update然后安装 CUDA Toolkitsudo apt 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能输出版本信息就说明装好了。提示WSL2 专用的 CUDA 源地址是wsl-ubuntu不是普通的ubuntu。用错源会导致装出来的包不兼容 WSL2。这个细节很多人会踩坑。4.4 版本选择的一个实操判断方法怎么确定该装哪个 CUDA 版本我的方法是先看 Windows 侧nvidia-smi右上角显示的CUDA Version这个数字是驱动支持的最高 CUDA 版本。然后在这个范围内选一个 PyTorch 官方支持的版本。比如nvidia-smi显示 CUDA Version 12.4那你可以装 12.1、12.2、12.3、12.4 中的任意一个。但 PyTorch 官网可能只提供到 12.1 的预编译包那你就装 12.1稳妥。不要盲目追新。CUDA 版本不是越新越好关键是和 PyTorch 匹配。装一个 PyTorch 官方明确支持的版本比装最新版省心得多。5. PyTorch 环境搭建与 GPU 验证5.1 用 conda 还是 venv我的选择Python 环境管理conda 和 venv 各有拥趸。我现在的做法是用 conda 管理 Python 版本和 CUDA 相关的库用 pip 装 PyTorch。原因是 conda 在处理 CUDA、cuDNN 这类二进制依赖时更省心而 PyTorch 官方推荐的安装方式又是 pip。先装 Minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh一路回车装完后source ~/.bashrc。然后创建环境conda create -n pytorch python3.10 -y conda activate pytorch注意很多人会遇到conda: 无法将conda项识别这种报错通常是环境变量没配好或者装完之后没重新加载 shell。执行source ~/.bashrc或者重开终端一般能解决。5.2 PyTorch 安装认准官方命令生成器PyTorch 的安装命令不要凭记忆写去官网的Get Started页面按你的环境选好选项它会生成对应的命令。以 CUDA 12.1 为例生成的命令大概是pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121这里的关键是--index-url参数它指定了从 PyTorch 的 CUDA 专用源下载而不是默认的 PyPI。默认源里的 PyTorch 是 CPU 版本装了也用不了 GPU。装完之后验证import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果is_available()返回 Trueget_device_name能打印出你的显卡型号那就大功告成了。5.3 一个完整的验证脚本光看is_available还不够我习惯跑一个小的矩阵运算确认 GPU 真的在干活import torch import time device torch.device(cuda if torch.cuda.is_available() else cpu) print(fUsing device: {device}) x torch.randn(5000, 5000).to(device) y torch.randn(5000, 5000).to(device) start time.time() z torch.matmul(x, y) torch.cuda.synchronize() print(fMatrix multiply took {time.time() - start:.4f} seconds) print(fResult device: {z.device})如果这段代码能跑完并且z.device显示 cuda说明 GPU 计算链路完全打通。跑的时候可以开个nvidia-smi -l 1在另一个终端盯着能看到显存占用和 GPU 利用率上去就实锤了。6. 常见问题排查与避坑经验实录6.1 问题速查表我把这几年踩过的坑整理成一张表遇到问题可以先对照排查现象可能原因解决方向WSL2 启动报尚未准备就绪虚拟化未开启 / 内核过旧检查 BIOS 虚拟化执行 wsl --updatenvidia-smi 在 WSL2 里找不到未装 CUDA 工具 / 驱动问题装 CUDA Toolkit检查 Windows 驱动torch.cuda.is_available() 为 False装了 CPU 版 PyTorch用官方 CUDA 源重装训练时报 CUDA out of memory显存不足 / 未释放减小 batch size手动清缓存import torch 报 libcudart 错误CUDA 版本不匹配核对 CUDA 与 PyTorch 版本conda 命令找不到环境变量未加载source ~/.bashrc 或重开终端训练速度异常慢实际跑在 CPU 上检查 tensor 是否 .to(device)6.2 显存管理WSL2 下的一个特殊坑WSL2 有个特点它不会自动把不用的显存还给 Windows。也就是说你在 WSL2 里跑完一个模型显存可能还被占着Windows 侧想玩游戏或者跑别的 GPU 任务就没显存了。解决办法是执行wsl --shutdown彻底关掉 WSL2显存就释放了。另外可以在 Windows 用户目录下建一个.wslconfig文件限制 WSL2 能用的资源[wsl2] memory32GB processors16 swap8GB这个配置能防止 WSL2 把整机内存吃光。我建议内存给到物理内存的一半左右留一半给 Windows。6.3 文件系统性能别在 /mnt 下跑训练WSL2 访问 Windows 文件系统/mnt/c、/mnt/d的性能比访问 Linux 原生文件系统~/下慢很多。如果你把数据集和代码放在/mnt/d下训练时的数据读取会成为瓶颈。我的做法是代码和数据都放在 WSL2 的原生目录下比如~/projects需要和 Windows 交换文件时再用/mnt。VS Code 通过 Remote-WSL 连进来编辑的也是原生目录下的文件体验很顺。提示如果数据集特别大又不想占 WSL2 的空间可以考虑用符号链接但性能问题依然存在。最稳的还是放在原生目录。6.4 几个我踩过的具体坑第一个坑是 CUDA 版本装太高。有次我图新鲜装了最新的 CUDA结果 PyTorch 没有对应的预编译包只能自己编译折腾了一整天没成功。后来退回官方支持的版本十分钟搞定。教训就是跟着 PyTorch 的节奏走别自己当先锋。第二个坑是 conda 和 pip 混用导致的依赖冲突。我在 conda 环境里既用 conda 装包又用 pip 装包结果 numpy 版本冲突import 就报错。现在的做法是PyTorch 相关的用 pip其他基础库尽量用 conda并且装之前先conda list看看有没有重复。第三个坑是 WSL2 的时钟漂移。长时间休眠后唤醒WSL2 里的时间可能和实际时间对不上导致一些依赖时间戳的操作出错。解决办法是执行sudo hwclock -s同步时间或者干脆重启 WSL2。7. 这套环境跑起来之后的一些实际体会环境搭好只是开始真正用起来还有一些细节值得说。我现在这套配置跑 7B 级别的大模型微调用 LoRA 的话24G 显存的卡基本够用。推理的话量化之后更宽松。日常写代码用 VS Code 的 Remote-WSL终端用 Windows Terminal整体体验和原生 Linux 没差。有一点要提醒的是WSL2 的 GPU 直通虽然好用但并不是所有 CUDA 特性都完整支持。比如某些底层的性能分析工具、多卡通信的一些高级功能在 WSL2 下可能有限制。如果你做的是多卡分布式训练或者需要极致的性能调优原生 Linux 还是更稳妥。但对于绝大多数单卡开发、调试、中小规模训练的场景WSL2 完全够用。最后分享一个小技巧我会给 WSL2 环境做一个快照备份。方法是把整个发行版导出成 tar 文件存起来环境搞崩了直接导入恢复比重新配一遍快得多。命令就是前面迁移时用的wsl --export定期执行一次心里踏实。这套环境我用了两年多中间重装过几次每次靠备份恢复省了大量时间。