
Eval bug: CDNA2 ROCM Performance Issue: QAT Q4 vs Q8
快速结论:在 AMD CDNA2 (MI210) 双卡环境下运行 gemma-4-31B 模型时,QAT Q4_0 量化版本相比非 QAT Q8_0 版本,prompt processing 速度下降,token generation 速度未获得预期提升,尽管模型权重体积显著减小。优先排查 -fa (flash attention) 和 -sm (split mode) 参数组合对性能的影响,并建议限制单卡测试以排除 PCIe 传输干扰。
问题场景
用户在 llama.cpp (build 9619, commit d8a24cce) 中,使用 llama-bench 工具,后端为 HIP (ROCm),硬件为 2x AMD Instinct MI210 (CDNA2, gfx90a)。分别测试了 gemma-4-31B 模型的 QAT Q4_0 和 Q8_0 版本,发现性能不符合预期。
报错原文
Gemma 4 31B, no QAT, Q8_0:
| model | size | params | backend | ngl | test | t/s |
| ------------------------------ | ---------: | ---------: | ---------- | --: | --------------: | -------------------: |
| gemma4 31B Q8_0 | 30.38 GiB | 30.70 B | ROCm | 999 | pp512 | 1007.44 ± 11.58 |
| gemma4 31B Q8_0 | 30.38 GiB | 30.70 B | ROCm | 999 | tg128 | 27.44 ± 0.05 |
Gemma 4 31B, QAT, Q4_0
| model | size | params | backend | ngl | test | t/s |
| ------------------------------ | ---------: | ---------: | ---------- | --: | --------------: | -------------------: |
| gemma4 31B Q4_0 | 16.42 GiB | 30.70 B | ROCm | 999 | pp512 | 787.30 ± 6.59 |
| gemma4 31B Q4_0 | 16.42 GiB | 30.70 B | ROCm | 999 | tg128 | 35.22 ± 0.05 |
原因分析
可能原因:QAT Q4_0 量化在 CDNA2 ROCm 后端上的性能优化不足,导致 prompt processing 阶段速度下降,token generation 阶段提升不明显。这可能与量化格式的矩阵运算效率、ROCm 对 Q4_0 的 kernel 实现效率有关。后续测试进一步显示,-fa off -sm layer 组合在 Q8_0 上可获得最佳性能,而 -sm none -fa on 组合性能最差,但即使最佳性能也未必达到理论预期,暗示可能存在更底层的优化问题。
环境排查
- llama.cpp 版本:9619 (d8a24ccee) 及 9641 (6e9007ae6)
- 操作系统:Linux
- 后端:HIP (ROCm)
- 显卡:2x AMD Instinct MI210 (CDNA2, gfx90a:sramecc-:xnack-), 单卡 VRAM 65520 MiB
- 模型:
gemma-4-31B(QAT Q4_0 与 Q8_0) - 工具:llama-bench
- CPU 编译器:GNU 16.1.1
解决步骤
- 限制单卡测试以隔离 PCIe 传输影响:使用
-dev ROCm0参数,仅在第一张卡上运行测试,避免双卡间数据传输干扰。 - 测试不同
-fa和-sm参数组合:对 Q8_0 和 QAT Q4_0 模型分别执行以下命令,记录每种组合的 pp512 和 tg128 指标:llama-bench -ngl 999 -m /path/to/model.gguf -fa 0,1 -sm layer,none -dev ROCm0
在 Issue 中,
-fa off -sm layer组合在 Q8_0 上表现最佳,QAT Q4_0 上也接近最佳。可优先尝试此组合。 - 对比不同 llm.cpp build 版本:观察 Issue 中的测试,build 9641 下的结果与原始 9619 版本趋势一致,提示该问题可能在新版本中仍未解决。建议在最新稳定版上复测以确认问题是否持续。
- 尝试不同 GGUF 来源:原始 Issue 中用户使用了 unsloth 的 Q8_0 和 QAT Q4_0 版本。如果可能,尝试使用其他来源或自行量化的 Q4_0 模型,以排除模型文件本身的问题。
验证方法
运行上述参数组合测试后,比较 QAT Q4_0 相较于 Q8_0 在 prompt processing (pp512) 和 token generation (tg128) 上的提升比例。如果采用 -fa off -sm layer -dev ROCm0 后,QAT Q4_0 的 pp512 速度能接近或超过 Q8_0,且 tg128 提升明显(例如 >30%),则可视为问题缓解。否则,可能确为 Q4_0 kernel 或 ROCm 驱动的优化不足。



