☰
WSL2 GPU直通全指南:Windows下高效搭建AI开发环境
2026/10/7 14:17:26 网站建设 项目流程

这两年做AI开发,绕不开一个选择:到底用 Windows 还是 Linux?如果手头只有一台带 NVIDIA GPU 的 Windows 电脑,又不想装双系统、不想每天在虚拟机里卡顿着训练模型,那 WSL2 + GPU 直通这条路,几乎是我试过最接近“鱼和熊掌兼得”的方案。

先说人话:WSL2 是一个跑在 Windows 里的“内核级 Linux”,而 GPU 直通让你在 Linux 里能用上 Windows 侧的真实显卡跑 CUDA、训练 PyTorch、跑 Docker 镜像。对我这种常年写 Python、偶尔要训模型的人,它解决了两个痛点:一是不用重启切系统,二是 AI 框架跑在 Linux 里,行为更接近服务器端生产环境。这篇文章我用实际操作记录的方式,把 WSL2 的架构原理、GPU 转发机制、从零搭建 AI 环境的步骤,以及我踩过的坑完整写下来,适合想在 Windows 上做 AI 开发、又对双系统心存犹豫的朋友参考。

1. 先搞清楚:WSL2 是“内核级 Linux”,不是什么容器

很多人第一次接触 WSL2,以为它就是“Windows 里的 Linux 模拟器”,或者干脆理解成“一个增强版命令提示符”。这个理解离真相很远。WSL2 的本质是微软在 Hyper-V 虚拟化平台上运行的一个轻量级虚拟机(Utility VM),虚拟机里面跑的是一个完整的、真实的 Linux 内核,所以标题里才强调“内核级 Linux”。这句话对 AI 开发非常关键,因为像 CUDA 用户态组件、Docker 的 overlay 文件系统、systemd 服务,甚至部分内核模块,都要求你有真实内核,而不是一个模拟兼容层。

WSL1 和 WSL2 的区别,可以打个比方。WSL1 是一个“翻译官”,把 Linux 程序的系统调用一句一句翻译成 Windows 内核能听懂的话,翻译能力有限,遇到那些和内核高频交互的程序,比如需要加载内核模块的 GPU 驱动栈,就完全没法用。WSL2 则是直接在你家里装了个小客厅,请来了一个完整的 Linux 内核住进去,它自己说自己的语言,Windows 负责提供房间和基础设施。客厅的门窗做得比较好,所以你能直接在 Windows 文件管理器里访问 Linux 文件,也能在 Linux 里访问 C 盘 D 盘。

1.1 为什么 AI 开发更适合 WSL2

传统虚拟机(比如 VMware Workstation、VirtualBox)也能装 Linux,也能跑深度学习,但它们的图形和 GPU 加速链路太长了。用虚拟显卡(virtio-gpu)跑 CUDA 基本不可行,你必须做 GPU 直通或 vGPU 拆分,门槛高、配置复杂,而且一旦直通,Windows 宿主机就没了这块显卡,没法同时用显示器输出。WSL2 的模型完全不同:Linux 和 Windows 共享同一块 GPU,Windows 侧安装好官方显卡驱动之后,WSL2 里直接就能调用 CUDA。我实际训练一个 ResNet 时,速度几乎和原生 Linux 机器没有体感差异,这一点传统虚拟机根本做不到。

如果你对“WSL2 是虚拟机”这个说法有顾虑,其实不用担心性能。微软为了让它在开发者场景里“启动快、内存占用低”,做了很多优化:WSL2 的 VM 启动只要一两秒,内存可以动态回收,磁盘文件直接以 vhdx 虚拟磁盘形式挂载,和 Windows 的文件共享又有高性能的 9P 协议支撑。对于日常开发、跑深度学习训练、写脚本,这个环境足够顺滑。

1.2 部署前要满足的软硬件条件

