~/blog/turboquant-kv-cache-benchmark-gx10

LLM 深水區 · part 2

[Benchmark] TurboQuant 實測:KV Cache 3-bit 壓縮,真的零損失?

2026-03-30更新於 2026-04-114 分鐘閱讀#turboquant#kv-cache#quantization#vllmEnglish
cat --toc

TL;DR

Google TurboQuant 3-bit KV cache 壓縮在 GB10 上驗證通過:5.0x 壓縮、cosine sim 0.9943、Needle-in-Haystack EXACT。但目前沒有速度優勢(需要 fused kernel),且 Qwen3.5-35B 的 hybrid attention 只有 25% 的層受益——僅省 600 MB,遠低於論文對 dense 模型宣稱的 6x。

TurboQuant 30 秒動畫說明:PolarQuant + QJL 兩階段壓縮

白話版:壓縮 AI 的記憶體卻不損失品質

AI 模型跟你對話時,需要記住整段對話歷史。這塊記憶體叫「KV cache」(鍵值快取),會隨著每條訊息成長。光是 8,000 個 token 的對話就要用掉 289 MB 的記憶體。拉長到長文件或複雜任務,瓶頸就不是 AI 的大腦,而是它的筆記本。

TurboQuant 是 Google Research 在 ICLR 2026 發表的技術,宣稱可以把這塊記憶體壓縮 6 倍——每個值只用 3 bit 而不是通常的 16 bit,而且不損失回答品質。可以想成照片的 JPEG 壓縮:檔案小很多,但肉眼看不出差異。

這篇在真實硬體——NVIDIA DGX Spark 桌上型 AI 電腦——上測試了這些宣稱。對標準 AI 模型來說,壓縮效果確實如論文所述。但對新一代的 hybrid 模型如 Qwen3.5-35B(本身就已經用了省記憶體的架構),節省幅度比標題數字暗示的小很多。數學是對的;效益取決於你跑的是什麼模型。

對量化的基礎還不熟? 如果「3 bit 對 16 bit」或「Q4_K_M」這些詞對你來說還很陌生,建議先讀 LLM 101 Part 4:什麼是量化?——那篇用 MP3 比喻講清楚權重量化。這篇就是同系列的 KV cache 續集:一樣的技術家族,壓縮的是不同的東西。


LLM 推理的記憶體瓶頸不在模型權重,在 KV cache。一個 8K context 的 Qwen2.5-3B,KV cache 就要 289MB,而且隨 context 線性增長。這個問題在長 context 推理和大模型上會放大到讓人難受的程度。

3/24 Google Research 發了一篇 TurboQuant(ICLR 2026),宣稱能把 KV cache 壓到 3-bit,記憶體少 6x,精度零損失。社群五天內就冒出六個獨立實作。這篇是在 GX10(GB10/SM121)上的親測記錄。


TurboQuant 是什麼:30 秒懶人包

傳統量化是把浮點數對應到固定 bit 寬度。TurboQuant 用兩個步驟:

步驟一:PolarQuant 把每個 KV 向量做隨機旋轉,轉成極座標後再量化。旋轉後的向量分布更均勻,每個維度都可以用 Lloyd-Max 演算法找到最佳化的量化點。重點:不需要 calibration data,不需要 fine-tuning。

步驟二:QJL(Quantized Johnson-Lindenstrauss) 第一步會有殘差誤差。QJL 用 Johnson-Lindenstrauss 變換把殘差投影到 1-bit(只保留正負號)。數學上能保證 attention score 計算是 unbiased 的——這是 MSE-only 量化做不到的。

論文數字:品質無損約 3.5 bits/channel、KV 壓縮超過 5x、配合 optimized kernel 時 attention logit 計算有加速、LongBench/RULER/Needle-in-Haystack 零精度損失。(網路上常引用的「H100 8x」這個具體數字我在 arxiv 原文找不到,二手來源的 performance 數字看看就好。)


環境

  • 機器:GX10,NVIDIA GB10(SM121),128GB unified memory,273 GB/s bandwidth
  • vLLM venv:torch 2.10+cu130,transformers 5.3.0
  • 實作tonbistudio/turboquant-pytorch(PyTorch from-scratch 實作,非官方)
  • 驗證模型:Qwen2.5-3B-Instruct(本機,fp16)

安裝:

source ~/.python-vllm-custom/bin/activate
pip install accelerate scipy -q

# 注意:目錄名需要是合法 Python module name
git clone https://github.com/tonbistudio/turboquant-pytorch ~/experiments/turboquant-pytorch
mv ~/experiments/turboquant-pytorch ~/experiments/turboquant

