【免费下载链接】turboquant
TurboQuant: Near-optimal KV cache quantization for LLM inference (3-bit keys, 2-bit values) with Triton kernels + vLLM integration
想在 vLLM 上把 KV Cache 从 bf16 压到3-bit Keys + 2-bit Values,又不想改动一行 vLLM 源码?TurboQuant 正是为此而生的KV 缓存量化方案。它通过Monkey-Patch动态注入注意力层,提供4 种运行模式,在 RTX 3090 / 5090 上实测释放显存近半、上下文容量翻倍。这篇指南带你完整走通从安装到量化落地的每一步。
💡 一句话理解:TurboQuant 不改 vLLM,只"挂钩"它的注意力层,把 KV 缓存偷偷换成压缩格式,再用 free_kv_cache 把省下来的显存还给系统。
一、TurboQuant 解决什么问题:KV Cache 为什么是推理瓶颈
大模型推理时,每生成一个 token,都要把历史 Key / Value 存在显存里——这就是KV Cache。上下文越长、并发越大,KV Cache 吃得越凶,常常比模型权重本身还占显存。
TurboQuant 的思路很直接:压缩 KV Cache 的存储精度。它基于 ICLR 2026 论文(arXiv:2504.19874),用近最优的标量量化把 Key 压到 3-bit、Value 压到 2-bit,在几乎不损失注意力精度的前提下,把 KV 占用降到原来的约 1/4。
二、量化流程:从 bf16 到 3-bit 的 5 步压缩
TurboQuant 的压缩并不暴力,而是一条精心设计的流水线。整体可以概括为下面 5 步:
bf16 KV │ ├─ 1. 随机正交旋转 ── 把信息摊到各维度 [rotation.py](https://link.gitcode.com/i/074bbd30f87806693330f87bd1861b15) ├─ 2. Lloyd-Max 最优量化 ── Beta 分布最优码本 [codebook.py](https://link.gitcode.com/i/3601eb73e42e103fb85b2247f965946d) ├─ 3. QJL 残差符号位 ── 每个维度 1 bit [quantizer.py](https://link.gitcode.com/i/4c8588b14b4f4737417a5eba470e7c88) ├─ 4. Value 分组量化 ── 2/4-bit + 组内缩放 [kv_cache.py](https://link.gitcode.com/i/4435b082f40880d9a81d32ec8251a458) └─ 5. 位打包 ── 4 值/字节(2-bit) │ 3-bit Key + 2-bit Value 的紧凑张量- Key 走"无偏内积估计":旋转后用 Lloyd-Max 码本量化,再用 QJL 投影补残差符号位,最终保证
E[估计内积] = 真实内积(见 TurboQuantProd)。 - Value 走"分组量化":按 32 个一组做对称量化,支持 2-bit 或 4-bit。
- 位打包:4 个 2-bit 值塞进 1 字节,进一步压体积。
预生成的码本文件放在 codebooks/ 目录(如 codebook_d128_b3.json),按维度 64/128/576、位宽 1~4 分好,开箱即用。
三、4 种运行模式怎么选
TurboQuant 的灵活性来自 integration/vllm.py 中定义的 4 种模式,用set_mode()随时切换:
| 模式 | 行为 | 典型用途 |
|---|---|---|
🚫off | 不做任何 TQ 活动,完全透传 | 关闭 / 回退到原生 vLLM |
📥capture_only | 把 KV 捕获进压缩存储,但始终用 flash 输出 | 安全验证、采集数据、调 bug |
⚡hybrid | 用压缩历史 + 精确最近 buffer参与 decode | 生产环境省显存的主力模式 |
🚧full_tq | 规划中:TQ 接管 prefill 在内的全流程 | 未来完全无 paged cache 方案 |
怎么选?新手建议:先用capture_only确认钩子装对了、精度没崩,再切到hybrid享受省显存的红利。off是"后悔药",full_tq先观望。
📌 旧版 vllm_attn_backend.py 还提供
shadow/accumulate/active三个别名,分别映射到capture_only(前两者)和hybrid(active),方便老脚本平滑迁移。
四、一键安装 TurboQuant
先克隆仓库并本地安装(vLLM 与 Triton 为可选依赖):
git clone https://gitcode.com/gh_mirrors/tu/turboquant cd turboquant pip install -e ".[vllm,triton]"⚙️ 环境参考(见 setup.py 与 README):vLLM 0.18.0、PyTorch 2.10、CUDA 12.8、Python 3.12+。仅
pip install -e .也能跑核心量化与论文验证,接入 vLLM 时才需要[vllm]附加包。
五、Monkey-Patch 注入 vLLM 的完整流程
这是整篇指南的核心。整个注入其实只调了两个函数:装钩子+释放显存。
5.1 第一步:安装钩子(install_hooks)
拿到 vLLM 的model_runner后,调用 install_hooks 即可。它会自动遍历每个注意力层,识别flash或MLA后端,并替换关键方法:
from turboquant.vllm_attn_backend import ( install_turboquant_hooks, MODE_ACTIVE, free_kv_cache ) # 在 vLLM 引擎初始化、拿到 model_runner 之后执行 hooks = install_turboquant_hooks( model_runner, key_bits=3, value_bits=2, buffer_size=128, # 精确最近 buffer(ring buffer)容量 mode=MODE_ACTIVE, # 等价于 hybrid ) print(f"已为 {hooks} 个注意力层装上 TurboQuant 钩子")它具体做了三件"猴子补丁":
- 拦截 KV 写入:
do_kv_cache_update被包一层,prefill 走批量捕获、decode 单 token 进 ring buffer(KVCaptureEngine)。 - 拦截 forward:
forward被替换,在hybrid模式下用压缩历史 + 精确 recent buffer 计算注意力(compute_hybrid_attention)。 - 自动识别后端:
flash层全量支持,MLA/GDN层只记录日志、暂不压缩。
5.2 第二步:释放 paged KV 缓存(free_kv_cache)
钩子装好后,vLLM 原本预分配的 paged KV cache 就不再需要了。调用 free_kv_cache 把这些张量换成极小张量并torch.cuda.empty_cache(),把显存真正还回去:
freed_bytes = free_kv_cache(model_runner) # 返回释放的字节数🧠 注意:
free_kv_cache只释放被 TQ 钩子接管的flash层;MLA / linear-attention 层保留原缓存。这就是 proof.py 里"释放 30 GB"数字的来源。
5.3 运行时随时切换模式
模式是全局的,随时可切,便于线上灰度:
from turboquant.integration.vllm import set_mode set_mode("capture_only") # 先只采集、不动输出 set_mode("hybrid") # 确认后启用省显存 set_mode("off") # 一键回退原生 vLLM🏭 生产提示:多 GPU / 多进程场景下,建议用 enable_no_alloc 在创建
vllm.LLM()之前调用,它会自动 patch Executor,在引擎初始化时就把钩子装进每个 worker,避免手动collective_rpc。
六、实测收益:显存与容量能省多少
以下数据来自 README 与 benchmark.py 的真实压测:
| 场景 | 关键指标 | 收益 |
|---|---|---|
| RTX 5090· Qwen3.5-27B | 释放 KV 显存 | 30.0 GB |
| 同上 | 最大 token 容量 | 457,072 →914,144(2.0×) |
| 同上 | Prefill / Decode 吞吐 | +5.7% / +3.1% |
| 8×RTX 3090· Qwen3.5 MoE | 每卡 KV 节省 | 30.9% |
| 同上 | 上下文容量 | 1.45× |
⚖️ 量化精度实测(head_dim=256):3-bit Key 的 cos_sim ≈1.000000(近无损);2-bit Value 为0.940(质量瓶颈),对质量敏感的负载建议改用 4-bit Value(cos_sim0.997)。
七、注意事项与局限
诚实声明几个边界,避免踩坑:
- Prefill 仍用 paged cache:KV 在引擎初始化时分配并在 prefill 使用,TQ 之后才释放;真正的零分配需要更深的 vLLM 集成。
- 只压 full-attention 层:linear-attention / Mamba 混合层不可压缩,MoE 模型整体收益因此打折。
- Value 是质量瓶颈:2-bit Value 造成 cos_sim=0.94 的退化;追求质量请用 4-bit。
- Hybrid decode 会反量化全历史:计算路径会把压缩 token 展开回 float32,省的是存储、不一定省算力(融合 Triton 内核见 triton_kernels.py,hybrid 路径暂未启用)。
八、核心模块速查
| 文件 | 职责 |
|---|---|
| integration/vllm.py | vLLM 适配器:4 模式、install_hooks、free_kv_cache |
| vllm_attn_backend.py | 兼容 shim +enable_no_alloc自动注入 |
| capture.py | 写路径:ring buffer + 批量捕获引擎 |
| store.py | 压缩 KV 存储(懒扁平化) |
| score.py | 读路径:压缩历史 + 精确 buffer 的混合注意力 |
| quantizer.py | 算法 1/2 量化器 + 无偏内积估计 |
| codebook.py | Lloyd-Max 最优码本 |
| rotation.py | 随机正交旋转 + QJL 矩阵 |
| triton_kernels.py | 3 个融合 Triton decode 注意力内核 |
| proof.py / benchmark.py | A/B 基准与综合压测脚本 |
✅ 想先跑通论文验证(无需 GPU),可直接
python validate_paper.py;接入 vLLM 前务必先以capture_only模式观察日志,确认[TurboQuant] Hooks on N layers出现后再切hybrid。
TurboQuant 把"压缩 KV Cache"这件听起来要重构引擎的难事,收敛成了两次函数调用——装上钩子、释放显存。4 种模式给了你从"只观察"到"全接管"的完整梯度,让你在不动 vLLM 源码的前提下,稳稳拿到近半显存和翻倍的上下文容量。
【免费下载链接】turboquant
TurboQuant: Near-optimal KV cache quantization for LLM inference (3-bit keys, 2-bit values) with Triton kernels + vLLM integration
相关推荐
Liger-Kernel 与 Megatron-Core 集成实战:Monkey-Patch 与手写 Spec 两种接入模式详解
Liger Kernel 与 Megatron Core 集成实战:Monkey Patch 与手写 Spec 两种接入模式详解 Liger Kernel 为
大模型模型优化深度学习vllm-ascend 量化适配指南:ModelSlim 量化算法与量化模型的接入全流程
vllm ascend 量化适配指南:ModelSlim 量化算法与量化模型的接入全流程 本文围绕 vllm ascend 仓库中 quantization.m
人工智能大模型模型推理服务AscendCANN终极AutoAWQ指南:如何快速实现大模型4位量化优化提升2倍推理速度
终极AutoAWQ指南:如何快速实现大模型4位量化优化提升2倍推理速度 AutoAWQ是一款实现AWQ算法的高效工具,专为大模型4位量化设计,能够在推理过程中实
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考