<?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>Kv-Cache on Wilson Wu</title><link>https://wilsonwu.me/zh/tags/kv-cache/</link><description>Recent content in Kv-Cache on Wilson Wu</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 18 Nov 2025 00:00:00 -0500</lastBuildDate><atom:link href="https://wilsonwu.me/zh/tags/kv-cache/index.xml" rel="self" type="application/rss+xml"/><item><title>玩转大语言模型：深入理解 KV-Cache - 大模型推理的核心加速技术</title><link>https://wilsonwu.me/zh/blog/2025/kv-cache-in-llm/</link><pubDate>Tue, 18 Nov 2025 00:00:00 -0500</pubDate><guid>https://wilsonwu.me/zh/blog/2025/kv-cache-in-llm/</guid><description>&lt;p&gt;随着大语言模型（LLM）规模不断增长，推理成本也随之飙升。为了让模型在响应用户请求时更快、更经济地运行，各类优化技术不断涌现。其中，&lt;strong&gt;KV-Cache（Key-Value Cache）&lt;/strong&gt;是目前最关键、影响最深远的推理加速机制之一，被所有主流的推理框架（如 vLLM、TensorRT-LLM、LLama.cpp、llm-d、OpenAI Triton Transformer Engine 等）广泛使用。&lt;/p&gt;</description><content:encoded><![CDATA[<p>随着大语言模型（LLM）规模不断增长，推理成本也随之飙升。为了让模型在响应用户请求时更快、更经济地运行，各类优化技术不断涌现。其中，<strong>KV-Cache（Key-Value Cache）</strong>是目前最关键、影响最深远的推理加速机制之一，被所有主流的推理框架（如 vLLM、TensorRT-LLM、LLama.cpp、llm-d、OpenAI Triton Transformer Engine 等）广泛使用。</p>
<p>这篇文章将全面介绍什么是 KV-Cache、它如何工作、为什么它能极大提升推理效率、它对行业带来了什么影响，以及在实际使用中的最佳实践。</p>
<h2 id="kv-cache-是什么">KV-Cache 是什么？</h2>
<p>首先，其工作原理架构图如下：</p>
<p><img alt="架构图" loading="lazy" src="/zh/blog/2025/kv-cache-in-llm/1-architecture.png"></p>
<p>理解起来非常简单，单其中细节结合复杂度计算还是略有抽象。</p>
<p>KV-Cache，全称 <strong>Key-Value Cache</strong>，是在 LLM 推理过程中对 Transformer 解码器中<strong>自注意力层（Self-Attention）</strong>的中间结果进行缓存的一种方法。</p>
<p>Transformer 的自回归生成方式决定了：
<strong>每生成一个新 token，就需要重新计算它与全部历史 token 的注意力关系</strong>。</p>
<p>如果每次都把过去所有 token 的 Key 和 Value 重新计算一遍，其计算量是：</p>

<blockquote>
  <p>推理时间复杂度：O(n²)
（n 为上下文长度）</p>

</blockquote>
<p>为了避免重复计算，KV-Cache 会在每步生成 token 时，将计算后的 <strong>Key（K）</strong> 和 <strong>Value（V）</strong> 保存下来，这样之后再生成下一步 token 时就能直接引用过去的 Key/Value，而无需重新计算历史部分。</p>
<p>这让时间复杂度大幅下降为：</p>

<blockquote>
  <p>推理时间复杂度：O(n)</p>