在开始搭建之前,先检查自己的机器是否满足条件。Windows 10 2004 及以上版本(推荐 Windows 11),这是硬性门槛。电脑的 CPU 虚拟化必须在 BIOS 中开启,Intel 叫 VT-x,AMD 叫 SVM。可以在任务管理器“性能”标签里看“虚拟化”状态,如果显示“已启用”就行。内存建议 16GB 起步,因为 WSL2 默认会拿宿主机约 50% 的内存,你总得给 Windows 和浏览器留点余地。

显卡方面,NVIDIA 卡最省心,官方专门提供了 WSL2 驱动的 CUDA 支持,这也是当前 AI 生态最主流的路径。AMD 和 Intel 显卡并不是完全不能用,比如可以通过 DirectML 让 PyTorch/TensorFlow 跑在 GPU 上,但涉及大模型、微调这些场景还是不如 NVIDIA + CUDA 生态顺手。一个常见误区是:以为要在 WSL2 里安装 Linux 版 NVIDIA 驱动。不要这么做,WSL2 的驱动完全由 Windows 侧接管,Linux 内只需要用户态的 CUDA 工具包。这一点后面实操部分会反复强调。

2. GPU 直通原理:WSL2 是怎么把显卡“借”给 Linux 的

标题里有“GPU 直通”这个词,但我必须先澄清一个概念:WSL2 里的 GPU 加速,严格来说并不是传统虚拟机里的 PCIe 直通(Passthrough)。传统直通是把一块物理显卡整体切成独立设备,单独分配给某一个虚拟机,其它虚拟机彻底看不到显卡,宿主机的显示输出也可能受影响。WSL2 用的是微软提出的 GPU Paravirtualization(GPU 半虚拟化)方案。Linux 内核里运行的不是 NVIDIA 官方那个庞大的内核驱动,而是一个轻量的虚拟 GPU 驱动,叫 dxgkrnl。它不直接操作显卡寄存器,而是把 OpenGL、CUDA、DirectX 这些 API 请求打包起来,通过 /dev/dxg 设备节点转发给 Windows 侧的图形驱动,再由真正的显卡硬件完成计算。

打个好懂的比方:Linux 这边没有直接握着显卡,它把任务写在纸条上,通过一个专用窗口递给隔壁 Windows 房间里的显卡总管,显卡总管调度真实 GPU 干活,再把结果从窗口递回来。因为中间没有经过网络协议栈,也没有模拟硬件层的消耗,所以性能损耗被压得非常低。我在 Windows 11 + RTX 4070 上测试过,用 PyTorch 跑 1000 次矩阵乘法,WSL2 里的耗时和原生 Linux 机器几乎一致;只有在极高频率小请求的场景下,能感觉到几个百分点的延迟,日常训练模型完全感知不到。

2.1 Linux 侧和 Windows 侧各自负责什么

整个 GPU 调用链路大致是这样的:应用进程(如 Python + PyTorch)发起 CUDA 调用,进入 CUDA 用户态库;这些库不直接找 NVIDIA 内核模块,而是调用 /usr/lib/wsl/lib 下面的转发组件;组件通过 /dev/dxg 传递到 Windows 的图形内核;Windows 侧再调用 NVIDIA 官方驱动,真正把计算指令发给显卡。所以,在 WSL2 里你始终不需要、也不应该安装 Linux 原生的 NVIDIA 驱动。你只需要保证 Windows 侧显卡驱动是比较新的版本,因为 NVIDIA 从 512 系列开始,驱动里已经包含了对 WSL2 CUDA 的特殊支持层。

对开发者来说,这个设计最大的好处是“驱动统一”。宿主机显卡驱动升级好,WSL2 里的 CUDA 能力同步提升,不会出现 Linux 侧驱动和 Windows 侧驱动互相冲突的问题。我在很多群里见过朋友折腾 vGPU 直通,设置 IOMMU、找 BIOS 选项、改 GRUB 参数,折腾一下午最后还不稳定,而 WSL2 只需要装好 Windows 驱动,Linux 侧装 CUDA Toolkit 就能跑,这种开箱即用的体验确实是时代福利。

