☰
Windows 上 WSL2 内核级 Linux 与 GPU 直通:AI 开发环境搭建实战
2026/10/12 19:14:40 网站建设 项目流程

1. 为什么要在 Windows 上折腾一套内核级 Linux 加 GPU 直通

很多人第一次听到“在 Windows 里跑 Linux 还要把显卡直通进去”这个说法,第一反应是:这不是多此一举吗?直接装双系统,或者干脆买台 Linux 主机不就完了。我一开始也这么想,直到我需要在同一台笔记本上同时处理文档、开视频会议、跑模型训练,还要随时切回 Windows 做演示,双系统来回重启的代价实在太高,虚拟机跑深度学习又慢得让人抓狂。后来我把整套 AI 开发环境迁到了 WSL2 上,配合 GPU 直通,才算真正找到了一个平衡点。

WSL2 的全称是 Windows Subsystem for Linux 第二代,它和第一代最大的区别在于:WSL1 是系统调用翻译层,而 WSL2 跑的是一个真正的 Linux 内核,由轻量级虚拟机承载。这意味着你在里面跑 Docker、跑 CUDA、跑各种依赖内核特性的工具,行为跟原生 Linux 几乎一致。而 GPU 直通,指的是把宿主机上的独立显卡通过驱动层暴露给 WSL2 里的 Linux 环境,让里面的 PyTorch、TensorFlow 能直接调用显卡算力,而不是退化成 CPU 跑。

这套方案解决的核心问题是:让 Windows 用户在不放弃桌面生态的前提下,获得接近原生 Linux 的 AI 开发体验,并且能用上 GPU 加速。它适合几类人:一是主力机是 Windows 笔记本、但又经常跑深度学习的学生和开发者;二是需要 Windows 做日常办公、Linux 做工程开发的双需求人群;三是想低成本体验 Linux 开发环境、又不想折腾双系统分区的新手。只要你机器上有 NVIDIA 显卡,并且系统版本达标,这套环境基本可以做到开箱即用。

我踩过的坑主要集中在三个地方:驱动版本不匹配导致 GPU 识别不到、WSL2 内存占用失控把宿主机拖垮、以及 CUDA 工具链在 WSL 里的路径问题和原生 Linux 有细微差异。下面我会把整套流程拆开讲清楚,包括每一步背后的原理、参数怎么定、以及出问题怎么排查。

2. 环境准备与前置条件核查

2.1 硬件与系统版本要求

在动手之前,先把硬件和系统底子摸清楚,这一步偷懒后面会加倍还回来。WSL2 的 GPU 直通对硬件有硬性门槛,不是所有机器都能跑。

项目最低要求推荐配置说明
操作系统Windows 10 21H2 及以上Windows 11 22H2 及以上版本太低不支持 WSLg 和 GPU 直通
显卡NVIDIA GTX 10 系及以上RTX 20 系及以上需要支持 CUDA 的 NVIDIA 卡
显卡驱动470 以上535 以上必须是 Windows 侧驱动,不是 Linux 驱动
内存8GB16GB 及以上WSL2 默认会吃掉一半内存
磁盘剩余 40GB剩余 100GB SSD镜像和数据集很占空间
CPU支持虚拟化支持虚拟化且 BIOS 已开启需在 BIOS 里开 VT-x 或 AMD-V

这里有个特别容易搞混的点:WSL2 的 GPU 驱动是装在 Windows 侧的,不是装在 Linux 里的。很多人习惯性地进 Linux 去装 NVIDIA 驱动,结果要么装不上,要么装上了冲突。正确的做法是 Windows 装好官方驱动,WSL2 通过一个叫/usr/lib/wsl/lib的目录自动挂载驱动库,Linux 里只需要装 CUDA Toolkit 就行,不需要装驱动本体。

2.2 开启虚拟化与 WSL 功能组件

系统版本确认之后,接下来要开启几个 Windows 功能组件。这一步用命令行做最干净,避免在图形界面里点来点去漏掉东西。

以管理员身份打开 PowerShell,依次执行:

