目录

TurboQuant+ 深度解读:LLM KV 缓存极限压缩的工程实践

项目概览

TurboQuant+ 是对 Google Research TurboQuant 论文(ICLR 2026)的开源实现与扩展工程。截至 2026 年 4 月,该项目已获得 6,482 Stars872 Forks,是近期最具影响力的 LLM 推理优化开源项目之一。

属性数值
Stars6,482
Forks872
语言Python + C (llama.cpp 集成)
协议Apache 2.0
主要贡献者TheTom
分支feature/turboquant-kv-cache

项目核心目标:在不显著损失模型质量的前提下,将 LLM 推理时的 KV Cache 压缩 3.8-6.4 倍,从而大幅降低长上下文场景的内存占用和带宽消耗。


背景:为什么 KV Cache 压缩是关键技术瓶颈

大语言模型推理分为两个阶段:Prefill(处理输入 prompt,生成第一个 token)和 Decode(自回归地逐 token 生成)。在长上下文场景下,KV Cache 的内存占用往往成为瓶颈:

  • Llama-3.1-70B 在 48K 上下文时,KV Cache 占用 ~40GB+
  • Command-R+ 104B 在 128K 上下文时,KV Cache 占用 ~80GB+

这意味着即使模型权重是量化的,KV Cache 仍可能将显存塞满,导致无法使用长上下文。

TurboQuant 的核心洞察是:不需要量化模型权重,只需要压缩 KV Cache 本身


核心技术:PolarQuant + Walsh-Hadamard Rotation

3.1 算法原理

TurboQuant 的核心是 PolarQuant——一种结合随机旋转和标量量化(Scalar Quantization)的压缩方法:

输入向量 x ∈ R^d
    │
    ├── 1. 提取归一化系数:γ = ||x||,x̂ = x/γ
    │
    ├── 2. 随机旋转(Walsh-Hadamard Transform + 随机符号翻转)
    │   旋转后坐标服从 N(0, 1/d),Gaussianize 分布
    │
    ├── 3. 最优标量量化(Lloyd-Max)
    │   turbo4: 16 个质心(4-bit),turbo3: 8 个质心(3-bit),turbo2: 4 个质心(2-bit)
    │
    └── 输出:量化索引 + 每个块的归一化系数

为什么需要旋转?

KV 向量各维度的量级(magnitude)差异巨大(Google 论文中测量到 kurtosis 高达 900)。直接量化会把精度浪费在大幅值维度,而小幅度维度则被粗化。通过随机旋转将向量"打散",使各坐标的分布接近 Gaussian(kurtosis → 3.0),从而让标量量化效果最优

实验验证(Qwen3-1.7B 真实 KV 张量):

原始 kurtosis: 900.4 → 旋转后: 2.9(Gaussian = 3.0)

3.2 压缩率与质量

格式Bits/val压缩率(vs fp16)PPL(wikitext-2, 512c)vs q8_0
fp1616.01.0x6.121baseline
q8_08.51.9x6.111baseline
turbo44.253.8x6.125+0.23%
q4_04.53.6x6.142+0.52%
turbo33.54.6x6.176+1.06%
turbo22.56.4x6.507+6.48%

关键发现:turbo4 的压缩率接近 q4_0,但质量接近 q8_0。PPL 仅增加 0.23%,远优于同等压缩率的 q4_0。

3.3 K 压缩 vs V 压缩:不对称的发现

项目通过大量实验发现了一个关键非对称性:

V 压缩是免费的(无质量损失),所有质量损失来自 K 压缩。

这是因为 attention score 由 softmax(Q @ K^T / √d) 计算,K 控制了注意力路由,精度丢失会直接导致错误的注意力权重分配;而 V 只是被加权求和的对象,其量化误差在 softmax 加权平均下被平滑。

这一发现直接导向了非对称 K/V 配置(q8_0-K + turbo-V),这是低 bit 模型(如 Q4_K_M)的关键救星:

模型(权重)KVPPLvs q8_0
Qwen2.5-7B (Q4_K_M)q8_0turbo46.64+1.0%
Qwen2.5-7B (Q4_K_M)q8_0turbo36.71+2.0%
Qwen2.5-7B (Q4_K_M)turbo3turbo33556灾难性

Boundary V:边界层保护机制

核心思想

项目进一步发现:Transformer 的首尾层对 V 精度极为敏感,而中间层则相对鲁棒。

基于此,设计了 Boundary V 策略:保护前 2 层 + 后 2 层使用 q8_0-V,其余层使用 turbo2-V:

boundary_layers = [前2层] + [后2层]  → q8_0-V
其余层 → turbo2-V

实现仅需 15 行代码,无速度惩罚。

质量恢复效果

模型层数turbo2 PPLBoundary V PPL恢复比例
phi-4-Q8_040L4.8354.78455%
Qwen2.5-7B Q4_K_M28L6.9116.83537%
Qwen3.5-35B MoE64L5.2575.14891%
Qwen3.5-27B Dense36L6.5346.42342%

规律:模型越深,恢复效果越好。64 层 MoE 模型恢复了 91% 的质量差距。


Sparse V:注意力门控的解码加速

原理

传统 KV Cache 在 decode 时需要对所有缓存位置进行 dequantize 和加权求和。但研究发现:大多数位置的 softmax 注意力权重 < 1e-6,这些位置的贡献可以忽略不计。

Sparse V 在 dequantize 时跳过这些低权重位置,节省约 50% 的 dequant 计算量:

配置32K 上下文 Decode tok/svs q8_0
q8_085.71baseline
turbo3~760.89x
turbo3 + Sparse V1173.9113.7x

注意:这里 13.7x 包含 prefill+decode 的复合场景。纯 decode 加速约 22.8%。