2.2 对 AI 开发的真实性能影响

性能问题永远是 AI 开发者的敏感点。我做了几轮快速测试,结论基本和社区主流反馈一致:WSL2 的 GPU 性能大约是原生 Linux 的 90%-95%。差别主要来源于系统调用转发那一层,纯计算密集型的矩阵运算几乎无损,涉及频繁小数据交换的算子可能慢一点。因为现代深度学习框架的核心运算早就是大矩阵、大张量,CPU 和 GPU 之间的同步频率相对不高,所以张量计算的主流任务感受不到明显损失。

这里穿插一个实战建议:如果团队里所有人都用 Linux,你也确实只做训练不写 Windows 桌面软件,那原生 Linux 双系统依然是理论峰值最优。但如果你像我一样,PPT、钉钉、PDF、PS 都离不开 Windows,又偶尔要训模型,WSL2 是综合效率最高的妥协方案。它解决了“切换成本”和“环境一致性”这两个矛盾,让 Windows 成为一台既能办公又能训模型的二合一工作站。

3. 实操:手把手在 WSL2 里搭一个 AI 开发环境

讲完原理,进入真正可复现的操作步骤。建议照着顺序执行,遇到问题先看第 4 节,那里集中了我这次整理环境时踩过的坑。

3.1 安装 WSL2 并装好 Ubuntu 22.04

如果你用的是 Windows 11,安装过程已经被微软简化到一条命令。以管理员身份打开 PowerShell,执行:

wsl --install -d Ubuntu-22.04

这条命令会同时启用 WSL 功能、虚拟机平台,并安装 Ubuntu-22.04 发行版。装完重启,系统会提示设置 Linux 用户名和密码。用户名不会影响文件路径权限,但我建议不要设得太复杂,后面会经常在终端里使用。

如果你的 Windows 10 版本较老,或者开了 WSL 但并不是 2 代,需要手动启用两个 Windows 功能:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

操作完重启,再执行:

wsl --set-default-version 2

这个命令把 WSL 默认版本切到 2 代。如果想确认当前发行版是几代,用:

wsl -l -v

输出里如果 VERSION 一列是 2,说明没问题。如果是 1,就用wsl --set-version <发行版名> 2升级。

这里有一个很多新手栽跟斗的地方:Ubuntu 装完后,默认安装目录在 C 盘。WSL2 的虚拟磁盘会随着你 pip install、拉取 Docker 镜像、存放模型权重而疯狂膨胀。我建议一开始就把发行版挪到 D 盘。做法是先导出,再导入:

  1. 在 PowerShell 里关闭 WSL:wsl --shutdown。
  2. 导出当前系统:wsl --export Ubuntu-22.04 D:\wsl\ubuntu-22.04.tar。
  3. 注销原系统:wsl --unregister Ubuntu-22.04。
  4. 导入到 D 盘:wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\wsl\ubuntu-22.04.tar --version 2。
  5. 如果导入后默认用户变成了 root,可以用ubuntu2204.exe config --default-user 你的用户名改回来,或者在/etc/wsl.conf里加[user] default=你的用户名。

我建议把.wslconfig也一并配好,否则 WSL2 默认内存限制可能不够训练用。在C:\Users\你的用户名\.wslconfig文件里写:

[wsl2] memory=12GB processors=8 swap=4GB localhostForwarding=true

改完记得wsl --shutdown再重新进入 WSL2,配置才生效。内存别贪多,Windows 本身留 4-8GB 才不卡。

进入 Ubuntu 后,先更新 apt 源。我个人习惯把 Ubuntu 源换成国内镜像,否则 apt 下载速度会非常锻炼耐心。更新/etc/apt/sources.list,把archive.ubuntu.com替换成你信任的镜像站域名即可,然后执行:

sudo apt update && sudo apt upgrade -y

基础环境装完后,安装常用的开发工具链:

sudo apt install -y build-essential git curl wget unzip

