
Eval bug: ROCm error: device kernel image is invalid
快速结论:该错误在 llama.cpp 使用 HIP 后端于 AMD Radeon RX 7900 XTX 显卡上执行批量推理时出现,典型特征是短请求(≤200 tokens)正常,长请求(>200 tokens)崩溃。优先排查 CMake 构建类型与 ROCm 版本兼容性。
问题场景
用户在 Ubuntu 22.04.5 LTS 系统上使用 llama.cpp(v9307, commit 549b9d843)通过 HIP 后端加载 Qwen3.6-27B-Q4_K_M.gguf 模型。显卡为 AMD Radeon RX 7900 XTX (gfx1100, 24GB VRAM),ROCm 版本 7.11.0。执行 llama-server 时,生成 token 数超过 200-500 区间即触发崩溃,短请求(≤200 tokens)正常。CPU-only 模式(-ngl 0)也存在问题——即使不加载 GPU 层,只要 HIP 库被加载就会触发相同错误。
报错原文
ggml-cuda.cu:102: ROCm error
current device: 0, in function ggml_cuda_op_mul_mat at ggml-cuda.cu:2072
hipGetLastError()
llama-server 日志显示在 ggml_backend_sched_graph_compute_async 过程中 segfault/abort。
原因分析
可能原因:
- Debug 构建已知 bug:根据 ROCm 上游反馈(ROCm #6042),ROCm 7.11 的 LLVM 后端在
-O0(即 Debug 模式)下可能生成无效指令,仅影响特定核路径(如大矩阵乘法操作),因此小请求通过而大请求崩溃。 - Release 构建同样崩溃:即使切换到
-DCMAKE_BUILD_TYPE=Release,用户尝试后仍出现相同错误,说明问题不限于 Debug 模式。 - 驱动/ROCm 版本不匹配:Windows HIP 用户更新显卡驱动至 26.5.2 后也遇到相同问题(使用官方 GitHub 构建或
lemonade-sdk/llamacpp-rocm构建),llama-bench同样崩溃,暗示 ROCm 7.11 或对应驱动版本可能存在普遍兼容问题。
环境排查
- ROCm 版本:确认当前安装的 ROCm 版本(本例中为 7.11.0)。PyTorch 2.12.0+rocm7.2 在同一硬件上正常工作,7.11 版本可能引入回归。
- llama.cpp 构建类型:检查 CMake 构建配置中
CMAKE_BUILD_TYPE是否为 Debug(-DCMAKE_BUILD_TYPE=Debug)。 - HIP 平台变量:确保
HIP_PLATFORM=amd已正确设置。 - GPU 目标架构:确认
AMDGPU_TARGETS或GPU_TARGETS与显卡匹配(本例为gfx1100)。 - 依赖版本:GCC 11.4.0、CMake 3.22.x、Clang 22.0.0。
解决步骤
- 切换到 Release 构建(可优先尝试):完全清除构建目录并重新编译:
rm -rf build cmake -B build -DGGML_HIP=ON -DGPU_TARGETS=gfx1100 -DCMAKE_BUILD_TYPE=Release -DHIP_PLATFORM=amd cmake --build build -j12 - 如果仍需要调试符号,使用
RelWithDebInfo而非 Debug。 - 若 Release 构建仍然崩溃,考虑降级 ROCm:回退到 ROCm 7.2 或 7.0 版本(如 PyTorch 使用的 7.2),因为该版本在同一硬件上已验证可正常工作。
- 检查驱动更新:Windows 用户若遇到此问题,尝试回滚显卡驱动至较早版本(如 26.5.2 之前的版本)。
验证方法
使用短请求和长请求分别测试:
- 短请求:
curl http://localhost:8080/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"模型名","messages":[{"role":"user","content":"Hello"}],"max_tokens":200}'——应成功返回。 - 长请求:将
max_tokens设为 500+,确认服务端不崩溃且正常返回完整输出。 - 也可使用
llama-bench -n 50 -p 128测试——若之前崩溃,修复后应通过。
确认无 ROCm error: device kernel image is invalid 错误且无 segfault 即问题解决。
参考来源
附加参考(Issue 中提及的上游 ROCm bug):ROCm/ROCm #6042



