WSL2 部署 AI 开发环境:内核级 Linux + GPU 直通

WSL2 部署 AI 开发环境:内核级 Linux + GPU 直通

系列第 4 篇。Windows 上装 CUDA、装 PyTorch 能跑,但不少模型工具(Ollama 的 Linux 脚本、vLLM、docker 全家桶)在 Linux 上更顺滑;而 Windows 里装虚拟机又笨重、还常拿不到 GPU 加速。WSL2 是两全其美的方案 :一条 wsl --install 装好"真 Linux",GPU 还能直接给 WSL 用。对在国内组环境的读者,WSL2 还有一层现实好处:Linux 侧的依赖与模型缓存全部留在自己的文件系统里,配合国内镜像源,整个链路(驱动在 Windows 装、环境在 WSL 装、模型从镜像下)都是可控的。本篇覆盖 WSL1/WSL2 区别、一键安装、.wslconfig 资源限制、GPU 直通原理、WSL 内装 PyTorch 验证、与 Windows 互访文件的性能取舍,以及日常运维命令。

一、为什么需要它:WSL1 和 WSL2 到底差在哪

先建立心智模型:WSL 不是虚拟机,是在 Windows 内核里"翻译"Linux 系统调用的层。

  • WSL1 :纯"翻译层"。Linux 进程直接在 Windows 内核上跑,启动快、占内存少,但很多依赖真 Linux 内核行为的功能是缺失的:部分系统调用行为不一致,GPU 加速基本用不上。
  • WSL2 :跑在一个轻量级虚拟机里的真 Linux 内核。它有独立的根文件系统、自己的内核,兼容几乎所有 Linux 发行版和内核模块,还能直通 GPU。代价是占一点额外内存(默认不设上限,WSL2 可能把 Windows 物理内存吃得比较多------这正是本篇第三章要配置的原因)。

一句话:WSL1 是"Linux 应用跑在 Windows 上",WSL2 是"Windows 上跑了一个小 Linux 机器"。做 AI 开发要 GPU、要 docker、要装各种 .so 依赖,必须 WSL2。

一个常见的误区先说破:有人以为 WSL2 是"更快的 WSL1",其实它是另一个物种------WSL1 进程用的是 Windows 内核,WSL2 进程用的是 Linux 内核(运行在轻量虚拟机里)。这决定了:WSL2 里 uname -r 看到的是 linux 版本号,apt 装的包、内核模块的行为与真 Linux 一致,绝大多数 AI 工具链在 WSL2 里的表现和服务器上没有区别。

WSL2 在 AI 场景的额外好处:很多大模型工具链的官方安装脚本就是给 Linux 写的(例如 Ollama 官方 Linux 安装脚本),在 WSL2 里直接照抄文档即可,少踩 Windows 路径与权限的坑,也不用为"Windows 上跑 Linux 工具链"单独开一台虚拟机------Hyper-V 或第三方虚机跑 Linux 的 GPU 直通要单独配置、启动慢、占资源多,日常开发不划算;WSL2 恰好把"Linux 工具链 + GPU 直通 + 轻量"三者凑齐了。

二、环境要求

项目 要求 说明
系统 Windows 10 21H2+ 或 Windows 11 老版本 Win10 需手动启用"适用于 Linux 的 Windows 子系统"
硬件虚拟化 CPU 虚拟化开启 BIOS 里开 VT-x / AMD-V;没开则 wsl --install 会报虚拟化未启用;开没开可以在"任务管理器 → 性能 → CPU"的"虚拟化"一栏确认,不必进 BIOS 瞎摸
内存 建议物理内存 ≥ 16 GB WSL2 默认无上限,建议用 .wslconfig 限到 8 GB 左右
GPU NVIDIA 卡 + Windows 侧游戏驱动 WSL 内不需要再装驱动,这是 WSL2 GPU 直通的核心
磁盘 建议 ≥ 100 GB 空闲 一个 Ubuntu + Python + PyTorch 环境 + 模型,轻松几十 GB

三、安装与部署

3.1 一键安装 WSL2 + Ubuntu

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

powershell 复制代码
wsl --install

这条命令会一次性完成:启用必要 Windows 功能、下载 WSL2 内核、安装默认的 Ubuntu 发行版。装完重启电脑。

想直接指定发行版也可以:

powershell 复制代码
wsl --install -d Ubuntu-22.04

重启后打开 Ubuntu,会提示设置用户名和密码,照提示操作即可。Ubuntu 自带的 python3 版本(3.10.x)已经够本系列所有篇目使用,无需另装。确认你已经在 WSL2 上:

powershell 复制代码
wsl --list --verbose

输出里 Ubuntu 那一行的 VERSION 列应为 2 (若为 1,用 wsl --set-version Ubuntu-22.04 2 升级,见第五章运维命令)。

3.2 配置 .wslconfig 资源限制(必做)