3.2 在 Windows 侧安装 GPU 驱动,在 WSL2 内安装 CUDA

GPU 驱动是 Windows 侧的事,先去 NVIDIA 官网下载最新的 GeForce Game Ready 或 Studio 驱动,安装过程无脑下一步就行。只要驱动版本比较新,就自带 WSL2 的 CUDA 支持层。装完重启电脑,这是很多人会忽略的一步。

重启之后进入 WSL2,在终端里直接敲:

nvidia-smi

如果出现了类似 NVIDIA-SMI 的驱动信息表格,说明 GPU 转发链路已经打通了。如果提示找不到命令,先执行一下:

export PATH=/usr/lib/wsl/lib:$PATH nvidia-smi

后面会讲如何把这个路径写到~/.bashrc。如果现在还是看不到显卡,别急着装 CUDA,先检查 Windows 侧驱动安装是否正确,或者看第 4 节里的排查方法。

确认 GPU 可见后,安装 CUDA Toolkit。NVIDIA 为 WSL2 提供了专属的 WSL-Ubuntu 软件源,不要用普通 Ubuntu 的通用源。按官方文档顺序:

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 -y cuda-toolkit-12-4

安装完成后,把 CUDA 的 bin 目录加入 PATH。编辑~/.bashrc,追加:

export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

然后source ~/.bashrc,敲:

nvcc --version

能看到 CUDA 版本号,就说明 CUDA 工具链装好了。这里有个比较常见的误区:安装 CUDA 的时候,终端会输出“你还需要安装 NVIDIA Linux 驱动”的提示。在 WSL2 里可以忽略这条,千万不要手贱去安装 Linux 版 NVIDIA 驱动。一旦装了,反而会覆盖掉/dev/dxg的转发链路,导致 GPU 消失。

3.3 安装并验证 PyTorch / TensorFlow

接下来是 AI 开发者最关心的一步:跑通 PyTorch 的 GPU 调用。我习惯用 Miniconda 管理 Python 环境,因为训练项目经常要切换 Python 版本和 CUDA 版本。下载并安装 Miniconda:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh

安装时一路回车,最后把 conda 初始化到~/.bashrc。新建一个虚拟环境:

conda create -n ai python=3.11 -y conda activate ai

安装 PyTorch。这里建议从 PyTorch 官网的安装命令生成器里复制对应 CUDA 版本的指令。比如 CUDA 12.4 可以用:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

装完后写一段验证代码,确认 GPU 真的被 PyTorch 看到了:

import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) x = torch.randn(1000, 1000, device='cuda') y = torch.matmul(x, x) print(y.sum().item())

如果输出里torch.cuda.is_available()是 True,并且能看到你的显卡型号,那基本可以欢呼了。TensorFlow 用户也类似,先确认 CUDA 环境已就绪,然后:

pip install tensorflow[and-cuda]

验证:

import tensorflow as tf print(tf.config.list_physical_devices('GPU'))

能看到 GPU 设备,说明安装成功。

这里再分享一个我吃过亏的细节:不要把你的训练数据集和代码放在/mnt/c/、/mnt/d/这类 Windows 挂载目录里跑。WSL2 访问 Windows 文件系统走的是 9P 协议,单线程小文件读写很慢,数据加载会成为训练瓶颈。正确做法是把代码和数据放到 WSL2 自己的文件系统里,比如~/projects/,Windows 侧的文件通过从 WSL2 里挂载或复制进去,或者直接在 VS Code 里通过 Remote-WSL 打开 WSL2 内部的目录。

3.4 用 Docker 把 AI 环境隔离起来

如果你像我一样同时研究多个项目,每个项目的依赖版本各不相同,直接在系统里装来装去迟早出事。这时候推荐引入 Docker,让 WSL2 成为 Docker 的容器运行时。两种方式任选:第一种是在 Windows 上安装 Docker Desktop,并在设置里启用 WSL 2 based engine,然后在 WSL2 Ubuntu 中把 Docker Desktop 的集成开关打开;第二种是彻底不使用 Docker Desktop,直接在 WSL2 里安装 Docker Engine,有些开发者认为这样更轻、更可控。

