<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Quantization on Hypho - AI Agent 技术博客</title><link>https://blog.hypho.cn/tags/quantization/</link><description>Recent content in Quantization on Hypho - AI Agent 技术博客</description><image><title>Hypho - AI Agent 技术博客</title><url>https://blog.hypho.cn/papermod-cover.png</url><link>https://blog.hypho.cn/papermod-cover.png</link></image><generator>Hugo -- 0.148.2</generator><language>zh-cn</language><lastBuildDate>Fri, 05 Jun 2026 10:04:37 +0800</lastBuildDate><atom:link href="https://blog.hypho.cn/tags/quantization/index.xml" rel="self" type="application/rss+xml"/><item><title>KV-cache 量化终于能跑生产了？KVarN 用方差归一化打破 vLLM 的吞吐量魔咒</title><link>https://blog.hypho.cn/posts/kvarn-vllm-kv-cache-quantization-production/</link><pubDate>Fri, 05 Jun 2026 10:04:37 +0800</pubDate><guid>https://blog.hypho.cn/posts/kvarn-vllm-kv-cache-quantization-production/</guid><description>vLLM 官方基准显示 TurboQuant 等 KV-cache 量化方案普遍损失 40-52% 吞吐量，华为 KVarN 通过 Hadamard 旋转和方差归一化实现了 FP16 级精度、FP16 级吞吐和 3-5 倍缓存容量三者兼得。本文解析 KVarN 的工程原理、与 TurboQuant/FP8 的实测对比，以及在 vLLM 生产环境中一行配置启用的实践路径。</description><content:encoded><![CDATA[<ul>
<li><a href="https://blog.hypho.cn/posts/ai-chip-memory-wall-hbm-cost/">AI 芯片为什么越来越像内存生意？从 HBM 成本看 LLM 推理的真正瓶颈</a></li>
<li><a href="https://blog.hypho.cn/posts/gemma-4-multi-token-prediction-inference/">Gemma 4 的多 token 预测：LLM 推理加速不该只盯着量化</a></li>
</ul>
<h2 id="kv-cache-量化为什么一直不敢开">KV-cache 量化为什么一直&quot;不敢开&quot;</h2>
<p>做过 vLLM 生产部署的人大概都纠结过一个问题：context 越来越长，KV-cache 吃掉的 GPU 显存越来越多，但官方文档里那个 <code>--kv-cache-dtype</code> 参数，你真的敢在生产环境打开吗？</p>
<p>vLLM 团队今年 5 月发了一篇 TurboQuant 的系统性基准测试<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>，结论相当诚实：除了 FP8 之外，所有 KV-cache 量化方案都在&quot;拿吞吐量换容量&quot;。具体来说：</p>
<ul>
<li><strong>TurboQuant 4bit-nc</strong>：最高 3.4 倍 KV-cache 容量，但吞吐量损失 40-52%，延迟增加最高 60%</li>
<li><strong>TurboQuant 3bit-nc</strong>：精度大幅下降，推理和长上下文任务表现尤其差</li>
<li><strong>FP8</strong>：2 倍容量，吞吐量基本无损，但容量增幅有限</li>
</ul>
<p>说白了就是：你要么选 FP8（安全但只翻倍），要么选更激进的量化（容量大但吞吐暴跌）。在推理密集型场景——比如长上下文 Agent、代码生成、数学推理——吞吐量下降意味着请求排队变长、用户等待变久，这在生产环境是不可接受的。</p>
<p>所以 vLLM 官方的建议一直是：<strong>默认用 BF16，显存不够就用 FP8，其他量化方案慎用。</strong></p>
<p>这就是 KVarN 想解决的问题。</p>
<h2 id="kvarn-是什么华为的-kv-cache-量化新方案">KVarN 是什么：华为的 KV-cache 量化新方案</h2>
<p>KVarN（读作 /kvɑːɳ/，瑞典语&quot;研磨机&quot;的意思）来自华为通讯系统实验室（Huawei CSL），论文在 arXiv 上<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>，代码以 Apache 2.0 开源在 GitHub<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>，目前 196 星，最新提交就在今天。</p>
<p>它的核心卖点用一句话概括：<strong>FP16 级精度、FP16 级吞吐、3-5 倍 KV-cache 容量，不需要校准数据。</strong></p>
<p>在 Qwen3-32B 的 AIME25 基准测试中（16K context，TP=2），KVarN 的精度和吞吐量都<strong>匹配甚至超过 FP16</strong>，同时提供约 4 倍的 KV-cache 容量。这在之前的量化方案中从未同时实现过。</p>
<h2 id="它怎么做到的四步流水线">它怎么做到的：四步流水线</h2>
<p>KVarN 的量化流程分四个阶段，每一步都有明确的工程目的：</p>
<p><strong>第一步：Cache</strong> — 原始 FP16 KV-cache 瓦片（channels × tokens），直接来自注意力计算。</p>
<p><strong>第二步：Hadamard 旋转</strong> — 沿通道维度做 Hadamard 变换。这一步的直觉是：原始 KV-cache 中某些通道有极端值（outlier），直接量化会丢失大量信息。Hadamard 旋转是正交变换，不改变注意力分数，但会把极端值&quot;摊开&quot;到所有通道，让量化更容易。</p>
<p><strong>第三步：方差归一化</strong> — 交替沿行和列做标准差归一化（类似 Sinkhorn 迭代），在对数空间中操作。这一步让瓦片内部的方差均匀分布，进一步减少量化误差。</p>
<p><strong>第四步：非对称舍入量化</strong> — 在低比特宽度下做 round-to-nearest，读取时还原 scale。关键设计是<strong>给 key 分配更多比特，给 value 分配更少</strong>（默认配置 <code>kvarn_k4v2_g128</code>：key 4-bit，value 2-bit）。</p>
<p>用人话说就是：先把数据&quot;打散&quot;（旋转），再&quot;抹平&quot;（归一化），最后才&quot;压缩&quot;（量化）。传统量化方法直接在原始数据上压，极端值会让误差爆炸；KVarN 的前两步就是在为量化创造更好的条件。</p>
<h2 id="论文的核心发现推理场景的误差累积">论文的核心发现：推理场景的误差累积</h2>
<p>论文<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>指出了一个之前被忽视的问题：<strong>现有的 KV-cache 量化方法主要在 prefill 类场景中评测，但推理（autoregressive decoding）场景下，量化误差会跨时间步累积。</strong></p>
<p>具体来说，在长序列生成过程中，每一步解码都会读取之前所有 token 的 KV-cache。如果某个 token 的 scale 估错了，这个误差会随着解码的推进不断放大。论文发现，驱动误差累积的主要因素是<strong>不正确的 token scale</strong>。</p>
<p>KVarN 的方差归一化正是针对这个问题：通过对 KV 矩阵的行和列做联合归一化，直接消除不均匀的 token scale，从而大幅减少误差累积。</p>
<p>在 MATH500、AIME24 和 HumanEval 等生成式基准上，KVarN 在 2-bit 精度下达到了新的 state-of-the-art。</p>
<h2 id="与-turboquant-和-fp8-的实测对比">与 TurboQuant 和 FP8 的实测对比</h2>
<p>根据 KVarN 的 README<sup id="fnref1:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> 和 vLLM TurboQuant 博客<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>的数据：</p>
<table>
  <thead>
      <tr>
          <th>方案</th>
          <th>容量倍数</th>
          <th>吞吐量（相对 FP16）</th>
          <th>精度</th>
          <th>校准需求</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>FP8</td>
          <td>2×</td>
          <td>≈100%</td>
          <td>接近 FP16</td>
          <td>无</td>
      </tr>
      <tr>
          <td>TurboQuant 4bit-nc</td>
          <td>2.3-3.7×</td>
          <td>48-60%</td>
          <td>降 1-4 分</td>
          <td>无</td>
      </tr>
      <tr>
          <td>TurboQuant 3bit-nc</td>
          <td>3-5×</td>
          <td>更低</td>
          <td>明显下降</td>
          <td>无</td>
      </tr>
      <tr>
          <td><strong>KVarN k4v2_g128</strong></td>
          <td><strong>3-5×</strong></td>
          <td><strong>≥100%</strong></td>
          <td><strong>匹配 FP16</strong></td>
          <td><strong>无</strong></td>
      </tr>
  </tbody>