cd ~/experiments && python -m turboquant.test_turboquant

測試一:Synthetic Benchmark

不需要下載模型,直接驗證演算法數學正確性。

cd ~/experiments && python -m turboquant.test_turboquant

Lloyd-Max Codebook

不同維度(d=64/128/256)和 bit 寬度的量化失真:

d=128, bits=3: distortion/coord=0.000270
d=256, bits=3: distortion/coord=0.000135

維度越高,每個維度的失真越小——高維向量量化的數學有這個好性質。

MSE-Only vs QJL:bias 差異確認

bits=2: MSE-only bias=+0.001052  (有 bias)
bits=3: MSE-only bias=+0.000191  (有 bias)

QJL correction 後:

bits=3: bias=-0.000317  (≈ 0)
bits=4: bias=+0.000559  (≈ 0)

這是論文的核心主張之一:MSE-only 量化對 attention score 有系統性偏差,QJL 校正消除它。在 GB10 上親自驗證,結果如論文所述。

Needle-in-Haystack(Synthetic)

bitsseq=512seq=2048seq=8192
2-bitEXACTEXACTEXACT
3-bitEXACTEXACTEXACT
4-bitEXACTEXACTEXACT

2/3/4-bit 全部精準找到。

GB10 速度

GPU: NVIDIA GB10
Config: d=128, bits=3, seq_len=8192, n_queries=64
Quantize 8192 keys:          31.04 ms
Inner product (64q × 8192k): 11.16 ms
Full-precision matmul:        0.02 ms
Memory: 2048 KB (fp16) → 384 KB (TQ-3bit) = 5.3x

這裡有個重要的數字:full-precision matmul 只要 0.02ms,但 TurboQuant inner product 要 11ms。

原因:這個 PyTorch 實作沒有寫 fused CUDA kernel。論文有提 optimized kernel 下的 attention 加速(網路上常引用的「H100 8x」具體數字我在 arxiv 原文找不到,當二手來源看)。在 GB10 這個非主流硬體(SM121)上,用現成的 PyTorch ops,目前沒有速度優勢。記憶體節省是真的,速度優勢要等上游 kernel 支援。


測試二:Real Model Validation(Qwen2.5-3B-Instruct)

用真實模型的 KV cache 向量驗證,3 種 context 長度(2K/4K/8K),needle-in-haystack 場景。

# validate.py 中把 MODEL_NAME 改成本機路徑,移除 bitsandbytes dependency
python -m turboquant.validate

壓縮率與精度

bits壓縮比Cosine sim (2K)Cosine sim (8K)Top-1 match (8K)
4-bit3.8x0.99870.998284.7%
3-bit5.0x0.99590.994380.6%
2-bit7.3x0.98910.984669.4%

原始 KV cache 大小:289MB(8K context, fp16)。3-bit 壓後:57.6MB。

幾個觀察:

3-bit 是甜蜜點。 Cosine similarity 0.9943,Top-1 match 80.6%。在長 context 任務上,不是每個 attention head 都需要精準的 top-1——整體分布夠好就行。

品質隨 context 微幅下降。 3-bit cosine sim 從 2K 的 0.9959 降到 8K 的 0.9943。幅度小,但存在。更長的 context 壓縮後誤差會累積。

2-bit 不建議生產使用。 69.4% Top-1 match 在 attention-heavy 任務(需要精確找到特定 token)可能出問題。


Qwen3.5-35B 的特殊情況

本來想直接在 production 模型上測,結果發現了一個架構特性值得記錄。

Hybrid Attention:只有 25% 的層有 KV cache

~/models/qwen35-35b-hf/ 的 config:

layer_types: [
    "linear_attention", "linear_attention", "linear_attention", "full_attention",  # 0-3
    "linear_attention", "linear_attention", "linear_attention", "full_attention",  # 4-7
    ...  # 每 4 層才有一個 full_attention
]
# full_attention 層:[3, 7, 11, 15, 19, 23, 27, 31, 35, 39]
num_key_value_heads: 2
head_dim: 256

40 層裡,只有 10 層是傳統的 full attention,其他 30 層是 GatedDeltaNet(線性注意力,狀態固定大小,不用 KV cache)。

TurboQuant 只能壓縮 full_attention 的 KV cache,也就是 10/40 = 25% 的層。而且 num_key_value_heads=2,每層的 KV cache 本來就已經很小。

記憶體估算

fp16,200K context:

