PyTorch 在 gfx1103 上报 CK_AMD_GPU_GFX* 宏未定义,如何处理?
应该在哪里添加宏?
根据日志,需要检查 MIOpen 为 GPU 内核生成的 HIPRTC 编译选项。如果确认需要补充 CK 架构宏,应在 MIOpen 构造该内核运行时编译选项的位置加入,让它进入 hiprtcCompileProgram() 接收的 c_options。在 Python 训练脚本中添加宏,无法直接影响这次编译。
目前还不能确认 CK_AMD_GPU_GFX1103 是否为当前 CK 版本认可的宏,也不能确认添加后能否解决问题。先检查 MIOpen 所用的 CK 架构配置及其对 gfx1103 的支持情况。
日志能说明什么?
错误发生的顺序是:
loss.backward()触发反向传播。- 执行过程中调用 MIOpen,后者通过 HIPRTC 编译一个 reduction 内核。
- 编译该内核时,
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 的组合。如果发现组件混装或版本不匹配,先换成相互匹配的组合再复现。现有材料没有提供具体版本,无法保证某次升级或某个宏定义一定能解决问题。
备注:内容仅供参考。
