【infra之路】从 KV Cache 到逐层语义:理解 Decoder-Only LLM 的推理过程
本文记录了我学习 AI Infra以 nano-vllm 为切入点过程中围绕 LLM 推理机制产生的几个核心问题及思考。起因在学习 nano-vllm 源码时我遇到了一个看似简单但细想很深的问题KV Cache 为什么只缓存 K 和 V不缓存 Q这个问题把我拉回到了 Attention 机制本身进而引出了对 Decoder-Only 架构逐层数据流的完整梳理。问题一KV Cache 为什么只存 K 和 V回到 Attention 公式Attention(Qt,K,V)softmax(Qt⋅[K1,…,Kt]Td)⋅[V1,…,Vt]\text{Attention}(Q_t, K, V) \text{softmax}\left(\frac{Q_t \cdot [K_1, \dots, K_t]^T}{\sqrt{d}}\right) \cdot [V_1, \dots, V_t]Attention(Qt​,K,V)softmax(d​Qt​⋅[K1​,…,Kt​]T​)⋅[V1​,…,Vt​]关键不对称性矩阵形状含义QtQ_tQt​[1, d]只有当前 1 个token 的 QueryK1..tK_{1..t}K1..t​[t, d]所有历史token 的 KeyV1..tV_{1..t}V1..t​[t, d]所有历史token 的 Value用生成过程推演假设已生成 “我 喜欢 吃”要生成第 4 个 token生成第 4 个 token Q₄ x₄ · W_q ← 只需要当前 1 个 Q Attention softmax(Q₄ · [K₁,K₂,K₃,K₄]ᵀ / √d) · [V₁,V₂,V₃,V₄] 生成第 5 个 token Q₅ x₅ · W_q ← Q₄ 再也不会被用到 Attention softmax(Q₅ · [K₁,K₂,K₃,K₄,K₅]ᵀ / √d) · [V₁,V₂,V₃,V₄,V₅] ↑ K₁~K₄ 又要用 ↑ V₁~V₄ 又要用结论Q 是一次性提问者每步只需当前一个用完即弃无跨步复用需求K 和 V 是被反复查询的知识库每一步生成都要回顾全部历史必须缓存一个类比把 Attention 想象成图书馆查资料Q 你手里的一次性提问纸条问完就扔K 每本书封面上的索引标签你需要翻所有书的标签V 书里的实际内容找到后你要读所有相关书图书馆KV Cache存的是书KV不是你的纸条Q。不缓存的代价无 Cache暴力重算有 KV Cache每步计算量O(t)O(1)生成 n 个 tokenO(n²)O(n)代价无额外显存显存占用KV Cache 本质是用空间换时间。问题二多层 Decoder 中每层的输入输出到底是什么全局数据流Token IDs: [我, 喜, 欢, 吃] │ ▼ Embedding: [4, 4096] ← 第一层的输入 │ ▼ ┌─ Layer 1 ─┐ in: [4, 4096] out: [4, 4096] ├─ Layer 2 ─┤ in: [4, 4096] out: [4, 4096] ├─ Layer 3 ─┤ in: [4, 4096] out: [4, 4096] │ ... │ └─ Layer N ─┘ in: [4, 4096] out: [4, 4096] │ ▼ RMSNorm LM Head: [4, 4096] → [4, vocab_size] │ ▼ 取最后一个位置 → softmax → 下一个 token核心事实每一层的输入输出形状完全相同都是[seq_len, hidden_dim]。层与层之间变的不是形状是语义的深度。第一层的输入Embedding 层的输出。每个 token 被映射为一个 4096 维向量此时只包含该 token 自身的词义尚未与任何其他 token 交互。每层内部做了什么输入 x: [seq_len, 4096] │ ├──→ RMSNorm → Self-Attention → (残差) │ │ │ ▼ ├──→ RMSNorm → FFN (SwiGLU) → (残差) │ ▼ 输出: [seq_len, 4096]两个子模块各司其职模块作用类比Self-Attentiontoken 之间交流横向融合上下文开会讨论FFN/MLP每个 token 独立思考纵向深化表示会后独立思考Prefill vs DecodePrefill处理 promptDecode逐 token 生成每层输入[n, 4096][1, 4096]Q[n, 4096][1, 4096]K, V[n, 4096]新算并存入 cache[1, 4096]新算并追加到 cache参与计算的 K, V[n, 4096][t, 4096]全部历史从 cache 读问题三我的核心感悟逐层语义完善把上面两个问题串起来我得到的理解是每个 token 的向量从孤立的词义出发每经过一层通过 Attention 吸收上下文、通过 FFN 深化推理维度不变但语义逐层丰富最终变成一个浓缩了全文信息、足以预测下一个词的表示。具体地Embedding 后 吃 只知道自己是吃 Layer 1 后 吃 知道前面是喜欢 Layer 5 后 吃 知道这是主语喜欢吃的结构 Layer 20 后 吃 知道语境大概率要接一个食物名词 Layer N 后 吃 的向量已经准备好去预测苹果/米饭/火锅...三个让这个过程成立的关键设计Causal Mask每个 token 只能看到自己 前文保证自回归生成的合法性残差连接每层不是推倒重来而是在上一层基础上叠加一个增量修正维度恒定4096 维贯穿始终让层与层之间可以无限堆叠这就像画画第一层打轮廓后面每层加一点细节和色彩最终成为一幅完整的画。

