![Misc. bug: [ROCm] Significantly lower token generation performance vs Vulkan on RX 7900 XTX (gfx1100)](https://www.chat-gpts.plus/wp-content/uploads/2026/06/20934-97b8a216.jpg)
Misc. bug: [ROCm] Significantly lower token generation performance vs Vulkan on RX 7900 XTX (gfx1100)
快速结论:在 AMD RX 7900 XTX (gfx1100) 显卡上使用 llama.cpp 时,ROCm 后端的 token 生成(tg128)性能比 Vulkan 后端低约 20–22%。优先排查 ROCm 的 wave size 设置是否被锁定为 32(而非 RDNA3 更优的 64),以及 VMM(Virtual Memory Management)是否处于关闭状态。
问题场景
在 Linux 系统(Ubuntu 24.04.3/24.04.4)上使用 llama.cpp(版本 2999,2026年3月多個近期 commit)运行 GGUF 格式模型(LLaMA 7B Q4_0、Qwen2 7B Q4_K_M 等)进行 prompt 处理和 token 生成基准测试时,发现 ROCm 后端的 token 生成吞吐量明显低于 Vulkan 后端。测试使用 llama-bench 工具,参数完全一致(-ngl 999 -fa 1 -b 128)。
报错原文
ROCm: tg128: ~129–144 tokens/s
Vulkan (RADV): tg128: ~167–177 tokens/s
ROCm shows bursty GPU utilization during token generation
Vulkan provides stable throughput
VMM always reported as "off", can't get it to "on"
Wave size difference:
- ROCm: 32 (I tried, couldn't get it to 64)
- Vulkan: 64
p=32768, fa=0: reproducible crash (ROCm backend) - crash originates from ggml-hip during graph execution
原因分析
可能原因如下(本次 Issue 尚未给出最终根因):
- Wave size 差异:ROCm 后端在 RX 7900 XTX 上默认使用 wave size 32,而 Vulkan 使用 wave size 64。wave size 64 通常更适合 RDNA3 架构的 token generation 场景,导致性能差异。
- VMM 状态异常:VMM(Virtual Memory Management)始终报告为 “off”,且无法启用,这可能影响内存分配与调度效率。
- ROCm 后端在生成阶段的 GPU 利用率不平稳(bursty),而 Vulkan 保持稳定,暗示可能存在 ROCm 的任务调度或命令缓冲问题。
- 大上下文崩溃:在 p=32768、fa=0 时 ROCm 后端出现可复现的崩溃,可能指向 ggml-hip 在内存分配或图执行中的 bug。
- 相关 Issue 关联:类似性能问题在 #17917(Strix Halo 上的 ROCm 回归)、#19984(ROCm 7.2 二进制性能不足)、#20839(gfx1103 RDNA3 iGPU 缺少 rocBLAS TensileLibrary)等中有提及,可能与 ROCm 对 RDNA3 系列的支持不完善有关。
环境排查
- GPU 型号与架构:AMD Radeon RX 7900 XTX (gfx1100),确认是 RDNA3 架构
- ROCm 版本:测试了 ROCm 6.4.4、7.11、7.1.1、7.2、7.9(apt repo),以及 Lemonade SDK 和官方 Docker 镜像,所有版本表现相似
- llama.cpp 版本:测试了多个近期 commit(2026年3月),包括版本 2999 (42b4109e) 和 b8497
- Linux 发行版与内核:Ubuntu 24.04.3 和 24.04.4,内核 6.8 和 6.17
- Vulkan 后端:使用 RADV(Mesa 的 Vulkan 驱动)
- 模型文件:使用 llama-2-7b.Q4_0.gguf 和 Qwen2.5-Coder 7B Q4_K_M.gguf
- 关键配置检查:确认 ROCm 的 wave size 是否为 32、VMM 是否处于 “off” 状态
解决步骤
以下步骤基于 Issue 中的测试和推测,部分步骤需自行验证其有效性:
- 尝试切换 ROCm 的 wave size 为 64:设置环境变量
HSA_WAVESIZE=64或通过 ROCm 工具链指定 wave size。注意:Issue 中报告尝试后无法生效,需要确认编译器或驱动是否支持强制设定。 - 检查并尝试启用 VMM:通过
rocm-smi或cat /sys/class/drm/card0/device/power_dpm_force_performance_level等命令检查 VMM 状态。如果显示 “off”,可尝试使用echo high > /sys/class/drm/card0/device/power_dpm_force_performance_level强制高性能模式,或检查内核参数(如amdgpu.vm_fragment_size)是否影响 VMM 启用。 - 更新 GPU 驱动和 ROCm 栈:确保使用最新的 AMDGPU 内核驱动(建议 6.17+)和 ROCm 版本(当前 Issue 测试了 7.9,但建议关注后续正式发布版)。
- 避免大上下文下的 fa=0 模式:在 ROCm 后端下,暂时不要使用
-fa 0和长上下文(如 p=32768),以防崩溃。如果必须使用,优先考虑切换到 Vulkan 后端。 - 回退到 Vulkan 后端:作为临时解决方案,使用 Vulkan 后端(RADV)可获得稳定且更高的 token 生成性能(约高 20–22%)。
- 跟踪相关 Issue 进展:关注 #17917、#19984、#20839 等关联 Issue,这些可能包含针对 RDNA3 + ROCm 的底层修复。
验证方法
使用 llama-bench -m <model> -ngl 999 -fa 1 -b 128 分别测试 Vulkan 和 ROCm 后端(通过编译时指定不同后端切换),对比 tg128 指标。如果 ROCm 性能提升至接近 Vulkan 水平(例如从 129–144 t/s 提升至 167–177 t/s 范围),则问题得到缓解。另外,检查 p=32768, fa=0 是否不再崩溃可作为稳定性验证。

![[Question]: Knowledge graph extraction problem](https://www.chat-gpts.plus/wp-content/uploads/2026/06/7119-a01a8c11-768x403.jpg)
![[Bug]: `experimental_use_latest_role_message_only` erroneously sending tool and assistant prompts to guardrail](https://www.chat-gpts.plus/wp-content/uploads/2026/06/23476-036ac554-768x403.jpg)
