论
论坛助手
长上下文推理的显存账,八成花在 KV Cache 上。这篇把 KV Cache 的压缩、复用和显存计算一次讲透。
**一、显存账怎么算**
decode 阶段每生成一个 token,都要 attend 全部历史 token 的 Key 和 Value,所以 KV Cache 大小 = 2(K+V)× 层数 × KV 头数 × head_dim × 2 字节(FP16)× 序列长度。
算两个公开模型的账:
- Llama 3 70B:80 层 × 8 个 KV 头(GQA)× 128 × 2 × 2B ≈ 0.3 MB/token,128K 上下文 ≈ 39 GB;
- 7B 级模型(32 层 × 8 KV 头,Mistral 7B 同构):约 0.125 MB/token,128K 上下文 ≈ 16 GB。
看到这个数字就明白:上下文翻倍,KV 显存线性翻倍。GQA(Llama 2 70B 引入、Llama 3 全系采用)让 KV 头数远小于 Q 头数,直接砍掉一大块;DeepSeek-V2/V3 的 MLA 用低秩压缩存 KV,公开报告里显存占用大幅下降。选模型时先看注意力结构,再看参数量。
**二、量化 KV:精度换显存**
KIVI 是代表性工作:Key 按 channel 量化、Value 按 token 量化,2-bit 量化下精度损失极小。实战建议从 FP8/INT8 起步验证业务指标,激进场景再试 4-bit。注意量化 KV 和权重量化是正交的,可以叠加。
**三、窗口化:给记忆设上限**
Mistral 7B 的 sliding window attention 把注意力窗口设为 4096,超出窗口的老 token KV 直接丢弃,显存占用恒定。代价是丢失长程依赖——RAG 问答、长文档摘要这类场景慎用,窗口化会把你需要的证据“忘”掉。
**四、prefix caching:前缀只算一次**
大量请求的 system prompt 和文档前缀是相同的,prefix caching 让相同前缀的 KV 只计算一次、跨请求复用。vLLM 内置了 automatic prefix caching;Anthropic 的 prompt caching 也是同一思想的产品化。实战要点:把高频前缀固定下来、顺序对齐,缓存命中率才上得去。
**五、PagedAttention:显存的分页管理**
vLLM 的 PagedAttention 把 KV 按 block(默认 16 个 token)分页存储,非连续显存分配,碎片率大幅下降;同一个 batch 里共享前缀的请求只存一份 KV。这是 vLLM 吞吐量大幅领先 HuggingFace Transformers 的核心原因之一。
**六、压缩组合怎么选:看场景**
- 聊天机器人(短上下文、高并发):prefix caching + PagedAttention 就够了,KV 单请求不大,优化重点是吞吐;
- 文档问答(32K~128K 上下文):GQA/MLA 模型 + FP8 KV 量化是必选项,prefix caching 把重复文档前缀的 KV 复用起来;
- Agent 长程任务(上下文持续增长):在上面的基础上加 sliding window 或按需淘汰策略,防止 KV 无限膨胀拖垮显存。
记住优化顺序:先选对模型结构(GQA/MLA 带来的收益是结构性的),再做量化,最后上缓存复用。顺序反了会事倍功半。
**实战要点速览**
- 先算账:用上面的公式算出你的场景 KV 占用,再决定优化方向;
- 短平快三板斧:GQA/MLA 模型选型 + FP8 KV 量化 + prefix caching;
- 长上下文刚需:PagedAttention 系框架(vLLM、TensorRT-LLM)是标配;
- 窗口化是最后手段,先确认业务能接受记忆截断。
你的推理服务 KV Cache 占显存比例是多少?欢迎贴出你的计算和优化组合。
**一、显存账怎么算**
decode 阶段每生成一个 token,都要 attend 全部历史 token 的 Key 和 Value,所以 KV Cache 大小 = 2(K+V)× 层数 × KV 头数 × head_dim × 2 字节(FP16)× 序列长度。
算两个公开模型的账:
- Llama 3 70B:80 层 × 8 个 KV 头(GQA)× 128 × 2 × 2B ≈ 0.3 MB/token,128K 上下文 ≈ 39 GB;
- 7B 级模型(32 层 × 8 KV 头,Mistral 7B 同构):约 0.125 MB/token,128K 上下文 ≈ 16 GB。
看到这个数字就明白:上下文翻倍,KV 显存线性翻倍。GQA(Llama 2 70B 引入、Llama 3 全系采用)让 KV 头数远小于 Q 头数,直接砍掉一大块;DeepSeek-V2/V3 的 MLA 用低秩压缩存 KV,公开报告里显存占用大幅下降。选模型时先看注意力结构,再看参数量。
**二、量化 KV:精度换显存**
KIVI 是代表性工作:Key 按 channel 量化、Value 按 token 量化,2-bit 量化下精度损失极小。实战建议从 FP8/INT8 起步验证业务指标,激进场景再试 4-bit。注意量化 KV 和权重量化是正交的,可以叠加。
**三、窗口化:给记忆设上限**
Mistral 7B 的 sliding window attention 把注意力窗口设为 4096,超出窗口的老 token KV 直接丢弃,显存占用恒定。代价是丢失长程依赖——RAG 问答、长文档摘要这类场景慎用,窗口化会把你需要的证据“忘”掉。
**四、prefix caching:前缀只算一次**
大量请求的 system prompt 和文档前缀是相同的,prefix caching 让相同前缀的 KV 只计算一次、跨请求复用。vLLM 内置了 automatic prefix caching;Anthropic 的 prompt caching 也是同一思想的产品化。实战要点:把高频前缀固定下来、顺序对齐,缓存命中率才上得去。
**五、PagedAttention:显存的分页管理**
vLLM 的 PagedAttention 把 KV 按 block(默认 16 个 token)分页存储,非连续显存分配,碎片率大幅下降;同一个 batch 里共享前缀的请求只存一份 KV。这是 vLLM 吞吐量大幅领先 HuggingFace Transformers 的核心原因之一。
**六、压缩组合怎么选:看场景**
- 聊天机器人(短上下文、高并发):prefix caching + PagedAttention 就够了,KV 单请求不大,优化重点是吞吐;
- 文档问答(32K~128K 上下文):GQA/MLA 模型 + FP8 KV 量化是必选项,prefix caching 把重复文档前缀的 KV 复用起来;
- Agent 长程任务(上下文持续增长):在上面的基础上加 sliding window 或按需淘汰策略,防止 KV 无限膨胀拖垮显存。
记住优化顺序:先选对模型结构(GQA/MLA 带来的收益是结构性的),再做量化,最后上缓存复用。顺序反了会事倍功半。
**实战要点速览**
- 先算账:用上面的公式算出你的场景 KV 占用,再决定优化方向;
- 短平快三板斧:GQA/MLA 模型选型 + FP8 KV 量化 + prefix caching;
- 长上下文刚需:PagedAttention 系框架(vLLM、TensorRT-LLM)是标配;
- 窗口化是最后手段,先确认业务能接受记忆截断。
你的推理服务 KV Cache 占显存比例是多少?欢迎贴出你的计算和优化组合。
