如果你的PC装的是AMD显卡又离不开Windows 11同时还想着跑PyTorch做深度学习、微调模型、跑推理任务那你大概率已经被“官方不支持”这件事磨得没脾气了。PyTorch在Windows原生环境里只提供CUDA版AMD主推的ROCm计算平台又没有完整的Windows用户态支持导致AMD用户想走GPU加速这条路要么装双系统要么想办法在WSL2里折腾。这篇博文想分享的就是我反复验证过的一条可行路线在Win11里装好WSL2在Ubuntu里部署ROCm 10.0最后给PyTorch配上ROCm后端让AMD显卡真正跑起来。这条路线的适用人群很明确拥有支持ROCm的AMD显卡、主力系统是Win11、想兼顾日常办公和Linux开发环境、又不想为了训练模型频繁重启切换系统的人。整套流程下来大概需要半小时到一小时不涉及太复杂的编译操作但有不少隐藏的坑尤其是驱动与WSL2的协作方式、ROCm安装时的“不装内核模块”等细节一旦理解错了就会花很多冤枉时间。我会把每一步的为什么和具体命令都写出来尽量让你照着做也能一次通关。1. 动工前必须想清楚的事方案选型与硬件确认很多人一上来就想在Windows原生环境里装ROCm这个念头趁早打消。AMD虽然提供HIP SDK等工具链但PyTorch、TensorFlow这类深度学习框架并没有针对Windows原生的ROCm版本官方只发布了Linux版本。这意味着Windows原生环境里用AMD显卡跑PyTorch目前基本是死路。剩下的选择无非是双系统、虚拟机、WSL2而WSL2在这个需求里几乎是“最优解”。1.1 为什么是WSL2而不是双系统双系统的问题不是装不上而是切换成本太高。你在Windows里有一堆工作突然想跑个训练任务得关机重启进Linux训练完再切回来。这种割裂感在项目中期尤其痛苦。另一方面虚拟机的GPU直通方案虽然也能把AMD显卡映射给Linux虚拟机但配置门槛高性能损耗也不小而且对家用主板的IOMMU支持要求比较苛刻。WSL2的优势在于它跑的是真正的Linux内核不是模拟层同时又由Windows统一管理GPU驱动。你在Windows侧更新AMD显卡驱动WSL2里的Linux就能直接看到GPU设备文件/dev/kfd和/dev/dri不需要在Linux内部单独装驱动。Microsoft和AMD共同维护的GPU-PVGPU分区虚拟化机制会把GPU计算请求从Linux转发给Windows宿主驱动处理性能损耗非常低尤其适合深度学习这种大批量矩阵运算场景。所以最终的路子是Win11 最新AMD Windows驱动 WSL2 Ubuntu 22.04 ROCm用户态组件 PyTorch ROCm版。整个方案里Windows只负责驱动转发Linux负责ROCm运行库和PyTorch各司其职。1.2 ROCm到底解决什么问题ROCmRadeon Open Compute是AMD对标NVIDIA CUDA的异构计算平台。它包含HIP编程模型、编译器、数学库rocBLAS、rocFFT、rocSPARSE等以及运行时组件。PyTorch官方发布过针对ROCm的预编译版本底层通过HIP/ROCm调用AMD显卡的计算单元对外API依然是熟悉的torch.cuda系列接口。理解这一点很重要在PyTorch里不管你是NVIDIA卡还是AMD卡代码里写的还是torch.cuda.is_available()和devicecuda只是底层驱动引擎从CUDA换成了ROCm的HIP。所以只要你熟悉PyTorch完全不需要学新的编程模型。HIP本身的语法也和CUDA高度相似未来如果换到NVIDIA平台迁移成本也比较低。ROCm生态这几年进步明显但相比CUDA还有差距。比如一些深度学习库的ROCm版本更新不及时极个别算子可能需要等待。不过对于PyTorch主流的卷积、Transformer、训练与推理流程ROCm版已经完全可用。1.3 硬件要求和版本确认先说版本本文以ROCm 10.0为目标版本来写安装命令。如果你在操作时官方仓库里还没有发布10.0退回到6.x或者7.x版本也完全没问题安装思路和命令格式基本一致只是版本号不同。写这篇文章时我默认你已经查过ROCm官方支持列表确认自己的显卡在支持范围内。ROCm对显卡型号有明确要求。当前主流的RX 7900 XTX、RX 7900 XT、RX 7900 GRE、Radeon PRO W7800/W7900等专业卡在支持列表里上一代RX 6000系列以及更老的RX 5000系列大部分不在官方支持范围内强行用可能不行。如果你用的是新发布、尚未适配的显卡可能连ROCm都识别不到。内存方面WSL2默认分配的内存是物理内存的50%左右如果你有16GB内存分配8GB给Linux。深度学习任务建议物理内存不低于32GB分配16GB以上给WSL2比较舒服。存储方面ROCm和PyTorch加一起大概需要15GB左右空间建议D盘留20GB以上。另外确保Windows已更新到较新版本AMD显卡驱动使用最新的Adrenalin版本我测试时使用24.x以上版本没有遇到问题。2. WSL2环境搭建从零开始装出可用的Linux子系统WSL2在这里是整个方案的“地基”。这个地基如果不稳后面装ROCm会冒出各种莫名奇妙的问题。所以这一章我会从开启Windows功能开始逐步走完WSL2的初始化每一步都说明作用。2.1 开启Windows虚拟化功能WSL2依赖两个Windows功能虚拟机平台Virtual Machine Platform和适用于Linux的Windows子系统WSL。这一步有两种方式我习惯直接用管理员PowerShell执行命令效率最高。dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完必须重启电脑。如果不重启后面的wsl --set-default-version 2会报错而且WSL2内核无法加载。另外需要注意WSL2需要CPU支持虚拟化并在BIOS中开启。如果你之前在VMware这类软件里跑过虚拟机说明虚拟化已开启。若不确定在任务管理器-性能-CPU里看“虚拟化”这一项是否为“已启用”。2.2 安装WSL2和Ubuntu 22.04重启后建议先在管理员PowerShell里执行一次完整更新wsl --update这一步会把WSL内核升级到最新版本。很多教程会跳过这里导致后面出现“版本号过低”“无法在WSL里访问GPU”等问题。尤其是部分第三方工具会检查WSL环境的安全性如果内核太旧可能直接报类似“could not safely verify the wsl2 environment”的错误。所以先更新内核再装发行版顺序不要反。接下来安装Ubuntu 22.04 LTS。Ubuntu 24.04也支持但ROCm安装包如果按官方仓库来22.04jammy是兼容性最好、文档最全的选择。wsl --install -d Ubuntu-22.04安装完成后系统会弹出Ubuntu的控制台窗口让你设置用户名和密码。这个用户名会映射到WSL内部不需要和Windows账号一致但密码要记好因为后续sudo操作需要。然后确认WSL版本确实是2wsl -l -v输出里Ubuntu-22.04那行的VERSION列应该是2。如果是1用下面命令转换wsl --set-version Ubuntu-22.04 22.3 WSL资源分配与Linux初始化WSL2默认会占用宿主机一半内存这对深度学习不够灵活。我建议在Windows用户目录下创建C:\Users\你的用户名\.wslconfig文件写清资源上限[wsl2] memory24GB processors8 swap8GB根据你机器的物理内存自行调整比如32GB内存可以给24GB16GB内存给10GB。保存文件后在PowerShell里执行wsl --shutdown再重新进入Ubuntu配置才能生效。初次进入Ubuntu后先做一套标准初始化sudo apt update sudo apt upgrade -y sudo apt install -y wget curl git build-essential python3-pip python3-venv这些工具在后面下载ROCm安装包、创建Python环境时都会用到。这里顺便说一个小技巧WSL2里也可以安装miniconda但考虑到这篇流程主要依赖ROCm官方仓库和PyTorch官方源用venv更轻量、更不容易出依赖冲突。所以本文后续统一使用venv。3. ROCm 10.0安装AMD计算平台核心步骤ROCm安装是整个流程里最容易被“网上教程”带偏的地方。很多教程会让你直接安装amdgpu-dkms内核模块但在WSL2里这是一条死路因为WSL2的Linux内核由微软统一提供不允许加载外部内核模块。你只需要安装ROCm用户态组件即可也就是运行库、编译器、工具链这些不依赖内核的部分。3.1 检查WSL2中的GPU设备正式安装前先确认WSL2里能不能看到GPU设备。在Ubuntu终端执行ls /dev/kfd ls /dev/dri/如果存在/dev/kfd和/dev/dri/renderD128这类设备文件说明Windows侧的AMD驱动已经通过GPU-PV机制把GPU映射进来了这是ROCm在WSL2里工作的前提。如果设备不存在先不要继续回Windows侧检查两件事AMD显卡驱动是否已更新到最新版本wsl --update是否执行过。设备文件没有出现多半就是这两点没满足。另外一个需要留意的点是权限。ROCm需要当前用户能访问/dev/kfd和/dev/dri设备。如果设备文件存在但后续rocminfo报权限错误就需要把用户加进对应的设备组。常见的是video组部分版本还会用render组。sudo usermod -aG video $USER然后退出终端重进让组权限生效。3.2 安装ROCm官方仓库与amdgpu-installAMD官方提供的安装入口是amdgpu-install脚本它本质是个.deb安装包安装后通过一个命令帮助你部署完整的ROCm用户态环境。不同ROCm版本对应不同的下载目录以Ubuntu 22.04 ROCm 10.0为例写法大致如下cd /tmp wget https://repo.radeon.com/amdgpu-install/10.0/ubuntu/jammy/amdgpu-install_10.0.*.deb sudo apt install -y ./amdgpu-install_10.0.*.deb如果你在操作时官方目录还没有10.0可以到https://repo.radeon.com/amdgpu-install/下看一下实际存在的版本目录选择最新的稳定版本替换即可。下载地址里的jammy对应Ubuntu 22.04如果你是24.04就换成noble。安装完amdgpu-install本身后重点来了。在普通Linux系统里你需要执行sudo amdgpu-install --usecaserocm但在WSL2里这个命令会尝试安装amdgpu-dkms内核模块而WSL2不允许也不需要它装到一半就会因内核头文件不匹配而失败。正确的做法是加上--no-dkms参数sudo amdgpu-install --usecaserocm --no-dkms--no-dkms的意思是忽略内核模块安装只装ROCm用户态运行库、HIP工具链、rocBLAS、MIOpen等。这正是WSL2方案的核心差异点。如果你之前照网上教程装过一次带DKMS的版本建议先把残留清掉再重新来sudo amdgpu-install --uninstall装的过程中会拉取几百MB到1GB左右的包取决于网速耐心等一下。装完可以通过dpkg -l | grep rocm看看都装了哪些包正常情况下能看到rocm-hip-libraries、rocm-llvm这些关键包。3.3 配置环境变量与验证ROCmROCm默认安装在/opt/rocm这通常是一个符号链接指向具体的版本目录比如/opt/rocm-10.0。为了让系统能找到hipcc、rocminfo等命令需要把bin目录加进PATH。我推荐写入全局profile避免每次启动终端都重新设置echo export PATH/opt/rocm/bin:$PATH | sudo tee /etc/profile.d/rocm.sh echo export ROCM_PATH/opt/rocm | sudo tee -a /etc/profile.d/rocm.sh echo export HIP_PATH/opt/rocm/hip | sudo tee -a /etc/profile.d/rocm.sh sudo chmod x /etc/profile.d/rocm.sh然后重新加载或者重新打开终端source /etc/profile.d/rocm.sh验证安装是否成功执行rocminfo这个命令会输出GPU的详细架构信息包括Compute Unit数量、显存大小、固件版本等。如果中途出现错误先确认/dev/kfd权限以及当前用户组。如果没有问题你会在输出里看到类似gfx1100这样的GPU代号这说明ROCm已经正确识别到AMD显卡。再验证HIP编译器hipcc --version能看到HIP版本号就说明工具链已经可用。到这里ROCm本身安装成功接下来轮到PyTorch。4. PyTorch ROCm环境配置与GPU加速验证ROCm装好只代表系统层面准备好了PyTorch还需要安装“ROCm版”的包。很多人在这一步会拿普通PyPI的CPU版PyTorch来装结果怎么测都是CPU运行原因就是包不对。PyTorch的ROCm后端是官方预编译的它把HIP运行时静态链接进包内所以必须从PyTorch官方指定的ROCm索引地址下载。4.1 创建干净的Python环境虽然Ubuntu 22.04自带Python 3.10但直接在系统Python里装深度学习依赖不是好习惯。我用venv创建独立环境隔离性足够也不会污染系统包。cd ~ python3 -m venv pt_rocm source ~/pt_rocm/bin/activate激活后命令行前面会出现(pt_rocm)前缀。先升级pip避免一些老的pip版本解析索引时出问题pip install --upgrade pip setuptools wheel如果你更习惯conda也可以在这个阶段创建conda环境但要注意conda的默认源里没有专门给ROCm的预编译PyTorch最后安装时还是要走pip install --index-url这条路。所以venv是更直接的选择。4.2 安装ROCm版PyTorchPyTorch官方把不同后端的预编译包放在同一个仓库用URL路径区分。ROCm 10.0对应的安装命令通常是pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm10.0如果你的PyTorch官方源里还没有rocm10.0目录可以访问https://download.pytorch.org/whl/rocm/看真实的可用版本把URL后缀替换成实际存在的版本目录比如rocm6.3之类的。需要说明的是PyTorch的ROCm版包体积比较大torch包本身可能超过2GB下载时间会比较长网速慢的话记得保持网络畅通别在下载中途挂代理或者切换网络否则容易下载中断。如果你在的部分网络环境下访问download.pytorch.org比较慢请耐心重试几次或者换个时间段再下载。安装完成后先确认包版本与HIP后端信息python -c import torch; print(torch.__version__); print(torch.version.hip); print(torch.cuda.is_available())这里可能有人会疑惑PyTorch在ROCm版里为什么还是torch.cuda.is_available()。这是PyTorch为了保持上层API统一而保留的命名底层在ROCm版中会自动映射到HIP/ROCm返回值代表“是否能使用GPU计算”。4.3 验证GPU是否被PyTorch识别上面命令如果输出torch.version.hip有版本号torch.cuda.is_available()为True说明PyTorch已经成功拿到AMD GPU。接下来再进一步确认设备名称和数量python -c import torch; print(torch.cuda.device_count()); print(torch.cuda.get_device_name(0))正常能看到显卡的型号名称比如AMD Radeon RX 7900 XTX。如果is_available()是False先不要怀疑包的问题多半是环境变量或者权限问题。比如ROCm的LD_LIBRARY_PATH没有包含/opt/rocm/lib可以在命令行临时设置export LD_LIBRARY_PATH/opt/rocm/lib:$LD_LIBRARY_PATH然后再跑一次验证。你也可以把这个变量追加到/etc/profile.d/rocm.sh里省得每次手动设置。4.4 一个能跑的微型训练示例光看is_available()还不够最好跑一小段训练流程来验证GPU上的张量运算、反向传播是否真正工作。用下面这个简单的线性模型示例最直接python - EOF import torch import torch.nn as nn device cuda if torch.cuda.is_available() else cpu model nn.Linear(1024, 1024).to(device) optimizer torch.optim.Adam(model.parameters(), lr1e-3) loss_fn nn.MSELoss() for step in range(20): x torch.randn(256, 1024, devicedevice) y model(x) loss loss_fn(y, torch.randn_like(y)) optimizer.zero_grad() loss.backward() optimizer.step() if step % 5 0: print(fstep {step}, loss: {loss.item():.4f}) EOF如果能在几秒内跑完并看到loss在下降说明GPU上的前向计算和反向传播都正常。我实际测试时这种规模的MLP在GPU上基本是秒出CPU则要好几秒GPU加速效果非常直观。5. 常见问题与排查技巧实录这套环境我前前后后搭过至少五六次参数不同、系统状态不同踩过的坑五花八门。这一章我把最高频的问题整理成一份排查速查表遇到问题可以按表格逐项检查。5.1 /dev/kfd设备不存在可能原因检查方式解决方法Windows显卡驱动过旧在Windows的AMD Software中查看驱动版本升级到最新Adrenalin驱动WSL2内核太旧在PowerShell执行wsl --update更新WSL内核后重启WSL2未正确配置虚拟化任务管理器查看虚拟化是否启用开机进BIOS开启SVM/VMXWindows版本太老查看Win11设置里的系统版本更新到最新补丁这个问题如果出现在安装ROCm之前直接解决环境就行不需要重装任何包。5.2 /dev/kfd权限拒绝运行时提示没有权限访问/dev/kfd或者rocminfo报“Permission denied”。原因是当前用户不在video组里sudo usermod -aG video $USER如果提示没有render组也一并加上sudo groupadd -f render sudo usermod -aG render $USER然后退出Ubuntu终端再重新打开否则组权限不会刷新。5.3 PyTorch检测不到GPU这一条的原因最复杂我按排查优先级列一下确认安装的是ROCm版PyTorch而不是默认的CPU版。如果执行pip list | grep torch看到torch包的版本号里没有rocm字样说明装错了用--index-url重装。确认ROCm的库路径。在运行Python的终端里看下echo $LD_LIBRARY_PATH是否包含/opt/rocm/lib。确认用户有权限访问/dev/kfd参考5.2。确认PyTorch的ROCm版本和系统ROCm版本理论上兼容。如果PyTorch的HIP版本是6.3而系统安装的ROCm是10.0偶尔会出现ABI不兼容。最稳妥的做法是PyTorch和ROCm都选择官方推荐的匹配版本。5.4 内存不足与性能异常训练数据集过大时WSL2默认的50%内存分配可能不够。修改.wslconfig是直接的方案[wsl2] memory32GB processors12 swap16GB改完务必wsl --shutdown再重进。如果显存不够可以调低batch_size或者开启梯度累积。另外在WSL2里PyTorch的默认线程数有时会拉满CPU反而影响GPU数据加载可以在代码里限制torch.set_num_threads(4)5.5 显卡型号不在支持列表如果你的显卡不在ROCm官方支持列表里比如RX 6600、RX 5000系列rocminfo可能直接看不到设备或者PyTorch报“no HIP device”。社区里流行一个环境变量方案通过强制指定GPU架构代号来绕过支持检测export HSA_OVERRIDE_GFX_VERSION10.3.0但我要提醒一句这属于非常规手段用不好会导致错误计算甚至驱动崩溃。遇到不支持的情况我建议优先查官方支持列表如果只是差一个架构版本可以谨慎试试这个变量如果相差太远就老老实实换卡或者继续CPU。6. 一些零碎但重要的实操心得技术流程走完后我再说几个平时不会写进教程、但实际用起来特别有用的点。这些经验会让你的开发体验舒服很多。6.1 VSCode远程开发配置建议在WSL2里用vim写深度学习代码不是不可以但远不如VSCode舒服。VSCode有官方的Remote-WSL扩展在Windows侧安装VSCode后进入Ubuntu终端执行code .就能自动调用Windows侧的VSCode连接当前WSL目录。这样你可以在Windows窗口里编辑代码解释器选WSL里的~/pt_rocm/bin/python代码在Linux侧运行GPU调用不受影响。调试、变量监控、Git集成都很方便。6.2 导出系统快照随时回滚搭建环境最怕的是搞坏之后从头再来。WSL2支持把整个发行版导出成tar文件相当于给系统做快照。环境刚装好的时候就导出一份wsl --export Ubuntu-22.04 D:\backup\ubuntu_rocm_fresh.tar后面如果环境被改坏可以直接导入回去wsl --import Ubuntu-22.04 D:\wsl\ubuntu_rocm D:\backup\ubuntu_rocm_fresh.tar --version 2导入后生成的默认用户名可能变成root进去后用sudo usermod调整即可。我建议在“ROCm装好且验证通过”之后做一次快照这个状态最值得存档。6.3 后续扩展思路这套环境跑通之后你还可以继续往外扩展。比如在WSL2里安装Docker然后使用PyTorch官方的ROCm容器镜像团队协作时能保证每个人环境一致。又比如配合Hugging Face Transformers加载大语言模型做本地推理ROCm的MIOpen对常见算子优化得不错只要显存够体验不会差。如果需要在多卡机上跑也可以在ROCm环境里接DeepSpeed或者PyTorch FSDP。我在实际使用中最深的一点体会是折腾这套环境最耗时间的不是安装命令而是理解WSL2和ROCm之间的边界。哪些由Windows驱动负责哪些由ROCm用户态负责哪些是PyTorch的编译绑定把这三层关系理清楚了以后无论是升级ROCm版本、换显卡还是给同事复现环境都能做到心里有数照着方抓药就行。如果你的显卡在支持列表里这套流程半小时内跑通是完全可以做到的。