相关新闻

GDScript反编译器实战指南:从字节码逆向到源码恢复

GDScript反编译器实战指南:从字节码逆向到源码恢复

1. 项目概述:为什么我们需要GDScript反编译器?如果你是一个使用Godot引擎的开发者,无论是独立游戏制作人还是团队的一员,你大概率都接触过GDScript。这门为Godot量身定制的脚本语言,以其简洁的语法和与引擎节点的深度集…

2026/8/3 8:38:39 阅读更多
SSM框架在高校团委管理系统中的实践与优化

SSM框架在高校团委管理系统中的实践与优化

1. 项目概述:高校团委管理系统的核心价值高校团委作为学生工作的核心枢纽,每天需要处理大量事务性工作:团员信息管理、活动审批、志愿服务统计、评优评先等。传统Excel纸质档案的管理方式已经难以应对日益增长的数据量和协作需求。我去年为某…

2026/8/3 9:58:41 阅读更多
GitHub私有仓库SSH访问配置全流程指南

GitHub私有仓库SSH访问配置全流程指南

1. GitHub 私有仓库SSH访问配置全流程指南作为开发者日常工作的刚需,SSH密钥访问GitHub私有仓库的配置看似简单,实际暗藏不少平台差异性和配置细节。我在为团队制定标准化操作流程时,发现即便是经验丰富的工程师,也常会在密钥权限…

2026/8/3 9:48:41 阅读更多
3分钟搞定!QQ空间历史说说完整备份终极指南

3分钟搞定!QQ空间历史说说完整备份终极指南

3分钟搞定!QQ空间历史说说完整备份终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想过,那些年发过的QQ空间说说,那些记录青春的文字…

2026/8/2 0:04:01 阅读更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是应用材料(Applied Materials)公司生产的一款用于半导体设备的I/O信号分配电路板。该型号(0100-02186)的核心特点如下:专用于Endura等半导体工艺腔室。集成信号路由与分配功能。连接控制…

2026/8/2 2:51:21 阅读更多
Nissei Corp FFMN-32L-10-T0 40AX 三相异步电动机

Nissei Corp FFMN-32L-10-T0 40AX 三相异步电动机

Nissei Corp FFMN-32L-10-T0 40AX 三相异步电动机是日本日清(Nissei)品牌的一款工业用三相异步电机,适用于自动化设备及通用机械驱动。该型号(FFMN-32L-10-T0 40AX)的核心特点如下:三相交流异步电动机。额定…

2026/8/2 2:52:49 阅读更多