Key-Value(KV) Cache 量化

April 16, 2026 · View on GitHub

自 v0.4.0 起,LMDeploy 支持在线 kv cache int4/int8 量化,量化方式为 per-head per-token 的非对称量化。原来的 kv 离线量化方式移除。

从直观上看,量化 kv 有利于增加 kv block 的数量。与 fp16 相比,int4/int8 kv 的 kv block 分别可以增加到 4 倍和 2 倍。这意味着,在相同的内存条件下,kv 量化后,系统能支撑的并发数可以大幅提升,从而最终提高吞吐量。

但是,通常,量化会伴随一定的模型精度损失。我们使用了 opencompass 评测了若干个模型在应用了 int4/int8 量化后的精度,int8 kv 精度几乎无损,int4 kv 略有损失。详细结果放在了精度评测章节中。大家可以参考,根据实际需求酌情选择。

LMDeploy kv 4/8 bit 量化和推理支持如下 NVIDIA 显卡型号:

  • volta 架构(sm70): V100
  • 图灵架构(sm75):20系列、T4
  • 安培架构(sm80,sm86):30系列、A10、A16、A30、A100
  • Ada Lovelace架构(sm89):40 系列
  • Hopper 架构(sm90): H100, H200

总结来说,LMDeploy kv 量化具备以下优势:

  1. 量化不需要校准数据集
  2. 支持 volta 架构(sm70)及以上的所有显卡型号
  3. kv int8 量化精度几乎无损,kv int4 量化精度在可接受范围之内
  4. 推理高效,在 llama2-7b 上加入 int8/int4 kv 量化,RPS 相较于 fp16 分别提升近 30% 和 40%

TurboQuant 量化

LMDeploy 支持基于 Google Research 的 TurboQuant 技术(将在 ICLR 2026 发表)实现的 KV 量化方案,通过 K=4bit QJL4 + V=2bit MSE 的组合,实现更高的压缩率和几乎无损的精度。

原理

TurboQuant 通过两个关键步骤实现高效压缩:

  1. 高质量压缩(PolarQuant 方法):首先对数据向量进行随机旋转(使用 Hadamard 变换等正交变换)。这个巧妙的步骤简化了数据的几何结构,使得可以对向量的每个部分单独应用标准的高质量量化器。这一阶段使用大部分压缩能力(大部分比特)来捕捉原始向量的主要概念和强度。

  2. 消除隐藏误差(QJL 方法):使用少量剩余的压缩能力(仅 1 bit)将 QJL(Quantized Johnson-Lindenstrauss)算法应用于第一阶段剩余的微小误差。QJL 阶段充当数学误差检查器,消除偏差,从而获得更准确的注意力分数。

K/V 量化方案

  • K 路径 - QJL4 量化

    • 使用 3bit Lloyd-Max 码本进行 MSE 量化(捕捉主要信息)
    • 使用 1bit QJL 存储残差符号(消除误差偏差)
    • 每个 token 的 K 压缩为 4bit
  • V 路径 - MSE int2 量化

    • 使用 2bit Lloyd-Max 码本进行 MSE 量化
    • 每个 token 的 V 压缩为 2bit
    • 存储归一化系数用于反量化

优势

  • 零精度损失:通过 PolarQuant + QJL 的组合,实现高压缩率的同时保持模型精度
  • 更高的压缩率:K 4bit + V 2bit = 平均 3bit,相比 int4 的 4bit 进一步压缩
  • 消除量化偏差:QJL 算法作为误差检查器,有效消除量化引入的偏差

性能测试

在 H200 上使用 Qwen3-30B-A3B-Base 模型、ShareGPT 数据集进行测试:

指标Baseline (quant_policy=0)TurboQuant (quant_policy=42)变化
输入吞吐2368.8 tok/s2195.8 tok/s-7.3%
输出吞吐2186.7 tok/s2027.0 tok/s-7.3%
请求吞吐10.74 req/s9.96 req/s-7.3%
平均端到端延迟5.888s6.348s+7.8%
平均 TTFT1.139s1.235s+8.4%
平均 TPOT0.024s0.026s+8.3%
平均 ITL0.059s0.059s持平

测试配置:GPU: H200, 模型: Qwen3-30B-A3B-Base, 数据集: ShareGPT, 并发: 64, 请求数: 5000

结论:TurboQuant K4V2 实现约 5 倍的 KV cache 内存压缩,端到端性能开销约 7%-8%,在内存受限的 serving 场景中是一个合理的权衡。