我更推荐第二种方式,因为它让 Linux 环境更纯粹。安装 Docker Engine 的命令在 Docker 官网有完整版,核心步骤如下:

curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER sudo systemctl enable docker sudo systemctl start docker

然后安装 NVIDIA Container Toolkit,让 Docker 容器可以访问 GPU:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt update sudo apt install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker

验证容器 GPU 能力:

docker run --rm --gpus all nvidia/cuda:12.4.1-devel-ubuntu22.04 nvidia-smi

看到显卡信息就说明容器已经能访问 GPU。之后你可以选一个适合自己的 PyTorch Docker 镜像,比如pytorch/pytorch:2.4.0-cuda12.4-cudnn9-devel,这样每个项目都有独立的 CUDA 版本、Python 版本和依赖环境,再也不怕把宿主机弄脏。

4. 常见问题与排查技巧实录

写这篇博文前,我又专门用一台全新的 Windows 机器把流程走了一遍,记录下最容易翻车的几个环节。这里不按官方文档讲,都是实际操作中我会优先怀疑的方向。

4.1 “WSL2 尚未准备就绪”或安装后无法启动

这个问题一般在老 Windows 10 上出现。症状是运行wsl时报错“WSL2 尚未准备就绪”。我刚才在 1.2 节提过,需要手动启用“虚拟机平台”和“Linux 子系统”功能。即使你已经启用了,也可能出现功能虽然勾选但 Windows 没真正生效的情况,建议把两个功能都用 PowerShell 强制启用一次:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -All Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All

然后重启。如果还不行,检查 BIOS 里的虚拟化开关是否打开。开机进入 BIOS 通常不容易描述,所以先看 Windows 侧systeminfo输出中“Hyper-V 要求”那一段是否为“是”。如果某个项目显示“否”,基本就是 BIOS 虚拟化被关了。

我遇到过一种隐蔽情况:电脑原来装过老版本的 WSL 内核,后来 Windows 更新把功能模块弄坏了。解决方法是更新 WSL 内核:

wsl --update

如果在线更新一直卡住,可以从微软官网手动下载 WSL2 内核安装包(wsl_update_x64.msi)离线安装。要是遇到下载慢的问题,建议早上网络空闲时操作,个人实测成功率更高。

4.2 nvidia-smi 找不到:显卡去哪了

这个问题的排查优先级就是一句话:“Windows 驱动没就绪的时候,WSL2 里永远也别想看到 GPU。”先回到 Windows 下,打开设备管理器,看看显卡是否正常。如果显卡旁边有黄色感叹号,先解决 Windows 驱动问题。如果驱动是好的,再在 WSL2 里检查:

ls /usr/lib/wsl/lib/

确认目录里有没有nvidia-smi、libcuda.so这些文件。如果没有,很可能是 WSL2 内核版本太老,执行wsl --update后重启 WSL2。

如果文件存在但命令找不到,把路径加到~/.bashrc:

export PATH=/usr/lib/wsl/lib:$PATH export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH

另外务必检查你是否在 WSL2 里装过 Linux 版 NVIDIA 驱动。这个坑我在第 3.2 节提醒过,如果lsmod | grep nvidia有输出,说明你装错了。需要卸载掉nvidia-driver-xxx,然后wsl --shutdown再重启,让/dev/dxg链路恢复正常。

还有一个很常见的情况:Windows 驱动在nvidia-smi正常,但 WSL2 里nvidia-smi显示 CPU 版信息或者报 CUDA 错误。多半是因为 WSL2 的 CUDA 用户态库版本和 Windows 驱动不配套。NVIDIA 官方建议是不管 WSL2 里 CUDA Toolkit 装什么版本,Windows 驱动都尽量升级到最新。我一般是先升级 Windows 驱动,再进 WSL2 里重装一次 CUDA Toolkit。

