ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WSL2 深度学习环境搭建:CUDA、PyTorch 与大模型微调实战

WSL2 深度学习环境搭建:CUDA、PyTorch 与大模型微调实战 1. 为什么我最终把 AI 开发主力环境搬进了 WSL2三年前如果有人跟我说把深度学习训练环境跑在 Windows 上我大概率会笑一笑然后继续抱着我的双系统 Ubuntu 不放。但这两年我的主力开发机已经彻底变成了 Windows 11 WSL2 的组合PyTorch 训练、CUDA 编译、大模型微调全都在这个环境里跑而且跑得比我以前那台纯 Linux 工作站还顺手。原因很简单WSL2 不是虚拟机也不是模拟层它是货真价实的内核级 Linux微软把真正的 Linux 内核编译进了 Windows通过轻量级 Hyper-V 虚拟化跑起来同时用一套 9P 文件协议和 Windows 主机打通。这意味着你在里面装的 CUDA、PyTorch、各种 Linux 原生工具链跑起来和裸机 Ubuntu 几乎没有性能差异。但几乎没有差异和完全没坑是两回事。我见过太多人卡在nvidia-smi在 Windows 里正常、进 WSL2 就报错或者 PyTorch 装完torch.cuda.is_available()返回 False又或者 pip 装包慢到怀疑人生。这些问题不是 WSL2 不行而是部署顺序和驱动架构理解错了。WSL2 的 GPU 直通走的是微软自己的 WSLg DirectX 转发 NVIDIA 的 WSL 专用驱动这套组合拳和你熟悉的裸机 CUDA 安装逻辑完全不同。你要是按裸机那套apt install nvidia-driver-xxx去搞百分之百翻车。这篇内容我打算把整套流程从头到尾讲透从 WSL2 的安装、Ubuntu 发行版选择、GPU 直通的驱动原理到 CUDA Toolkit 和 PyTorch 的版本匹配、conda 环境管理、大模型微调时的显存调优再到我踩过的那些坑——比如wsl2 尚未准备就绪、wsl2下载慢、cuda llama.cpp non compatible这类真实报错。适合谁看如果你手上有带 NVIDIA 显卡的 Windows 机器想搞深度学习、想跑大模型微调、想用 Linux 工具链但又不想放弃 Windows 的日常使用那这篇就是给你写的。零基础也能跟但我会把每一步为什么这么做讲清楚方便你出问题时自己排查。2. WSL2 的安装与发行版选择别一上来就装 Ubuntu 22.042.1 用一条命令搞定 WSL2而不是去控制面板勾功能很多人装 WSL2 的路径是控制面板 → 启用或关闭 Windows 功能 → 勾选适用于 Linux 的 Windows 子系统和虚拟机平台 → 重启 → 去商店装 Ubuntu。这套流程没错但太老了而且容易漏掉虚拟机平台这个关键项导致后面报wsl2 尚未准备就绪。现在 Windows 10 2004 以上和 Windows 11 都支持一条命令搞定wsl --install这条命令会自动启用所需的 Windows 功能、下载最新版 WSL2 内核、并把 Ubuntu 设为默认发行版。装完重启一次系统会让你设置 Linux 用户名和密码。如果你已经装过 WSL 但版本是 1用wsl --set-default-version 2切换再用wsl -l -v确认每个发行版的 VERSION 列是 2。注意wsl --install默认装的是 Ubuntu但如果你在国内网络环境下遇到wsl2下载慢的问题可以在命令后面加--no-distribution先只装 WSL2 内核然后自己去装发行版或者用wsl --install -d 发行版名指定。2.2 发行版选择Ubuntu 22.04 还是 24.04这是个真问题热词里wsl2安装ubuntu22.04出现频率很高我理解为什么——22.04 LTS 是目前 CUDA 和 PyTorch 生态兼容性最稳的版本。但 24.04 也已经很成熟了而且自带更新的 GCC 和 Python。我的建议是发行版适合场景注意事项Ubuntu 22.04 LTS生产级训练、需要长期稳定CUDA 12.x 官方支持最全Ubuntu 24.04 LTS新项目、想用新工具链部分老版本 CUDA 需要手动降 GCCDebian 12轻量、稳定NVIDIA 驱动包名和 Ubuntu 不同Arch WSL滚动更新、爱折腾内核更新频繁CUDA 偶尔要重装我自己的主力是 Ubuntu 22.04因为大模型微调那套工具链transformers、peft、bitsandbytes在 22.04 上验证最充分。如果你只是跑推理或者学习24.04 完全没问题。装发行版的命令wsl --install -d Ubuntu-22.04装完第一次启动会让你设用户名密码这个账号默认是普通用户需要 sudo 权限时输密码即可。这里有个小细节WSL2 的默认用户不要设成 root否则后面 conda、pip 的权限管理会乱套而且很多工具会警告你不要用 root 跑。2.3 系统盘迁移别让 C 盘被 Linux 镜像撑爆WSL2 的发行版默认装在 C 盘路径大概是C:\Users\你的用户名\AppData\Local\Packages\...。一个装完 CUDA PyTorch 几个 conda 环境的 Ubuntu轻松吃掉 30-50GB。如果你 C 盘是系统盘且空间紧张强烈建议迁移到其他盘。步骤是# 先关闭 WSL wsl --shutdown # 导出当前发行版到指定路径 wsl --export Ubuntu-22.04 D:\wsl\ubuntu22.tar # 注销原发行版 wsl --unregister Ubuntu-22.04 # 导入到新位置 wsl --import Ubuntu-22.04 D:\wsl\ubuntu22 D:\wsl\ubuntu22.tar --version 2导入后默认用户会变成 root需要改回普通用户。编辑/etc/wsl.conf[user] default你的用户名然后wsl --shutdown重启即可。这一步我踩过坑导出前一定要wsl --shutdown否则 tar 包可能不完整导入后文件系统损坏。3. GPU 直通的真相驱动装在 WindowsCUDA 装在 Linux3.1 为什么nvidia-smi在 WSL2 里能跑但你不能装 Linux 驱动这是整个部署里最容易搞错的一点。WSL2 的 GPU 直通架构是这样的Windows 主机上装 NVIDIA 的常规驱动带 WSL 支持WSL2 里通过/usr/lib/wsl/lib下的转发库访问 GPU。也就是说Linux 侧根本不需要装 NVIDIA 驱动你装了反而会冲突。验证方法很简单在 WSL2 里直接跑nvidia-smi如果 Windows 驱动装对了这条命令会直接输出显卡信息包括驱动版本、CUDA Version注意这个 CUDA Version 是驱动支持的最高版本不是你装的 CUDA Toolkit 版本。如果报command not found先检查/usr/lib/wsl/lib是否在 PATH 里echo $PATH | grep wsl ls /usr/lib/wsl/lib正常情况下这个目录里有libcuda.so、nvidia-smi等文件。如果没有说明 Windows 侧的驱动没装好或者版本太老。Windows 驱动必须是 470 以上推荐 535 或更高去 NVIDIA 官网下Windows Driver而不是Linux Driver这点千万别搞错。提示如果你之前手贱在 WSL2 里apt install nvidia-driver-xxx先卸载干净sudo apt purge nvidia-*然后重启 WSL。否则会出现驱动版本冲突nvidia-smi报 Failed to initialize NVML。3.2 CUDA Toolkit 的安装用官方 runfile 还是 aptCUDA Toolkit 是装在 Linux 侧的它提供nvcc编译器、cuBLAS、cuDNN 等库。安装方式有两种方式一apt 源安装推荐新手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 update sudo apt install cuda-toolkit-12-4注意这里用的是wsl-ubuntu的源不是普通的ubuntu2204源。WSL 专用源里的包针对 WSL 环境做了适配能避免一些库路径问题。方式二runfile 安装适合需要多版本共存去 NVIDIA 官网下载 runfile运行后只勾选 CUDA Toolkit不要勾 Driver。因为 WSL2 不需要 Linux 驱动勾了会装一堆没用的东西甚至搞坏环境。装完配置环境变量编辑~/.bashrcexport PATH/usr/local/cuda-12.4/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc用nvcc -V验证。这里有个关键点nvcc -V显示的版本和nvidia-smi显示的 CUDA Version 是两回事。前者是你装的 Toolkit 版本后者是驱动支持的最高版本。只要 Toolkit 版本 ≤ 驱动支持版本就没问题。3.3 cuDNN 的坑版本必须和 CUDA 严格对应cuDNN 是深度学习的加速库PyTorch 底层会调用它。下载 cuDNN 需要 NVIDIA 账号选版本时一定要和 CUDA Toolkit 对应。比如 CUDA 12.4 对应 cuDNN 9.x。安装就是把头文件和库拷到 CUDA 目录tar -xvf cudnn-linux-x86_64-9.x.x.x_cuda12-archive.tar.xz sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64 sudo chmod ar /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*我见过有人 cuDNN 版本装错PyTorch 能 import 但一跑卷积就报CUDNN_STATUS_NOT_INITIALIZED。排查方法python -c import torch; print(torch.backends.cudnn.version())看输出的版本和 CUDA 是否匹配。4. PyTorch 环境搭建conda 还是 venv以及版本匹配的硬逻辑4.1 环境管理工具的选择Miniconda 是 WSL2 里的最优解WSL2 里装 Python 环境我强烈推荐 Miniconda 而不是系统 Python venv。原因有三第一conda 能管理非 Python 依赖比如 CUDA 运行时库venv 不行第二conda 的环境隔离更彻底不会污染系统 Python第三大模型微调那套工具链bitsandbytes、flash-attn用 conda 装省心很多。wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh # 一路回车最后 yes 初始化 source ~/.bashrc装完conda --version验证。然后创建环境conda create -n ai python3.10 -y conda activate aiPython 版本选 3.10 或 3.11这两个是 PyTorch 生态兼容性最好的。3.12 也能用但部分库还没跟上。4.2 PyTorch 安装别用pip install torch裸装这是新手最大的坑。直接pip install torch装的是 CPU 版本torch.cuda.is_available()永远返回 False。正确做法是去 PyTorch 官网查对应 CUDA 版本的安装命令。以 CUDA 12.4 为例pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124注意--index-url参数它指定了 CUDA 12.4 的 wheel 源。如果你用 condaconda install pytorch torchvision torchaudio pytorch-cuda12.4 -c pytorch -c nvidia装完验证import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) print(torch.backends.cudnn.version())四个输出分别是 PyTorch 版本、CUDA 是否可用、显卡型号、cuDNN 版本。如果is_available()是 False按这个顺序排查先看nvidia-smi是否正常再看 PyTorch 版本是否 CPU 版torch.__version__里带cpu就是装错了最后看 CUDA Toolkit 和 PyTorch 的 CUDA 版本是否匹配。4.3 版本匹配的硬逻辑一张表说清楚PyTorch 版本推荐 CUDA推荐 Python备注2.4.x12.43.10-3.12最新稳定支持 FlashAttention 22.3.x12.13.10-3.11兼容性好大模型微调常用2.2.x11.8 / 12.13.10-3.11老项目维护2.1.x11.83.10部分老库依赖我自己的组合是 PyTorch 2.4 CUDA 12.4 Python 3.10跑 Llama 3 微调和 Stable Diffusion 都没问题。如果你要跑cuda llama.cpp non compatible这类报错通常是 llama.cpp 编译时的 CUDA 架构参数没对上你的显卡算力需要加-DCMAKE_CUDA_ARCHITECTURES8940 系或8630 系重新编译。5. 大模型微调场景下的显存与性能调优5.1 WSL2 的显存是动态分配的但有个上限WSL2 默认会占用最多 50% 的系统内存作为虚拟内存GPU 显存则是直通使用不额外分配。但有个坑WSL2 的显存不会自动释放跑完一个大模型后nvidia-smi可能还显示占用。这是 Linux 侧进程没退干净kill掉对应 PID 即可。如果频繁出现可以在~/.wslconfigWindows 用户目录下里限制[wsl2] memory32GB processors16 swap8GB改完wsl --shutdown重启生效。注意memory不要设得太大给 Windows 主机留够内存否则整个系统会卡。5.2 微调时的 batch size 和 gradient accumulationWSL2 的 GPU 性能和裸机几乎一致但显存管理上有个细节Windows 桌面本身会占用一部分显存尤其是接了多显示器或开了浏览器硬件加速。所以同样的模型WSL2 里能跑的 batch size 可能比裸机小一点。我的经验是7B 模型 LoRA 微调24G 显存4090可以跑 batch size 4 gradient accumulation 413B 模型 LoRA24G 显存建议 batch size 1 gradient accumulation 16全量微调 7B至少需要 80G 显存A100如果显存不够优先用bitsandbytes的 4bit 量化 LoRA能把 7B 模型的显存需求压到 10G 以内。安装pip install bitsandbytes accelerate peft transformers然后在代码里配置load_in_4bitTrue。这里有个 WSL2 特有的坑bitsandbytes 的某些版本在 WSL2 里会报CUDA error: no kernel image is available解决方法是装最新版或者从源码编译。5.3 数据加载的性能别让 9P 文件协议拖后腿WSL2 访问 Windows 文件系统/mnt/c/走的是 9P 协议速度比访问 Linux 原生文件系统慢很多。如果你把训练数据放在 Windows 盘里DataLoader 的读取速度可能成为瓶颈。我的做法是训练数据全部放在 WSL2 的 Linux 文件系统里比如~/data/需要从 Windows 传数据时用cp拷进去。实测下来同样的数据集从/mnt/d/读取比从~/data/读取慢 3-5 倍。如果数据太大拷不动可以在 Windows 侧开个 HTTP 服务WSL2 里用wget下载或者用rsync同步。但最根本的解决方案还是把数据放在 Linux 侧。6. 那些让我熬夜排查的真实报错与解决路径6.1wsl2 尚未准备就绪的完整排查链路这个报错我遇到过三次每次原因都不一样。第一次是 Windows 功能没开全第二次是 WSL2 内核没更新第三次是 Hyper-V 和某些虚拟化软件冲突。排查顺序检查 Windows 功能dism.exe /online /get-featureinfo /featurename:Microsoft-Windows-Subsystem-Linux和VirtualMachinePlatform两个都要是 Enabled。更新 WSL2 内核去微软官网下载最新版wsl_update_x64.msi安装。检查 BIOS 虚拟化任务管理器 → 性能 → CPU看虚拟化是否为已启用。如果装了 VMware 或 VirtualBox可能和 Hyper-V 冲突需要关掉它们的虚拟化加速。6.2cuda llama.cpp non compatible的编译参数问题llama.cpp 在 WSL2 里编译 CUDA 版本时默认的 CUDA 架构可能不包含你的显卡。比如 40 系显卡是算力 8.9需要在 CMake 时指定cmake .. -DLLAMA_CUDAON -DCMAKE_CUDA_ARCHITECTURES8930 系是 8620 系是 75A100 是 80H100 是 90。不指定的话编译出来的二进制在运行时可能报 no kernel image is available for execution on the device。这个坑我踩过排查了半天才发现是架构参数问题。6.3 pip 安装慢和 conda 源的问题国内网络环境下pip 和 conda 默认源都很慢。换源# pip 换清华源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # conda 换源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --set show_channel_urls yes但注意PyTorch 的 CUDA wheel 不要用清华源因为清华源可能没有最新的 CUDA 版本还是用官方--index-url。我一般只给普通包换源PyTorch 相关的手动指定官方源。6.4 显存泄漏和进程残留WSL2 里跑训练脚本如果脚本异常退出GPU 显存可能不释放。nvidia-smi看到占用但找不到进程这时候需要# 查看所有 python 进程 ps aux | grep python # 强制杀掉 kill -9 PID # 如果还不行重启 WSL wsl --shutdown重启 WSL 会清空所有 Linux 进程显存自然释放。但注意这会中断所有正在跑的任务所以训练脚本最好加 checkpoint 保存。7. 我日常用的 WSL2 AI 开发工作流7.1 代码编辑VS Code Remote 是标配在 Windows 侧装 VS Code然后装 WSL 扩展。在 WSL2 里进入项目目录运行code .VS Code 会自动连接到 WSL2 环境所有终端、调试、Python 解释器都在 Linux 侧。这个体验比在 Windows 侧编辑再传到 Linux 侧好太多。配合 Jupyter 扩展可以直接在 VS Code 里跑 notebook内核选 WSL2 里的 conda 环境。7.2 文件互传用explorer.exe快速打开目录在 WSL2 里想用 Windows 资源管理器打开当前目录explorer.exe .反过来在 Windows 里访问 WSL2 文件系统路径是\\wsl$\Ubuntu-22.04\home\你的用户名\。这个路径可以直接在资源管理器地址栏输入也可以映射成网络驱动器。7.3 后台训练用 tmux 或 nohupWSL2 的终端关掉后里面的进程默认会终止。跑长训练任务要用 tmuxsudo apt install tmux tmux new -s train # 在 tmux 里跑训练 python train.py # CtrlB 然后 D 脱离 # 下次 tmux attach -t train 回来或者用 nohupnohup python train.py train.log 21 但 tmux 的好处是可以随时回去看实时输出调试更方便。7.4 系统备份定期导出 tar 包WSL2 环境折腾久了容易乱建议每隔一段时间导出备份wsl --shutdown wsl --export Ubuntu-22.04 D:\backup\ubuntu-$(date %Y%m%d).tar这样即使环境搞坏了也能快速恢复。我一般一个月备份一次或者在装完重要环境后立刻备份。8. 关于性能我实测下来的一些数字很多人关心 WSL2 的 GPU 性能到底损失多少。我在 4090 i9-13900K 的机器上做过对比测试用 PyTorch 跑 ResNet-50 训练裸机 Ubuntu 和 WSL2 的差距在 3% 以内基本可以忽略。推理场景差距更小1% 左右。真正有差距的是文件 IO前面说过 9P 协议的问题但把数据放 Linux 侧就解决了。显存方面WSL2 直通的是物理显存没有额外开销。但 Windows 桌面本身会占用 1-2GB 显存所以实际可用显存比裸机少一点。如果你要跑显存吃紧的任务可以关掉 Windows 的硬件加速 GPU 调度或者用集显接显示器独显专门给 WSL2 用。CPU 性能上WSL2 默认使用所有核心但可以通过.wslconfig限制。我一般设processors16总共 24 核给 Windows 留 8 核这样边训练边用电脑不会卡。最后说个我自己的体会WSL2 这套方案最大的价值不是性能而是让你不用在 Windows 和 Linux 之间做选择。以前我要么双系统重启切换要么用虚拟机忍受性能损失现在两个环境无缝共存文件互通、剪贴板共享、GPU 直通开发效率提升非常明显。当然它也不是银弹内核更新偶尔会出问题网络配置比裸机复杂但这些坑踩过一遍之后剩下的就是稳定产出。如果你还在犹豫要不要上 WSL2我的建议是只要你的显卡是 NVIDIA 且驱动版本够新直接上不会后悔。
返回列表