☰
Windows 上用 WSL2 搭建 PyTorch GPU 训练环境全攻略
2026/10/26 23:42:39 网站建设 项目流程

1. 为什么要在 Windows 上折腾 WSL2 跑 AI 训练

1.1 一个真实的需求场景

我平时主力机是 Windows,但做深度学习相关的事情,Linux 生态的兼容性确实更好。早期我试过双系统,切换一次要重启,训练跑一半想回 Windows 查个资料都麻烦;也试过纯 Windows 下装 CUDA 和 PyTorch,能跑,但很多开源项目默认按 Linux 路径写脚本,bash脚本、apt装依赖、/tmp临时目录这些习惯一旦形成,回到 Windows 就处处别扭。后来我把整套 AI 开发环境搬到了 WSL2 里,用下来最大的感受是:它不是一个"模拟器",而是跑在轻量虚拟化层上的真 Linux 内核,同时又能直接调用 Windows 侧的 NVIDIA 显卡做 GPU 加速。

这篇内容就是把我从零搭这套环境的完整过程、踩过的坑、以及一些参数选择的理由整理出来。适合的人群很明确:Windows 用户,想跑 PyTorch 训练或推理,手里有一块 NVIDIA 显卡,又不想放弃 Windows 的日常使用。如果你只是想跑跑 CPU 推理,那这套方案同样能用,只是 GPU 部分可以跳过。

1.2 WSL2 到底是个什么东西

很多人对 WSL 的印象还停留在第一代——那是一个把 Linux 系统调用翻译成 Windows 调用的兼容层,文件 IO 慢、系统调用不全,跑深度学习基本没戏。WSL2 完全换了个思路:它底层是微软自家的轻量级虚拟化技术,跑的是一个真正的 Linux 内核,由微软维护并随系统更新。你在里面uname -r看到的是一串带microsoft-standard-WSL2后缀的内核版本号,这是货真价实的 Linux 内核,不是翻译层。

这个架构差异带来的直接好处有三个。第一,系统调用完整,fork、mmap、epoll这些行为跟原生 Linux 一致,绝大多数开源项目不用改一行代码就能跑。第二,文件系统性能在 Linux 原生目录下接近裸机,尤其是大量小文件读写(比如 Python 包安装、数据集加载)比 WSL1 快一个数量级。第三,也是对我们最关键的——GPU 直通。微软和 NVIDIA 合作,把 Windows 侧的显卡驱动通过/dev/dxg这个设备节点暴露给 WSL2,Linux 侧不需要再单独装一套驱动,直接就能用nvidia-smi看到显卡。

1.3 GPU 直通的原理,一句话讲清楚

传统虚拟化里,虚拟机想用显卡要么靠 PCI 直通(把整块卡划给虚拟机,宿主机就用不了了),要么靠虚拟 GPU(性能损耗大)。WSL2 走的是另一条路:它不独占显卡,而是通过一个叫GPU-PV(GPU Paravirtualization)的机制,把宿主机的 GPU 能力以半虚拟化的方式共享给 Linux 子系统。具体表现就是,你在 WSL2 里执行nvidia-smi,看到的显存占用、进程列表,跟 Windows 侧nvidia-smi看到的是同一块卡、同一份数据。CUDA 计算任务在 Linux 侧提交,实际由 Windows 驱动调度到物理 GPU 上执行。

这个机制的关键前提是:驱动只需要装在 Windows 侧,WSL2 里不要装驱动。这是新手最容易搞错的地方,后面会专门讲。

2. 环境准备:装之前先把这几件事理清楚

2.1 硬件与系统的最低门槛

在动手之前,先对照下面这张表确认自己的机器能不能跑。这不是吓唬人,我见过太多人卡在第一步——主板 BIOS 里虚拟化没开,折腾半天以为是软件问题。

项目最低要求推荐配置说明
Windows 版本Win10 2004 (Build 19041)Win11 22H2 及以上版本太低不支持 WSL2
CPU支持虚拟化(VT-x/AMD-V)近五年主流 CPUBIOS 里需开启虚拟化
内存8GB16GB 及以上WSL2 默认最多占一半内存
显卡无硬性要求(可纯 CPU)NVIDIA GTX 10 系及以上GPU 加速需 NVIDIA
磁盘预留 40GBSSD 预留 100GB+镜像和数据集很占空间