WSL2 默认能占用物理内存的一大半。跑大模型时 Windows 本身还要留内存,不限制的话容易把 Windows 拖到卡死 。在 Windows 用户目录 C:\Users\<你的用户名>\.wslconfig 新建/编辑(注意是 Windows 侧文件,不是 WSL 内):

复制代码
[wsl2]
memory=8GB
processors=4
swap=2GB
  • memory:WSL2 可用物理内存上限,按机器内存设(16 GB 内存设 8GB 是稳妥值);
  • processors:WSL2 可见的 CPU 核心数,设成物理核心数或稍少;
  • swap:WSL2 自己的交换空间。内存不够时它顶一下------如果 WSL 内进程被 Killed(OOM),先把这里加大的思路之一(见故障排查)。

改完必须执行 wsl --shutdown 再重启 WSL 才生效 ------这是新手最常漏的一步。.wslconfig 只在 WSL 冷启动时读取。

3.3 GPU 直通原理(关键:Windows 侧装驱动,WSL 内不用装)

WSL2 GPU 直通的机制:

  1. Windows 侧 :安装 NVIDIA 官方游戏/创意驱动(新版驱动自带 WSL 支持,驱动包里就包含面向 WSL 的组件);
  2. WSL 内核侧 :WSL2 内核通过专用组件把 GPU 直通给 Linux,WSL 内能直接执行 nvidia-smi;
  3. WSL 内 :不需要、也不应该再装 NVIDIA 驱动。你只需要装 CUDA Toolkit(可选)或直接装 PyTorch 的 cuXXX 版 wheel,运行时自动找到显卡。

一句话:驱动只装在 Windows 上,WSL 里装的是"工具链",不是"驱动" 。很多人照 Linux 教程去 WSL 里 apt install nvidia-*,结果反而装坏,别这么干。

3.4 WSL 内装 Python + PyTorch 并验证 GPU

进入 Ubuntu 后:

bash 复制代码
python3 -V

输出 Python 3.10.x(Ubuntu 22.04 自带),无需另装。版本选择原则与 venv/conda 用法同《AI-03 Python环境与虚拟环境》------建议照该篇建一个 venv 再装 PyTorch,避免弄脏系统 Python。下面命令假定已在激活的虚拟环境内:

bash 复制代码
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

验证(期望输出 2.x.x+cu124 True):

bash 复制代码
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"

True 说明 WSL 内已直通 GPU;False 按"六、故障排查"第 1、3 条定位。nvidia-smi 在 WSL 内直接能跑,输出与 Windows 侧一致。我一般按固定顺序验证 WSL 侧:先 nvidia-smi 出表(驱动层),再 torch.cuda.is_available()(框架层),最后才怀疑模型与应用------顺序反了,排查时间翻倍。

四、验证

三关全过才算部署成功:

  1. WSL2 身份 :wsl --list --verbose 中 Ubuntu 的 VERSION 列为 2;
  2. 资源限制 :.wslconfig 配置后 wsl --shutdown,再进 WSL 执行 free -h,看到的总内存约等于 memory= 的值(不是 Windows 全量内存);
  3. GPU 直通 :WSL 内 nvidia-smi 出表(驱动版本 + GPU + 显存),且 torch.cuda.is_available() 为 True。

五、进阶技巧

  1. Windows ↔ WSL 互访文件。两个方向:

    • Windows 侧:资源管理器地址栏输 \wsl$\Ubuntu-22.04 可像访问网络共享一样进 WSL 文件系统(或 \wsl.localhost\Ubuntu-22.04);
    • WSL 侧:Windows 的 C 盘挂载在 /mnt/c,例如 ls /mnt/c/Users。
      性能建议 :跨文件系统访问走 9P 协议,比本机原生慢不少。模型权重、数据集、venv 一律放 WSL 内部 (如 ~/models、~/projects/xxx/.venv),/mnt/c 只用来取放临时文件。把整个项目放 C 盘再进 WSL 跑,训练/推理 IO 会明显拖慢。判断一个文件在哪一侧很简单:~/ 开头在 WSL 内,/mnt/c/... 开头在 Windows 盘------项目目录、.venv、~/.cache(模型缓存)、~/.ollama 都应该落在 ~/ 下面。
  2. 运维三命令。

    • wsl --shutdown:关掉所有 WSL 实例,释放内存;改 .wslconfig 后必做;
    • wsl --list --verbose:看发行版、VERSION、状态(Running / Stopped);
    • wsl --update:WSL 内核/组件出兼容问题(如新显卡驱动后 nvidia-smi 异常)时,在 PowerShell 执行升级 WSL 本体。
  3. WSL2 跑 Ollama 。WSL 内照官方 Linux 脚本安装 Ollama(详见《AI-07 Ollama本地部署大模型》),模型存 WSL 内(~/.ollama),Windows 侧浏览器直接访问 http://localhost:端口 即可------WSL2 的 localhost 会自动转发到 Windows(前提是服务监听在 127.0.0.1 或 0.0.0.0)。

