【免费下载链接】llm-internals
Learn LLM internals step by step - from tokenization to attention to inference optimization.
LLM Internals是一个逐步讲解大模型内部原理的开源学习项目,而KV Cache(键值缓存)正是它重点剖析的核心推理加速技术。本文将用通俗的语言带你弄懂:KV Cache 为什么能让大模型生成文本快上数倍、它背后的速度 vs 内存权衡是什么,以及主流引擎是如何优化它的。📚
一、问题起点:大模型为什么生成文字这么慢?
大模型(LLM)生成文本的方式叫自回归:一次只吐出一个 token(可以粗略理解为"半个词"),每生成一个新 token,都要回头"看一遍"之前所有的 token,再通过注意力机制决定该关注谁。
假设回答已经生成了 100 个 token:
| 方案 | 第 100 步的计算量 | 100 步累计计算量 |
|---|---|---|
| ❌ 不缓存 | 重新计算全部 100 个 token 的注意力 | 约 5050 次(O(n²)) |
| ✅ 使用 KV Cache | 只计算第 100 个 token | 大幅降低,接近 O(n) |
问题在于:之前 99 个 token 的 Key(键)和 Value(值)在每一步都没有变过,却每轮都被重复计算——这就像你每天把昨天已经整理好的资料全部重新整理一遍。💡
二、KV Cache 的原理:算过的结果存起来,不再重算
KV Cache 的思想非常朴素:把过去 token 已经算好的 K(Key)和 V(Value)向量存进显存,新 token 来了直接复用。
工作流程只有三步:
- Prefill(预填充):你输入的 prompt 一次性并行处理,每层的 K、V 向量全部写入缓存;
- Decode(解码):每生成一个新 token,只计算它自己的 K、V,追加到缓存末尾;
- 注意力计算:新 token 的 Query(查询)与缓存中全部历史 K、V 做注意力,得到结果输出。
为什么只缓存 K 和 V,不缓存 Q?
Query 是"当前 token 去检索历史"的检索条件,每一步都是全新的,过去的 Q 没有任何复用价值;而 K 和 V 是历史 token 的"档案",一旦算好就永远不变,是天然的缓存对象。
相关原理可在项目资料中继续深入:
- 注意力 Q/K/V 的数学推导:README.md - Math behind Attention
- 因果掩码(保证只能看历史、不看未来):README.md - Causal Masking
- KV Cache 专章:README.md - KV Cache in LLMs
三、速度 vs 内存:KV Cache 的核心权衡 ⚖️
天下没有免费的午餐——KV Cache 是用显存换速度。缓存会随着上下文变长而线性膨胀,多路并发时还要乘以请求数。
内存占用大致遵循:
KV 缓存大小 ≈ 2 × 层数 × KV头数 × 每头维度 × 序列长度 × 精度字节数
拿一个 7B 级别的典型模型(32 层、32 个 KV 头、每头 128 维、FP16)估算:
| 上下文长度 | 单个请求的 KV 缓存 |
|---|---|
| 4K token | ≈ 2 GB |
| 32K token | ≈ 16 GB |
| 128K token | ≈ 64 GB |
这就是"长上下文很贵"、"大并发很吃显存"的根源:模型权重本身可能只要 14 GB,但几十个 32K 并发请求的 KV 缓存就能轻松吃掉上百 GB 显存。💸
主流优化方案速览
- GQA / MQA(分组查询注意力):让多个 Query 头共享同一组 K/V,直接砍掉大部分缓存体积(README.md - Grouped Query Attention)
- Paged Attention(分页注意力):借鉴操作系统虚拟内存的分页思想,把 KV 缓存切成固定大小的"页"按需分配,几乎消除碎片浪费,大幅提升并发吞吐(README.md - Paged Attention)
- KV 量化:把缓存从 FP16 压到 FP8/INT8,内存近乎减半
- Flash Attention:通过分块(tiling)与在线 softmax,在不物化完整注意力矩阵的前提下提升注意力计算效率(README.md - Flash Attention)
四、把 KV Cache 放回推理全景:Prefill vs Decode
理解Prefill 与 Decode 两阶段,才算真正理解 KV Cache 的价值:Prefill 阶段并行处理 prompt、快速填满 KV 缓存,决定首 token 延迟(TTFT);Decode 阶段逐 token 追加缓存,决定每个 token 的生成速度(TPOT)。KV Cache 正是连接这两个阶段的桥梁——Prefill 攒下的缓存,让 Decode 免于任何重复计算。🚀
两阶段的对比、指标与逐阶段优化技巧,项目中有专门章节:README.md - Prefill vs Decode。
五、如何系统学习 LLM Internals?
本项目采用"博客 + 视频"的方式,从 tokenization 一直讲到推理优化,学习路径建议如下:
| 学习主题 | 资料位置 |
|---|---|
| 注意力数学基础(Q、K、V) | README.md#L64-L78 |
| Transformer 整体架构 | README.md#L164-L181 |
| KV Cache 完全剖析(本篇主角) | README.md#L223-L239 |
| Paged Attention 解决内存浪费 | README.md#L243-L258 |
| GQA / MQA 压缩 KV 缓存 | README.md#L391-L410 |
| Prefill vs Decode 推理优化 | README.md#L349-L368 |
| Flash Attention 加速原理 | README.md#L262-L279 |
| 投机解码(Speculative Decoding) | README.md#L283-L301 |
项目采用 Apache 2.0 协议开源(LICENSE),内容持续更新,跟着 README.md 的目录顺序学即可。
六、总结
✅一句话回顾:KV Cache 把历史 token 的 Key/Value 向量缓存下来,让大模型从"每步重算全部历史"变成"只算新 token",是 LLM 推理加速的基石技术。
✅核心权衡:它以显存持续膨胀为代价换取速度——上下文越长、并发越多,缓存越贵,这是长上下文与高并发服务昂贵的主要原因。
✅优化方向:GQA 减少 KV 头数、Paged Attention 分页管理、KV 量化压缩精度,三者组合构成了现代 LLM 推理引擎的标准配置。
理解了 KV Cache,你就拿到了打开 Prefill/Decode、Flash Attention、投机解码这一整套推理优化知识地图的钥匙 🔑。
【免费下载链接】llm-internals
Learn LLM internals step by step - from tokenization to attention to inference optimization.
相关推荐
大模型推理加速利器:KV Cache量化技术深度解析
大模型推理加速利器:KV Cache量化技术深度解析 引言:为什么KV量化成为LLM推理优化的关键? 在大语言模型的实际部署中,推理性能瓶颈往往不是计算速度,而
人工智能大模型模型推理服务推理引擎本地部署模型量化终极指南:如何通过KV Cache量化实现大模型推理的"内存瘦身术"
终极指南:如何通过KV Cache量化实现大模型推理的"内存瘦身术" LMDeploy是一款用于压缩、部署和服务大语言模型 LLM 的工具包,其提供的KV Ca
人工智能大模型模型推理服务推理引擎本地部署模型量化libvips操作缓存完全指南:cache内存限制与revalidate如何平衡速度与内存
libvips操作缓存完全指南:cache内存限制与revalidate如何平衡速度与内存 libvips 操作缓存(operation cache)是这套低内
图像处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考