
1. 为什么要在 Windows 上折腾内核级 Linux 开发环境如果你是一个长期在 Windows 上做 AI 开发的工程师大概率经历过这样的纠结Windows 的桌面生态和办公软件确实舒服但一旦要跑训练脚本、装 CUDA、配各种 Python 依赖就总感觉隔了一层。早期大家用虚拟机性能损耗大GPU 直通配置复杂到让人想砸键盘后来有人干脆装双系统结果每次切换都要重启开发效率被切得稀碎。WSL2 的出现基本终结了这个纠结。它不是传统的虚拟机也不是简单的兼容层而是微软在 Windows 内核之上跑的一个真正的 Linux 内核。你可以在 Windows 里直接打开一个终端里面跑的是完整的 Ubuntu 用户态同时还能调用宿主机的 NVIDIA 显卡做 CUDA 计算。这意味着什么意味着你可以在 Windows 上写代码、用 Windows 的浏览器查文档同时在 Linux 环境里跑 PyTorch 训练而且 GPU 性能几乎不打折。这套方案特别适合几类人一是刚入门 AI、主力机器是 Windows 笔记本的学生和开发者二是公司配了 Windows 工作站但需要 Linux 工具链的工程师三是想在一台机器上同时兼顾日常办公和模型训练的独立开发者。我自己从 WSL1 时代就开始用到 WSL2 加上 GPU 直通成熟之后基本上把主力开发环境整个搬了进来踩过的坑和总结出来的配置方法正好借这篇整理一下。需要提前说明的是本文讲的是在 Windows 上搭建本地 AI 开发环境所有操作都在本机完成不涉及任何远程连接或网络代理相关的内容。下面从环境准备开始一步步把整套流程讲清楚。2. 环境准备版本、驱动与发行版选择的那些细节2.1 Windows 版本与 WSL2 的硬性门槛WSL2 对 Windows 版本有明确要求。你需要 Windows 10 版本 1903 及以上内部版本 18362 以上或者 Windows 11 任意版本。但这里有个很多人忽略的点即使你的系统版本号够了如果没开启虚拟化相关的功能WSL2 照样跑不起来。具体来说需要在 BIOS 里确认 CPU 虚拟化Intel VT-x 或 AMD-V已经开启然后在 Windows 功能里勾选虚拟机平台和适用于 Linux 的 Windows 子系统两个选项。我见过不少人卡在这一步装完 WSL 之后启动报错折腾半天才发现是 BIOS 里虚拟化没开。操作上用管理员权限打开 PowerShell执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启一次然后把 WSL2 设为默认版本wsl --set-default-version 2注意如果你之前装过 WSL1 的发行版升级到 WSL2 需要用wsl --set-version 发行版名 2单独转换转换过程会重建文件系统提前备份重要数据。2.2 发行版怎么选Ubuntu 是默认答案但不是唯一答案微软商店里能装的发行版很多Ubuntu、Debian、Fedora、openSUSE 都有。对 AI 开发来说我的建议是直接用 Ubuntu 的 LTS 版本比如 22.04 或 24.04。原因很实际NVIDIA 的 CUDA 工具链、PyTorch 官方 wheel、各种深度学习框架的文档默认都是围绕 Ubuntu 写的。你用 Debian 也能跑但遇到问题时网上能搜到的解决方案会少一大截。安装命令很简单wsl --install -d Ubuntu-22.04装完之后首次启动会让你设置用户名和密码这个用户是 Linux 侧的普通用户不是 root。这里有个经验用户名别用中文也别用带空格的否则后面配 SSH、跑脚本时容易出各种编码问题。2.3 显卡驱动的正确安装姿势这是整个流程里最容易出错的一环。很多人以为要在 WSL 里装 NVIDIA 驱动结果装完发现 GPU 根本识别不到。正确的做法是驱动只装在 Windows 宿主机上WSL 里不要装任何显卡驱动。Windows 侧去 NVIDIA 官网下载对应你显卡型号的驱动安装时选择自定义安装确保勾选核心驱动组件。装完之后在 WSL 里执行nvidia-smi如果能看到显卡型号、驱动版本、CUDA 版本这些信息说明直通已经生效。如果报command not found那大概率是 Windows 驱动没装好或者 WSL 版本不对。这里补充一个判断技巧WSL 里的nvidia-smi显示的驱动版本和 Windows 侧是一致的因为它是直接调用宿主机的驱动。CUDA 版本那一栏显示的是驱动支持的最高 CUDA 版本不代表你实际安装的 CUDA 版本这个区别后面配 PyTorch 时会用到。3. GPU 直通背后的机制为什么它比虚拟机方案更值得用3.1 WSL2 的架构决定了它的性能表现要理解 GPU 直通为什么在 WSL2 上能跑得这么好得先搞清楚它的架构。WSL2 本质上是一个轻量级的虚拟机微软在里面跑了一个经过定制的 Linux 内核但这个虚拟机的 I/O 和硬件访问做了大量优化。GPU 直通是通过一个叫 GPU-PVGPU Paravirtualization的技术实现的它把宿主机的 GPU 以半虚拟化的方式暴露给 Linux 内核。和传统虚拟机需要配置 PCI 直通不同WSL2 的 GPU 直通是微软和 NVIDIA 合作在驱动层面做好的你不需要手动配置任何硬件映射。这也是为什么它用起来这么简单——装好 Windows 驱动WSL 里就能直接用。性能上根据我自己的实测在 WSL2 里跑 PyTorch 训练相比原生 Linux 大概有 5% 到 15% 的性能损耗主要来自文件系统 I/O 和部分内核调用的开销。但相比传统虚拟机动辄 30% 以上的损耗这个数字已经非常可观了。对于大多数中小规模训练任务这个损耗完全可以接受。3.2 文件系统跨界的性能陷阱WSL2 有一个非常关键的性能特性Linux 文件系统和 Windows 文件系统之间的跨系统访问非常慢。具体来说从 WSL 里访问/mnt/c/...这样的 Windows 路径或者从 Windows 访问\\wsl$\...速度都会明显下降。这个特性对 AI 开发影响很大。因为训练数据往往很大如果你把数据集放在 Windows 的 D 盘然后在 WSL 里读取数据加载会成为瓶颈。我的做法是所有和训练相关的代码、数据、模型全部放在 WSL 的 Linux 文件系统里也就是/home/用户名/下面。Windows 侧只用来编辑代码和查资料。如果你确实需要从 Windows 访问 WSL 里的文件可以在文件资源管理器地址栏输入\\wsl$\Ubuntu-22.04\home\用户名但只建议用来查看不要用来做大量文件操作。3.3 内存和 CPU 资源的分配策略WSL2 默认会占用宿主机最多 50% 的内存这个默认值在跑大模型时经常不够用。你可以在用户目录下创建一个.wslconfig文件来调整[wsl2] memory32GB processors8 swap8GB这个文件放在 Windows 用户目录下比如C:\Users\你的用户名\.wslconfig。改完之后执行wsl --shutdown重启 WSL 生效。这里有个经验值内存分配不要超过物理内存的 70%否则 Windows 侧会开始频繁使用页面文件整体体验反而变差。CPU 核心数同理留一两个核心给 Windows 系统本身。我自己的机器是 64G 内存 16 核分配了 40G 和 12 核跑中等规模的模型训练很稳。4. CUDA 与深度学习框架的安装实操4.1 CUDA Toolkit 到底要不要装这个问题困扰过很多人。结论是如果你只用 PyTorch 或 TensorFlow 的官方 wheel不需要单独装 CUDA Toolkit。因为 PyTorch 的 wheel 里已经打包了运行所需的 CUDA 运行时库只要宿主机的驱动版本够新就行。但如果你需要编译自定义算子、用 nvcc 编译 CUDA 代码那就得装完整的 CUDA Toolkit。安装方式推荐用 NVIDIA 官方源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 sudo apt install cuda-toolkit-12-4注意这里的源地址是wsl-ubuntu不是普通的ubuntu这是 NVIDIA 专门为 WSL 准备的源。装完之后把 CUDA 路径加到环境变量里export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH写进~/.bashrc里持久化。4.2 PyTorch 安装的版本匹配逻辑PyTorch 安装最容易踩的坑是版本不匹配。你需要关注三个版本驱动支持的 CUDA 版本、PyTorch 编译时用的 CUDA 版本、以及你实际安装的 CUDA Toolkit 版本如果装了的话。判断方法很简单先跑nvidia-smi看右上角显示的 CUDA 版本比如显示 12.4那说明你的驱动最高支持 CUDA 12.4。然后去 PyTorch 官网的安装页面选择不超过这个版本的 CUDA 版本。比如选 CUDA 12.1 的 wheelpip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121装完之后验证import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果第一行输出 True第二行输出你的显卡型号就说明 GPU 环境配好了。注意不要用pip install torch直接装那样装的是 CPU 版本跑起来会发现cuda.is_available()返回 False白白浪费显卡。4.3 用 Conda 还是 venv 管理环境AI 开发的环境依赖复杂强烈建议用虚拟环境隔离。Conda 和 venv 都能用我的建议是如果你需要装很多非 Python 的依赖比如特定版本的 CUDA 库、编译工具用 Conda 更省心如果只是纯 Python 项目venv 更轻量。Conda 在 WSL 里的安装wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh装完之后创建环境conda create -n ai python3.10 conda activate ai这里有个细节Conda 环境里的 Python 版本要和 PyTorch 支持的版本匹配。目前 PyTorch 对 Python 3.10 和 3.11 支持最好3.12 有些库还没跟上建议用 3.10。5. 开发工作流的搭建从编辑器到终端5.1 VS Code 的远程开发配置在 WSL 里开发最顺手的编辑器是 VS Code 配合 WSL 扩展。装好扩展之后在 WSL 终端里进入项目目录执行code .VS Code 会自动以远程模式打开这个目录所有插件、终端、调试都在 Linux 侧运行。这个体验和原生 Linux 几乎没区别但你可以同时用 Windows 的字体渲染和窗口管理。我常用的插件组合是Python、Pylance、Jupyter、GitLens再加上一个 Remote - WSL。Jupyter 插件特别有用可以直接在 VS Code 里跑 notebook内核选 WSL 里的 Conda 环境。5.2 终端的选择与配置WSL 的终端我推荐用 Windows Terminal它支持多标签、分屏、自定义配色比默认的控制台好用太多。配置上把默认启动的 shell 设成 WSL 里的 zsh 或 bash再装个 oh-my-zsh 提升体验。如果你习惯用 tmux 做会话管理WSL 里也能正常跑。我一般会开三个 pane一个跑训练一个看 GPU 状态watch -n 1 nvidia-smi一个用来改代码和跑测试。这样切换起来很顺手。5.3 数据与模型的存放策略前面提过训练数据要放在 Linux 文件系统里。具体目录结构我一般这样组织/home/user/ projects/ # 代码 datasets/ # 数据集 checkpoints/ # 模型权重 envs/ # 虚拟环境数据集如果是从 Windows 下载的用cp命令从/mnt/c/...拷过来虽然拷贝过程慢但只慢一次后续读取就快了。模型权重同理训练完的 checkpoint 如果要分享给 Windows 侧的同事再拷回去就行。这里有个小技巧如果数据集特别大比如几百 G拷贝过程可能很久可以用rsync带进度显示rsync -avh --progress /mnt/c/Users/user/Downloads/dataset/ ~/datasets/6. 实际训练中的性能调优与常见问题6.1 数据加载成为瓶颈时的排查思路训练时如果发现 GPU 利用率上不去一直在 30% 以下波动大概率是数据加载拖了后腿。排查顺序是先看 CPU 利用率如果某个核心跑满说明是数据预处理的问题再看磁盘 I/O用iostat看读写速度。解决办法有几个一是把数据集转成更高效的格式比如把大量小图片打包成 LMDB 或 WebDataset二是增加 DataLoader 的num_workers一般设成 CPU 核心数三是用pin_memoryTrue加速 CPU 到 GPU 的数据传输。6.2 显存不足的几种应对方案显存不够是训练大模型时的常见问题。除了换更大的显卡还有几个实用技巧一是用梯度累积模拟大 batch把 batch size 设小累积几步再更新二是用混合精度训练torch.cuda.amp能省不少显存三是用梯度检查点牺牲一点速度换显存。如果这些都不够那就只能上模型并行或者 ZeRO 这类分布式策略了。不过在单卡 WSL 环境下前面几招基本能覆盖大部分场景。6.3 WSL 特有的坑与规避方法WSL2 有几个特有的问题需要注意。一是长时间训练时WSL 可能会因为内存回收机制导致进程被杀解决办法是在.wslconfig里设置swap并监控内存使用。二是 WSL 的时钟可能和宿主机不同步导致分布式训练时通信超时可以用sudo hwclock -s同步。三是 WSL 重启后 GPU 直通偶尔会失效执行wsl --shutdown再重进一般能解决。还有一个容易被忽略的点WSL2 的网络是 NAT 模式如果你要跑 TensorBoard 或者 Jupyter需要在 Windows 侧用localhost访问因为 WSL 的端口会自动转发到宿主机。但如果端口被占用转发会失败这时候换个端口就行。7. 我在这套环境里踩过的几个真实坑第一个坑是驱动版本。有次我图省事用 Windows 自动更新装的显卡驱动结果 WSL 里nvidia-smi能跑但 PyTorch 一调用 CUDA 就报错。后来去 NVIDIA 官网下了最新的 Game Ready 驱动重装才好。教训是AI 开发用的驱动一定要去官网手动装别用系统自动更新的。第二个坑是文件系统。早期我把代码放在 Windows 的 D 盘用 VS Code 远程打开结果每次保存文件都要等好几秒Git 操作也慢得离谱。后来把整个项目移到 Linux 侧瞬间流畅。这个坑我见很多新手都踩过本质是没理解 WSL2 跨文件系统的性能差异。第三个坑是 Conda 和系统 Python 的冲突。有次我在没激活 Conda 环境的情况下pip install装到了系统 Python 里结果和 Conda 环境里的包版本打架排查了半天。现在的习惯是每次开终端先conda activate确认环境对了再操作。第四个坑是内存配置。默认的 50% 内存在跑 BERT 这类模型时不够用训练到一半 OOM。后来在.wslconfig里调到 40G 才稳定。这个值要根据自己机器的物理内存来定没有万能数字。8. 关于这套环境的一些个人体会用 WSL2 做 AI 开发这几年最大的感受是它把 Windows 和 Linux 各自的优势真正捏到了一起。你不需要为了跑模型去忍受 Linux 的桌面环境也不需要为了用 Windows 软件去折腾双系统。GPU 直通成熟之后性能损耗已经小到可以忽略对于个人开发者和中小团队来说这是目前性价比最高的方案。当然它也不是万能的。如果你要做多卡训练、需要特定的内核模块、或者对 I/O 延迟极其敏感那还是得上原生 Linux。但对绝大多数日常的模型开发、调试、小规模训练任务WSL2 完全够用而且省心。最后分享一个我常用的检查清单每次配新机器时按这个顺序走一遍基本不会出问题先确认 BIOS 虚拟化开启再装 Windows 显卡驱动然后装 WSL2 和 Ubuntu接着配.wslconfig调资源再装 Conda 和 PyTorch最后用nvidia-smi和torch.cuda.is_available()双重验证。这套流程走下来半小时内就能从零搭好一个可用的 AI 开发环境。