突破 VRAM 限制:將 KV 快取移至系統記憶體並異步串流

Qwen3.8-27B 模型的 IQ4_XS 量化權重約佔用 14.3 GB,即使經過 ASCII 精簡處理降至約 13.6 GB(12.6 GiB),在 16GB VRAM 的 RX 9070 XT 上僅剩約 3.4 GiB 可用空間。

標準 llama.cpp 實作中,Q8_0/Q4_0 KV 快取在 262k 上下文下需要約 7.4 GiB 的 GPU 記憶體,導致處理超過 65k 詞元時即發生 OOM 錯誤。

開發者參考了 RaymondHuang210129/llama.cpp-adaptive-kv-streaming 專案的概念,該專案原本僅支援 NVIDIA/CUDA 平台。透過將完整的 262k KV 快取保留在主機 RAM(約 7.4 GB),並利用 PCIe SDMA 異步串流有限的工作集到 GPU,解決了 VRAM 不足的問題。

具體而言,預填充階段僅串流約 450 MiB 的數據,解碼階段則串流約 2,100 MiB,這些傳輸與計算過程並行執行,以隱藏記憶體傳輸延遲。

RDNA 4 架構優化與內核融合技術

為了提升 AMD GPU 上的執行效率,開發者整合了 stew675/llama-cpp-rdna-boosts 專案中的多項內核優化,包括 4-row multi-column mmvq、針對 Q4_K/Q5_K 的 16-byte 向量化載入、SwiGLU 融合以及單隊列異步 HIP graphs。

進一步的優化包括「兄弟激活重用」技術,該技術在平行投影(如 gate/up 和 Q/K/V)之間重用量化激活值,避免重複的記憶體讀寫操作。

開發者還實作了寄存器內融合的殘差加法與 RMSNorm,將激活值保留在 VGPRs 中並在通過間直接寫入量化的 q8_1 副本供 mmvq 使用。

其他改進涵蓋多列 SwiGLU 與 GDN 融合、線上 Log-Sum-Exp 預填充與流水線預取、持久化圖形區域(Persistent graph arenas)以消除階段切換的開銷,以及針對串流優化的推測解碼技術。

不同上下文長度下的實際吞吐量表現

基準測試顯示,未啟用多詞元預測(MTP)時,解碼速度隨上下文長度增加而顯著下降:從 1k 詞元的 36.5 t/s 降至 65k 的 32.1 t/s、131k 的 27.0 t/s,最終在 262k 完整上下文時僅剩 9.5 t/s。

啟用 MTP 後,短上下文(1k-4k)的解碼速度提升至 71.8-86.5 t/s,65k 詞元時為 72.9 t/s,131k 詞元時為 78.6 t/s。

然而,在 262k 完整上下文下,即使啟用 MTP,解碼速度仍大幅下降至 31.1 t/s,顯示長上下文下的記憶體頻寬與串流開銷成為主要瓶頸。

預填充(Prefill)階段的吞吐量同樣隨長度遞減:從 1k 詞元的 1368.4 t/s 降至 262k 詞元的 585.8 t/s。

功耗限制對效能的影響

測試中將 RX 9070 XT 的功耗限制設定為 231W,較預設 TDP 304W 降低了約 24%。

在此低功耗設定下,預填充階段的延遲僅增加 3.6%,而解碼吞吐量幾乎沒有變化。

這意味著在長時間運行任務時,降低功耗不僅能節省電力,還能保持顯卡安靜,同時維持可用的推理速度。