</blockquote>
<p>所以简单总结一下，KV-Cache 是在自回归解码中缓存历史 token 的 Key/Value，让后续生成直接复用过去的注意力结果，从而把时间复杂度从 O(n²) 降到 O(n)，节省的成本非常巨大。</p>
<h2 id="kv-cache-是如何工作的">KV-Cache 是如何工作的？</h2>
<p>以当前主流的解码流程为例，我们以是否使用 KV-Cache 来做一个简单的对比。</p>
<h3 id="如果没有-kv-cache">如果没有 KV-Cache</h3>
<p>每次生成新 token 时需要做：</p>
<ol>
<li>重新对全部历史序列做 embedding</li>
<li>通过所有 Transformer 层重新计算 K/V</li>
<li>根据新 token 与整个序列做自注意力</li>
<li>得到新 token 并输出</li>
</ol>
<p>具体流程图示如下：</p>
<p><img alt="不使用 KV-Cache" loading="lazy" src="/zh/blog/2025/kv-cache-in-llm/2-without-kv-cache.png"></p>
<h3 id="使用-kv-cache">使用 KV-Cache</h3>
<p>第一次推理（prefill 阶段）：</p>
<ol>
<li>对所有提示词（prompt tokens）进行计算</li>
<li>计算所有 K/V，并将它们保存在 KV 缓存中</li>
</ol>
<p>之后的每一步（decode 阶段）：</p>
<ol>
<li>只计算当前新 token 的 K/V</li>
<li>与缓存中的 K/V 做注意力，得到结果</li>
<li>写回缓存</li>
</ol>
<p>这样，每生成一个 token 的计算量从<strong>全序列规模 → 近似常数开销</strong>，越长的上下文收益越大。</p>
<p>其流程图示如下：</p>
<p><img alt="使用 KV-Cache" loading="lazy" src="/zh/blog/2025/kv-cache-in-llm/3-with-kv-cache.png"></p>
<h2 id="kv-cache-带来了什么影响">KV-Cache 带来了什么影响？</h2>
<h3 id="推理速度提升数十倍">推理速度提升数十倍</h3>
<p>对长上下文模型（8k / 32k / 128k tokens）尤其明显。</p>
<p>例如对 32k token 的上下文，如果没有 KV-Cache：</p>
<ul>
<li>每生成一个 token 需要遍历 32k 历史序列</li>
<li>整体是 <em>重复 32k 次的巨量工作</em></li>
</ul>
<p>有了 KV-Cache：</p>
<ul>
<li>历史部分只算一次</li>
<li>单步 decode 的开销变成固定量（几百维 KV 与注意力点积）</li>
</ul>
<p>通常加速比可达到：</p>

<blockquote>
  <p>10 倍至 100 倍不等
（取决于提示词长度、模型大小、硬件）</p>

</blockquote>
<h3 id="推理成本大幅降低">推理成本大幅降低</h3>
<p>大模型推理的成本主要由这几个部分构成：</p>
<ul>
<li><strong>算力</strong>（矩阵乘法）</li>
<li><strong>显存占用</strong></li>
<li><strong>带宽</strong></li>
</ul>
<p>KV-Cache 能大幅降低重复算力，因此成本成比例下降。</p>
<p>这就是为什么：</p>
<ul>
<li>OpenAI、Anthropic、Meta、Mistral</li>
<li>各大云推理服务</li>
<li>所有开源推理框架</li>
</ul>
<p>都把 KV-Cache 作为默认推理方式。</p>
<h3 id="但是显存占用会变高">但是显存占用会变高</h3>
<p>KV 是每一层每个 token 的结果，因此缓存本身需要<strong>巨大的显存</strong>。</p>
<p>例如：
Llama-3 70B 模型，64K context，对 1 token 的 KV 占用约 1.5KB。</p>
<p>那么 64K token 就是：<strong>约 96MB × 80 层 ≈ 7.6GB 的 KV-cache</strong></p>
<p>当你看到推理卡 80GB 显存不够时，很大概率是因为 KV 满了，而不是模型权重太大。</p>
<h3 id="影响了模型的架构设计与行业走向">影响了模型的架构设计与行业走向</h3>
<p>KV-Cache 的重要性高到：<strong>模型架构都围绕它做优化。</strong></p>
<p>包括：</p>
<ul>
<li>Mistral 的<strong>滑动窗口注意力（SWA）</strong></li>
<li>Meta 的 <strong>Grouped Query Attention（GQA）</strong></li>
<li>DeepSeek 的 <strong>Multi-head Latent Attention（MLA）</strong></li>
<li>Google 的 <strong>Multi-Query Attention（MQA）</strong></li>
</ul>
<p>这些技术主要目的之一就是：</p>

<blockquote>
  <p>降低 KV-Cache 的显存占用</p>

</blockquote>
<p>因为 Q 数少 → KV 也变少 → 显存压力更低。</p>
<p>所以 <strong>KV-Cache 不只是一个技术点，而是影响模型架构的重要因素</strong>。</p>
<h2 id="kv-cache-的性能关键因素">KV-Cache 的性能关键因素</h2>
<h3 id="不同-attention-架构带来的-kv-大小差异">不同 Attention 架构带来的 KV 大小差异</h3>
<table>
	<thead>
			<tr>
					<th>Attention 类型</th>
					<th>KV 大小</th>
					<th>优点</th>
					<th>缺点</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>MHA（多头注意力）</td>
					<td>最大</td>
					<td>兼容性最好</td>
					<td>显存占用高</td>
			</tr>
			<tr>
					<td>MQA（多查询注意力）</td>
					<td>小很多</td>
					<td>更高效</td>
					<td>灵活性略差</td>
			</tr>
			<tr>
					<td>GQA（分组注意力）</td>
					<td>居中</td>
					<td>性能好</td>
					<td>结构更复杂</td>
			</tr>
			<tr>
					<td>MLA</td>
					<td>更小</td>
					<td>更快</td>
					<td>模型支持有限</td>
			</tr>
	</tbody>