关于显卡有一点要特别说明:GPU 直通目前对 NVIDIA 支持最成熟。AMD 显卡在 WSL2 下的 ROCm 支持还在推进中,Intel 核显主要用于图形加速而非 CUDA 计算。所以如果你的目标是跑 PyTorch + CUDA,NVIDIA 是省心的选择。另外,显卡驱动版本不能太旧,建议用 NVIDIA 官网的最新 Game Ready 或 Studio 驱动,两者都包含 WSL 所需的组件。

2.2 开启虚拟化与系统功能

第一步是确认 CPU 虚拟化已开启。任务管理器 → 性能 → CPU,右下角看"虚拟化"是否为"已启用"。如果是"已禁用",重启进 BIOS,找Intel Virtualization Technology或SVM Mode打开。

系统功能这块,Win11 和较新的 Win10 版本其实一条命令就能搞定。以管理员身份打开 PowerShell,执行:

wsl --install

这条命令会自动启用"虚拟机平台"和"适用于 Linux 的 Windows 子系统"两个可选功能,并安装默认的 Ubuntu 发行版。执行完重启一次即可。如果你的系统版本较老,或者想手动控制,也可以用传统方式:

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 的发行版,需要单独用wsl --set-version <发行版名> 2转换,转换过程会重建文件系统,提前备份数据。

2.3 把 WSL2 装到非系统盘

默认情况下,WSL2 的虚拟磁盘文件(ext4.vhdx)会放在 C 盘用户目录下。这个文件会随着你装包、下数据集不断膨胀,几十 GB 是常态,C 盘紧张的话很痛苦。我的做法是把它迁到 D 盘。

先看看当前装了哪些发行版:

wsl --list --verbose

导出再导入到目标位置:

# 关闭 WSL wsl --shutdown # 导出为 tar 文件 wsl --export Ubuntu-22.04 D:\wsl\ubuntu2204.tar # 注销原发行版 wsl --unregister Ubuntu-22.04 # 导入到 D 盘 wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\wsl\ubuntu2204.tar --version 2

导入后默认登录用户会变成 root,需要改回普通用户。编辑/etc/wsl.conf:

[user] default=你的用户名

这里有个细节:wsl --import之后原来的用户配置还在,只是默认登录用户变了,改完wsl.conf重启 WSL 就恢复。另外,导入的目录建议放在 SSD 上,机械硬盘跑 WSL2 的 IO 会明显拖慢训练时的数据加载。

3. 安装 Linux 发行版与基础配置

3.1 发行版怎么选

WSL2 支持从微软商店一键安装多种发行版,也可以手动导入任意 Linux 镜像。对 AI 开发来说,我的建议是Ubuntu 22.04 LTS 或 24.04 LTS。原因很实际:PyTorch、CUDA 的官方文档和 wheel 包基本都以 Ubuntu 为主力测试平台,遇到问题搜到的解决方案也大多是 Ubuntu 的。Debian 也能用,但某些 CUDA 组件的依赖版本会稍微麻烦一点。

安装命令很简单:

wsl --install -d Ubuntu-22.04

装完首次启动会让你设置用户名和密码,这个密码是 sudo 用的,记牢。如果你想要更轻量的选择,也可以导入 Alpine 之类的镜像,但 AI 生态的兼容性会打折扣,不太推荐新手走这条路。

3.2 换源与基础工具

装完第一件事是换软件源。默认的 Ubuntu 源在国内访问速度不稳定,换成国内镜像能省不少时间。以 Ubuntu 22.04 为例,备份原配置后编辑/etc/apt/sources.list,把archive.ubuntu.com和security.ubuntu.com替换成镜像站地址即可。换完执行:

sudo apt update && sudo apt upgrade -y

然后装一批常用工具,这些在后面编译、调试时都会用到:

sudo apt install -y build-essential git curl wget vim htop \ python3-pip python3-venv unzip