# 启用 WSL 功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 启用虚拟机平台功能 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

执行完这两条命令后必须重启,否则后面的步骤会报错。重启之后,把 WSL 的默认版本设为 2:

wsl --set-default-version 2

如果你机器上之前装过 WSL1 的旧发行版,可以用wsl --list --verbose查看版本,用wsl --set-version <发行版名> 2单独升级。

注意:有些机器在 BIOS 里默认关闭了虚拟化,执行wsl命令时会提示“请启用虚拟机平台”。这时候要进 BIOS 找 Intel VT-x 或 AMD-V 选项打开,不同主板位置不一样,通常在 Advanced 或 CPU Configuration 菜单下。

2.3 安装 Linux 发行版与初始配置

功能组件就绪后,安装发行版就很简单了。我一般推荐 Ubuntu 22.04 LTS 或 24.04 LTS,社区资料最全,CUDA 支持也最成熟。

# 查看可安装的发行版列表 wsl --list --online # 安装 Ubuntu 22.04 wsl --install -d Ubuntu-22.04

安装完成后会提示你设置用户名和密码,这个账号是 Linux 内部的普通用户,和 Windows 账号无关。设置好之后进入系统,先做一次全面更新:

sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential git curl wget vim

这里装build-essential是因为后面编译一些 Python 包时需要 gcc 和 make,提前装好省得中途报错。

2.4 验证 GPU 是否被正确识别

这是整个流程里最关键的一步,也是最多人卡住的地方。在 WSL2 里执行:

nvidia-smi

如果输出了一张表格,显示显卡型号、驱动版本、CUDA 版本,那说明 GPU 直通已经生效。如果提示command not found或者No devices were found,说明驱动层没打通。

排查思路是这样的:先在 Windows 侧确认nvidia-smi能正常输出,如果 Windows 侧都不行,那是驱动没装好;如果 Windows 侧正常但 WSL 里不行,检查/usr/lib/wsl/lib目录是否存在,以及LD_LIBRARY_PATH是否包含这个路径。正常情况下这个目录是自动挂载的,如果缺失,可能是 WSL 版本太旧,执行wsl --update升级内核。

实操心得:我遇到过一种情况,Windows 侧驱动是笔记本厂商定制版,版本号看着很新,但就是不带 WSL 的驱动组件。解决办法是去显卡官网下载标准版驱动覆盖安装,不要用厂商定制版。这个问题折腾了我整整一个下午,最后发现是驱动来源的问题。

3. CUDA 工具链与深度学习框架落地

3.1 CUDA Toolkit 的安装与版本选择

GPU 识别通了之后,下一步是装 CUDA Toolkit。这里有个版本匹配的坑:CUDA Toolkit 版本、显卡驱动版本、深度学习框架版本,三者必须兼容。不是越新越好。

选版本的逻辑是这样的:先确定你要用的框架版本,比如 PyTorch 2.x 通常对应 CUDA 11.8 或 12.1;然后看这个 CUDA 版本要求的最低驱动版本;最后确认你的 Windows 驱动满足要求。我一般推荐 CUDA 12.1 这个版本,兼容性好,主流框架都支持。

安装方式我推荐用官方仓库,比手动下载 runfile 干净:

# 下载并安装 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 update # 安装 CUDA Toolkit 12.1 sudo apt install -y cuda-toolkit-12-1

装完之后配置环境变量,编辑~/.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 --version验证。

注意:WSL2 里不要装 Linux 版的显卡驱动,也就是不要执行apt install nvidia-driver-xxx。WSL 的驱动是 Windows 侧提供的,Linux 里装驱动会破坏挂载关系,导致 GPU 直接消失。这是新手最容易犯的错误,我见过不止一个人因为这个重装系统。

3.2 Python 环境与 PyTorch 安装

CUDA 就绪后,Python 环境我强烈建议用 conda 或 miniconda 管理,不要用系统自带的 Python,避免依赖污染。

# 下载 miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh # 按提示完成安装后重启终端 # 创建独立环境 conda create -n ai python=3.10 -y conda activate ai