六、故障排查

同样走分层定位:网络层 → 驱动层 → 框架层 → 显存层 → 应用层。WSL2 特有的坑集中在驱动层与内存层:

# 症状(报错原文) 层 原因 解决
1 WSL 内 nvidia-smi 报错 The NVIDIA driver on your system is too old 驱动层 Windows 侧驱动太老不支持 WSL2 GPU 直通 升级 Windows 侧 NVIDIA 驱动到最新版(注意:升级 Windows 驱动,不是去 WSL 里装驱动)
2 WSL 内 Could not load libcuda.so.1 驱动层 WSL 内未找到 GPU 用户态库(通常根因同上:Windows 侧驱动问题) 升级 Windows 侧驱动后 wsl --shutdown 重启;不要手动往 WSL 装驱动
3 torch.cuda.is_available() 返回 False 框架层 装了 CPU 版 PyTorch;或驱动过老 重装 cuXXX 版 wheel(--index-url https://download.pytorch.org/whl/cu124);nvidia-smi 先确认驱动
4 WSL 内进程突然消失 / Killed(dmesg 见 oom-kill) 内存层 物理 RAM 不足(非显存),WSL2 被内存限制杀掉 检查 .wslconfig:加大 memory= 与 swap=,改完 wsl --shutdown 生效
5 HuggingFace 下载卡住 / ConnectionError / 超时 网络层 国内访问 huggingface.co 受限 WSL 内 export HF_ENDPOINT=https://hf-mirror.com 或改用 ModelScope
6 pip install 慢 / 超时 网络层 直连 pypi.org 慢 清华镜像:pip install <pkg> -i https://pypi.tuna.tsinghua.edu.cn/simple

三条实战经验:

  • WSL 内一切 GPU 异常,先看 Windows 侧驱动版本 ,再看 WSL 内组件。顺序反了会白折腾半天:wsl --update 解决不了驱动太老的问题,apt install nvidia-* 只会把环境搞乱。

  • 改 .wslconfig 后忘了 wsl --shutdown 是高频事故:配置只在冷启动时读取,改完不 shutdown,free -h 看到的还是旧值,会误以为"没配置成功"。

  • 先算好 WSL 的内存预算再跑大模型 。显存管 GPU 侧,.wslconfig 的 memory 管 WSL 的 CPU 侧内存:7B 级推理主体在显存里,但数据预处理、CPU offload、并发请求都吃 WSL 内存;内存限得太小,进程被 OOM 杀掉(Killed)是典型表现------先确认 memory/swap 给够了,再怀疑别的。

七、本篇自检清单

  • 能说出 WSL1 与 WSL2 的本质区别(翻译层 vs 真 Linux 内核)
  • wsl --list --verbose 显示 Ubuntu 为 VERSION 2
  • .wslconfig 已配置 memory/processors/swap,且改完执行过 wsl --shutdown
  • free -h 中总内存 ≈ memory 配置值
  • WSL 内 nvidia-smi 出表,torch.cuda.is_available() 为 True
  • 会双向互访文件(\wsl$\Ubuntu-22.04 与 /mnt/c),且模型/环境都放在 WSL 内
  • 掌握 wsl --update / wsl --list --verbose / wsl --shutdown 三个运维命令

一句话收尾:WSL1 是翻译层、WSL2 是真内核,AI 开发必选 WSL2;驱动只装 Windows 侧,WSL 里装工具链不装驱动;.wslconfig 限好内存,改完必 shutdown;模型与环境全放 WSL 内。 这四点守住,WSL2 就是一个长期稳定的 AI 开发底座。

下一篇:《AI-05 显存计算与模型选择》------先算清楚你的显存能跑多大的模型,再决定下载什么。

参考

相关推荐
袖清暮雨43 分钟前
机器学习之线性回归
人工智能·机器学习·线性回归
其实防守也摸鱼1 小时前
网安自测题:掌握核心知识点的实用练习
linux·运维·服务器·前端·数据库·sql·xss
木白CPP1 小时前
[QNX] 深入理解 Resource Manager 接口设计
linux·服务器·数据库
AlfredZhao1 小时前
别再 rm 日志了:Linux 下安全清空日志文件的正确姿势
linux
星恒随风1 小时前
Linux开发工具详解(二):Git版本控制、GitHub协作与GDB调试实战
linux·笔记·git·学习·github
2401_868534781 小时前
简要说明PON下行和上传数据方式
运维·服务器·网络
weixin_403810131 小时前
iOS 自动化脚本怎么输入文字:代理、输入法与快捷指令三级方案
运维·ios·自动化
Mortalbreeze1 小时前
MySQL 基础篇(五):数据操作基础 —— CRUD
linux·服务器·数据库·mysql