build-essential提供 gcc、g++、make,很多 Python 包在没预编译 wheel 时需要现场编译;python3-venv用于创建隔离环境,比直接往系统 Python 里装包干净得多。

3.3 系统级配置调优

WSL2 默认会占用最多一半的物理内存,跑大模型训练时可能把 Windows 侧挤爆。可以在 Windows 用户目录下建一个.wslconfig文件(路径是C:\Users\你的用户名\.wslconfig)来限制资源:

[wsl2] memory=24GB processors=8 swap=8GB localhostForwarding=true

这里memory设成物理内存的 60% 到 70% 比较稳妥,留足给 Windows。processors是分配给 WSL2 的 CPU 核心数,别全给,留两核给系统。改完执行wsl --shutdown重启生效。

实操心得:.wslconfig里的内存限制是硬上限,但 WSL2 不会主动归还内存给 Windows,除非你 shutdown。如果发现 Windows 变卡,先看看是不是 WSL2 吃满了内存,必要时手动wsl --shutdown释放。

4. GPU 直通配置:最容易踩坑的一环

4.1 驱动只装 Windows 侧,这是铁律

前面提过,WSL2 的 GPU 直通依赖 Windows 侧的驱动。所以正确做法是:在 Windows 上装好 NVIDIA 驱动,WSL2 里什么都不用装。很多人习惯性地在 Linux 里apt install nvidia-driver-xxx,结果要么装不上,要么装上了反而冲突,nvidia-smi报错。

验证 Windows 侧驱动是否就绪,直接在 WSL2 终端里执行:

nvidia-smi

如果能看到显卡型号、驱动版本、CUDA Version 那一栏,说明直通已经通了。注意这里的 "CUDA Version" 指的是驱动支持的最高 CUDA 运行时版本,不是你当前装的 CUDA 版本,别混淆。

如果nvidia-smi提示 command not found,先确认 Windows 驱动版本够新。老驱动不带 WSL 组件,去 NVIDIA 官网下最新的装上,重启 WSL 再试。如果报Failed to initialize NVML,多半是驱动没装对或者 WSL 内核太旧,wsl --update更新一下内核。

4.2 CUDA Toolkit 的安装选择

nvidia-smi通了之后,接下来装 CUDA Toolkit。这里有个关键认知:PyTorch 自带的 wheel 包里已经包含了 CUDA 运行时,也就是说,如果你只是用 PyTorch 跑训练,其实可以不单独装完整的 CUDA Toolkit,直接装 PyTorch 就能用 GPU。

那什么时候需要单独装 CUDA Toolkit?两种情况:一是你要编译自定义 CUDA 算子(比如写.cu文件用 nvcc 编译),二是你要用 TensorRT、cuDNN 这类需要手动配置的库。如果你属于这两种,那就装。

安装方式我推荐用 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 update sudo apt install -y cuda-toolkit-12-1

注意源地址里是wsl-ubuntu而不是普通的ubuntu,这是 NVIDIA 专门为 WSL 准备的仓库,别搞错。装完配置环境变量,编辑~/.bashrc:

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

然后source ~/.bashrc,执行nvcc -V验证。

4.3 版本匹配:一张表说清楚

CUDA、驱动、PyTorch 三者的版本关系是新手最容易翻车的地方。核心原则是:驱动版本决定 CUDA 上限,PyTorch 版本决定它需要哪个 CUDA。下面这张表是我整理的常见组合,供参考:

PyTorch 版本推荐 CUDA最低驱动版本备注
2.0.x11.7 / 11.8450+老项目兼容性好
2.1.x11.8 / 12.1525+稳定性不错
2.2.x11.8 / 12.1525+支持新特性
2.3.x12.1530+推荐新项目
2.4.x12.1 / 12.4550+最新特性

选版本的时候,先看你的显卡驱动支持到哪个 CUDA,再选不超过这个上限的 PyTorch 版本。比如驱动支持到 12.1,那就别装需要 12.4 的 PyTorch。反过来,如果 PyTorch 需要 12.1 而你的驱动只支持 11.8,要么升级驱动,要么降 PyTorch 版本。

