PAYATHON 2026

PyTorch 在 gfx1103 上报 CK_AMD_GPU_GFX* 宏未定义,如何处理?

架构老王

应该在哪里添加宏?

根据日志,需要检查 MIOpen 为 GPU 内核生成的 HIPRTC 编译选项。如果确认需要补充 CK 架构宏,应在 MIOpen 构造该内核运行时编译选项的位置加入,让它进入 hiprtcCompileProgram() 接收的 c_options。在 Python 训练脚本中添加宏,无法直接影响这次编译。

目前还不能确认 CK_AMD_GPU_GFX1103 是否为当前 CK 版本认可的宏,也不能确认添加后能否解决问题。先检查 MIOpen 所用的 CK 架构配置及其对 gfx1103 的支持情况。

日志能说明什么?

错误发生的顺序是:

  1. loss.backward() 触发反向传播。
  2. 执行过程中调用 MIOpen,后者通过 HIPRTC 编译一个 reduction 内核。
  3. 编译该内核时,config.hpp 没有检测到有效的 CK_AMD_GPU_GFX* 目标宏,因而触发 #error。

日志中已有 compiling for gfx1103,说明编译器获得了 GPU 编译目标。但 CK 所需的预处理宏仍然缺失,需要检查编译目标与 CK 架构配置之间的衔接。

可能是架构映射缺失、编译选项遗漏,也可能是 MIOpen 与其所用的 CK 文件不匹配。仅凭这段日志无法确定原因,也不能认定整个 GPU 都不受支持。

先确认版本和实际调用路径

在发生错误的同一 Python 环境中运行:

import sys
import torch

print("Python:", sys.version)
print("PyTorch:", torch.__version__)
print("HIP build:", torch.version.hip)
print("GPU available:", torch.cuda.is_available())

if torch.cuda.is_available():
    print("GPU:", torch.cuda.get_device_name(0))
    print("Properties:", torch.cuda.get_device_properties(0))

同时记录已安装的 ROCm、MIOpen 软件包版本及安装来源。torch.version.hip 不能代替所有 ROCm 组件的版本信息。还要确认程序实际加载的是哪个 MIOpen 库,尤其是在系统包和 Python 环境各自提供依赖时。

随后开启 MIOpen 日志,重新运行训练脚本:

MIOPEN_ENABLE_LOGGING=1 MIOPEN_ENABLE_LOGGING_CMD=1 MIOPEN_LOG_LEVEL=6 python s2s.py 2>miopen-debug.log

这些变量用于输出 API 调用、关联的驱动命令和更详细的内部日志,具体含义见 MIOpen 日志与调试文档。日志有助于确认触发错误的算子和编译过程,但不会修复宏定义。

如果需要修改源码,检查哪些位置?

使用与已安装 MIOpen 对应的源码和 CK 文件,重点检查两处:

  • 报错的 config.hpp:确认它接受哪些 CK_AMD_GPU_GFX* 宏,以及相关架构分支如何选择。
  • MIOpen 构造内核编译选项的位置:追踪 gfx1103 如何映射为 CK 宏,并检查这些选项是否最终传入 hiprtcCompileProgram()。

日志中的 hipoc_program.cpp:299 是报告编译失败的位置,不一定是添加架构映射的位置。具体修改文件和行号取决于所安装的版本,现有信息不足以确定可靠的补丁。

还要区分两种 -D 用法:

cmake -DNAME=ON ...     # 设置 CMake 配置变量
-DNAME=1               # 编译器预处理宏定义

把 -DCK_AMD_GPU_GFX1103=ON 传给 CMake,宏不会因此自动进入 HIPRTC 编译参数;构建脚本必须明确处理并传递它。即使直接传给编译器,ON 也只是宏的替换文本,是否合适取决于源码如何使用该宏。

普通 CXXFLAGS 也不能保证传入 MIOpen 的运行时内核编译。不要修改 /tmp/comgr-... 下的临时头文件来修复问题,它们是本次编译产生的临时文件。

如果对应版本的 CK 没有合适的目标分支,需要评估架构适配和内核支持。仅添加名称相似的宏,不能证明内核可以正确运行。

如何先继续验证教程?

可以先将教程统一切换到 CPU,确认训练流程能否完成反向传播。在创建模型和训练张量之前设置:

device = torch.device("cpu")

确保模型、输入、目标和隐藏状态都使用该设备。如果复用已经创建的模型,先迁移模型,再创建优化器:

encoder = encoder.to(device)
decoder = decoder.to(device)

CPU 能运行有助于缩小排查范围,但不能证明 GPU 路径上的所有计算都正确。

GPU 侧应按照所用版本的支持说明,核对 Ryzen 7 8700G、操作系统、PyTorch、ROCm 和 MIOpen 的组合。如果发现组件混装或版本不匹配,先换成相互匹配的组合再复现。现有材料没有提供具体版本,无法保证某次升级或某个宏定义一定能解决问题。

备注:内容仅供参考。