Qwen 27B (IQ4_XS, Q8/Q4 KV) 在 16GB RX 9070 XT 上跑满 262k 上下文:借助 Adaptive KV Streaming 实现 80+ t/s 解码

Reddit r/LocalLLaMA 工具

摘要

作者将 adaptive KV streaming 从 CUDA 移植到 ROCm/HIP,并结合 RDNA 4 内核优化,使 Qwen3-27B (IQ4_XS) 能在单张 16GB RX 9070 XT 上以完整 262k 上下文运行,MTP 解码达到 80+ t/s。项目包含大量内核级优化与功耗调优结果,已发布到 GitHub 分支。

我一直在为 llama.cpp 实现 adaptive KV streaming 和 RDNA 4 / ROCm 优化,以在单张 16 GB RX 9070 XT 显卡上运行 Qwen3.8-27B(IQ4_XS 权重、Q8_0/Q4_0 KV cache),完整使用 262,144 token 的上下文窗口,解码速度达到 80+ t/s。Qwen 27B IQ4_XS 约为 14.3 GB,在 16 GB 显卡上几乎没有显存余量。ASCII 精简版本将非 ASCII 词表裁剪后约为 13.6 GB(12.6 GiB),剩下约 3.4 GiB 可用显存。即便使用 Q8_0/Q4_0 KV cache,262k 上下文光 KV 张量就需要约 7.4 GiB,在 llama.cpp 上超过约 65k token 就会触发 OOM。 我发现了 RaymondHuang210129/llama.cpp-adaptive-kv-streaming,它为 NVIDIA/CUDA 引入了 adaptive KV streaming,但不支持 AMD/ROCm。我将其移植到 ROCm/HIP,把完整的 262k cache 保留在主机内存中(约 7.4 GB),同时通过 PCIe SDMA 与计算并行地异步流式传输有界的活跃工作集(prefill 约 450 MiB,解码约 2,100 MiB)。我还整合了 stew675/llama-cpp-rdna-boosts 中的内核优化(4 行多列 mmvq、Q4_K/Q5_K 的 16 字节向量化加载、SwiGLU 融合以及单队列异步 HIP graph)。 进一步的改进: **Sibling 激活复用**:在并行投影(gate/up 和 Q/K/V)之间复用量化后的激活,避免重复的内存访问。 **寄存器内融合的残差加法 + RMSNorm**:在各次 pass 之间将激活保留在 VGPR 中,并直接写出供 mmvq 使用的量化 q8_1 副本。 **多列 SwiGLU 与 GDN 融合**:将融合的 Gate/Up + SwiGLU 扩展到 mmvq 中的 4 列 verify 批次,并为混合层融合循环线性注意力门控。 **在线 Log-Sum-Exp prefill 与流水线预取**:通过在线 LSE 累积在流式传输的页面上分块执行 prefill,并将第 L+1 层的 PCIe 传输与第 L 层的计算重叠。 **持久化 graph arena**:在 prefill/解码阶段切换时复用 arena,消除销毁重建开销。 **面向流式传输优化的投机解码**:将单头 MTP verify 追赶合并到第一个 draft 步骤中(使 MTP 前向传播次数减半,并防止 draft KV 污染),为 verify graph 使用专用 arena 以消除重建造成的停顿,将分页解码注意力扩展到 verify 批次,并叠加机会主义 n-gram 与概率性拒绝采样。 **基准性能**: 解码:36.5 t/s (1k) -> 32.1 t/s (65k) -> 27.0 t/s (131k) -> 9.5 t/s (262k) 解码(开启 MTP):71.8-86.5 t/s (1k-4k) -> 72.9 t/s (65k) -> 78.6 t/s (131k) -> 31.1 t/s (262k) Prefill:1368.4 t/s (1k) -> 1120.3 t/s (65k) -> 863.0 t/s (131k) -> 585.8 t/s (262k) 将 9070 XT 的功耗限制设为 231W(相对默认 304W TDP 降低 24%),prefill 延迟仅增加 3.6%,解码吞吐量几乎完全相同,既省电又能让显卡在长时间运行中保持安静。 完整细节请查看仓库:https://github.com/achyudh/llama.cpp/tree/feature/adaptive-kv-stream-rocm
查看原文

相似文章

使用 Deadcode 的 Radiance 引擎,在 2 张 R9700 + 64GB DDR5 上运行 Q4 量化的 Qwen-3.8 Flash-Next,解码速度为 176 token/秒,预填充速度为 6,450 token/秒

Reddit r/LocalLLaMA

一位用户使用 BetterBench 吞吐量测试工具,在配备 2 块 R9700 GPU 和 64GB DDR5 内存的定制 PC 上,对运行于 Deadcode 的 Radiance 推理引擎上的 Q4 量化版 Qwen-3.8 Flash-Next 进行基准测试,实现了 176 token/秒的解码速度和 6,450 token/秒的预填充速度。