首页 / 资讯中心 / 文章详情

WSL2 + GPU 直通:从零搭建 PyTorch CUDA 深度学习环境

WSL2 + GPU 直通:从零搭建 PyTorch CUDA 深度学习环境 ★ FEATURED ARTICLE
1. 为什么我最终把 AI 开发环境搬进了 WSL21.1 从双系统到 WSL2 的折腾史搞深度学习这几年环境问题一直是最让人头疼的事。最早我是 Windows 和 Ubuntu 双系统每次想跑个模型都得重启切换写代码在 Windows 上训练又得跑到 Linux 下文件传来传去路径还老出问题。后来试过纯 Linux 桌面驱动、输入法、办公软件各种水土不服坚持了不到两个月又装回了 Windows。直到 WSL2 成熟之后我才算找到了一个真正舒服的方案Windows 负责日常办公和写代码WSL2 里的 Ubuntu 负责跑训练和推理两边文件系统互通GPU 也能直接调用。这套组合用下来最大的感受就是“不用再为环境折腾了”。这篇文章要聊的就是怎么在 WSL2 里从零搭一套能跑 PyTorch、能调用 CUDA 的 AI 开发环境。核心关键词就几个WSL2、Linux、GPU、PyTorch、CUDA。适合谁看如果你手上是一台带 NVIDIA 显卡的 Windows 机器想搞深度学习又不想放弃 Windows 生态那这套方案基本就是为你准备的。哪怕你之前没怎么碰过 Linux跟着走也能搭起来。1.2 这套方案到底解决了什么问题先说清楚 WSL2 的本质。它不是虚拟机软件那种“模拟”出来的 Linux而是微软在 Windows 内核里做的一个兼容层底层用的是真正的 Linux 内核由微软维护编译。所以你拿到的就是一个货真价实的 Linux 环境apt、systemd、bash全都能用和你在物理机上装的 Ubuntu 体验几乎一致。GPU 直通是这套方案的关键。WSL2 支持把 Windows 上的 NVIDIA 显卡直接透传给 Linux 子系统靠的是微软和 NVIDIA 合作搞的WSLg GPU-PVGPU 半虚拟化技术。简单说你不需要在 WSL2 里再单独装一遍显卡驱动只要 Windows 侧的驱动够新WSL2 里就能直接nvidia-smi看到显卡。这一点比传统虚拟机强太多传统虚拟机要么不支持 GPU 直通要么配置极其麻烦。解决了什么问题三个一是环境隔离AI 项目的依赖经常打架放在 WSL2 里随便折腾搞崩了直接删掉重建不影响 Windows 主系统二是开发效率VS Code 可以直接连进 WSL2代码补全、调试、终端全在一条链路里三是性能GPU 直通之后训练速度和原生 Linux 差距很小我实测下来大概在 95% 以上。2. 部署前的准备工作与方案选型2.1 硬件与系统的前置条件这套方案对硬件有硬性要求先对照检查一遍不满足的话后面会卡住。项目要求说明操作系统Windows 10 版本 2004 及以上或 Windows 11版本太低不支持 WSL2显卡NVIDIA GTX 10 系及以上需要支持 CUDAAMD 和 Intel 显卡走不了这套显卡驱动Windows 侧驱动版本 470 以上越新越好建议直接官网下最新内存建议 16GB 以上WSL2 默认最多用一半内存训练吃内存磁盘预留 50GB 以上镜像、CUDA、PyTorch 加起来很占地方CPU支持虚拟化需要在 BIOS 里开启这里有个坑要提前说WSL2 里不要装显卡驱动。很多人习惯性地在 Linux 里apt install nvidia-driver结果直接把 GPU 直通搞崩了。WSL2 的显卡驱动是 Windows 侧提供的Linux 里只需要装 CUDA Toolkit驱动部分会自动从 Windows 透传过来。这个逻辑和物理机 Linux 完全相反一定要记住。2.2 为什么选 Ubuntu 22.04 而不是别的发行版WSL2 支持很多发行版Ubuntu、Debian、Fedora、openSUSE 都有。我推荐Ubuntu 22.04 LTS理由很实在生态最全PyTorch、CUDA 的官方文档默认就是 Ubuntu遇到问题搜出来的答案也大多是 Ubuntu 的。LTS 稳定22.04 是长期支持版支持到 2027 年不用频繁升级。软件源新22.04 自带的 GCC、Python 版本比较新装 PyTorch 不容易遇到编译问题。Ubuntu 24.04 也可以但有些 CUDA 版本对它的支持还在跟进稳妥起见先用 22.04。至于 Debian软件源偏保守装新版 CUDA 容易缺依赖Fedora 更新太快稳定性差一点。所以综合下来22.04 是最省心的选择。2.3 安装 WSL2 的正确姿势网上很多教程还在教你手动开启“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个功能然后重启再下载内核更新包。这套流程在 Win11 上已经过时了现在一条命令搞定。以管理员身份打开 PowerShell执行wsl --install这条命令会自动完成启用所需功能、下载最新内核、安装 Ubuntu 默认发行版、设置 WSL2 为默认版本。执行完重启一次电脑然后 Ubuntu 会自动启动让你设置用户名和密码。如果你已经装过 WSL 想重装或者想指定发行版可以这样# 查看可用的发行版列表 wsl --list --online # 安装指定发行版 wsl --install -d Ubuntu-22.04 # 查看已安装的发行版 wsl --list --verbose # 设置默认版本为 WSL2 wsl --set-default-version 2注意wsl --install在部分 Win10 老版本上可能不生效这时候才需要走手动开启功能的老流程。判断方法很简单执行命令报错就说明版本太老先升级系统。安装完成后第一次进入 Ubuntu 会让你创建用户。这个用户是普通用户不是 root后面装 CUDA 需要 sudo 权限密码记牢。2.4 迁移到非系统盘避免 C 盘爆掉WSL2 默认把发行版装在 C 盘一个 Ubuntu 镜像加上后面装的 CUDA、PyTorch轻松吃掉几十 GB。C 盘紧张的话强烈建议迁移到其他盘。迁移流程分三步。先关闭 WSLwsl --shutdown然后导出镜像到目标盘比如 D 盘# 导出注意路径 wsl --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需要改回你自己的用户。编辑/etc/wsl.conf加上[user] default你的用户名然后wsl --shutdown重启一次就恢复正常了。这一步我踩过坑导入后直接是 root一开始还以为是权限出问题了其实就是默认用户没配。3. GPU 直通与 CUDA 环境搭建3.1 验证 GPU 是否成功直通WSL2 装好之后第一件事是确认 GPU 能不能被识别。在 WSL2 的 Ubuntu 终端里执行nvidia-smi如果输出了一张表格显示显卡型号、驱动版本、CUDA Version那就说明直通成功了。这里显示的 CUDA Version 是驱动支持的最高版本不是你实际装的版本别搞混。如果报command not found说明 Windows 侧的驱动没装好或者版本太老。回到 Windows去 NVIDIA 官网下载最新的 Game Ready 或 Studio 驱动装上重启 WSL2 再试。还有一种情况是nvidia-smi能跑但显示不了显卡那多半是 Windows 驱动版本低于 470升级即可。提示WSL2 里永远不要执行apt install nvidia-driver-xxx装了必崩。如果手贱装了卸载掉再重启 WSL2 就能恢复。3.2 CUDA Toolkit 的安装与版本选择CUDA Toolkit 是编译和运行 CUDA 程序的基础PyTorch 的 GPU 版本依赖它。版本选择有个原则跟着 PyTorch 走不要盲目追新。先确定你要装的 PyTorch 版本然后去 PyTorch 官网看它对应的 CUDA 版本。比如 PyTorch 2.1 默认对应 CUDA 11.8PyTorch 2.2 开始支持 CUDA 12.1。选一个匹配的就行不用装最新的 CUDA 12.4。安装 CUDA Toolkit 有两种方式我推荐用官方 runfile 或者 apt 源。以 CUDA 11.8 为例用 apt 源的方式# 下载并安装 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-get update # 安装 CUDA Toolkit sudo apt-get install -y cuda-toolkit-11-8注意这里用的是wsl-ubuntu的源不是普通的ubuntu源。WSL2 的 CUDA 包和物理机略有不同用错源可能装不上或者装完不能用。装完之后配置环境变量编辑~/.bashrcexport PATH/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc生效。验证一下nvcc --version能输出版本信息就说明 CUDA Toolkit 装好了。3.3 cuDNN 的配置cuDNN 是 NVIDIA 的深度神经网络加速库PyTorch 底层会用到。现在 cuDNN 也走 apt 源了比早年手动下载解压方便太多sudo apt-get install -y libcudnn8 libcudnn8-dev装完不需要手动配置路径apt 会自动放到系统库目录。验证的话可以写个小程序但一般装完 PyTorch 能跑起来就说明 cuDNN 没问题。这里有个版本匹配的坑cuDNN 的版本要和 CUDA 对应。CUDA 11.8 对应 cuDNN 8.7 以上apt 源会自动处理依赖所以直接用 apt 装最省心。手动下载 cuDNN 压缩包那种老方法很容易版本对不上不推荐。3.4 环境变量配置的完整清单把环境变量集中整理一下方便你对照。编辑~/.bashrc追加以下内容# CUDA export CUDA_HOME/usr/local/cuda-11.8 export PATH$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH$CUDA_HOME/lib64:$LD_LIBRARY_PATH # cuDNNapt 安装的一般不需要手动装的才需要 # export LD_LIBRARY_PATH/usr/local/cudnn/lib64:$LD_LIBRARY_PATH配置完执行source ~/.bashrc然后echo $CUDA_HOME确认一下。环境变量这东西配错了后面 PyTorch 找不到 CUDA 就是它的问题所以这一步别偷懒。4. PyTorch 安装与 GPU 验证实操4.1 用 conda 还是 venv 管理环境Python 环境管理这块我强烈建议用condaMiniconda而不是系统自带的 venv。原因有三个conda 能管理 Python 版本本身venv 只能管理包conda 装科学计算相关的包numpy、scipy有预编译版本不用现场编译多项目隔离方便一个项目一个环境互不干扰。Miniconda 比 Anaconda 轻量没有一堆用不上的预装包推荐装 Minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh一路回车最后选 yes 让它初始化 shell。重开终端后conda --version能输出版本就行。4.2 创建独立的 PyTorch 环境不要直接在 base 环境里装 PyTorch养成好习惯一个项目一个环境# 创建环境指定 Python 版本 conda create -n pytorch python3.10 -y # 激活环境 conda activate pytorchPython 版本选 3.10 比较稳3.11、3.12 有些库还没跟上。激活之后命令行前面会出现(pytorch)说明进对环境了。4.3 安装 PyTorch 的正确命令去 PyTorch 官网的 Get Started 页面选好你的配置PyTorch 版本、CUDA 版本、pip 还是 conda它会生成对应的安装命令。以 CUDA 11.8 为例pip 方式pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118注意--index-url这个参数它指向 PyTorch 官方的 CUDA 专用源。不加的话默认从 PyPI 装装出来的是 CPU 版本白忙活。conda 方式conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia两种方式都行pip 装得快一点conda 依赖处理更稳。我一般用 pip因为 PyTorch 官方现在主推 pip 安装。注意安装过程中如果卡在下载多半是网络问题。可以换国内镜像源但 CUDA 版本的包国内镜像不一定全建议还是用官方源耐心等。4.4 验证 GPU 是否真的可用装完之后必须验证别以为装完就万事大吉。写个测试脚本import torch # 检查 CUDA 是否可用 print(CUDA available:, torch.cuda.is_available()) # 查看 CUDA 版本 print(CUDA version:, torch.version.cuda) # 查看显卡数量 print(GPU count:, torch.cuda.device_count()) # 查看显卡名称 if torch.cuda.is_available(): print(GPU name:, torch.cuda.get_device_name(0)) # 做个实际运算测试 if torch.cuda.is_available(): x torch.randn(1000, 1000).cuda() y torch.randn(1000, 1000).cuda() z torch.mm(x, y) print(Matrix multiply on GPU done:, z.shape)如果CUDA available输出 True显卡名称也对矩阵乘法能跑通那恭喜你环境搭好了。如果输出 False往下看排查部分。4.5 一个完整的训练小例子光验证还不够跑个真实的小训练确认一下。用 MNIST 手写数字识别几行代码就能跑import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 设备 device torch.device(cuda if torch.cuda.is_available() else cpu) print(Using device:, device) # 数据 transform transforms.Compose([transforms.ToTensor()]) train_set datasets.MNIST(./data, trainTrue, downloadTrue, transformtransform) train_loader torch.utils.data.DataLoader(train_set, batch_size64, shuffleTrue) # 简单模型 model nn.Sequential( nn.Flatten(), nn.Linear(784, 128), nn.ReLU(), nn.Linear(128, 10) ).to(device) # 训练 optimizer optim.Adam(model.parameters(), lr0.001) criterion nn.CrossEntropyLoss() for epoch in range(2): for batch_idx, (data, target) in enumerate(train_loader): data, target data.to(device), target.to(device) optimizer.zero_grad() output model(data) loss criterion(output, target) loss.backward() optimizer.step() if batch_idx % 200 0: print(fEpoch {epoch} Batch {batch_idx} Loss {loss.item():.4f})跑起来之后用nvidia-smi看能看到 python 进程占用显存说明 GPU 真的在工作。这个例子虽然简单但把数据加载、模型、训练循环、GPU 迁移全串起来了是个很好的起点。5. 常见问题排查与性能调优5.1 高频问题速查表实际搭环境过程中下面这些问题我基本都遇到过整理成表方便对照问题现象可能原因解决方法nvidia-smi找不到命令Windows 驱动没装或太老升级 Windows 侧 NVIDIA 驱动到 470torch.cuda.is_available()返回 False装了 CPU 版 PyTorch用--index-url重装 CUDA 版CUDA 版本和 PyTorch 不匹配版本选错按 PyTorch 官网对应关系重装WSL2 启动报“尚未准备就绪”虚拟化功能没开BIOS 开虚拟化Windows 功能里开虚拟机平台磁盘空间不足镜像装在 C 盘迁移到其他盘训练速度慢内存分配不足配置.wslconfig调大内存apt update慢默认源在国外换国内镜像源5.2 WSL2 内存和 CPU 限制的调整WSL2 默认最多用主机一半的内存训练大模型时经常不够。可以在 Windows 用户目录下创建.wslconfig文件路径是C:\Users\你的用户名\.wslconfig内容如下[wsl2] memory32GB processors8 swap8GB localhostForwardingtruememory根据你主机内存来16GB 主机给 8GB32GB 主机给 24GB 比较合适。processors是分配的 CPU 核心数。改完执行wsl --shutdown重启生效。注意不要把所有内存都给 WSL2Windows 本身也要用。给太多会导致 Windows 卡顿给太少训练又不够一般给总内存的 60% 到 75% 比较平衡。5.3 文件系统性能的坑WSL2 访问 Windows 文件/mnt/c/...和访问 Linux 原生文件~/...性能差距巨大。我实测过同样读一个几万张图片的数据集放在/mnt/c下比放在~/下慢好几倍。所以有个铁律AI 项目的代码和数据全部放在 WSL2 的 Linux 文件系统里不要放在/mnt/c或/mnt/d。Windows 那边想看文件通过\\wsl$\Ubuntu-22.04\home\你的用户名这个路径访问就行。如果数据集特别大又不想复制两份可以考虑用符号链接但性能还是不如原生。最彻底的办法是数据也放 Linux 侧Windows 侧需要时通过网络路径访问。5.4 网络下载慢的解决思路WSL2 里apt、pip、conda下载慢是常态。apt换源最简单编辑/etc/apt/sources.list把archive.ubuntu.com换成国内镜像。pip 可以配置~/.pip/pip.conf[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple但注意装 PyTorch CUDA 版时不要用这个镜像因为 CUDA 包国内镜像不全还是得用 PyTorch 官方源。可以临时用-i参数指定或者装完 PyTorch 再配镜像。conda 换源稍微麻烦点要改.condarc文件。不过 conda 现在用得少了pip 基本够用。5.5 几个提升开发体验的小技巧最后分享几个我用了很久的技巧能明显提升日常开发效率。VS Code 远程连接装个 WSL 扩展直接在 VS Code 里CtrlShiftP输入WSL: Connect to WSL就能连进 WSL2。代码补全、调试、终端全在 VS Code 里体验和本地开发几乎一样。Python 解释器选 WSL2 里 conda 环境的那个就能直接用 GPU。Jupyter Lab 远程访问在 WSL2 里启动 Jupyter LabWindows 浏览器直接访问localhost:8888就能用。因为 WSL2 和 Windows 共享 localhost不需要额外配置端口转发。启动命令jupyter lab --no-browser --port8888快照备份环境搭好之后用wsl --export导出一份备份。以后环境搞崩了直接wsl --import恢复几分钟搞定比重装快多了。这个习惯我强烈建议养成尤其是装 CUDA 这种容易出问题的环节之前先备份一份。GPU 显存监控训练时想看显存占用开个终端跑watch -n 1 nvidia-smi每秒刷新一次比反复敲命令方便。这套 WSL2 GPU 直通的环境我从去年用到现在跑过 BERT 微调、Stable Diffusion 推理、YOLO 训练稳定性没得说。唯一要注意的就是别在 WSL2 里装显卡驱动以及数据放 Linux 侧这两点记住了基本不会踩大坑。环境搭好之后剩下的精力就可以安心放在模型和算法上了这才是正经事。
阅读完成 · 觉得有帮助?
咨询建站