2 KV heads × 256 dim × 2 bytes × 10 layers × 200K tokens ≈ 2GB
TurboQuant 3-bit → ~400MB

現在 GX10 vLLM 用 --kv-cache-dtype fp8(8-bit),KV cache 已是 1GB。TurboQuant 3-bit 再壓:~400MB,節省 600MB。

換句話說:對 Qwen3.5-35B-A3B,TurboQuant 的記憶體節省效益比論文測的 dense 模型小很多。這不是 TurboQuant 的問題,是 hybrid attention 架構的特性。

對比,如果跑一個純 dense 模型(像 Llama-3.1-70B),全部 80 層都有 KV cache,效益就接近論文的 6x。


現在能用嗎?

不能在生產環境直接用。 vLLM PR #38280 在 2026 年 3 月下旬 review 中,但 2026-04-06 未合併被 close 掉。llama.cpp 有多個 fork 但尚未合併 main。追 upstream vLLM 有沒有後續 PR。

可以學習和實驗。 pip install turboquanttonbistudio/turboquant-pytorch 可以跑 Python 驗證,理解演算法。

等時機:

vLLM PR #38280 合併
    ↓
--kv-cache-dtype turboquant3
    ↓
測 Qwen3.5-35B 的實際效果(預計 context 1.8M → 4.8M tokens)

什麼值得學

最花時間的:搞清楚 qwen35-35b-hf/ 是 multimodal model(Qwen3_5MoeForConditionalGeneration),不是純文字模型。transformers 無法在 89GB 記憶體裡載入 fp8 MoE + vision encoder,掉進去花了一個小時。

可遷移的診斷:對任何 hybrid attention 模型(Mamba hybrid、GLA、DeltaNet、RetNet 混合架構),算 TurboQuant 效益前先確認有多少層是 full attention。架構改變了演算法的適用範圍。

一句話 takeaway:TurboQuant 的數學是對的,3-bit 是可用的,但效益取決於模型架構——hybrid attention 讓它的節省比論文說的少。


TL;DR

  • TurboQuant 3-bit 在 GB10 上驗證正確:5x 壓縮,cosine sim 0.9943,Needle-in-Haystack EXACT
  • QJL bias 校正是真實有效的(MSE-only 有系統性偏差,QJL 消除)
  • 速度優勢目前不存在於 GB10:需要 fused kernel,目前的 PyTorch 實作比 matmul 慢 500x
  • Qwen3.5-35B-A3B 只有 25% 的層有 KV cache(hybrid attention),TurboQuant 效益遠低於 dense 模型
  • 等 vLLM PR #38280 合併,再決定是否在 production 上開啟

常見問題

TurboQuant 3-bit KV cache 壓縮真的不會損失精度嗎?
在 GB10 上用 Qwen2.5-3B-Instruct 測試,TurboQuant 3-bit 達到 5.0x 壓縮比,cosine similarity 0.9943,8K context 下 Top-1 match 80.6%。Needle-in-Haystack 在所有 bit 寬度(2/3/4-bit)都是 EXACT。QJL bias 校正消除了 MSE-only 量化的系統性偏差。品質隨 context 長度微幅下降(2K 時 0.9959,8K 時 0.9943)。
TurboQuant 在 Qwen3.5-35B hybrid attention 模型上能省多少記憶體?
比 dense 模型少很多。Qwen3.5-35B-A3B 只有 10/40 層是 full attention(25%),每層只有 2 個 KV head。200K context 下,KV cache 在 fp16 約 2 GB、fp8 約 1 GB、TurboQuant 3-bit 約 400 MB——只省了 600 MB。純 dense 模型如 Llama-3.1-70B(80 層全是 full attention)才能接近論文宣稱的 6x 節省。
TurboQuant 在 GB10(DGX Spark)上有速度優勢嗎?
目前沒有。社群 PyTorch 實作沒有 fused CUDA kernel——在 GB10 上 inner product 要 11ms,full-precision matmul 只要 0.02ms。論文有提 optimized kernel 下的 attention 加速,但網路上常引用的「H100 8x」這個具體數字我在 arxiv 原文找不到,當作二手來源看。記憶體節省在 GB10 上是真的;速度優勢要等上游 kernel 支援。
TurboQuant 什麼時候可以在 vLLM production 環境使用?
vLLM PR #38280 在 2026 年 3 月下旬 review 中,但 **2026-04-06 未合併被 close 掉**。llama.cpp 有社群 fork 但尚未合併到 main。追 upstream vLLM 看有沒有後續 PR;目前還沒到 production usability。