ARTICLE DETAIL

资讯详情

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

Win11下用WSL2+ROCm让A卡跑PyTorch的完整踩坑指南

Win11下用WSL2+ROCm让A卡跑PyTorch的完整踩坑指南 说实话在Windows下用A卡跑PyTorch一直以来都挺折腾的。之前想做深度学习手上的显卡偏偏是AMD的网上一搜教程全是CUDA和N卡那种“A卡用户没人权”的感觉非常强烈。但Win11搭配WSL2这条路其实给出了一个很成熟的解法——在Windows里跑一个真正的Linux内核再配合ROCm 10.0把A卡的计算能力“透传”过去就能把PyTorch环境完整跑起来。这篇文章我把自己从零到一踩坑的全过程整理出来包括版本选型、每一步命令、为什么这样做以及最后遇到的那些奇奇怪怪的报错希望能帮你少走点弯路。1. 为什么选择WSL2 ROCm这条路线1.1 原生Windows下A卡跑PyTorch的困局先说清楚问题在哪。PyTorch官方对N卡的支持是直接走CUDA的Windows原生驱动装好就能用几乎无缝。但AMD这边的主推方案ROCm官方明确只支持Linux系统Windows原生版本直到现在都算不上一等公民。以前想过两个折中方案第一是用DirectML版本的PyTorch确实能在Windows原生环境下调用A卡但算子覆盖和性能都差那么一口气很多模型代码跑一半会莫名其妙报“算子不支持”第二是搞双系统需要的时候重启进Linux代价是中断工作流来回切换很烦。WSL2解决了这个尴尬。它本质上是一个运行在Hyper-V里的轻量级虚拟机但又和传统虚拟机完全不同——它和Windows共享内核级的GPU驱动通信。AMD在Windows侧只要装好驱动WSL2里的Linux系统就能“借用”这张显卡跑ROCm栈性能损失很小。整个过程就像在Windows里开了一个无缝的Linux终端不用重启Python脚本照跑文件系统还能互相访问。1.2 硬件和版本的硬性门槛这条路虽然好但不是所有A卡都能走。ROCm官方支持列表里主要覆盖的是GFX9系列RX Vega、RX 5000系列和GFX10系列RX 6000系列到了GFX11RX 7000系列支持也越来越完整。我实测用的是一块RX 6600 XTGFX1032如果你手里是RX 580这种老卡建议先去翻一下ROCm的Supported GPUs列表确认有对应条目再动手。GPU架构不在列表里后面装完PyTorch大概率会碰到“torch.cuda.is_available()返回False”或直接初始化失败。系统方面Win11建议22H2以上版本WSL2内核要用最新的wsl --update更新Ubuntu版本我推荐22.04 LTS这是目前ROCm 10.0官方支持最成熟的发行版24.04也能用但有些库的兼容性还没完全跟上。内存建议16GB起步32GB更舒服。因为WSL2里的GPU显存其实还是共享物理显存训练大模型时CPU端和GPU端都有开销内存太小容易在数据加载阶段卡成PPT。1.3 备选方案的取舍逻辑也有朋友问直接用Hyper-V虚拟机装Ubuntu再把PCIe显卡直通进去行不行技术上可行但配置复杂度上升一大截需要关闭虚拟机嵌套、手动分配显卡、处理驱动冲突而且Windows侧会彻底失去这块显卡的显示输出日常办公体验直接没了。WSL2的方案核心优势就是“保留宿主GPU用于桌面 WSL2内部用于计算”两不耽误。这也是我最终选定这条路的最大原因。2. WSL2环境准备与Ubuntu部署2.1 一条命令开启WSL2如果你是新装的Win11操作异常简单管理员身份打开PowerShell或Windows Terminal输入wsl --install这个命令会默认安装最新版WSL2组件和Ubuntu发行版。装完重启一下系统会提示你设置Linux用户名和密码。如果是老系统或者是精简版系统可能没有这个命令那就需要手动开功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart启用完重启然后去微软商店装一个Ubuntu 22.04或者继续用命令wsl --install -d Ubuntu-22.04安装完成后先跑一下wsl --version确认WSL2内核版本不是太老老版本内核在后续配置GPU透传的时候会遇到奇怪问题建议直接更新到最新wsl --update2.2 替换APT源与系统初始化进入WSL2里的Ubuntu之后第一步永远是更新软件源。国内网络环境下直接访问官方源慢得让人崩溃建议换成清华或阿里云镜像。拿清华源举例先备份原文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo apt update sudo apt upgrade -y这里顺便把后续要用到的工具链一并装上别等到报错再补sudo apt install -y wget curl git build-essential cmake g python3-pip sudo apt install -y mesa-utilsmesa-utils里的glxinfo虽然不是必需但后面排查OpenCL或者GPU透传是否成功时很有用。补一个关键细节装好之后开个新终端跑一下lspci | grep -i amd正常情况下应该能看到你显卡的PCIe设备信息。如果这里输出为空说明WSL2里的虚拟PCI总线都没检测到AMD显卡后面ROCm再折腾也没用问题出在Windows侧驱动先回宿主机解决。2.3 用.wslconfig调整WSL2资源分配WSL2默认配置下内存占用是宿主机总内存的50%左右CPU是所有核心都能用对一般开发是够了但跑深度学习最好单独配置一下。直接在C:\Users\你的用户名\.wslconfig这个文件里写[wsl2] memory16GB processors8 swap8GB swapFileD:\\wsl\\swap.vhdx localhostForwardingtrue注意每次改完配置文件要让WSL2完全重启才能生效wsl --shutdown wsl配置里值得说的是swapFile如果C盘空间紧张把交换文件挪到D盘能救急默认是在C盘用户目录下一个几十GB的动态文件。localhostForwarding保持打开后面用WSL2里的Jupyter或TensorBoard时Windows浏览器直接访问localhost:8888就能连上非常方便。3. Windows侧AMD驱动与ROCm 10.0安装3.1 WSL2下GPU驱动的工作原理这是最容易踩坑的地方先把这个概念掰扯清楚WSL2里看不到传统意义上的“显卡驱动安装流程”。你不需要也不应该在Ubuntu里跑去装AMD官方驱动更不要装amdgpu-dkms这类内核模块包——WSL2的Linux内核由微软统一管理维护GPU的驱动能力全部来自Windows宿主机。换句话说Windows侧装好最新版本的AMD Adrenalin驱动之后WSL2里的Linux会自动通过微软提供的半虚拟化驱动层把/dev/kfd和/dev/dri/renderD128这两个设备“映射”进Ubuntu。ROCm 10.0这些用户态库再去操作这些设备就能和GPU通信了。所以第一步是先回Windows把AMD驱动更新到官网最新的Adrenalin版本至少要支持你的显卡型号建议2024年以后版本。驱动太旧WSL2里即使ROCm装对了也经常出现amdgpu: failed to run init_ip function of amdgpu之类的报错排查起来非常头疼。装完后在Ubuntu里验证一下设备节点是否存在ls /dev/kfd /dev/dri/renderD128如果这两个路径都能看到说明GPU透传已经就绪可以进入下一步。3.2 系统级ROCm装还是不装这里我直接给你我的结论如果目的仅仅是跑PyTorch训练和推理强烈建议跳过系统级ROCm安装直接用PyTorch官方发布的ROCm版wheel包。理由是PyTorch的ROCm版wheel已经把运行时需要的HIP库、MIOpen、rocBLAS等打包进Python包了不需要系统里再装一份完整ROCm省时省力。但如果你想用hipcc编译自定义HIP代码或者要用rocminfo这类ROCm自带的调试工具那就得装系统级ROCm。我给你的方案是装但只装用户态运行时和开发库不碰内核模块。用AMD官方仓库curl -fsSL https://repo.radeon.com/rocm/rocm.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/rocm.gpg echo deb [archamd64 signed-by/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/10.0 jammy main | sudo tee /etc/apt/sources.list.d/rocm.list sudo apt update sudo apt install -y rocm-hip-libraries rocm-hip-runtime rocm-dev rocminfo注意我特意没装amdgpu-dkms理由上面说了——它在WSL2环境里会尝试编译和安装内核模块可能和微软提供的GPU半虚拟化驱动冲突轻则重复加载失败重则导致系统级崩溃。装完后把当前用户加入video和render组否则非root用户访问GPU设备会没有权限sudo usermod -a -G video,render $USER newgrp video newgrp render然后跑rocminfo验证rocminfo | grep -i gfx正常能看到你的GFX版本号例如gfx1032这种。看到它就说明ROCm用户态栈已经能识别GPU了。3.3 如果显卡不在官方支持列表里老卡用户或者小众型号用户到了rocminfo这一步经常是空的或者虽然能看到GPU但一运行就报HIP错误。这时候可以试试HSA_OVERRIDE_GFX_VERSION这个环境变量把显卡伪装成同架构下的主流型号。比如RX 6600 XT本来是gfx1032有些库还不认那就让它伪装成gfx1030export HSA_OVERRIDE_GFX_VERSION10.3.0这个变量是运行时生效的所以我建议直接写进~/.bashrc一劳永逸。不过要注意这只是绕过ROCm支持名单限制的手段如果卡在某个算子不兼容的报错上成功率并不高最终还是要回归到受支持的显卡上。4. PyTorch ROCm版环境搭建4.1 安装Miniconda并创建独立环境系统里的Python环境最好和PyTorch环境隔离我习惯用Miniconda。它比Anaconda轻量只装conda本体需要什么包再往里加。安装过程很简单wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装时一路确认最后conda init会自动把conda加到PATH里。如果下载速度很慢可以把安装包URL换成清华镜像搜索“Miniconda3-latest-Linux-x86_64.sh 清华”就能找到镜像地址。装好后创建一个专用的PyTorch环境conda create -n torch python3.10 -y conda activate torchPython版本选3.10是我反复验证过的稳妥选择PyTorch最新的ROCm wheel对3.9到3.12都有支持但3.10是目前第三方库兼容面最广的不容易遇到某个依赖包没编译对应版本的问题。4.2 用官方ROCm wheel安装PyTorch激活环境后最关键的一步来了。PyTorch官方在download.pytorch.org上提供了针对ROCm各版本的wheel仓库安装命令是pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm10.0如果你在的ROCm版本在官方wheel仓库里没有对应目录PyTorch对ROCm版本有一定滞后就退一步用稳定版匹配的目录比如rocm6.x系列方法完全一样pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.2这里有个非常容易翻车的地方如果你之前装过CUDA版PyTorch或者当前conda环境是从别处clone来的pip会认为torch已经存在而跳过安装。保险起见安装前先确认环境是干净的pip uninstall torch torchvision torchaudio -y另外下载PyTorch wheel动辄几个GB国内网络可能非常慢。可以用清华的PyTorch wheel镜像源加速pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/rocm10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple这里--extra-index-url和-i配合用主源用清华但让pip依然能从PyTorch官方源找ROCm专用包。只用-i指定清华源的话它默认源里没有ROCm后缀的包安装下来的很可能是CPU版白等半天。4.3 验证GPU可用性安装完不要急着跑训练先用最简单的几行代码确认GPU真的被PyTorch识别了import torch print(PyTorch版本:, torch.__version__) print(ROCm/HIP版本:, torch.version.hip) print(CUDA是否可用(ROCm接口):, torch.cuda.is_available()) print(GPU名称:, torch.cuda.get_device_name(0))如果你看到torch.cuda.is_available()输出True就说明PyTorch已经通过ROCm成功接管GPU了。这里要提前说一句在ROCm版PyTorch里命名空间还是torch.cuda不是torch.hip这是历史遗留的API命名代码层面不用改但新手经常误以为装错了。接下来可以跑一个稍微有计算量的矩阵乘法验证性能是否正常python -c import torch; atorch.randn(4096,4096,devicecuda); btorch.randn(4096,4096,devicecuda); print(torch.matmul(a,b).sum())再进一步跑个小规模的卷积训练片段测试也能接受。有朋友问我为什么不直接跑CIFAR-10其实环境验证到矩阵乘法和设备信息就够了剩下的交给真实训练任务去检验。5. 常见问题与排查技巧实录5.1 高频报错速查表错误现象直接原因解决手段torch.cuda.is_available()返回FalseGPU透传失败或显卡架构不受支持先检查lspci和/dev/kfd再查ROCm支持列表是否包含你的显卡最后尝试HSA_OVERRIDE_GFX_VERSION运行时出现MIOpen相关报错MIOpen缓存损坏或版本不匹配删除~/.cache/miopen目录后重试hipErrorNoDevice非root用户没有权限访问GPU设备节点把用户加入video,render组可能需要重新登录终端WSL2安装Ubuntu后无法启动GPU服务宿主AMD驱动版本过旧更新Windows侧Adrenalin驱动到最新然后wsl --shutdown重启conda创建环境时卡住或极慢默认源是国外给conda配置清华镜像conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/训练时提示显存不足但任务占用不大WSL2显存管理策略与原生Linux不同尽量关闭Windows侧占显存的软件浏览器硬件加速等必要时重启WSL2释放显存碎片OpenCLW could not safely verify the WSL2 environmentOpenCL运行时版本和底层WSL2环境不匹配确认ROCm和最新WSL2内核已更新必要时升级Ubuntu 22.04小版本到最新补丁5.2 最容易被忽略的权限问题权限问题真的是快被问烂了。很多教程会让你直接sudo python跑训练脚本我很反对这种做法——sudo环境下很多库的路径和缓存目录会变得混乱还会把MIOpen缓存写到/root/.cache以后切回普通用户又得重新缓存一遍。正确做法是确保普通用户能访问GPU设备sudo usermod -a -G video,render $USER执行完切记完全退出WSL2exit然后wsl --shutdown重新进入才生效。不要嫌麻烦这一步不做后面所有程序都会在初始化设备时摔跟头。5.3 文件IO慢到怀疑人生怎么办WSL2的一个老毛病访问Windows侧文件系统也就是/mnt/c/xxx的速度比访问Linux原生文件系统慢好几个数量级。尤其训练大规模数据集时如果代码里直接读取/mnt/c/Users/xxx/datasets/下的数据数据加载阶段会成为整个训练流程的最大瓶颈。我的习惯是这样数据集、模型权重、缓存目录全部放在WSL2的Linux文件系统内比如~/datasets、~/models、~/cache。Windows侧文件只作为临时中转用完后及时拷贝进Linux侧。还有个小技巧如果你是从Windows浏览器下载的模型先放到C:\Users\xxx\Downloads再在WSL2里用cp /mnt/c/Users/xxx/Downloads/model.pt ~/models/拷过去比直接在代码里跨系统读文件快非常多。另外PyTorch的DataLoader默认num_workers0Windows下经常这样设置在WSL2里可以放心调到num_workers0因为它底层变成了一个真正的Linux环境内存管理和进程fork都没有Windows那种限制多进程加载数据集非常稳。5.4 HSA_OVERRIDE_GFX_VERSION的适用范围这个环境变量算是A卡用户最后的补救手段。之前讲过RX 6600 XT伪装成gfx1030的例子但它不是万能钥匙——对不能覆盖的架构比如gfx90c这类集成显卡或者跨时代伪装比如gfx1100伪装成gfx1030基本没用强行设置甚至可能让程序崩溃得更早。我的建议是只有当你确知自己的显卡MES构架号和伪装目标非常接近同系列、同核心代际时才使用。并且设置后一定要跑一遍torch.cuda.is_available()和矩阵乘法确认不会出现计算错误。6. 性能优化与日常使用建议6.1 压榨WSL2的资源配置前面提过.wslconfig但那里只是基础配置还有几个参数值得根据实际硬件微调。比如networkingModemirrored这个选项开启后WSL2和Windows共享同一套网络接口访问局域网里其他机器时IP地址就是Windows本机IP某些分布式训练场景更好用dnsTunnelingtrue可以解决DNS解析慢的问题。一个完整的示例配置[wsl2] memory24GB processors8 swap8GB networkingModemirrored dnsTunnelingtrue firewalltrue autoProxytrue这些参数的调整原则是给WSL2足够的内存但不至于让宿主机卡死CPU核心数留两个给Windows用同时保持网络和代理自动同步。这样训练时的体验和远程Linux服务器几乎没差别。6.2 环境变量统一管理ROCm栈有几个环境变量建议统一写进~/.bashrc省得每次启动都手动exportexport ROCM_PATH/opt/rocm export ROCM_HOME/opt/rocm export HSA_OVERRIDE_GFX_VERSION10.3.0 # 如果显卡需要伪装才加这行 export HIP_VISIBLE_DEVICES0其中HIP_VISIBLE_DEVICES0指定默认使用第一张显卡如果以后插多卡可以改成export HIP_VISIBLE_DEVICES0,1或按需调整顺序。官方环境变量在ROCm文档里有完整清单按需查阅不需要全部记住。6.3 开发工具链的联动没有好用的开发环境再强的GPU也白搭。我目前的工作流是Windows侧用Visual Studio Code装好“WSL”扩展然后所有代码都通过WSL2里的Linux环境打开。这样VSCode连接的是Ubuntu侧的文件系统、Python解释器、虚拟环境直接用conda里创建的torch环境跑训练调试体验和原生Linux开发完全一致。如果需要Jupyter Notebook直接在WSL2里pip install jupyter启动后Windows浏览器访问localhost:8888网络完全打通。像ollama这样的大模型工具WSL2里直接装上配合ROCm也能跑本地推理省去双系统的麻烦。6.4 一个省心的日常训练流程踩了无数坑之后我现在的日常流程基本稳定在这几步启动WSL2激活训练环境检查一次GPU状态然后开跑。wsl ~ conda activate torch python -c import torch; assert torch.cuda.is_available(); print(torch.cuda.get_device_name(0)) python train.py每周末固定执行一次wsl --update和Windows系统更新确保底层驱动和内核补丁不落太多。遇到大规模长时间训练我会顺手在Windows里把浏览器、微信这些“显存杀手”关掉A卡的显存本来就比N卡抠门训练过程中爆显存基本都伴随着Windows侧一堆软件在抢资源。写到这里我觉得WSL2 ROCm 10.0 PyTorch这套组合已经是我在Windows上解决A卡深度学习问题的最优解了甚至能说它是当前最友好的方案。它的复杂度其实藏在前期环境配置的细节里一旦跑通了后面的使用体验非常顺畅。我踩过最大的坑还是显卡支持列表没看清楚就一路装到底最后在torch.cuda.is_available()这步卡了半天。所以建议你先对照自己的GPU型号确认在ROCm支持范围里再动手能省下大量排查时间。如果你也是A卡用户不妨照着这篇文章一步步试一下有问题欢迎交流。
返回列表