注意:不要盲目追新。我见过有人为了用最新 PyTorch 去升级驱动,结果旧显卡不再被新驱动支持,反而用不了。升级前先查清楚自己的显卡型号在新驱动里还在不在支持列表。

5. Python 环境与 PyTorch 安装实操

5.1 用 conda 还是 venv

这是个老生常谈的问题。我的建议是:纯 PyTorch 项目用 venv 就够,涉及复杂科学计算栈(比如要装特定版本的 numpy、scipy、以及一些非 Python 依赖)用 conda 更省心。conda 的优势在于它能管理非 Python 的二进制依赖,缺点是体积大、装包慢。

如果你选 conda,推荐装 Miniconda 而不是完整版 Anaconda,后者动辄几个 GB。安装:

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

装完记得conda init bash,重开终端生效。这里有个常见报错:conda: 无法将"conda"项识别,这通常是没执行conda init或者 shell 配置没加载,重开终端或者手动source ~/.bashrc即可。

5.2 创建隔离环境并安装 PyTorch

无论用哪种方式,都强烈建议建一个独立环境,别往 base 或系统 Python 里装。以 conda 为例:

conda create -n pytorch python=3.10 -y conda activate pytorch

Python 版本选 3.10 或 3.11 比较稳,3.12 有些库还没跟上。然后装 PyTorch,一定要用官方给的命令,别直接pip install torch,那样装的是 CPU 版。去 PyTorch 官网的安装页面选好版本,它会生成对应命令。以 CUDA 12.1 为例:

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

这个--index-url是关键,它指向 PyTorch 自己的 wheel 仓库,里面是带 CUDA 的版本。装完验证:

import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))

如果cuda.is_available()返回 True,恭喜,GPU 通了。返回 False 的话,往下看排查部分。

5.3 验证 GPU 真的在干活

is_available()为 True 只说明 PyTorch 能识别到 GPU,不代表计算真的跑在 GPU 上。做个实际测试:

import torch import time device = torch.device("cuda") a = torch.randn(10000, 10000, device=device) b = torch.randn(10000, 10000, device=device) # 预热 for _ in range(3): c = torch.matmul(a, b) torch.cuda.synchronize() start = time.time() for _ in range(10): c = torch.matmul(a, b) torch.cuda.synchronize() print(f"耗时: {time.time() - start:.3f}s")

同时开一个终端跑nvidia-smi -l 1,观察显存占用和 GPU 利用率有没有变化。如果利用率上去了,说明计算确实在 GPU 上跑。这个测试很有必要,因为有些情况下 PyTorch 会静默回退到 CPU,你不主动验证根本发现不了。

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

6.1 nvidia-smi 相关报错

这是最高频的问题,我整理成一张速查表:

报错信息可能原因解决方向
command not foundWSL 里没这个命令正常,驱动在 Windows 侧,检查 Windows 驱动
Failed to initialize NVML驱动版本旧/内核旧升级 Windows 驱动,wsl --update
No devices were found驱动未装 WSL 组件重装最新 NVIDIA 驱动
GPU access blocked驱动与 WSL 版本不匹配更新驱动和 WSL 内核

一个容易被忽略的点:如果你用的是笔记本双显卡(核显 + 独显),确保 NVIDIA 驱动装的是包含 WSL 支持的版本,有些 OEM 定制驱动会阉割这部分功能,建议去 NVIDIA 官网下通用版。

6.2 PyTorch 识别不到 GPU

torch.cuda.is_available()返回 False,按这个顺序排查:

  1. 先确认nvidia-smi能正常输出。如果这个都不行,问题在驱动层,跟 PyTorch 无关。
  2. 检查装的 PyTorch 是不是 CUDA 版。执行pip list | grep torch,看版本号后面有没有+cu121之类的后缀。没有的话就是装了 CPU 版,卸载重装。
  3. 检查 CUDA 版本和 PyTorch 是否匹配。torch.version.cuda能看到 PyTorch 编译时用的 CUDA 版本,跟nvidia-smi显示的驱动支持版本对比。
  4. 如果以上都对还不行,试试wsl --shutdown重启,有时候是设备节点没正确挂载。

