第一原则:先查支持矩阵,再安装
ROCm是否可用取决于GPU型号、操作系统、内核、ROCm与PyTorch组合。相同AMD品牌并不代表都在生产支持范围内,消费卡、专业卡和Instinct加速卡的支持级别也可能不同。先在AMD官方兼容矩阵中确认准确型号和PCI ID,再决定裸机包或容器路线。
lspci -nn | grep -Ei 'VGA|Display|AMD'
uname -r
cat /etc/os-release
ls -l /dev/kfd /dev/dri/render* 2>/dev/null`/dev/kfd`负责计算调度,`/dev/dri`中的render节点用于GPU访问。设备不存在时应先修复内核驱动和ROCm基础安装,不要反复更换PyTorch wheel。
为什么优先使用官方验证容器
AMD官方将预构建PyTorch容器作为推荐路线,镜像组合了经过测试的ROCm、PyTorch和用户态依赖。测试可用latest,生产必须选择明确标签并保存摘要:
```bash docker pull rocm/pytorch:latest docker image inspect rocm/pytorch:latest --format '{{index .RepoDigests 0}}'
docker run --rm -it \ --device=/dev/kfd --device=/dev/dri \ --group-add video --group-add render \ --ipc=host --shm-size 8G \ --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \ rocm/pytorch:latest bash ```
`SYS_PTRACE`和放宽seccomp常用于调试工具,但会扩大权限。生产推理容器如果不需要调试,应测试移除这些权限后的最小配置。数据和模型目录使用只读或明确写目录挂载。
容器内完成三层验证
rocminfo | grep -E 'Name:|Marketing Name' | head -n 30
rocm-smi
python - <<'PY'
import torch
print('torch',torch.__version__)
print('HIP build',torch.version.hip)
print('available',torch.cuda.is_available())
print('count',torch.cuda.device_count())
for i in range(torch.cuda.device_count()): print(i,torch.cuda.get_device_name(i))
x=torch.randn(4096,4096,device='cuda');y=x@x;torch.cuda.synchronize()
print('finite',bool(torch.isfinite(y).all()),'memory',torch.cuda.max_memory_allocated())
PYPyTorch在ROCm上仍使用`torch.cuda`命名空间,这是API兼容设计,不表示后台使用NVIDIA CUDA。判断ROCm构建应查看`torch.version.hip`。
逐卡与多卡验收
用`HIP_VISIBLE_DEVICES=0`逐张卡运行矩阵计算,再检查RCCL集合通信。某一张卡单独异常时不要用多卡任务掩盖。保存GPU唯一标识、固件、ROCm和镜像摘要。
多卡性能同时受PCIe拓扑、xGMI互联、NUMA和RCCL影响。模型能启动不代表扩展效率正常,应先用通信基准,再测目标框架。
常见错误的定位顺序
- `torch.cuda.is_available()`为False:先看`/dev/kfd`和render设备映射,再看用户组与镜像是否为ROCm构建。
- `Permission denied`:检查宿主机video/render组、容器group-add和设备权限,不要简单使用privileged掩盖。
- `invalid device function`:GPU架构可能不在镜像编译目标或支持矩阵内。
- 算子不存在:检查目标模型依赖的Flash Attention、量化库或自定义扩展是否有ROCm实现。
- 速度低:确认没有CPU回退,观察GPU利用率、显存带宽、数据加载和算子日志。
从环境成功到模型可用
选择一个小模型完成加载、短输入、长输入和批量测试,再运行业务目标模型。CUDA专用量化包、Triton内核或预编译扩展不能默认在ROCm上工作。每次升级ROCm或PyTorch都必须重新执行张量、精度、目标算子与模型回归,而不是只检查版本号。



