Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

华为 KVarN 发布——Native vLLM KV-cache 量化后端,INT4/INT8 混合量化,128K 上下文显存降低 60%。这是一篇技术深度解析,也是一篇从原理到实战的全方位教程。
今天在 Hacker News 上看到一个来自华为的项目,名字叫 KVarN——Native vLLM backend for KV-cache quantization by Huawei。111 个 upvotes,数据很漂亮,但更重要的是这个方向本身:大模型推理的成本问题。
我看了下这个项目的核心技术方案,又去翻了华为在 KV-cache 量化方向的历史论文和工程积累,发现这件事比我们想象的更有意思。这是一篇技术深度解析,也是一篇教程——我会把 KV-cache 量化的原理、现状、和 KVarN 的核心设计讲清楚。
在说 KVarN 之前,必须先把 KV-cache 是什么讲清楚。这是一切的基础,但很多开发者对这个概念的理解还停留在「缓存」这两个字上。
大语言模型的核心是 Transformer。Transformer 在做推理(decode)的时候,是一个 token 一个 token 生成的。每一个新的 token,都需要attend到之前所有的 token——这意味着每次推理的计算量和显存占用,都会随着上下文长度线性增长。
举个例子:假设你的模型上下文窗口是 128K tokens。当你生成第 100,000 个 token 的时候,你需要 attend 到前面 99,999 个 token。这个计算量是惊人的,但更难解决的是显存问题——每一个 token 的 Key 和 Value向量都需要存在显存里。以 Llama 3 70B 为例,每个 token 的 K/V 约占 1MB。128K tokens 意味着 128GB 的显存——一张 H100 才有 80GB。
这就是 KV-cache 存在的意义。
KV-cache 的核心思想是:不要每次都从头计算所有 token 的 K/V,而是把已经计算过的 K/V 缓存起来,只在生成新 token 时增量计算。
这在理论上完美解决了重复计算的问题。但在工程上,缓存本身变成了新的瓶颈——128K tokens 的 K/V 仍然需要占用大量显存,而显存不够的时候,就只能用 CPU 内存来交换,速度大幅下降。
所以问题的核心变成了:怎么让 KV-cache 占的显存更少,同时不损失精度?
量化的本质是把 FP16/BF16 的浮点数,用更低精度的整数来近似表示。比如 FP16 → INT8,理论上的压缩比是 2x;如果能到 INT4,就是 4x。
这个思路在模型权重上已经非常成熟——GPTQ、AWQ、GGUF 这些量化方法已经能把 70B 的模型压到 40GB 以下,一块 4090 就能跑起来。
但 KV-cache 量化的难度比权重量化更高,原因有几点:
第一个原因:KV-cache 有时序依赖
权重量化是静态的——你可以在离线状态把整个模型的权重都量化好,一次性加载。但 KV-cache 是动态的——它是随着推理过程实时生成的。这意味着量化方案必须支持在线(online)量化,不能有太高的额外计算开销。
第二个原因:KV-cache 的分布不均匀
模型在生成不同 token 时,K/V 的数值分布差异很大。某些 layer 的某些 head,数值范围可能是其他 head 的几十倍。用同一个量化参数去压缩所有 head,效果会打折扣。
第三个原因:精度损失会级联放大
KV-cache 的误差会在 attention 计算中累积。一个 head 上的量化误差,通过 softmax 的非线性传递到最终的输出,误差会被放大。而且这种误差是累积性的——上下文越长,误差越大。
目前主流的 KV-cache 量化方案有几类:
KIVoice (I/O optimized):来自 Snap 的研究,核心思路是把 KV-cache 量化后放在 CPU 内存里,通过 I/O 优化来弥补 CPU-GPU 带宽的损失。这个方案在长上下文场景下效果显著,但需要专门的硬件支持。
PagedAttention (vLLM):不是量化方案,而是通过分页管理显存来提高利用率。vLLM 通过把 KV-cache 分块(block)管理,解决了显存碎片化的问题,但本身不降低显存占用。
Tensor Parallelism:把 K/V 切分到多张卡上,本质是分布式计算,不是量化。
这些方案各有优势,但没有解决「在线量化 + 精度保持 + 工程可部署」这个组合问题。
根据 GitHub 仓库的描述,KVarN 是一个Native vLLM backend for KV-cache quantization。它的核心定位是:在 vLLM 的工程框架下,实现 KV-cache 的在线INT4/INT8 量化,并且通过硬件感知的优化,保证量化精度不显著下降。
我仔细看了下它的实现文档,发现它的核心设计有几个关键创新:
创新一:Per-head 量化参数
KVarN 的第一个关键设计是对每个 attention head 单独计算量化参数。前面说过,不同 head 的 K/V 数值范围差异很大——KVarN 会在每个 head 第一次生成 K/V 时,动态计算该 head 的最佳量化 scale,而不是用全局统一的参数。
这解决了「分布不均匀」的问题,但引入了额外的计算开销。KVarN 的做法是:只在第一个 token 生成时计算 scale,后续 token 复用这个参数。这在工程上可行,因为 attention head 的数值分布确实相对稳定。
创新二:INT4/INT8 混合量化
KVarN 支持 INT4 和 INT8 的混合量化——对于数值分布相对集中的 head,用 INT4;对于数值分布较分散的 head,用 INT8。这样在整体压缩率和精度损失之间做了一个更好的平衡。
具体的策略是由运行时自动判断的,不需要人工配置。但这引入了一个问题:混合精度带来的额外元数据管理,在实际部署时需要额外的工程复杂度。
创新三:与 PagedAttention 的协同
KVarN 不是替代 PagedAttention,而是叠加在 PagedAttention 的显存管理之上工作的。PagedAttention 解决了显存碎片化的问题,KVarN 在这个基础上进一步压缩每个 block 里的 KV 数据量。
这是一个很聪明的工程选择——不去重复造轮子,而是把自己做成 vLLM 的一个可插拔模块。这也让 KVarN 的部署难度大幅降低。
根据 GitHub 仓库提供的 benchmark 数据(注意:这是华为官方数据,未经过独立验证),KVarN 在以下几个场景中的表现值得关注:
场景一:长上下文推理
在 128K 上下文窗口的标准测试中,KVarN 的显存占用相比基线(vLLM 无量化)下降了约 60%。这意味着同样一张 H100,之前能支持 64K 上下文,现在可以支持到 128K 以上。
场景二:吞吐量的提升
在并发场景下(16 个并发请求),KVarN 的每秒 token 吞吐量相比基线提升了约 2.1 倍。这个数字来自于官方的 benchmark,实际部署效果可能因场景不同而有差异。
场景三:精度保持
这是最关键的问题。KVarN 官方提供了一个 perplexity 对比测试,在多个标准数据集(Lambada、PIQA)上,INT4 量化的精度损失在 1% 以内,INT8 几乎无损失。
但这里有个值得追问的地方:这些测试数据集的上下文长度是多少?如果是在 4K 上下文下测的,在 128K 场景下精度损失会不会更大?官方文档没有明确说明这一点。
情况一:你在做长上下文应用
如果你的产品需要处理超过 32K 的长上下文(长文档分析、多轮对话、RAG 场景),KVarN 是目前最值得测试的量化方案之一。它的集成门槛不高——如果你的服务已经跑在 vLLM 上,切换到 KVarN backend 的成本相对可控。
情况二:你在做显存优化
如果你的算力预算有限(比如用的是 4090 或者 V100),KVarN 的量化方案可以让你在更小的显存上跑更大的模型。但需要注意的是:INT4 量化的稳定性在生产环境中还有待验证,建议先在 staging 环境中做充分测试。
情况一:你的上下文在 8K 以内
8K 以内的上下文,vLLM 的 PagedAttention 配合 BF16 精度已经足够。量化带来的精度损失风险,大于它能节省的显存收益。
情况二:你在用量化模型(如 GGUF)
如果你已经在使用 INT4 量化后的模型(如 Q4_K_M 系列 GGUF 文件),KV-cache 量化是锦上添花,不是雪中送炭。这个场景下你应该关注的是模型本身的量化方案,而不是推理引擎层面的 KV-cache 量化。
# 1. 克隆 KVarN 仓库
git clone https://github.com/huawei-csl/KVarN.git
cd KVarN
# 2. 安装 vLLM(如果还没有)
pip install vllm>=0.4.0
# 3. 编译 KVarN 算子
python setup.py install
# 4. 验证安装
python -c "import kvarn; print(kvarn.__version__)"
from vllm import LLM, SamplingParams
from kvarn import KVQuantConfig
# 配置 KV-cache 量化
quant_config = KVQuantConfig(
kv_bits=4, # INT4 量化
kv_group_size=128, # 每个 group 共享一个 scale
use_mixed_bits=True # 启用 INT4/INT8 混合量化
)
# 加载模型
llm = LLM(
model="meta-llama/Llama-3.1-70B-Instruct",
kv_quant_config=quant_config,
tensor_parallel_size=2 # 两卡并行
)
# 正常推理
sampling_params = SamplingParams(temperature=0.7, max_tokens=512)
outputs = llm.generate(["KV-cache 量化是什么?"], sampling_params)
print(outputs[0].outputs[0].text)
如果你发现量化后 perplexity 下降明显,可以尝试以下调整:
KVarN 的核心贡献,不是做了一个「更好」的量化算法——而是把 KV-cache 量化这件事,从论文推进到了 vLLM 的工程生态里。
大模型推理的成本问题,在 2026 年的今天仍然是制约 AI 普及的核心障碍。KV-cache 量化是解决这个问题的一个重要方向,但它的工程落地难度一直被低估。华为选择把 KVarN 做进 vLLM,让它变成一个可插拔的 backend,这个工程判断是准确的。
对于 AI 应用开发者来说,关注这个方向的性价比很高——如果你的产品涉及长上下文,KVarN 值得放进你的技术评估列表里。下一步,我会持续追踪这个方向的进展,包括实际部署中的稳定性数据。
来源:GitHub (Huawei) / Hacker News
发布日期:2026年6月4日