</table>
<h3 id="prefill-和-decode-性能壁垒不同">Prefill 和 Decode 性能壁垒不同</h3>
<ul>
<li><strong>Prefill 阶段</strong>：算 K/V 很耗算力，需要好 GPU。</li>
<li><strong>Decode 阶段</strong>：显存带宽优先，因为每步生成通常 batch 很小。</li>
</ul>
<p>这也影响推理框架的优化策略。</p>
<h3 id="kv-cache-的布局与管理">KV-Cache 的布局与管理</h3>
<p>例如：</p>
<ul>
<li><strong>PagedAttention</strong>（vLLM 的核心技术）</li>
<li><strong>Block-sparse KV 管理</strong>（TensorRT-LLM）</li>
<li><strong>动态缓存分配</strong>（llama.cpp）</li>
<li><strong>连续 vs 分块 KV 内存</strong></li>
</ul>
<p>优秀的分配策略可以极大减少 fragmentation 和显存浪费。</p>
<h2 id="kv-cache-的最佳实践">KV-Cache 的最佳实践</h2>
<h3 id="尽量减少上下文长度">尽量减少上下文长度</h3>
<p>上下文越长 → KV 越大 → 推理越慢、越贵。</p>
<p>如果业务允许：</p>
<ul>
<li>使用 <strong>RAG</strong> 把长文档拆分</li>
<li>使用<strong>压缩模型（compressor）</strong></li>
<li>使用<strong>短指令模板</strong></li>
<li>引导模型减少“废话”输出</li>
</ul>
<h3 id="选择合适的-attention-架构">选择合适的 Attention 架构</h3>
<p>如果你在自定义模型、微调或部署模型：</p>
<ul>
<li>需要高效推理 → 优选 <strong>MQA / GQA / MLA</strong></li>
<li>需要兼容许多任务 → MHA 仍然最稳定</li>
</ul>
<h3 id="使用专业推理框架">使用专业推理框架</h3>
<p>优先使用：</p>
<ul>
<li><strong>vLLM（商业与开源界第一推理框架）</strong></li>
<li><strong>TensorRT-LLM（NVIDIA 官方）</strong></li>
<li><strong>llm-d（中小型企业的极高性价比框架）</strong></li>
<li><strong>OpenAI Triton 引擎（内部使用）</strong></li>
</ul>
<p>它们都在 KV-Cache 管理上有深度优化。</p>
<h3 id="多卡推理时注意-kv-分布问题">多卡推理时注意 KV 分布问题</h3>
<p>KV 会引发：</p>
<ul>
<li><strong>多卡同步开销</strong></li>
<li><strong>all-reduce 带宽瓶颈</strong></li>
</ul>
<p>部分框架提供：</p>
<ul>
<li>KV sharding</li>
<li>pipeline parallelism</li>
<li>block-sparse KV sharing</li>
</ul>
<p>合理设置可显著提升吞吐量。</p>
<h3 id="批处理策略影响巨大">批处理策略影响巨大</h3>
<p>适配 KV-Cache 的批处理策略包括：</p>
<ul>
<li>continuous batching</li>
<li>block scheduling</li>
<li>prompt+decode 混合 batch</li>
</ul>
<p>正确 batching 通常带来 <strong>&gt;10× 吞吐提升</strong>。</p>
<h2 id="kv-cache-的未来展望">KV-Cache 的未来展望</h2>
<p>未来几年，模型推理的发展趋势中，KV-Cache 会继续是核心机制。</p>
<p>我们将看到：</p>
<ul>
<li>更轻量的 KV 结构（更少头、更小维度）</li>
<li>更智能的 KV 重用机制</li>
<li>KV 的跨请求共享（multi-query serving）</li>
<li>部分 KV 的 CPU/NVMe offload</li>
<li>Push-down Attention（降低 GPU 带宽要求）</li>
</ul>
<p>总之，KV-Cache 将继续驱动推理性能提升，是 LLM 推理领域最重要的基础设施之一。</p>
<h2 id="总结">总结</h2>
<p>KV-Cache 并不是一个“可选优化”，而是现代大语言模型推理的 <strong>核心基石</strong>。
它带来巨大的速度提升，但也带来显存压力，影响模型架构、推理框架设计乃至行业整个技术路线。</p>
<p>理解 KV-Cache，你就理解了：</p>
<ul>
<li>为什么推理这么贵</li>
<li>为什么上下文越长模型越慢</li>
<li>为什么新一代模型都在改注意力结构</li>
<li>为什么推理框架竞争如此激烈</li>
</ul>
]]></content:encoded></item></channel></rss>