WSL2 GPU直通:Windows下深度学习环境搭建指南

发布时间:2026/10/7 13:06:33
WSL2 GPU直通:Windows下深度学习环境搭建指南 日常搞 AI 的同学应该都有这种感觉Windows 上跑 Linux 工具链一直是老大难。我在公司用 Windows 笔记本回到家台式机也是 Windows之前想碰 CUDA 相关的开发来来回回就那几条路——双系统开机切换、虚拟机里装 Ubuntu、或者干脆在 Windows 上硬装深度学习环境。结果要么折腾启动项要么 GPU 性能打折要么被一堆 DLL 缺失折磨到怀疑人生。直到 WSL2 把真正的 Linux 内核以轻量虚拟机的方式跑在 Windows 上再加上 GPU 直通能让 CUDA 直接调用物理显卡我才终于找到了一套既能日常办公、又能写代码跑模型的正解。这篇文章就把我从零开始部署 WSL2 AI 开发环境的完整过程写下来包括原理、步骤、性能实测和踩坑记录给所有想在 Windows 上做深度学习但被环境配置劝退过的朋友一个可以直接抄的作业。1. 为什么我最终选了 WSL2 而不是双系统或虚拟机1.1 双系统的无限重启之痛双系统听起来很美好开机选系统进 Linux 就是纯正环境性能没有任何折损。但用一段时间你就知道痛点在哪。每次想切系统都得重启重启一次少说两分钟频繁切换的时候整个人都很崩溃。更要命的是Windows 和 Linux 之间的文件交换特别别扭虽然可以挂载 NTFS 分区但权限问题、中文文件名问题、软链接问题层出不穷。我在双系统阶段遇到过最糟的一次经历Linux 侧训练任务跑到一半Windows 侧需要紧急处理一个文档我只能把训练任务停了重启进 Windows。那次之后我就意识到双系统只适合一个机器只干一件事的场景不适合我这种需要在 Windows 办公和 Linux 开发之间高频切换的人。双系统还有一个隐蔽风险就是引导项被更新覆盖。Windows 大版本更新偶尔会把 GRUB 弄丢每次都要拿启动盘去修复引导操作倒是不难但真的很耗精力。1.2 传统虚拟机的性能天花板虚拟机方案我也认真试过。VirtualBox 和 VMware 在 Windows 上跑 Linux 已经很成熟了装个 Ubuntu 虚拟机做开发没问题但一旦涉及到 GPU 就不太行了。VirtualBox 的 3D 加速基本停留在能看桌面不卡的程度VMware 虽然有 vGPU 虚拟化但对 CUDA 的支持非常有限跑个小模型还行稍微上点规模就报错或者慢得无法接受。还有一个问题是虚拟机的资源开销。开一个 Ubuntu 虚拟机内存占用轻松上 4GBCPU 也要吃掉好几个核心Windows 本体再跑着浏览器、IDE、通讯软件16GB 内存的机器很快就捉襟见肘。而且传统虚拟机的磁盘 IO 性能折损比较大尤其是大量小文件读写的场景跑 git 操作、pip 安装的时候明显能感觉到卡顿。WSL2 出来之后我把虚拟机和双系统都弃了原因就是它把前两者的优势结合了不需要重启、启动快、资源动态分配、GPU 能直通。而且它不是靠翻译系统调用模拟出来的 Linux是货真价实的内核级 Linux这一点对 AI 开发来说太重要了。1.3 内核级 Linux 到底意味着什么要理解 WSL2 为什么对 AI 开发友好得先搞清楚它和 WSL1 的本质区别。WSL1 是一个系统调用翻译层把 Linux 程序发出的系统调用翻译成 Windows 的系统调用这个方案兼容性有限很多依赖内核特性的软件跑不了。WSL2 则完全不同它把真正的 Linux 内核编译成一个轻量虚拟机直接在 Hyper-V 虚拟机框架里跑。所以你在 WSL2 里执行uname -r看到的是一串真实 Linux 内核版本号而不是什么模拟出来的东西。内核级这三个字对 AI 开发的意义体现在几个方面。第一CUDA 工具链和 NVIDIA 驱动模块可以真正加载到 Linux 内核里这是 GPU 直通的基础。第二Docker 容器可以直接跑因为 WSL2 本身就支持完整的容器运行环境不需要额外的虚拟机层。第三像 eBPF、内核模块、性能剖析这些底层工具都能正常用调试和性能分析的手段和物理 Linux 机几乎没有差别。我个人的体感是在 WSL2 里写代码、跑训练、调优和在原生 Ubuntu 上几乎没有区别。唯一要注意的是 Windows 和 Linux 文件系统之间的 IO 开销问题这个我在后面会专门讲。1.4 什么人适合用 WSL2 做 AI 开发先说结论如果你的主力机是 Windows且需要同时兼顾日常办公和深度学习开发WSL2 是目前最舒服的解法。下面这个表是我根据自己的使用场景整理出来的可以参考一下。场景双系统传统虚拟机WSL2Windows 办公与 Linux 开发切换要重启费时不用重启但两套系统并行不用重启原生切换GPU 支持原生支持性能无损支持有限性能折损大GPU 直通性能接近原生启动速度分钟级分钟级秒级系统资源占用同时只能用一套静态分配开销大动态分配按需使用与 Windows 文件互传要挂载分区麻烦共享文件夹较方便直接访问 /mnt/c无缝适合人群需要独占 GPU 跑长时间任务想快速体验 Linux 的用户Windows 主力 AI 开发的绝大多数人还要说说什么人不适合。如果你跑的是动辄几天的超大模型训练需要把 GPU 吃满还不关机那纯 Linux 物理机或者双系统仍然更合适。另外如果是多卡环境的 NCCL 分布式训练WSL2 里的网络栈和物理机有一些微妙差异可能需要额外调参这部分我也遇到过后面会展开。2. WSL2 的 GPU 直通到底是什么原理2.1 不是 PCIe 直通而是 GPU 半虚拟化很多人听到WSL2 GPU 直通第一反应是把物理显卡直接塞给虚拟机。实际上 WSL2 的做法不是这种传统意义上的 PCIe Pass-Through而是一套叫 GPU-PVGPU 半虚拟化的机制。传统虚拟机如果要直通 GPU通常需要把整个 PCIe 设备从宿主机解绑然后分配给虚拟机这种方式的缺点是宿主机自己就不能再用这块显卡了。而 WSL2 的 GPU 直通走的是另一条路Windows 宿主机的显卡驱动仍然是主驱动Linux 侧通过一个虚拟设备接口把 CUDA/OpenGL 的调用请求转发给 Windows 驱动再由 Windows 驱动真正下发到物理 GPU 执行。所以你在 WSL2 里输入nvidia-smi看到的 GPU 信息其实是 Windows 侧驱动上报过来的。这样做的好处很明显Windows 桌面还在用这块显卡显示、渲染WSL2 里的训练任务也在用同一块显卡计算两者互不干扰。我实测下来Windows 桌面看视频、写文档的同时WSL2 里跑小规模训练任务Windows 侧几乎感觉不到卡顿。2.2 一条 CUDA 调用的完整旅程理解了半虚拟化的大框架我们再往下钻一层看看一次 PyTorch 里的 tensor 运算是怎么走到物理 GPU 上的。简化来说调用链是这样的Linux 用户态的程序比如 PyTorch调用 CUDA 运行库 → CUDA 运行库通过 ioctl 访问 /dev/dxg 设备 → 这个设备由 Linux 侧的内核驱动模块 vGPU 驱动处理 → 请求通过虚拟化通道发送到 Windows 宿主机 → Windows 的 WDDM 驱动调度到物理 GPU → GPU 计算完成后结果原路返回。这里面最关键的一点是Linux 侧其实并不需要完整的 NVIDIA 显卡驱动只需要一个能够对接 /dev/dxg 的设备驱动即可。所以你会发现在 WSL2 里安装 CUDA 和物理 Linux 上安装 CUDA 的步骤不一样物理机上要装显卡驱动WSL2 里则不需要因为驱动工作在 Windows 侧。这也解释了为什么 Windows 侧显卡驱动的版本必须足够新因为旧驱动根本没有实现针对 WSL2 半虚拟化的支持接口。NVIDIA 从 460 版本驱动开始才为 WSL2 提供了完善的 GPU 支持所以如果你的驱动版本太老WSL2 里是认不到 GPU 的。2.3 GPU 直通与内核级 Linux 的强绑定关系为什么要反复强调内核级 Linux因为 GPU 直通的实现极度依赖 Linux 内核的能力。WSL1 那种系统调用翻译架构下Linux 程序根本无法感知到 /dev/dxg 设备的存在也就谈不上任何 GPU 加速。WSL2 的轻量虚拟机里跑的是完整 Linux 内核NVIDIA 的 vGPU 驱动模块可以以内核模块的方式加载系统才能创建设备节点用户态程序才能通过设备节点发起 GPU 调用。所以内核级 Linux GPU 直通这两个关键词是强绑定的关系缺一不可。我后来还用 WSL2 跑过需要加载内核模块的 XDP/eBPF 程序这在 WSL1 时代是想都不敢想的。对做 AI Infra 或者深度学习系统方向的同学来说这点尤其关键因为性能分析工具如perf、bpftrace都需要内核特性配合能在 WSL2 里用上这些工具意味着调试手段和物理 Linux 基本对齐了。2.4 硬件与驱动版本的硬性门槛不是所有显卡都能在 WSL2 里跑 CUDA硬件和驱动都有明确要求。我自己整理了一个清单NVIDIA 显卡要求计算能力 6.0 以上也就是 GTX 10 系及以上包括 RTX 20/30/40 系、Tesla/Quadro 系列。如果用的是 GTX 9 系或更老的卡基本不用指望了。NVIDIA 驱动Windows 侧驱动版本必须大于等于 460推荐用最新 Game Ready 或 Studio 驱动。不要用 Windows 设备管理器自动安装的基础驱动版本那个往往太旧。AMD 显卡想用 ROCm 跑 AI 的话WSL2 里的支持目前比较有限我自己没有深入测试建议追求稳定体验还是选 NVIDIA。Intel 核显目前没有官方 CUDA 支持如果只有核显WSL2 里的 AI 加速基本只能靠 CPU 硬扛。另外要注意一点就是显存方面。WSL2 看到的是物理显卡的完整显存比如 8GB 显存的 RTX 4060在 WSL2 里nvidia-smi就能看到完整的 8GB所以不存在虚拟机里显存被砍半的问题。这也是 GPU 直通相比传统 GPU 虚拟化的一大优势模型显存需求基本可以照着物理机规格去估。3. 从零实操装好一套能跑大模型的 WSL2 环境3.1 动手之前的环境检查清单正式开始之前先花五分钟检查一下自己的机器条件避免装到一半才发现不支持。需要确认这几点Windows 版本Windows 10 2004 及以上或者 Windows 11。老版本 Windows 虽然也能单独装 WSL2 组件但步骤复杂得多建议至少保证 2004 以上。CPU 虚拟化BIOS/UEFI 里必须开启 Intel VT-x 或 AMD-V。这一步常被忽视如果 WSL2 安装后启动报错第一个就去查这里。Windows 更新建议把系统更新到最新因为 WSL2 的很多组件和修复是通过 Windows 更新推送的。显卡驱动确认自己的 NVIDIA 驱动版本。在 Windows 的 NVIDIA 控制面板或者任务管理器里能看到如果低于 460先更新驱动再做后面的事。检查命令可以这样用。在 Windows 的 PowerShell 里跑wsl --status如果显示没有安装它会给出提示如果已经装了可以看到默认版本等信息。另外可以在 PowerShell 里查看 Windows 版本winver虚拟化是否开启可以直接打开任务管理器在性能标签页里看 CPU 一栏是否显示虚拟化已启用。如果显示已禁用就需要进 BIOS 开启这一步每家主板界面不一样关键词搜 VT-x 或 SVM 即可。3.2 安装 WSL2 和 Ubuntu 22.04环境检查没问题之后安装其实很快。最简单的做法是以管理员身份打开 PowerShell执行wsl --install这个命令会默认安装 WSL2 和 Ubuntu 发行版。但如果想指定发行版可以先看看在线列表wsl --list --online我推荐用 Ubuntu 22.04 LTS因为它是目前 AI 生态适配最成熟的发行版PyTorch、CUDA、Docker 等工具链对它的支持都最完整。指定安装命令wsl --install -d Ubuntu-22.04安装过程中会要求设置 Linux 用户名和密码需要注意用户名不一定要和 Windows 一样随便取一个就行但密码要能记住因为后面sudo命令都靠它。装完之后建议立即执行更新和升级sudo apt update sudo apt upgrade -y这个步骤很重要尤其要保证内核最新因为老内核可能有与 WSL2 交互相关的 bug。更新完用uname -r确认一下内核版本正常会看到形如6.6.x-microsoft-standard-WSL2的版本号。如果之前装过 WSL1 的旧发行版可以手动指定默认版本wsl --set-version Ubuntu-22.04 2 wsl --set-default-version 23.3 驱动分工Windows 装驱动Linux 装工具链WSL2 里装 CUDA 环境时有一个常见的认知误区很多人会习惯性地在 Linux 侧装 NVIDIA 显卡驱动结果发现怎么也装不上或者装上之后各种冲突。这里一定要记住一个原则WSL2 里不需要也不能装 Linux 侧显卡驱动驱动完全由 Windows 侧负责。Linux 侧要装的是 CUDA Toolkit 和 cuDNN也就是运行 CUDA 程序所必需的库文件和工具链。我一般用 runfile 方式安装 CUDA因为比 apt 源更可控也不容易受到系统自带包的影响。以 CUDA 12.4 为例安装步骤是这样的wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.run sudo sh cuda_12.4.0_550.54.14_linux.run --toolkit --silent注意后面的--toolkit参数它表示只安装 CUDA Toolkit不安装驱动。因为 WSL2 里不需要驱动如果默认安装会把驱动也带进去然后大概率会报错。装完 CUDA 之后再装 cuDNN下载需要到 NVIDIA 官网注册账号选择对应 CUDA 版本的 cuDNN 包。下载后解压把库文件复制到 CUDA 安装目录tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include/ sudo cp cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64/ sudo chmod ar /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*最后配置环境变量。编辑~/.bashrc在末尾追加export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc执行nvcc --version验证 CUDA 编译器是否可用。3.4 安装 PyTorch 并用一张图验证 GPU深度学习框架我建议直接在虚拟环境里装避免污染系统 Python。用 miniconda 比 conda 全量版更轻量装完 Python 再配 PyTorch。wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh创建独立环境conda create -n pytorch python3.10 conda activate pytorch安装 PyTorch注意要下载带 CUDA 支持的版本。如果你前面装的是 CUDA 12.4可以这样装pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124装完做最终的 GPU 验证执行这一段 Pythonimport torch print(PyTorch version:, torch.__version__) print(CUDA available:, torch.cuda.is_available()) print(Device name:, torch.cuda.get_device_name(0))如果输出CUDA available: True说明整个 WSL2 GPU 直通链路已经打通。我在第一次看到这个输出的时候还挺激动的因为这意味着 Windows 机器真正具备了无缝跑深度学习的能力。再顺手跑一个简单的张量运算验证一下实际计算确实走的是 GPUimport torch x torch.randn(1024, 1024, devicecuda) y torch.randn(1024, 1024, devicecuda) z x y print(z.device)输出cuda:0就稳了。3.5 用 Docker 容器化你的 AI 工作流如果你和我一样喜欢用容器管理环境WSL2 里跑 Docker 也很丝滑。有两种方式一种是用 Docker Desktop 并开启 WSL2 backend另一种是直接在 WSL2 里装 Docker Engine。我推荐第二种因为更纯粹不依赖 Windows 侧进程资源占用也更低。安装命令curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh然后配置 GPU 容器支持。先安装 nvidia-container-toolkitdistribution$(. /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-get update sudo apt-get install -y nvidia-container-toolkit配置 Docker 运行时sudo nvidia-ctk runtime configure --runtimedocker sudo systemctl restart docker验证容器内 GPU 可见性sudo docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi能正常输出 GPU 信息说明容器里的 GPU 直通也打通了。我平时跑模型基本都在容器里进行宿主环境保持干净出问题直接换镜像效率高很多。4. 性能实测与几个关键的调优点4.1 GPU 直通后的实际性能表现先说大家最关心的性能问题。我自己在 WSL2 里跑过 ResNet-50 训练、BERT fine-tune、LLaMA 推理等不同类型的任务实测下来计算密集型的训练任务与原生 Ubuntu 的差距非常小基本在 5% 以内甚至有时候完全无感知。原因也很简单GPU 计算本身的耗时占大头CPU 到 GPU 之间的调用开销在整个训练流程里占的比例很小。所以只要你的模型是那种在 GPU 上一跑几十秒甚至几分钟的任务WSL2 的额外开销可以忽略不计。但在小模型频繁推理的场景下差异会明显一些。比如一个很小的 ONNX 模型单次推理毫秒级WSL2 里因为多了一层虚拟化转发每次调用的固定开销占比就被放大了。实测可能慢 10% 到 20%具体取决于调用频率和模型大小。所以如果你的核心场景是超高频小模型推理还是建议以物理 Linux 为准。多卡训练的情况要复杂一些。NCCL 在 WSL2 里通过虚拟网络栈通信跨卡通信的时延和带宽相比物理机有一定的折损尤其是在单机多卡场景。单卡训练完全没问题多卡需要做分布式训练的同学建议先在 WSL2 里测试如果发现通信瓶颈明显还是切到物理 Linux 或双系统更省心。4.2 用 .wslconfig 控制资源配额WSL2 默认会动态分配资源但有时候默认策略不是最优的。比如默认情况下 WSL2 最多可以占满系统 50% 内存如果你的机器内存不大Windows 本体反而容易被拖垮。建议在用户目录C:\Users\你的用户名\.wslconfig下写一个配置文件手动控制资源上限。我的配置大致是这样[wsl2] memory16GB processors8 swap8GB networkingModemirroredmemory控制 WSL2 最大可用内存processors控制最多使用的 CPU 核心数swap是虚拟内存的大小。networkingModemirrored是 Windows 11 22H2 之后新增的镜像网络模式可以让 WSL2 和 Windows 共享网络接口解决了很多端口转发和 localhost 访问的问题。修改.wslconfig之后需要重启 WSL2 才能生效wsl --shutdown再重新进 WSL2用free -h看内存、nproc看 CPU 数量确认配置是否生效。这里有个细节memory设成 16GB 并不代表 WSL2 启动就会占 16GB它只是一个天花板实际用了多少才算多少动态伸缩是 WSL2 的一大优点。4.3 文件系统性能陷阱项目文件千万别放 /mnt/c这是 WSL2 日常使用中最大的一个坑我刚开始就踩了。WSL2 里的 Linux 文件系统和 Windows 的 NTFS 文件系统之间存在一层很明显的性能损耗。如果你把项目放在C:\Users\你的用户名\projects然后在 WSL2 里通过/mnt/c/Users/...去访问pip 安装、git 操作、编译构建都会慢得离谱尤其是大量小文件的场景可能比原生 Linux 慢 10 倍以上。我后来做了个实验同样的 PyTorch 项目放在/mnt/c下和放在 Linux 原生文件系统/home/用户名/projects下跑一遍完整的pip install -r requirements.txt耗时差距接近一倍。原因在于跨文件系统的每次文件操作都涉及协议转换和上下文切换小文件成百上千个的时候这部分开销就被无限放大。所以正确的做法是项目文件一律放在 WSL2 的 Linux 文件系统里比如/home/用户名/projectsWindows 侧如果需要编辑直接在 VS Code 里通过 WSL Remote 扩展打开。VS Code 的 WSL 支持做得很好代码补全、调试、终端都能无缝工作文件路径显示为 Linux 风格但实际上读写的性能是原生 Linux 级别的。Windows 侧偶尔需要访问 Linux 文件可以直接在资源管理器地址栏输入\\wsl$\Ubuntu-22.04\home\用户名进入这个入口只用来小量传文件没问题但不适合作为项目的日常挂载点。4.4 把 WSL2 安装到非 C 盘给系统盘减负WSL2 的虚拟磁盘文件默认放在 C 盘默认大小就有几十 GB装完 CUDA、Docker 镜像、conda 环境之后随便破百 GB。如果你的 C 盘空间紧张这一步可以在刚装好系统后就做省得以后倒腾。原理是先导出再导入把整个 WSL2 发行版迁移到其他盘。在 Windows 的 PowerShell 里操作wsl --export Ubuntu-22.04 D:\wsl\ubuntu2204.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\wsl\ubuntu2204 D:\wsl\ubuntu2204.tar --version 2unregister会删除原来的发行版注意先备份数据import会把打包好的系统恢复到指定目录。恢复之后进入系统检查原来的文件和环境是否完好。我在一次迁移之后就顺手把 Alpine Linux 也装在 D 盘了专门用来当轻量终端环境用。日常生活动开发都放在 D 盘的虚拟磁盘里C 盘只留 Windows 系统本体空间压力小很多。5. 踩坑记录我遇到的 5 个典型问题和排查方法5.1 nvidia-smi 不存在或者看不到 GPU这是刚装完最容易遇到的问题。先区分两种情况如果nvidia-smi命令都不存在说明没有安装 NVIDIA 相关的工具不能直接在 Linux 侧装驱动而是先确认 Windows 侧驱动是否满足要求然后检查 Linux 侧的 /dev/dxg 设备是否存在ls -la /dev/dxg如果设备不存在大概率是 Windows 驱动版本太旧更新到最新 NVIDIA 驱动后重启 WSL2 再看看。如果设备存在但nvidia-smi还是不可用可以尝试在 Ubuntu 里安装nvidia-utils-xxx包sudo apt install nvidia-utils-550版本号要和 Windows 侧驱动对应。这个包只提供用户态工具不装驱动所以不会有冲突问题。还有一种情况是装完驱动之后不生效重启一下 WSL2 就好wsl --shutdown重新进入后nvidia-smi就会出现了。5.2 WSL2 无法启动报虚拟化相关错误如果你执行wsl --install -d ubuntu-24.04或者启动发行版时报类似WSL2 无法启动因为此计算机上未启用虚拟化的错误第一优先级检查 BIOS 里的虚拟化开关。进入 BIOS 或 UEFI 设置找到 CPU Configuration 或 Intel Virtualization Technology / SVM Mode改成 Enabled保存重启。这一步做完基本能解决。还有一种隐蔽情况是 Windows 的 Hyper-V 组件没有完全启用。在管理员 PowerShell 里执行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All执行后重启系统。我遇到过一台机器 BIOS 虚拟化开了但 WSL2 还是起不来就是用这个命令解决的。另外如果你在用 Windows 10 且没有更新到最新版可能会出现需要安装 WSL2 内核更新包的提示去微软官方下载对应的 MSI 安装包装一下即可。5.3 内存占用过高Windows 被拖垮WSL2 默认的内存回收策略确实有些激进跑过一次大模型训练之后即使任务结束了它的内存占用也不会立刻降下来导致 Windows 本体卡顿。除了在 .wslconfig 里限制memory上限外我养成了一个习惯每次用完 WSL2 的深度学习环境执行一次wsl --shutdown这个命令会关停所有 WSL2 发行版立刻释放内存和 CPU 资源。代价是下次启动要重新初始化但 WSL2 启动本来就很快几秒钟就能进系统所以这个操作非常划算。如果你不想频繁关闭也可以在 Linux 侧手动释放缓存echo 3 | sudo tee /proc/sys/vm/drop_caches这个命令能清掉 page cache但在有活跃服务跑着的时候慎用可能会短暂影响性能。5.4 WSL2 里的网络问题DNS 解析失败和下载慢WSL2 的 DNS 是动态生成的有时候会遇到/etc/resolv.conf被改坏或者失效导致 apt 或 pip 显示网络不通。排查方式cat /etc/resolv.conf如果内容异常或者nameserver明显不对可以临时写一个公共 DNS 试试echo nameserver 8.8.8.8 | sudo tee /etc/resolv.conf但要注意WSL2 重启后这个文件可能会被重新生成。更好的办法是在.wslconfig里配置镜像网络[wsl2] networkingModemirrored镜像网络模式下WSL2 共享 Windows 的 DNS 配置大部分网络问题都消失了。关于下载慢的问题最有效的办法是给 apt 和 pip 配置国内镜像源。apt 源在/etc/apt/sources.list或/etc/apt/sources.list.d/下pip 源在~/.pip/pip.conf里。把默认源替换成镜像站之后pip install和apt install的速度会有质的提升。5.5 重启后环境变量失效或磁盘路径找不到如果你发现每次启动 WSL2 都要重新source ~/.bashrc才能用 CUDA 工具链大概率是因为环境变量写在.bashrc里但 shell 启动时没有加载。排查方式是确认你用的是不是 bash以及.bashrc的归属echo $SHELL如果输出不是/bin/bash而是其他 shell就需要把环境变量写到对应的配置文件里。另外如果你开了多个 WSL2 发行版注意每个发行版的独立起点路径/home/用户名/...不是全局共享的。还有一个经验是如果nvcc -V能用但nvidia-smi找不到或者反过来很可能是 PATH 里的 CUDA 和系统自带工具冲突了。我最终的解决方案是把 CUDA 环境变量单独写到一个文件里然后在.bashrc里 source 它这样管理更清晰出问题也好定位。结尾这套环境我用了这么久的真实体感从第一次打通 WSL2 GPU 直通到现在我基本把日常的 AI 开发工作全部迁到了这套环境上。写代码用 VS Code WSL Remote跑训练直接在 WSL2 里敲命令容器环境用 Docker 隔离Windows 侧该办公办公、该玩游戏玩游戏两边互不干扰。偶尔遇到必须用物理 Linux 的场景找一台服务器或者开个双系统也不会太纠结。最后再分享一个小技巧就是养成定期压缩虚拟磁盘的习惯。WSL2 的 ext4.vhdx 文件会随着你反复安装卸载包变得越来越大即使删了文件也不会自动缩回去。在 PowerShell 里执行wsl --shutdown diskpart select vdisk fileD:\wsl\ubuntu2204\ext4.vhdx compact vdisk detach vdisk exit执行之后虚拟磁盘文件能瘦身不少。我第一次操作的时候从 120GB 压回了 60GBC 盘空间瞬间宽裕。这套 WSL2 GPU 直通的环境配置虽然一开始花点时间但一次性搞定之后是真的能踏踏实实做很久的开发。