Misc. bug: [ROCm] Significantly lower token generation performance vs Vulkan on RX 7900 XTX (gfx1100)

在 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 生成基准测试时,发现

Misc. bug: [ROCm] Significantly lower token generation performance vs Vulkan on RX 7900 XTX (gfx1100)

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 中的测试和推测,部分步骤需自行验证其有效性:

  1. 尝试切换 ROCm 的 wave size 为 64:设置环境变量 HSA_WAVESIZE=64 或通过 ROCm 工具链指定 wave size。注意:Issue 中报告尝试后无法生效,需要确认编译器或驱动是否支持强制设定。
  2. 检查并尝试启用 VMM:通过 rocm-smicat /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 启用。
  3. 更新 GPU 驱动和 ROCm 栈:确保使用最新的 AMDGPU 内核驱动(建议 6.17+)和 ROCm 版本(当前 Issue 测试了 7.9,但建议关注后续正式发布版)。
  4. 避免大上下文下的 fa=0 模式:在 ROCm 后端下,暂时不要使用 -fa 0 和长上下文(如 p=32768),以防崩溃。如果必须使用,优先考虑切换到 Vulkan 后端。
  5. 回退到 Vulkan 后端:作为临时解决方案,使用 Vulkan 后端(RADV)可获得稳定且更高的 token 生成性能(约高 20–22%)。
  6. 跟踪相关 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 是否不再崩溃可作为稳定性验证。

参考来源

ggml-org/llama.cpp #20934

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 10205

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注