限制

  • 仅支持 PytorchEngine:TurboQuant 目前仅支持 PyTorch 引擎,不支持 Turbomind 引擎
  • 不支持 MLA:不支持 Multi-head Latent Attention 结构
  • 不支持推测解码:不支持 speculative decoding
  • 需要 head_dim 为 2 的幂次方(power of 2)
  • 需要安装 fast_hadamard_transform 包以获得最佳性能(可选)

可选依赖

TurboQuant 使用 Hadamard 变换加速量化过程。安装 fast_hadamard_transform 可获得更好的性能:

pip install fast_hadamard_transform

不安装此依赖时,TurboQuant 仍可正常工作,但性能可能略有下降。

接下来,我们以 internlm2-chat-7b 模型为例,介绍 kv 量化和推理的若干应用。而在此之前,请安装 lmdeploy

pip install lmdeploy

应用示例

通过 LMDeploy 应用 kv 量化非常简单,只需要设定 quant_policy 参数。

LMDeploy 规定 quant_policy=4 表示 kv int4 量化,quant_policy=8 表示 kv int8 量化,quant_policy=42 表示 TurboQuant 量化。

离线推理

from lmdeploy import pipeline, TurbomindEngineConfig
engine_config = TurbomindEngineConfig(quant_policy=8)
pipe = pipeline("internlm/internlm2_5-7b-chat", backend_config=engine_config)
response = pipe(["Hi, pls intro yourself", "Shanghai is"])
print(response)

推理服务

lmdeploy serve api_server internlm/internlm2_5-7b-chat --quant-policy 8

TurboQuant 量化

TurboQuant 量化使用 quant_policy=42仅支持 PytorchEngine

from lmdeploy import pipeline, PytorchEngineConfig
engine_config = PytorchEngineConfig(
    tp=1,
    cache_max_entry_count=0.8,
    quant_policy=42  # TurboQuant: K=4bit QJL4 + V=2bit MSE
)
pipe = pipeline("Qwen/Qwen3-8B", backend_config=engine_config)
response = pipe.infer("Hello, how are you?", max_new_tokens=30)
print(response.text)

精度评测

我们把 lmdeploy 的 kv 量化应用在若干 LLM 模型上,并使用 opencompass 评测推理精度,结果如下表所示:

---llama2-7b-chat--internlm2-chat-7b--internlm2.5-chat-7b--qwen1.5-7b-chat--
datasetversionmetrickv fp16kv int8kv int4kv fp16kv int8kv int4kv fp16kv int8kv int4fp16kv int8kv int4
ceval-naive_average28.4227.9627.5860.4560.8860.2878.0677.8777.0570.5670.4968.62
mmlu-naive_average35.6435.5834.7963.916462.3672.3072.2771.1761.4861.5660.65
triviaqa2121cescore56.0956.1353.7158.7358.758.1865.0964.8763.2844.6244.7744.04
gsm8k1d7fe4accuracy28.228.0527.3770.1369.7566.8785.6785.4483.7854.9756.4154.74
race-middle9a54b6accuracy41.5741.7841.2388.9388.9388.9392.7692.8392.5587.3387.2686.28
race-high9a54b6accuracy39.6539.7740.7785.3385.3184.6290.5190.4290.4282.5382.5982.02

具体的评测方式可以参考这份指南。评测时,请在config文件中,为推理引擎添加 quant_policy 参数。

推理效率

modelkv typetest settingsRPSv.s. kv fp16
llama2-chat-7bfp16tp1 / ratio 0.8 / bs 256 / prompts 1000014.981.0
-int8tp1 / ratio 0.8 / bs 256 / prompts 1000019.011.27
-int4tp1 / ratio 0.8 / bs 256 / prompts 1000020.811.39
llama2-chat-13bfp16tp1 / ratio 0.9 / bs 128 / prompts 100008.551.0
-int8tp1 / ratio 0.9 / bs 256 / prompts 1000010.961.28
-int4tp1 / ratio 0.9 / bs 256 / prompts 1000011.911.39
internlm2-chat-7bfp16tp1 / ratio 0.8 / bs 256 / prompts 1000024.131.0
-int8tp1 / ratio 0.8 / bs 256 / prompts 1000025.281.05
-int4tp1 / ratio 0.8 / bs 256 / prompts 1000025.801.07

上述结果使用的测试脚本是 benchmark/profile_throughput.py