实操心得:我遇到过一次诡异的情况,nvidia-smi正常但 PyTorch 死活识别不到。最后发现是 conda 环境里装了个 CPU 版的pytorch-cuda包,跟 pip 装的冲突了。解决办法是conda list和pip list都查一遍,把冲突的包清干净。混用 conda 和 pip 装 PyTorch 是重灾区,尽量只用一种。

6.3 显存不足与性能问题

WSL2 下显存是跟 Windows 共享的,如果 Windows 侧有程序占着显存(比如浏览器硬件加速、游戏),WSL2 能用的就少了。训练前先nvidia-smi看看有没有别的进程占着。

另外,WSL2 的 GPU 性能相比原生 Linux 会有一定损耗,尤其是小 batch 频繁同步的场景。我的经验是,大矩阵运算损耗在 5% 以内,可以接受;但如果是大量小 kernel 启动,损耗会明显一些。如果对性能极度敏感,可以考虑双系统或者云 GPU,但日常开发调试,WSL2 的便利性完全值回这点损耗。

6.4 文件系统性能陷阱

这是 WSL2 一个经典的坑:跨文件系统访问极慢。如果你把数据集放在 Windows 的D:\data,然后在 WSL2 里通过/mnt/d/data访问,读取速度会比放在 Linux 原生目录下慢好几倍。原因是跨系统访问要走 9P 协议,开销大。

正确做法是把数据集和代码都放在 WSL2 的 Linux 文件系统里,比如~/projects、~/datasets。从 Windows 侧访问这些文件,可以用\\wsl$\Ubuntu-22.04\home\用户名这个路径。训练时数据在 Linux 侧,速度就正常了。

注意:不要把整个项目放在/mnt/c或/mnt/d下开发,哪怕你觉得方便。我早期就这么干过,一个 epoch 的数据加载时间比放在原生目录多了三倍,排查半天才发现是文件系统的问题。

7. 一些让环境更好用的小配置

7.1 终端与开发体验

WSL2 默认终端是 Windows Terminal,体验已经不错。可以装个zsh加oh-my-zsh,补全和主题更舒服:

sudo apt install -y zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

VS Code 的话,装个 "WSL" 扩展,在 WSL2 里执行code .就能直接打开当前目录,编辑器跑在 Windows 侧,文件系统在 Linux 侧,无缝衔接。这个组合我用下来是目前 Windows 上做 Linux 开发最顺手的方案。

7.2 开机自启与快捷命令

如果你经常需要进 WSL2,可以在 Windows Terminal 里配个 profile,一键打开。另外,把常用命令做成 alias 能省不少事,比如在~/.bashrc里加:

alias gs='git status' alias nv='nvidia-smi' alias act='conda activate pytorch'

7.3 备份与迁移

WSL2 的整个环境就是一个 vhdx 文件,备份很简单,前面导出命令wsl --export就是。建议在环境配好、装完所有依赖之后导出一份,以后搞坏了直接导入恢复,比重装快得多。我一般会在装完 CUDA 和 PyTorch 验证通过后立刻备份一次,这个"黄金镜像"救过我好几次。

8. 关于这套方案的边界

WSL2 不是万能的。它适合开发、调试、中小规模训练;但如果你要做多卡分布式训练、需要特定的内核模块、或者对 GPU 性能有极致要求,原生 Linux 仍然是更好的选择。另外,WSL2 的 GPU 直通目前对 NVIDIA 支持最好,AMD 和 Intel 用户可能需要等生态进一步完善。

我个人的用法是:日常开发、跑实验、调模型都在 WSL2 里,需要长时间大规模训练时再考虑迁到服务器或云上。这套组合用了两年多,稳定性没得说,唯一需要定期维护的就是 Windows 驱动和 WSL 内核的更新,保持两者版本匹配,基本不会出问题。

最后分享一个我踩过的坑:有次 Windows 自动更新了显卡驱动,结果 WSL2 里的 CUDA 突然用不了,nvidia-smi报错。折腾半天发现是新驱动和当时的 WSL 内核版本不兼容,wsl --update更新内核后就好了。所以如果你也遇到驱动更新后环境异常,第一反应应该是更新 WSL 内核,而不是去重装 CUDA。

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

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

立即咨询