然后装 PyTorch,注意要选对应 CUDA 12.1 的版本:

pip 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和显卡型号,说明整条链路打通了。如果输出False,八成是 CUDA 版本和 PyTorch 版本不匹配,或者环境变量没生效。

3.3 显存与内存的资源分配调优

WSL2 默认会占用宿主机一半的内存,而且不会主动释放,跑大模型的时候经常把 Windows 拖到卡死。解决办法是在 Windows 用户目录下创建一个.wslconfig文件,手动限制资源。

文件路径是C:\Users\你的用户名\.wslconfig,内容如下:

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

参数说明:memory是给 WSL2 的最大内存,建议设为物理内存的 60% 到 70%,留足给 Windows;processors是分配的 CPU 核心数,一般设为物理核心数的一半到三分之二;swap是交换空间,跑大模型时建议给足。

改完之后执行wsl --shutdown关闭 WSL,再重新进入生效。用free -h和nproc验证。

实操心得:显存方面 WSL2 是直接透传的,不需要额外配置,但要注意 WSL2 里的显存占用和 Windows 侧是共享的。如果你在 Windows 侧开着游戏或者视频渲染软件,WSL 里能用的显存会相应减少。跑大模型前先把 Windows 侧占显存的程序关掉,能多挤出不少空间。

4. 开发体验优化与工具链配置

4.1 文件系统性能:跨系统访问的坑

WSL2 有一个性能陷阱:从 Linux 访问 Windows 文件系统(/mnt/c 等)非常慢,反之亦然。这是因为跨系统访问要走 9P 协议,IO 性能只有原生文件系统的几分之一。

所以项目代码一定要放在 Linux 文件系统里,也就是~/目录下,不要放在/mnt/c/Users/...下面。我实测过,同样一个数据集,放在/mnt/c下读取速度只有放在~/下的三分之一左右,训练时数据加载会成为瓶颈。

如果你习惯用 Windows 侧的编辑器打开 Linux 里的文件,推荐用 VS Code 配合 Remote-WSL 插件。在 WSL 终端里进入项目目录,执行code .,VS Code 会自动以远程模式打开,编辑体验和本地几乎无差别,而且文件操作都在 Linux 侧完成,没有跨系统开销。

4.2 终端与 Shell 体验提升

默认的 bash 够用但不够顺手,我一般会做几件事:装 zsh 加 oh-my-zsh,配置一些别名,装 tmux 做会话管理。

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

然后在~/.zshrc里加一些常用别名:

alias gs='git status' alias ll='ls -alF' alias activate='conda activate'

tmux 的价值在于:跑长任务时如果终端断开,任务不会中断。用tmux new -s train创建会话,Ctrl+B然后D分离,tmux attach -t train重新连接。跑模型训练的时候这个太重要了,我吃过好几次终端一关训练就断的亏。

4.3 Docker 与容器化开发环境

WSL2 里跑 Docker 有两种方式:一是装 Docker Desktop 并开启 WSL2 后端,二是直接在 WSL 里装 Docker Engine。我推荐后者,资源占用更少,行为更接近原生 Linux。

# 安装 Docker Engine curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # 重新登录后生效

装完之后docker run hello-world验证。如果要让容器也能用 GPU,需要装 NVIDIA Container Toolkit:

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 systemctl restart docker

然后用docker run --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi验证容器内 GPU 可用。

注意:WSL2 里的 systemd 默认是关闭的,systemctl命令可能不工作。需要在/etc/wsl.conf里加[boot] systemd=true,然后wsl --shutdown重启。这个配置在较新的 WSL 版本里已经默认开启,但老版本需要手动加。

5. 常见问题排查与避坑速查

5.1 GPU 相关故障排查

GPU 问题是这套环境里最高频的故障,我把常见的几种情况和排查方法整理成表:

