资讯详情

WSL2 搭建 AI 开发环境:GPU 直通与 CUDA 配置实战

📅 2026/10/25 7:00:19 | 华诺云谱 👁 阅读
WSL2 搭建 AI 开发环境:GPU 直通与 CUDA 配置实战
1. 为什么我最终把 AI 开发环境搬进了 WSL21.1 从双系统到虚拟机的折腾史做深度学习这行的环境问题几乎是个绕不开的坎。我最早是 Windows Ubuntu 双系统每次要跑训练就得重启切系统写代码在 Windows 上、跑模型在 Linux 上文件传来传去路径一会儿反斜杠一会儿正斜杠烦得要命。后来试过 VMware 和 VirtualBox 跑 Ubuntu 虚拟机结果 GPU 直通基本是残废状态CUDA 跑不起来训练速度还不如 CPU纯属浪费时间。再后来听说 WSL2 可以做到内核级 Linux 加 GPU 直通我一开始是持怀疑态度的。毕竟 WSL1 时代那个兼容层翻译系统调用的方案跑个 Python 脚本还行跑 CUDA 简直是天方夜谭。但 WSL2 换了架构用的是真正的 Linux 内核跑在轻量级虚拟化之上这就完全不一样了。实测下来PyTorch 训练速度能跑到原生 Ubuntu 的 95% 以上显存调用、多卡并行、混合精度训练全都正常这个结果确实让我改变了看法。这篇文章就是把我从零搭建这套环境的完整过程整理出来包括版本选择、GPU 驱动配置、CUDA 工具链安装、PyTorch 环境搭建以及我踩过的那些坑。适合两类人看一类是 Windows 主力机但又需要 Linux 做 AI 开发的另一类是之前折腾过 WSL 但 GPU 一直没跑通的。我会尽量把每一步的“为什么”讲清楚而不是只丢一堆命令让你照抄。1.2 WSL2 到底解决了什么问题先说清楚 WSL2 的本质。它不是模拟器也不是传统的虚拟机软件而是微软在 Windows 上做的一套轻量级虚拟化方案里面跑的是一个真正的 Linux 内核。你通过终端进去之后uname -r出来的就是 Linux 内核版本号文件系统是 ext4进程管理是标准的 Linux 那套。这意味着什么意味着绝大多数 Linux 上的开发工具、编译工具链、运行时环境在 WSL2 里都能原生运行不需要任何兼容层。对于 AI 开发来说最关键的是 GPU 直通。WSL2 支持把 Windows 主机上的 NVIDIA 显卡直接映射到 Linux 子系统里你在 WSL2 里执行nvidia-smi能看到和 Windows 上一样的显卡信息CUDA 程序可以直接调用 GPU 做计算。这个能力是通过微软和 NVIDIA 合作实现的底层走的是 GPU 半虚拟化技术性能损耗很小。那它和原生 Linux 比差在哪主要是文件 I/O。WSL2 访问 Windows 文件系统挂在/mnt/c下面的速度比访问 Linux 原生文件系统慢不少尤其是大量小文件读写的时候。所以我的建议是代码和数据尽量放在 WSL2 自己的文件系统里比如/home/yourname/projects不要放在/mnt/c下面。这一点后面还会详细说。2. 环境准备版本选择和前置条件2.1 Windows 版本和 WSL2 的硬性要求WSL2 对 Windows 版本有明确要求。你需要 Windows 10 版本 1903 及以上内部版本 18362 以上或者 Windows 11 任意版本。我强烈建议用 Windows 11因为 WSL2 在 Win11 上的 GPU 直通支持更完善而且有 WSLg 图形界面支持跑一些需要 GUI 的工具会方便很多。检查方法很简单按Win R输入winver看版本号。如果版本太低先更新系统。另外需要确认 CPU 支持虚拟化在任务管理器里看“虚拟化”那一项是不是“已启用”。如果没启用需要进 BIOS 打开 Intel VT-x 或 AMD-V。还有一个容易忽略的点WSL2 需要开启“虚拟机平台”和“适用于 Linux 的 Windows 子系统”这两个 Windows 功能。在“启用或关闭 Windows 功能”里能找到或者用 PowerShell 命令开启dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启电脑。这两步是基础没做的话后面装什么都白搭。2.2 显卡驱动的正确安装方式这是最容易出问题的地方。很多人以为要在 WSL2 里单独装 NVIDIA 驱动其实不对。正确的做法是只在 Windows 主机上装 NVIDIA 驱动WSL2 里不要装驱动只装 CUDA Toolkit。Windows 上的驱动要用 NVIDIA 官方的最新版 Game Ready 或 Studio 驱动版本号建议 470 以上。装完之后WSL2 会自动通过/usr/lib/wsl/lib这个路径把驱动库映射进来。你可以在 WSL2 里执行ls /usr/lib/wsl/lib应该能看到libcuda.so、libnvidia-ml.so这些文件。如果这个目录不存在或者为空说明驱动没装好或者 WSL2 内核太旧。注意千万不要在 WSL2 里用apt install nvidia-driver-xxx这种方式装驱动会把 WSL2 的驱动映射搞乱导致nvidia-smi报错。如果已经装了先卸载干净再重来。另外如果你用的是 AMD 显卡情况会复杂一些。WSL2 对 AMD GPU 的 ROCm 支持目前还在完善中不是所有型号都能跑。NVIDIA 显卡的支持是最成熟的本文也主要针对 NVIDIA 显卡。2.3 WSL2 的安装和初始化Windows 11 上安装 WSL2 非常简单一条命令搞定wsl --install这条命令会自动安装 WSL2 和默认的 Ubuntu 发行版。如果你想指定发行版可以先看看有哪些可用wsl --list --online然后安装指定的wsl --install -d Ubuntu-22.04Ubuntu 22.04 LTS 是我推荐的版本因为它的软件源里 CUDA 相关包比较全而且长期支持到 2027 年。Ubuntu 24.04 也可以但有些 CUDA 版本的兼容性还在跟进中。安装完成后重启系统会让你设置 Linux 用户名和密码。这个用户名和密码是 WSL2 内部的和 Windows 账号无关自己记住就行。2.4 把 WSL2 装到非系统盘默认情况下 WSL2 的虚拟磁盘文件会放在 C 盘随着你装 CUDA、PyTorch、数据集这个文件会越来越大几十 GB 很正常。C 盘空间紧张的话最好把它挪到其他盘。方法是用wsl --export和wsl --importwsl --export Ubuntu-22.04 D:\wsl\ubuntu22.04.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\wsl\ubuntu22.04.tar --version 2导入之后默认用户会变成 root需要改回你自己的用户。在 WSL2 里执行ubuntu2204 config --default-user yourname或者直接编辑/etc/wsl.conf[user] defaultyourname然后wsl --shutdown重启生效。这一步做完你的 WSL2 就完全跑在 D 盘了C 盘只留一个几 MB 的引导文件。3. CUDA 工具链的安装与验证3.1 该装哪个版本的 CUDACUDA 版本的选择取决于你要用的 PyTorch 版本。截至我写这篇文章的时候PyTorch 2.x 稳定支持的 CUDA 版本主要是 11.8 和 12.1。CUDA 12.4 及以上的支持在新版本 PyTorch 里也有但生态兼容性还在跟进。我的建议是先确定 PyTorch 版本再倒推 CUDA 版本。比如你要用 PyTorch 2.3它官方预编译包支持 CUDA 11.8 和 12.1那你就装这两个之一。不要盲目追最新版 CUDA因为很多第三方库比如某些自定义算子、量化工具还没跟上。查看显卡支持的 CUDA 版本nvidia-smi右上角会显示CUDA Version: 12.x这是驱动支持的最高 CUDA 版本不是说你必须装这个版本装低版本完全没问题。3.2 用官方源安装 CUDA ToolkitNVIDIA 官方提供了 Ubuntu 的 apt 源这是最省事的方式。以 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-get update sudo apt-get install -y cuda-toolkit-12-1注意这里用的是wsl-ubuntu这个源不是普通的ubuntu2204源。WSL 专用的源里包含了一些针对 WSL2 环境优化的包用错了可能会有兼容问题。装完之后配置环境变量编辑~/.bashrcexport 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应该输出 CUDA 12.1 的版本信息。如果提示找不到命令检查 PATH 有没有配对。3.3 验证 GPU 直通是否正常装完 CUDA 之后跑一个简单的验证。先确认nvidia-smi能正常输出nvidia-smi如果这里报错Failed to initialize NVML大概率是驱动映射有问题。检查/usr/lib/wsl/lib目录是否存在以及 Windows 上的 NVIDIA 驱动是不是最新版。再跑一个 CUDA 自带的样例程序cd /usr/local/cuda-12.1/extras/demo_suite ./deviceQuery如果输出里能看到你的显卡型号、显存大小、CUDA 核心数并且最后显示Result PASS说明 GPU 直通完全正常。实操心得如果deviceQuery报cudaErrorInsufficientDriver通常是 Windows 驱动版本太旧。去 NVIDIA 官网下最新驱动重装重启后再试。我遇到过好几次都是这个原因。3.4 cuDNN 的安装cuDNN 是 NVIDIA 的深度学习加速库PyTorch 底层会调用它。从 CUDA 11 开始cuDNN 可以通过 apt 安装sudo apt-get install -y cudnn或者指定版本sudo apt-get install -y libcudnn8 libcudnn8-dev装完之后验证cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2能看到版本号就说明装好了。cuDNN 的版本要和 CUDA 版本匹配比如 CUDA 12.1 对应 cuDNN 8.9.x。apt 源会自动处理依赖关系一般不用手动指定。4. PyTorch 环境搭建与性能调优4.1 用 Conda 还是 venvPython 环境管理这块我推荐用 Miniconda。原因有几个一是 Conda 能管理非 Python 的依赖比如某些库需要的 CUDA runtime二是 Conda 的环境隔离更彻底不同项目的 CUDA 版本可以共存三是很多 AI 相关的包在 Conda 源里有预编译版本装起来比 pip 省事。安装 Minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh一路回车最后选 yes 让它初始化 shell。重开终端后conda --version能输出版本号就 OK。创建环境conda create -n pytorch python3.10 -y conda activate pytorchPython 3.10 是我推荐的版本兼容性好大多数库都支持。3.11 和 3.12 也可以但偶尔会遇到某些库还没出预编译 wheel 的情况。4.2 PyTorch 的正确安装姿势PyTorch 官网有个安装命令生成器选好版本、系统、CUDA 版本它会给你一条命令。但我要提醒一点不要用 conda 装 PyTorch 的 CUDA 版本因为 conda 源里的 PyTorch 包有时候会自带一份 CUDA runtime和你系统里装的 CUDA 冲突。用 pip 装官方 wheel 更干净。以 PyTorch 2.3 CUDA 12.1 为例pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121注意--index-url参数这是 PyTorch 官方的 wheel 源里面包含 CUDA 版本的预编译包。不加这个参数的话pip 会从 PyPI 装 CPU 版本那就白折腾了。装完之后验证import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) print(torch.cuda.get_device_properties(0).total_memory / 1024**3, GB)如果torch.cuda.is_available()返回True并且能打印出显卡型号和显存大小说明环境完全正常。4.3 性能基准测试光能跑还不够得看看性能有没有损失。我写了一个简单的基准脚本测矩阵乘法和卷积import torch import time def benchmark_matmul(size4096, iterations100): a torch.randn(size, size, devicecuda) b torch.randn(size, size, devicecuda) # 预热 for _ in range(10): c torch.matmul(a, b) torch.cuda.synchronize() start time.time() for _ in range(iterations): c torch.matmul(a, b) torch.cuda.synchronize() elapsed time.time() - start tflops 2 * size**3 * iterations / elapsed / 1e12 return tflops print(fMatMul TFLOPS: {benchmark_matmul():.2f})在我的 RTX 4070 Ti 上WSL2 里跑出来大约 85 TFLOPSFP32原生 Ubuntu 是 88 TFLOPS 左右差距在 3% 以内。这个损耗主要来自虚拟化层的调度开销实际训练中基本感知不到。4.4 显存管理和多卡配置WSL2 里显存管理和原生 Linux 基本一致但有一个点要注意WSL2 默认会占用一部分显存给 Windows 桌面环境。如果你在 Windows 上开着浏览器、IDE 等吃显存的程序WSL2 里可用的显存会减少。查看显存占用nvidia-smi如果发现显存被占了很多但 WSL2 里没跑东西去 Windows 任务管理器看看是哪个进程在占。关掉不必要的程序能释放不少显存。多卡的话WSL2 支持多张 NVIDIA 显卡直通CUDA_VISIBLE_DEVICES环境变量正常工作。但要注意WSL2 目前不支持 NVLink多卡通信走 PCIe带宽比原生环境低一些。做大规模分布式训练的话这个差异会比较明显。5. 常见问题排查与避坑指南5.1 nvidia-smi 报错的几种情况这是最高频的问题我整理了一个排查表报错信息原因解决方法command not foundWSL2 里没映射驱动检查 Windows 驱动版本重装最新版Failed to initialize NVML驱动映射损坏wsl --shutdown后重启或重装 Windows 驱动No devices were found显卡被 Windows 独占关闭占用显卡的 Windows 程序CUDA Version: N/A驱动太旧升级 Windows NVIDIA 驱动到 470避坑技巧每次 Windows 更新后如果nvidia-smi突然报错先wsl --shutdown再重开大概率能解决。Windows 更新有时候会重置驱动映射。5.2 文件系统性能问题前面提过WSL2 访问/mnt/c的速度很慢。我实测过在/mnt/c下解压一个包含 10 万个小文件的 Python 包耗时是/home下的 5 倍以上。所以代码仓库放在/home/yourname/projects数据集放在/home/yourname/data如果需要和 Windows 共享文件用\\wsl$\Ubuntu-22.04\home\yourname这个路径从 Windows 访问如果数据集太大WSL2 磁盘放不下可以考虑用网络文件系统或者外接硬盘挂载。但挂载 NTFS 硬盘到 WSL2 同样有性能损失只适合存放不频繁读写的冷数据。5.3 内存和 CPU 资源限制WSL2 默认会占用最多 50% 的物理内存如果你的机器内存不大比如 16GB跑大模型训练时可能会 OOM。可以在 Windows 用户目录下创建.wslconfig文件来调整[wsl2] memory12GB processors8 swap4GB这个文件放在C:\Users\你的用户名\.wslconfig改完wsl --shutdown重启生效。内存给多少取决于你的物理内存一般留 4-8GB 给 Windows 本身剩下的给 WSL2。5.4 PyTorch 版本和 CUDA 不匹配这个问题的典型症状是torch.cuda.is_available()返回False或者 import torch 时报undefined symbol错误。原因是 PyTorch wheel 编译时用的 CUDA 版本和你系统里的不一致。解决方法先看 PyTorch 版本对应的 CUDA 版本然后确保系统 CUDA 版本匹配。用torch.version.cuda查看 PyTorch 编译时的 CUDA 版本import torch print(torch.version.cuda)如果输出是12.1但你系统装的是 CUDA 11.8那就需要重装 PyTorch 或者升级 CUDA。两者必须一致。5.5 训练过程中的稳定性问题WSL2 跑长时间训练任务时偶尔会遇到进程被 kill 的情况。常见原因有两个一是内存不足被 OOM killer 干掉二是 Windows 休眠导致 WSL2 挂起。对于第一个减小 batch size 或者用梯度累积。对于第二个去 Windows 电源设置里把休眠关掉或者用caffeinate类似的工具保持唤醒。我一般会在训练脚本外面套一个nohup并且定期保存 checkpoint这样即使进程挂了也能从最近的 checkpoint 恢复。6. 我的实际使用体验和几个小技巧6.1 日常开发工作流我现在的工作流是这样的Windows 上用 VS Code 写代码通过 Remote-WSL 插件连到 WSL2 里终端、调试、Jupyter Notebook 全在 WSL2 里跑。VS Code 的 Remote 功能做得很好体验和本地开发几乎没区别而且能用上 WSL2 里的 Python 环境和 GPU。Jupyter Notebook 的话在 WSL2 里启动jupyter notebook --no-browser --port8888然后在 Windows 浏览器里访问http://localhost:8888WSL2 的端口会自动转发到 Windows。这个端口转发是自动的不需要额外配置。6.2 数据备份和迁移WSL2 的虚拟磁盘文件是个 ext4 格式的 vhdx不能直接挂载到 Windows 上读。备份的话用wsl --exportwsl --export Ubuntu-22.04 D:\backup\ubuntu-$(Get-Date -Format yyyyMMdd).tar这个命令会把整个 WSL2 环境打包成一个 tar 文件包括所有文件、配置、环境。恢复的时候用wsl --import。我一般每个月备份一次防止折腾环境把系统搞崩。6.3 几个提升效率的配置最后分享几个我常用的配置。一是给 apt 换国内源下载速度快很多sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo apt update二是配置 pip 国内源pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple三是给 Conda 也换源编辑~/.condarcchannels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r这几个配置做完装包速度能从几百 KB/s 提升到几 MB/s节省不少等待时间。6.4 关于 GPU 租用和本地环境的取舍有人可能会问既然有 GPU 租用服务为什么还要折腾本地环境我的看法是本地环境适合日常开发、调试、小规模实验响应快、没有网络延迟、数据也不用上传。GPU 租用适合大规模训练、临时跑大模型、或者本地显卡不够用的时候。两者不冲突可以搭配使用。本地 WSL2 环境搭好之后代码在本地调试通了再同步到租用的 GPU 机器上跑大规模训练这样效率最高。而且 WSL2 里的环境和标准 Linux 环境基本一致迁移过去不会有兼容问题。6.5 后续可以扩展的方向这套环境搭好之后还能做不少扩展。比如装 Docker Desktop 的 WSL2 后端在 WSL2 里跑容器化的训练任务或者配置 MLflow、Weights Biases 做实验跟踪再或者装 TensorRT 做推理加速。这些工具在 WSL2 里都能正常工作和原生 Linux 体验一致。我个人的体会是WSL2 这套方案最大的价值在于“不用切换系统”。写代码、跑训练、看文档、开会议全在一台 Windows 机器上完成不用重启、不用切换、不用维护两套系统。对于个人开发者和小团队来说这个便利性带来的效率提升远比那 3% 的性能损耗重要。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