</table>
<p>KVarN 的 Pareto 前沿占据了 TurboQuant 和 FP8 都够不到的位置：<strong>右上角</strong>——既比 FP8 容量大，又比 TurboQuant 吞吐高，精度还不打折。</p>
<p>vLLM 官方 TurboQuant 博客的结论是&quot;FP8 是目前最安全的默认选择&quot;。但如果 KVarN 的数据经得起更广泛验证，这个结论可能需要更新。</p>
<h2 id="工程实践一行配置启用">工程实践：一行配置启用</h2>
<p>KVarN 的部署极其简单——它是 vLLM v0.22.0 的 fork，安装方式和 vLLM 一样：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://github.com/huawei-csl/KVarN.git
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> KVarN
</span></span><span class="line"><span class="cl"><span class="nv">VLLM_USE_PRECOMPILED</span><span class="o">=</span><span class="m">1</span> pip install -e .
</span></span></code></pre></div><p>使用时只需要加一个参数：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">vllm</span> <span class="kn">import</span> <span class="n">LLM</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">llm</span> <span class="o">=</span> <span class="n">LLM</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span><span class="o">=</span><span class="s2">&#34;Qwen/Qwen3-32B&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">dtype</span><span class="o">=</span><span class="s2">&#34;float16&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">kv_cache_dtype</span><span class="o">=</span><span class="s2">&#34;kvarn_k4v2_g128&#34;</span><span class="p">,</span>  <span class="c1"># ← 就这一行</span>
</span></span><span class="line"><span class="cl">    <span class="n">block_size</span><span class="o">=</span><span class="mi">128</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>Serving 模式同理：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">vllm serve Qwen/Qwen3-32B --dtype float16 --kv-cache-dtype kvarn_k4v2_g128 --block-size <span class="m">128</span>
</span></span></code></pre></div><p>没有模型改动，没有校准数据集，没有额外配置。KVarN 的 kernel 是 Triton 实现的，运行时 JIT 编译。</p>
<p>有一个需要注意的点：在单卡显存紧张的情况下，vLLM 的 CUDA graph 内存分析器可能会过度预留显存，导致 KV-cache 池缩小。可以通过设置 <code>VLLM_MEMORY_PROFILER_ESTIMATE_CUDAGRAPHS=0</code> 或提高 <code>--gpu-memory-utilization</code> 来恢复完整容量。</p>
<h2 id="需要关注的几个问题">需要关注的几个问题</h2>
<p><strong>1. 为什么是 fork 而不是 PR？</strong></p>
<p>HN 评论区<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>第一条就问了这个问题。KVarN 选择 fork vLLM 而不是提交 PR 到上游，可能是因为它的 kernel 实现需要修改 vLLM 的注意力后端接口。短期内 fork 意味着你需要自己同步 vLLM 的更新，长期能否合并回上游还有待观察。</p>
<p><strong>2. 196 星，能用在生产吗？</strong></p>
<p>项目很新（论文和代码都是 2026 年 6 月），社区验证还在早期阶段。如果你的场景对精度极其敏感（比如金融计算），建议先在测试环境跑自己的基准。但如果你只是想在有限显存下跑更长的 context——比如 32K 甚至 128K 的 Agent 场景——KVarN 的风险收益比相当不错。</p>
<p><strong>3. 目前只支持 128 的 block size</strong></p>
<p>README 说其他 page size &ldquo;coming soon&rdquo;。在那之前，你需要确保 <code>block_size=128</code> 与你的工作负载兼容。</p>
<p><strong>4. 对硬件的要求</strong></p>
<p>KVarN 的 kernel 基于 Triton，理论上支持所有能跑 vLLM 的 GPU。但实际性能可能因硬件而异，A100/H100 上的表现和消费级卡上可能不同。</p>
<h2 id="我的判断">我的判断</h2>
<p>KV-cache 量化是 LLM 推理优化中被低估的一个方向。大家的注意力大多在模型量化（GPTQ、AWQ）、投机解码、架构创新上，但对长上下文场景来说，KV-cache 才是真正的显存瓶颈。</p>
<p>KVarN 的工程价值在于它<strong>打破了&quot;容量 vs 吞吐&quot;的二选一困境</strong>，而且实现方式极其轻量——不需要校准数据，不需要改模型，一行配置搞定。如果后续社区验证它在更多模型和场景上的一致性，它很可能成为 vLLM 长上下文部署的标配。</p>
<p>对于正在用 vLLM 做生产部署的团队，我的建议是：</p>
<ol>
<li><strong>短上下文、显存充裕</strong>：继续用 BF16，不用折腾</li>
<li><strong>中等上下文、显存紧张</strong>：FP8 是安全选择，2 倍容量，无损吞吐</li>
<li><strong>长上下文 Agent / 推理密集型</strong>：关注 KVarN，它可能给你 4 倍容量的同时不牺牲吞吐</li>
<li><strong>想尝鲜</strong>：在测试环境部署 KVarN，跑你自己的业务 benchmark，对比 FP16 和 FP8</li>
</ol>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://vllm.ai/blog/2026-05-11-turboquant">A First Comprehensive Study of TurboQuant: Accuracy and Performance | vLLM Blog</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://arxiv.org/abs/2606.03458">KVarN: Variance-Normalized KV-Cache Quantization Mitigates Error Accumulation in Reasoning Tasks (arXiv:2606.03458)</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://github.com/huawei-csl/KVarN">huawei-csl/KVarN — GitHub</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://news.ycombinator.com/item?id=48399974">HN Discussion: KVarN — 114 points</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item></channel></rss>