4.3 训练时内存不足、显存不够怎么办

WSL2 默认内存限制不是无限的,而且和你 Windows 物理内存有关系。如果你发现程序 OOM,先看.wslconfig是否配置正确。我之前有一台 32GB 内存的机器,默认只给 WSL2 分配了 8GB 左右,训练时直接把 PyTorch 的内存吃到爆。改成memory=20GB之后,问题立刻缓解。注意设置值不要超过物理内存的 75%,否则 Windows 本身会变得很卡。

显存和内存不一样,WSL2 无法为 GPU 显存做配额,它直接共享 Windows 正在使用的整块显存。如果你在 Windows 开着很多占用显存的应用,比如浏览器硬件加速、游戏、渲染软件,WSL2 里的可用显存就会减少。训练前最好把无关应用关掉,然后运行:

nvidia-smi -l 1

实时观察显存占用。如果训练中爆了 OOM,有几个实用办法:降低 batch size、减少模型输入分辨率、打开梯度累积、使用torch.cuda.empty_cache()定期清理缓存的显存,或者检查数据加载时是不是在 Python 进程里堆积了太多 CUDA context。

4.4 C 盘空间莫名变大,怎么迁移或瘦身

WSL2 的 vhdx 磁盘文件会自动扩张,但不会自动收缩。你反复搭建环境、pip 装包、下载模型权重,C 盘空间可能会被撑到几十甚至上百 GB。对付这个问题有两个办法。

第一个办法是导出导入迁移到 D 盘,步骤我在 3.1 已经写过。这里强调一点:迁移之前先清理不用的包,比如 conda 里的临时缓存、pip 缓存和 Docker 镜像,否则导出的 tar 会很大。清理命令:

conda clean -a pip cache purge docker system prune -a -f

第二个办法是压缩 vhdx 文件。关闭 WSL2 后,以管理员身份打开命令提示符,进入 WSL 的虚拟磁盘目录,用 diskpart 压缩。步骤有点繁琐,我更喜欢直接迁移,因为迁移的同时还能把系统整理一遍。

实际操作中,迁移后如果 Ubuntu 默认用户变 root,常用软件路径和当前用户权限会有些别扭。解决办法是编辑 WSL 发行版根目录下的/etc/wsl.conf,写入:

[user] default=你的用户名

然后wsl --shutdown再进入,就能恢复成原来的用户了。

最后分享一点个人体会

从在 Windows 上折腾 VMware 里跑 Ubuntu 和 CUDA,到后来切双系统每天重启七八次,最后稳定在 WSL2,我最大的感受是:AI 开发环境的“好用”,不在于你用了多高端的硬件,而在于环境切换的成本是否足够低。WSL2 的 GPU 方案虽然不是传统意义上那种硬核直通,但它的设计思路非常聪明——让 Windows 和 Linux 共享显卡,让驱动统一在 Windows 侧管理,让用户态 CUDA 环境在 Linux 里无缝运转。这套设计对绝大多数 AI 项目来说,已经足够稳定、足够高效。

如果你也想在 Windows 机器上搭一套随时能训练模型的 Linux 环境,我建议先装好 Windows 最新显卡驱动,再耐心走一遍 3.1 到 3.3 的步骤。整个过程我实测大约半小时能跑通,最耗时的是 CUDA Toolkit 的下载,其次是 Ubuntu 系统包的更新。等nvidia-smi在 WSL2 里亮出来的那一刻,你会发现之前的折腾全都值了。

最后再送一个实战小技巧:每次升级 Windows 显卡驱动之后,进 WSL2 先跑一下nvidia-smi和python -c "import torch; print(torch.cuda.is_available())",确认驱动和 CUDA 链路没有断,再开始跑训练任务。这个习惯可以帮你避免“训到一半才发现 GPU 不可用”的尴尬局面。祝大家都能在 Windows 和 Linux 之间找到最舒服的那条路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询