KV 压缩与量化¶
算法维度(横向)之三:保留所有 K/V 条目,但降低每个条目的位宽或秩,让 KVCache 在字节数上变小。
与 稀疏化 的差别:稀疏是"丢掉一些 K/V",本章是"K/V 都还在,但每个变小了"。两者经常组合使用。
A. 压缩¶
1. 低秩分解 / SVD 类¶
策略:把 KVCache 张量沿 head 或 channel 维度做 SVD,只保留 top-\(r\) 个奇异值与对应向量。
- 离线 SVD:用校准集决定分解矩阵,推理时缓存的是低秩因子
- 在线 SVD:随生成动态调整,质量更稳但计算开销大
工程上更常用的是 MLA(Attention 变体 §2)——它把低秩思想直接做进了模型架构里训练,避免了"事后压缩"的精度损失。事后 SVD 压缩在公开工业系统里部署较少。
2. 学习型压缩 / 摘要式压缩¶
策略:用一个轻量"压缩头"把一段 KV 压成更短的 KV(信息聚合)。
代表方向:
- Compressed Context Memory 类工作——把超出窗口的历史 K/V 压成几个 summary token
- Recurrent KV——KV 不再是 token 级,而是"段级"摘要
适用:多轮对话、长 Agent 链路等"历史 token 多但单 token 重要性低"的场景。 代价:质量损失需要任务级评估,不是"通用免费午餐"。
3. CacheGen / Streaming 类¶
不是缩 KV 本身,而是在跨节点传输 KV 时做压缩+流式传输。 - 把 KV 量化 + 编码成 bitstream - 接收端边收边解码,与计算 overlap
代表论文:CacheGen (2024)。
B. 量化¶
量化是工业上最广泛部署的 KVCache 优化路径,原因:兼容性好、硬件友好、收益直接。
1. 数据类型谱¶
| 精度 | KV 体积(相对 BF16) | 工业部署成熟度 |
|---|---|---|
| FP16 / BF16 | 1.0× | 默认 |
| FP8(E4M3 / E5M2) | 0.5× | H100/H200 一线方案 |
| INT8 | 0.5× | 成熟,质量略劣于 FP8 |
| INT4 | 0.25× | 研究阶段,部分场景可用 |
| 1-bit / KIVI 极致量化 | < 0.1× | 论文阶段 |
2. 量化粒度¶
| 粒度 | 描述 | 精度/速度权衡 |
|---|---|---|
| Per-tensor | 整个张量一个 scale | 最快,最不准 |
| Per-channel | 每个 channel(head_dim 维度)一个 scale | 中等 |
| Per-token | 每个 token 一个 scale | 较准,scale 表大 |
| Per-group | 每 g 个连续元素一组 | 主流折中(如 g=64) |
paged attention 下,per-block 也是常见粒度——每个 KV block 共享一组 scale。
3. 静态 vs 动态、对称 vs 非对称¶
- 静态量化:scale 提前用校准集确定。简单、推理零额外开销,但 outlier 敏感。
- 动态量化:scale 在写入时基于当前张量统计计算。适应性好,但 prefill / decode 路径都要插入计算。
- 对称量化:零点固定为 0。硬件对乘加更友好。
- 非对称量化:保留 zero point,对正负不对称分布更准(Key 张量常见这种分布)。
经验:K 比 V 更难量化——K 的分布更不均匀(attention sink 等极端值),常见做法是 K 用更细粒度、V 用更粗粒度。
4. 代表方法¶
| 方法 | 核心 idea | 备注 |
|---|---|---|
| KIVI | K per-channel quant + V per-token quant,2-bit 也能保精度 | arXiv:2402.02750 |
| KVQuant | 4-bit per-channel + outlier 处理 + RoPE 对齐 | arXiv:2401.18079 |
| Atom | 推理全栈低比特(含 KV) | arXiv:2310.19102 |
| QServe | W4A8KV4 + Lookahead Search 等 | arXiv:2405.04532 |
| TurboQuant | 3.5-bit 近似无损,WHT 旋转 + QJL 1-bit 残差,零训练开销 | arXiv:2504.19874 |
| HACK | 同态 INT2 量化,KV 压缩后不还原直接在 attention 内计算 | arXiv:2502.03589 |
5. TurboQuant:极致低比特 + 零训练开销¶
TurboQuant 实现了在 LongBench / Needle-in-a-Haystack 上近无损的 ~3.5 bit KV 量化:
- 核心技术:随机旋转(WHT)+ 标量量化 + QJL 1-bit 残差纠偏
- 注意力度:H100 上 4-bit 注意力 logits 比 32-bit 快 8×
- 框架集成路线:
- SGLang PR #23135:3.88× 压缩,93–105% decode 吞吐(uniform mode 比 codebook mode 快 ~15%)
- vLLM PR #40396:v2 添加 FLUTE-style grouped Q heads + vectorized LUT,受 CUDA Graph grid size 约束
- TRT-LLM:使用 NVFP4 原生格式(非 TurboQuant),MLA FP4 模型配 BF16 fallback pool
来源:主站 reading TurboQuant 详解、框架集成路线图
6. HACK:同态 KV 压缩¶
HACK 的核心创新是压缩后的 KV 直接驻留在注意力计算路径上,不进行逐步解压:
- 同态量化:KV 保持 2-bit INT2 格式进入 attention kernel,避免 per-step dequantization
- JCT 降低:38.6–61.6% vs 基线(disaggregated serving 场景)
- Dequant 成本替换:CacheGen/KVQuant 的 17–38% JCT dequant 开销被 HACK 的 1.5–3.2% 近似开销替代
- 分区策略:Partition size Π=64 平衡精度与 JCT;求和消除 + V tail block FP16 buffer 关键优化
来源:主站 reading HACK 同态 KV 压缩
7. NVFP4 / FP4:Blackwell 时代的 4-bit 路线¶
NVFP4 KV Cache 的核心价值是让 4-bit 浮点进入硬件友好的生产路径:在 Blackwell 上实现 KV 内存减半,长上下文高并发场景 TTFT 最高改善约 3×,公开 benchmark 上精度损失小于 1%。但它不是"所有 workload 免费降到 4-bit":
| 风险点 | 工程含义 |
|---|---|
| benchmark 分布有限 | LiveCodeBench、MMLU-PRO、MBPP、Ruler 64K 不等于生产 reasoning / agent trace |
| backend 兼容性 | SGLang 的 FP4/FP8 KV dtype 需要 attention backend 支持,否则会降级到慢路径 |
| scale buffer 开销 | FP4 通常仍需 block scale,实际容量收益不是严格 4× |
在 SGLang 实操中,BF16 → FP4 可支持约 3.56× 更长上下文或更多并发(含 scale buffer),DeepSeek-R1-0528 FP4 KV 在 gsm8k 上 0.9124 vs BF16 0.9157;Qwen3-235B-A22B FP4 KV 甚至略高于 FP8(0.9186 vs 0.9181)。这些数字说明 FP4 已具备评估价值,但仍需要逐模型、逐 workload 验证。
来源:主站 reading NVFP4 KV Cache,主站 field-note SGLang 部署方式、KV Cache 调参与最佳实践
8. TriAxialKV:Agent 负载的结构化低比特分配¶
Agent KV 不再是均质文本:system prompt、tool schema、CoT、tool call JSON、截图观测和 delimiter token 的敏感度不同。TriAxialKV 用模态、时间、语义三轴标签决定每类 token 使用 2-bit 还是 4-bit,65–75% token 被路由到 INT2,平均 bitwidth 约 2.6–2.7 bit,比 uniform INT4 低 35% 存储开销。
| 结果 | 数字 |
|---|---|
| KV 容量 | BF16 基线的 4.5× |
| 端到端吞吐 | B200 1.32×,H100 1.52× |
| 并发请求数 | H100 3.4×,B200 4.0× |
| 精度 | OSWorld 高于 BF16 0.6–1.8 个百分点;BFCL Memory 在 BF16 ±1.1% 内 |
关键启示是:aggressive quantization 未必比保守 uniform quantization 更危险,前提是比特预算按 Agent 结构分配。uniform FP4 / INT2 容易把 tool schema 这类高敏感 inst token 也压低,导致函数名、参数名错误。
来源:主站 reading TriAxialKV:为什么 Agent 推理需要多轴 KV Cache 量化
C. 系统层面的协同¶
量化 KV 与 paged 管理¶
- block_size 与量化 group_size 的对齐:例如 16 token/block × per-token quant,scale 表是 16 个 fp16 值,与 block metadata 一起存
- copy-on-write 时要不要重新量化?通常不要,直接拷贝量化后的字节
量化 KV 与 offload / 跨节点传输¶
- 在 PCIe / RDMA 上传输的就是量化后的字节,带宽收益正比于压缩比
- 接收端要么直接用量化 KV 算 attention(kernel 支持),要么 dequantize 回来(计算开销)
详见 维度交叉 §3.1。
量化 KV 与 prefix cache¶
哈希以量化后的字节为输入还是原始 token id 为输入?工业实践基本都是后者(token id)——量化是引擎内部细节,缓存语义应稳定于 token 级。但要注意:换一个量化方案后,老的物理 KV block 字节内容变了但 token id 哈希不变,导致命中后读到的是错的字节——这要求量化方案版本号纳入 cache key 或在切换时清空缓存。
D. 算法维度小结:三类操作的统一视角¶
把 Attention 变体、稀疏化 和本章合在一起看:
| 类别 | 操作 | 代表 |
|---|---|---|
| 改形状 | 改变 KV 张量的维度 | MQA/GQA/MLA、SWA |
| 减条目 | 在 token/head/layer 维度上去掉 K/V | StreamingLLM、H2O、SnapKV、YOCO |
| 减位宽/秩 | K/V 都在但每个变小 | KIVI、KVQuant、SVD |
它们共同效应是减少 KV 的"有效字节数",但作用通道、精度风险、kernel 友好度各不相同。在生产部署里这三类经常叠加使用:GQA 模型 + FP8 KV + SnapKV 剪枝是当前一线推理引擎的常见组合。
关联章节¶
版本历史¶
| 版本 | 日期 | 说明 |
|---|---|---|
| v0.3 | 2026-06-02 | 新增 NVFP4/FP4 Blackwell 路线与 TriAxialKV agent 结构化 2/4-bit 量化 |
| v0.2 | 2026-05-14 | 新增 TurboQuant(3.5-bit 近无损、三框架集成路线)和 HACK(同态 INT2 量化、JCT 38.6–61.6% 降低)代表方法及技术细节 |