资讯动态

Windows 上用 WSL2 搭建 AI 开发环境:CUDA 与 PyTorch 实战指南

发布时间:2026/10/26 23:38:24 来源:尧图企业网站定制
1. 为什么要在 Windows 上折腾 WSL2 跑 AI 开发环境如果你是一个长期在 Windows 上做深度学习或者大模型微调的开发者大概率经历过这样的场景想跑一个 PyTorch 训练脚本结果发现某个依赖在 Windows 上编译不过想用 CUDA 加速驱动版本和框架版本对不上想复现一篇论文的代码作者只提供了 Linux 下的安装脚本。这时候你有两个选择要么装双系统要么买一台 Linux 机器要么租 GPU 云主机。但这三种方案都有各自的麻烦——双系统切换成本高买机器要花钱租云主机长期下来也不便宜。WSL2 的出现让这件事有了第三种解法。它本质上是在 Windows 里跑了一个轻量级的虚拟机内核是真正的 Linux 内核但和 Windows 的文件系统、网络、GPU 是打通的。这意味着你可以在 Windows 的终端里直接调用 Linux 的命令行工具同时还能用上本地的 NVIDIA 显卡做 CUDA 计算。对于做 AI 开发的人来说这个组合的吸引力在于你不需要离开 Windows 的桌面环境就能获得一个几乎完整的 Linux 开发体验而且 GPU 性能损失很小。我自己从 WSL1 时代就开始用到 WSL2 成熟之后基本上把日常的 PyTorch 训练、模型微调、数据处理都放在 WSL2 里跑。实测下来在 WSL2 里跑 ResNet-50 的训练和原生 Ubuntu 双系统相比吞吐量差距在 5% 以内对于大多数实验场景完全够用。这篇文章我会从零开始把 WSL2 的安装、Linux 发行版的选择、CUDA 工具链的配置、PyTorch 环境的搭建、GPU 直通的验证以及常见问题的排查完整地讲一遍。不管你是刚接触 Linux 的新手还是已经用过一段时间但想优化配置的老手应该都能从里面找到有用的东西。2. WSL2 环境搭建的整体思路与版本选型2.1 为什么是 WSL2 而不是 WSL1 或者纯虚拟机WSL1 和 WSL2 的架构差异很大。WSL1 是微软自己做的一套系统调用翻译层把 Linux 的系统调用翻译成 Windows 的 NT 调用。好处是启动快、文件系统互通性好坏处是很多底层功能不支持比如 Docker、GPU 直通、完整的网络栈。WSL2 则是基于 Hyper-V 的轻量级虚拟机跑的是真正的 Linux 内核所以兼容性几乎和原生 Linux 一样。对于 AI 开发来说WSL2 的关键优势有三个第一是 GPU 直通NVIDIA 提供了专门的 WSL2 驱动可以让 Linux 侧的 CUDA 程序直接访问物理显卡第二是完整的 systemd 支持需要手动开启很多服务类工具依赖它第三是 Docker 兼容性你可以在 WSL2 里直接跑 Docker Desktop 或者原生的 Docker Engine。纯虚拟机方案比如 VMware 或 VirtualBox虽然也能跑 Linux但 GPU 直通配置复杂性能损失也更大。而且虚拟机的文件共享、网络配置都比 WSL2 麻烦。所以如果你主要是在 Windows 上做开发WSL2 是目前最省心的选择。2.2 Windows 版本和硬件的前置检查在开始之前你需要确认几个东西。首先是 Windows 版本WSL2 要求 Windows 10 版本 2004 及以上内部版本 19041 及以上或者 Windows 11 任意版本。你可以按Win R输入winver查看。如果是 Windows 10 但版本太低需要先通过 Windows Update 升级。其次是 CPU 虚拟化支持。WSL2 依赖 Hyper-V 的虚拟化功能所以需要在 BIOS 里开启 Intel VT-x 或者 AMD-V。你可以在任务管理器的“性能”标签页里看“虚拟化”是否显示“已启用”。如果没有启用重启进 BIOS 打开就行。第三是显卡。如果你要用 CUDA需要 NVIDIA 的显卡GTX 10 系列及以上基本都支持。AMD 显卡在 WSL2 里的 ROCm 支持目前还不够成熟所以这篇文章主要讲 NVIDIA 的方案。另外显卡驱动需要在 Windows 侧安装WSL2 里不需要单独装驱动这一点很多人会搞混。2.3 安装 WSL2 和选择 Linux 发行版安装 WSL2 现在非常简单一条命令就能搞定。以管理员身份打开 PowerShell运行wsl --install这个命令会自动启用所需的 Windows 功能、下载最新的 WSL2 内核、安装 Ubuntu 作为默认发行版。如果你想指定发行版可以先运行wsl --list --online查看可用的列表然后wsl --install -d Ubuntu-22.04Ubuntu 22.04 LTS 是目前最推荐的选择因为它的软件源稳定CUDA 工具链支持好社区文档也最全。Ubuntu 24.04 也可以但有些 CUDA 版本可能还没完全适配新手建议先用 22.04。安装完成后需要重启电脑。重启后会自动弹出 Ubuntu 的初始化窗口让你设置用户名和密码。这个用户名和密码是 Linux 侧的和 Windows 账户无关。设置完成后你就进入了一个完整的 Ubuntu 环境。注意如果你之前装过 WSL1需要先运行wsl --set-default-version 2把默认版本设为 2然后检查已有发行版的版本wsl -l -v。如果显示为 1用wsl --set-version 发行版名 2转换。2.4 把 WSL2 迁移到非系统盘默认情况下WSL2 的虚拟磁盘文件ext4.vhdx会放在 C 盘的用户目录下。这个文件会随着你装的东西越来越多而膨胀几十 GB 甚至上百 GB 都很正常。C 盘空间紧张的话建议迁移到其他盘。迁移的方法是先导出再导入。假设你要迁移到 D 盘wsl --shutdown wsl --export Ubuntu-22.04 D:\wsl\ubuntu22_backup.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\wsl\ubuntu22 D:\wsl\ubuntu22_backup.tar --version 2导入之后默认登录用户会变成 root需要修改一下配置。在 WSL2 里编辑/etc/wsl.conf加上[user] default你的用户名然后wsl --shutdown重启一下就恢复了。这个操作我做过好几次实测很稳但导出文件会比较大确保目标盘有足够空间。3. CUDA 工具链与 GPU 直通的配置细节3.1 Windows 侧驱动安装的正确姿势很多人卡在 GPU 直通这一步根本原因是驱动装错了地方。WSL2 的 GPU 直通机制是这样的Windows 侧安装 NVIDIA 的常规驱动就是你在官网下载的那个 Game Ready 或者 Studio 驱动这个驱动里包含了 WSL2 需要的 GPU 虚拟化组件。WSL2 里的 Linux 侧不需要安装完整的 NVIDIA 驱动只需要安装 CUDA Toolkit 就行。所以第一步是在 Windows 上确认驱动版本。打开 NVIDIA 控制面板或者运行nvidia-smiWindows 侧的确保驱动版本在 470 以上。如果版本太低去官网下载最新的驱动装上。装完之后在 WSL2 的 Ubuntu 里运行nvidia-smi如果能看到显卡信息说明 GPU 直通已经通了。如果提示 command not found说明 CUDA 工具链还没装但驱动层面其实是通的因为nvidia-smi这个命令本身是 CUDA Toolkit 提供的。实操心得Windows 驱动更新后有时候 WSL2 里的nvidia-smi会失效运行wsl --shutdown重启一下 WSL2 就好了。这是因为驱动更新后需要重新建立 GPU 直通的映射。3.2 CUDA Toolkit 的版本选择与安装CUDA 版本的选择主要看你要用的 PyTorch 版本。截至我写这篇文章的时候PyTorch 2.x 主流支持的 CUDA 版本是 11.8 和 12.1。CUDA 12.x 对新的显卡比如 RTX 40 系列支持更好CUDA 11.8 则兼容性更广。我的建议是如果你用的是 RTX 30 系列及以下CUDA 11.8 就够了如果是 RTX 40 系列建议上 CUDA 12.1 或更高。安装 CUDA Toolkit 有两种方式用 NVIDIA 官方的 apt 源或者用 runfile。在 WSL2 里我强烈推荐用 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 -y install cuda-toolkit-12-1注意这里的源地址是wsl-ubuntu而不是普通的ubuntu这是 NVIDIA 专门为 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 编译器的版本信息。3.3 cuDNN 的安装与验证cuDNN 是 NVIDIA 的深度学习加速库PyTorch 底层会调用它。从 CUDA 11 开始cuDNN 也可以通过 apt 安装了sudo apt-get -y install cudnn这个命令会自动安装和当前 CUDA 版本匹配的 cuDNN。装完之后可以验证一下cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2能看到版本号就说明装好了。cuDNN 的版本要和 CUDA 版本对应比如 CUDA 12.1 对应 cuDNN 8.9.x。用 apt 安装的好处是它会自动处理这个对应关系不用你手动去官网找。注意有些教程会让你去 NVIDIA 官网下载 cuDNN 的 tar 包手动解压那个方式在 WSL2 里容易出问题因为库文件路径可能和 apt 安装的不一致。除非你有特殊需求否则一律用 apt。3.4 验证 GPU 直通是否真正生效装完 CUDA 和 cuDNN 之后跑一个简单的测试来确认 GPU 真的能用。最直接的方法是编译一个 CUDA 示例程序cd /usr/local/cuda-12.1/samples/1_Utilities/deviceQuery sudo make ./deviceQuery如果输出里显示Result PASS并且列出了你的显卡型号和 CUDA 核心数那就说明 GPU 直通完全正常。另一个方法是跑 PyTorch 的测试import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) print(torch.cuda.get_device_properties(0))如果is_available()返回 True并且能打印出显卡名称和显存大小那就没问题了。4. PyTorch 开发环境的完整搭建流程4.1 Python 环境管理工具的选择在 WSL2 里搭 PyTorch 环境我建议用 Miniconda 或者 Micromamba 来管理 Python 版本和依赖。系统自带的 Python 版本往往比较老而且直接往系统 Python 里装包容易搞乱依赖。Conda 的好处是能创建隔离的环境每个项目一个环境互不干扰。Miniconda 的安装wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装过程中会问你是否初始化 conda选 yes。然后重新打开终端conda命令就能用了。如果你觉得 conda 太重可以用 Micromamba它更快更轻量命令基本兼容。踩过的坑有些人在 WSL2 里装完 conda 之后每次打开终端都提示conda: command not found这是因为.bashrc里的初始化代码没生效。检查一下~/.bashrc里有没有source ~/miniconda3/etc/profile.d/conda.sh这一行没有的话手动加上。4.2 创建 PyTorch 环境并安装框架创建一个专门的 PyTorch 环境conda create -n pytorch python3.10 conda activate pytorchPython 3.10 是目前兼容性最好的版本3.11 和 3.12 也可以但有些库可能还没适配。然后安装 PyTorch。去 PyTorch 官网的 Get Started 页面选好 CUDA 版本它会给你一条命令。以 CUDA 12.1 为例pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121这条命令会从 PyTorch 的官方源下载预编译好的 wheel 包里面已经包含了 CUDA 运行时不需要你本地有完整的 CUDA Toolkit 也能跑。但如果你要编译自定义的 CUDA 算子还是需要完整的 Toolkit。安装完成后验证import torch x torch.randn(1000, 1000).cuda() y torch.randn(1000, 1000).cuda() z x y print(z.sum())如果能在 GPU 上完成矩阵乘法并打印结果说明 PyTorch 的 CUDA 支持完全正常。4.3 常用 AI 开发工具的配置除了 PyTorchAI 开发还会用到一些其他工具。Jupyter Lab 是必备的安装和配置pip install jupyterlab jupyter lab --no-browser --port8888然后在 Windows 的浏览器里访问http://localhost:8888就能用了。WSL2 的网络和 Windows 是互通的localhost 直接能访问。如果你要用 Hugging Face 的模型装一下transformers和datasetspip install transformers datasets accelerate做计算机视觉的话opencv-python和pillow也是常用的pip install opencv-python pillow matplotlib这些包在 WSL2 里安装和原生 Linux 没有任何区别速度也很快因为 WSL2 的网络栈是直通的。4.4 文件系统性能的优化建议WSL2 有一个众所周知的性能问题跨文件系统访问很慢。具体来说如果你在 WSL2 里访问 Windows 的文件/mnt/c/...或者在 Windows 里访问 WSL2 的文件\\wsl$\...速度会比在各自系统内部访问慢很多。对于 AI 开发来说数据集动辄几十 GB如果放在错误的位置训练时的数据加载会成为瓶颈。我的建议是所有代码、数据集、模型权重都放在 WSL2 的文件系统里也就是~/下面不要放在/mnt/c/或者/mnt/d/下面。如果你需要和 Windows 共享文件可以用cp命令复制或者用 Git 来同步代码。实测数据在 WSL2 里读取本地 ext4 文件系统的文件速度能到 1GB/s 以上读取/mnt/c/下的文件速度可能只有 100MB/s 左右。对于小文件多的数据集差距更明显。实操心得如果你的数据集必须放在 Windows 盘上可以考虑在 WSL2 里挂载一个虚拟磁盘VHD或者用rsync定期同步到 WSL2 内部。我自己的做法是买一块单独的 SSD专门给 WSL2 用数据集和模型都放里面。5. 常见问题排查与性能调优实录5.1 WSL2 启动失败与网络问题WSL2 最常见的问题之一是启动时报错比如WslRegisterDistribution failed with error: 0x80370102。这个错误通常是虚拟化没开启或者 Hyper-V 相关功能没启用。解决方法是进 BIOS 确认虚拟化开启然后在 Windows 功能里确认“虚拟机平台”和“适用于 Linux 的 Windows 子系统”都勾选了。另一个常见问题是网络不通比如在 WSL2 里ping外网失败。这通常是 DNS 配置的问题。可以尝试在/etc/resolv.conf里手动指定 DNSnameserver 8.8.8.8 nameserver 114.114.114.114然后wsl --shutdown重启。如果还是不行检查 Windows 侧的防火墙设置有时候防火墙会拦截 WSL2 的虚拟网卡。5.2 GPU 相关问题的排查思路GPU 直通失败的表现通常是nvidia-smi报错或者 PyTorch 里torch.cuda.is_available()返回 False。排查步骤问题现象可能原因解决方法nvidia-smi 找不到命令CUDA Toolkit 未安装安装 cuda-toolkitnvidia-smi 报错 no devicesWindows 驱动版本太低更新 NVIDIA 驱动PyTorch 检测不到 GPUPyTorch 版本与 CUDA 不匹配重装对应 CUDA 版本的 PyTorch训练时显存不足显存被其他进程占用关闭 Windows 侧占用 GPU 的程序CUDA out of memorybatch size 太大减小 batch size 或使用梯度累积还有一个容易被忽略的问题Windows 侧的某些程序比如游戏、浏览器硬件加速会占用 GPU 显存导致 WSL2 里可用显存变少。训练前可以关掉这些程序或者在 NVIDIA 控制面板里设置 WSL2 的 GPU 优先级。5.3 性能调优的几个关键参数WSL2 的性能可以通过.wslconfig文件来调优。这个文件放在 Windows 用户目录下C:\Users\你的用户名\.wslconfig。一个典型的配置[wsl2] memory32GB processors8 swap8GB localhostForwardingtruememory控制 WSL2 能用的最大内存默认是 Windows 总内存的一半。如果你做深度学习建议给到总内存的 60%-70%。processors控制 CPU 核心数默认是所有核心但有时候限制一下反而更稳定。swap是交换空间建议设为内存的 1/4 左右。修改完.wslconfig后需要wsl --shutdown重启才生效。我自己的机器是 64GB 内存、16 核 CPU配置成memory40GB, processors12跑大模型微调的时候很稳。5.4 数据加载与训练速度的优化技巧在 WSL2 里做训练数据加载往往是瓶颈。除了前面说的把数据放在 WSL2 内部文件系统还有几个技巧第一用num_workers参数开启多进程数据加载。在 PyTorch 的 DataLoader 里设置num_workers4或8能显著提升数据吞吐。但注意num_workers不是越大越好超过 CPU 核心数反而会变慢。第二使用内存映射文件memmap或者 LMDB 格式来存储数据集减少小文件 IO 的开销。特别是对于图像数据集把几万张小图片打包成一个大的二进制文件读取速度能提升好几倍。第三如果数据集特别大可以考虑用 NVIDIA 的 DALI 库来做 GPU 加速的数据预处理。DALI 能把解码、裁剪、归一化这些操作放到 GPU 上做进一步减轻 CPU 负担。踩过的坑在 WSL2 里设置num_workers大于 0 时有时候会遇到共享内存不足的问题报错RuntimeError: DataLoader worker (pid xxx) is killed by signal: Bus error。解决方法是在/etc/wsl.conf里加上[wsl2]段落的kernelCommandLine sysctl.kernel.shmmax...或者简单点把num_workers设小一点。6. 从环境搭建到实际项目的落地经验6.1 一个完整的微调项目环境配置示例假设你要微调一个 LLaMA 架构的小模型下面是我实际用的一套环境配置流程。首先创建环境conda create -n llama_finetune python3.10 conda activate llama_finetune pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 pip install transformers datasets accelerate peft bitsandbytes pip install wandb tensorboardbitsandbytes是做 4-bit 量化微调用的能大幅降低显存需求。peft是参数高效微调库支持 LoRA 等方法。wandb和tensorboard用来记录训练过程。然后准备数据。把数据集下载到~/datasets/下面用datasets库加载from datasets import load_dataset dataset load_dataset(json, data_files~/datasets/train.json)训练脚本里设置per_device_train_batch_size4gradient_accumulation_steps8这样等效 batch size 是 32但显存占用只有 batch size 4 的水平。在 RTX 309024GB 显存上用 4-bit 量化微调一个 7B 模型显存占用大概在 12-14GB完全够用。6.2 多环境隔离与依赖管理的最佳实践做 AI 开发时间长了你会发现不同项目对 PyTorch、CUDA、Python 的版本要求可能完全不同。这时候环境隔离就很重要。我的做法是每个项目一个 conda 环境环境名和项目名对应。然后用conda env export environment.yml导出依赖清单方便复现。对于 CUDA 版本冲突的问题如果两个项目需要不同的 CUDA 版本可以在 WSL2 里装多个 CUDA Toolkit通过修改PATH和LD_LIBRARY_PATH来切换。或者更彻底一点用 Docker 来隔离。WSL2 里跑 Docker 很方便NVIDIA 也提供了支持 GPU 的 Docker 镜像。docker run --gpus all -it pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime这条命令会启动一个已经配好 PyTorch 和 CUDA 的容器--gpus all让容器能访问 GPU。对于需要频繁切换环境的场景Docker 是最干净的方案。6.3 备份与迁移的实用方案WSL2 环境配好之后建议做一次备份。用wsl --export导出整个发行版wsl --shutdown wsl --export Ubuntu-22.04 D:\backup\ubuntu22_ai_env.tar这个 tar 文件包含了整个 Linux 文件系统包括你装的所有软件、配置、代码。换电脑或者系统重装的时候直接wsl --import就能恢复。我一般每个月备份一次文件大概 20-30GB放在移动硬盘上。如果只想备份代码和数据用 Git 和 rsync 就够了。代码推到远程仓库数据集用 rsync 同步到 NAS 或者移动硬盘。模型权重文件比较大可以单独用tar打包压缩。实操心得导出 WSL2 发行版之前一定要先wsl --shutdown否则可能导出不完整。另外导出的 tar 文件不能跨 WSL 版本导入比如 WSL1 导出的不能导入到 WSL2反过来也一样。所以导出前确认一下版本。6.4 日常使用中的效率技巧最后分享几个日常使用中能提升效率的小技巧。第一在 Windows Terminal 里配置 WSL2 的启动配置设置默认打开目录、字体、配色用起来更顺手。第二用 VS Code 的 Remote-WSL 插件可以直接在 WSL2 环境里编辑代码、调试、跑终端体验和本地开发几乎一样。第三配置 SSH 密钥方便从 WSL2 推代码到 GitHub 或者公司内网的 Git 服务器。还有一个很实用的技巧在 Windows 资源管理器里输入\\wsl$\Ubuntu-22.04\home\你的用户名就能直接浏览 WSL2 里的文件。反过来在 WSL2 里用explorer.exe .命令可以用 Windows 资源管理器打开当前目录。这两个操作在需要拖拽文件的时候特别方便。我自己用 WSL2 做 AI 开发已经两年多了从最初的 RTX 2080 到现在的 RTX 4090从 PyTorch 1.x 到 2.x这套环境一直很稳定。中间也踩过不少坑比如驱动更新后 GPU 失效、conda 环境搞乱、数据加载慢等等但这些问题都有成熟的解决方案。如果你刚开始用建议先把基础环境搭好跑通一个简单的训练脚本然后再逐步优化。不要一上来就追求完美配置那样容易在细节上卡住。先把东西跑起来再慢慢调优这是我一贯的做法。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