质量验证

在 wikitext-103(50 chunks, 32K 上下文)上验证,PPL 变化为 0.000(无额外损失)。NIAH 检索任务:9/9 单针(vs baseline 7/9)。

更关键的是:Sparse V 不是 TurboQuant 专属的——在 q8_0 KV Cache 上也能带来 +5% 的 decode 加速,说明这是一种通用的注意力优化。


llama.cpp 集成:跨平台支持

支持的平台

平台GPU状态
Apple SiliconMetal✅ 完全支持,M1-M5 验证
NVIDIA CUDAGPU✅ RTX 3080 Ti/3090/4090/5090 社区验证
AMD RDNA 4HIP✅ RX 9070 XT (gfx1201) 原生支持
CPU✅ 回退支持

使用方式

# Server 模式
./build/bin/llama-server \
  -m models/your-model.gguf \
  --cache-type-k turbo3 --cache-type-v turbo3 \
  -np 1 -ngl 99 -c 262144 -fa on

# 推荐:低 bit 权重模型使用非对称配置
./build/bin/llama-server \
  -m models/your-model-Q4_K_M.gguf \
  -ctk q8_0 -ctv turbo4 -fa 1

Prefill vs Decode 性能(M5 Max 128GB, Qwen3.5-35B-A3B MoE)

上下文turbo4 Prefill tok/sq8_0 Prefill tok/s比率
2K268226651.01x
4K237022551.05x
32K114110981.04x

turbo4 的 Prefill 速度持平甚至略超 q8_0——因为压缩后的 KV Cache 带宽占用更小。

大模型压力测试(M5 Max 128GB)

模型参数权重配置PPL128K 上下文NIAH
Llama-3.1-70B70BQ4_K_Mturbo4/turbo43.461✅ 48K30/30
Command-R+ 104B104BQ4_K_Mturbo4/turbo46.312128K10/10

104B 模型在 MacBook M5 Max 上跑到 128K 上下文,PPL 仅增加 1.9%,是本项目最震撼的成果之一。


MLX Swift 集成:Apple Silicon 原生加速

项目与 ekryski/mlx-swift-lm 合作,推出 Swift 原生实现,在 M5 Max 上实测 Qwen3.5-35B-A3B MoE @ 4K 达到 144 tok/s

MLX 版本使用委托式 KVCache 架构7ad7500 优化):

  • Prefill 阶段存储原始 FP16
  • 第一个 decode 步压缩到 packed TurboQuant,并 seed 内部 KVCache
  • 后续 decode 走原生 KVCache(预分配缓冲区,零分配)
  • 后台周期性批量重压缩

密集模型注意事项:MLX 上 symmetric turbo 对密集模型是灾难性的(KLD 6.86,Top-1 匹配仅 10.5%),必须使用 asymmetric(K=FP16, V=turbo4)


配置推荐矩阵

模型权重类型推荐配置说明
Q8_0+-ctk turbo3 -ctv turbo3对称 turbo,质量最佳
Q4_K_M(敏感型)-ctk q8_0 -ctv turbo4非对称,K 保高精
Q4_K_M(鲁棒型)-ctk turbo3 -ctv turbo3Mistral/Llama/Command-R+ 可用对称
极限内存压缩-ctk q8_0 -ctv turbo26.4x 压缩

工程实践:14 项 Decode 优化总结

项目在 llama.cpp Metal 上的优化历程(从 739 tok/s 到 2747 tok/s)包含 5 个关键里程碑:

优化步骤Prefill tok/svs q8_0
turbo3 fp32 WHT(初始)7390.27x
+ fp16 WHT10740.40x
+ half4 向量化蝴蝶变换14110.52x
+ 图侧 WHT 旋转20950.78x
+ block-32 存储27471.02x

关键教训:WHT 旋转必须在图侧(graph-side)执行,而非查询侧(query-side),否则会因旋转方向不一致导致质量灾难。


技术里程碑与研究结论

三个被多团队独立验证的核心发现

  1. V 压缩免费:即使压缩到 2-bit,只要 K 精度保持,质量无显著损失
  2. 所有质量损失来自 K 压缩:这解释了为什么非对称配置能救活低 bit 模型
  3. 边界层极敏感:保护首尾 4 层可恢复 37-91% 的质量差距

QJL 的取舍

原始 TurboQuant 论文包含 1-bit QJL 误差校正。项目通过实验发现:QJL 增加方差,softmax 会放大这个方差,导致质量下降。用更多质心(PolarQuant-only)替代 MSE+QJL 组合,效果更好。已获 5 个独立团队验证。


总结与展望

TurboQuant+ 是近年来 KV Cache 压缩领域最完整的开源实现。其核心贡献在于:

  1. 工程完整性:Python 原型 → llama.cpp C 集成 → MLX Swift 移植,覆盖全平台
  2. 质量基准:6,482 Stars 背后是详尽的 PPL、NIAH、KL 散度实验数据
  3. 关键洞察:V 压缩免费 + K 是质量瓶颈 + 边界层保护,这三条发现改变了我们对 KV 压缩的理解
  4. 社区协作:M1/M2/M3/M5 Mac、RTX 3080 Ti/3090/4090/5090、AMD RX 9070 XT 多硬件验证

下一步里程碑

  • llama.cpp 上游 PR 准备(增量小 patch,而非整体合并)
  • 自适应 bit 宽度(根据层重要性动态分配精度)
  • 时间衰减缓存(长期记忆场景的 KV Cache 淘汰策略)

项目链接:https://github.com/TheTom/turboquant_plus


本文档基于 GitHub 仓库 TheTom/turboquant_plus 的公开信息编写,数据截止至 2026 年 4 月。