现象可能原因排查方法解决方式
nvidia-smi 找不到命令驱动库未挂载检查 /usr/lib/wsl/libwsl --update 升级内核
No devices were foundWindows 驱动不支持 WSLWindows 侧执行 nvidia-smi换标准版驱动重装
CUDA 版本不匹配框架与 Toolkit 版本冲突nvcc --version 对比重装对应版本
显存不足报错Windows 侧占用显存Windows 任务管理器查看关闭占显存程序
训练中途 GPU 掉线驱动崩溃或过热查看 dmesg 日志更新驱动、改善散热

排查 GPU 问题有个通用思路:先在 Windows 侧确认,再在 WSL 侧确认,最后在框架层确认。三层逐级排查,能快速定位问题出在哪一层。很多人一上来就在 Python 里调,结果发现是驱动层的问题,白白浪费时间。

5.2 内存与性能问题处理

WSL2 的内存管理有个特点:它不会主动把不用的内存还给 Windows。这意味着你跑完一个大任务后,WSL 占用的内存可能还是很高,导致 Windows 变卡。解决办法有两个:一是前面说的.wslconfig限制上限,二是定期执行wsl --shutdown彻底释放。

磁盘空间也是类似的问题。WSL2 的虚拟磁盘文件(ext4.vhdx)只增不减,删了文件空间也不会自动回收。需要手动压缩:

# 关闭 WSL wsl --shutdown # 用 diskpart 压缩虚拟磁盘 diskpart # 在 diskpart 里执行: # select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\...\ext4.vhdx" # compact vdisk

这个操作我一般一两个月做一次,能回收不少空间。注意路径里的发行版标识每个人不一样,要自己找一下。

5.3 网络与端口转发问题

WSL2 的网络是 NAT 模式,默认情况下 Windows 访问 WSL 里的服务需要端口转发。不过较新的 WSL 版本已经支持 localhost 自动转发,也就是 WSL 里跑的服务,Windows 侧用localhost:端口就能直接访问。

如果遇到访问不了的情况,先检查服务是否监听在0.0.0.0而不是127.0.0.1。很多框架默认只监听本地回环,导致 Windows 侧访问不到。改监听地址即可。

反向的场景,WSL 里访问 Windows 的服务,用host.docker.internal或者 Windows 的 IP 地址。这个在跑一些本地 API 服务时经常用到。

实操心得:WSL2 的 IP 地址每次重启都会变,如果你有脚本依赖固定 IP,会经常失效。解决办法是用localhost代替具体 IP,或者写个脚本动态获取。我早期写过一个定时任务依赖固定 IP,结果每次重启都失败,排查了半天才发现是 IP 变了。

6. 我在这套环境上的一些真实体会

整套环境搭下来,从零到能跑通训练,顺利的话一个下午能搞定,不顺利的话可能要折腾两三天。我前后在不同机器上装过五六次,总结下来几个关键点:驱动一定要用标准版不要用厂商定制版,CUDA 版本要跟着框架走不要盲目追新,项目文件一定放 Linux 侧不要放 /mnt 下,内存一定要用 .wslconfig 限制住。

这套方案不是没有代价的。WSL2 的 IO 性能相比原生 Linux 还是有差距,尤其是大量小文件读写场景;GPU 直通虽然能用,但某些底层特性比如多卡通信、特定版本的 cuDNN 可能会有兼容性问题。如果你的工作强依赖这些,双系统或者纯 Linux 仍然是更稳妥的选择。

但对于大多数日常开发、模型微调、实验验证的场景,WSL2 加 GPU 直通已经足够好用。它最大的价值在于让你不用在 Windows 和 Linux 之间做非此即彼的选择,一台机器同时满足两种需求。我现在的工作流就是 Windows 侧处理文档和沟通,WSL 侧跑代码和训练,切换成本几乎为零。

最后分享一个小技巧:把常用的环境配置写成一个 setup 脚本,换机器或者重装时一键执行,能省下大量重复劳动。我自己的脚本里包含了 apt 源替换、conda 安装、CUDA 配置、常用工具安装这些步骤,新机器从零到可用基本半小时内搞定。这个脚本我改了好几版,每次踩坑就补一条进去,现在已经是我的标配工具了。

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

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

立即咨询