附录 A. 速查表与出处
A.1 一条公式链
整个前向里与"省 KV"有关的式子,按依赖顺序排成一条链。左边是式子,右边是它出现在哪一节。
(1) 条目字节 = 2 H_kv d_h s 1.1
(2) 潜在吸收 q~ = W_K^T q 1.4
(3) 条目 = d_c 个数 = 512 1.6
(4) 窗口感受野 R = 1 + D(W-1) 2.2
(5) 稀疏分数 s = sum g_h ReLU(qk) 2.3
(6) 可见集 A = TopK(512) + 窗口 2.4
(7) CED: C = H_20 W^KV 3.3
(8) 成本比 = 1/2 + B/(2N) 3.4
(9) 主 KV 字节 = d_c/2 + d_c/16 4.4
(10) 每 token 890 B = ... 4.4
(11) o(q) 在 conv{c_j} 内 5.2
(12) do/dq = Cov_p(c)/sqrt(d) 5.3
(13) p ∝ p* exp(C_A dq/sqrt d) 5.4
(14) 像集 = relint conv{c_j} 5.5
(15) 视觉 token = ⌈H/42⌉⌈W/42⌉ 7.2
(16) 内容:地址:查询 = 4:8:40 8.6
这张表把条件都省略了。(11)–(14) 都假设候选集固定、且实际参与计算的 K 与 V 是同一个向量;(14) 还是理想化单头模型的结论——RoPE、以及"只旋转 K 不旋转 V"的实现要另算(5.6 节)。(7) 用的是报告式 (1) 的逐层投影 \(W_l^{KV}\);CSA2 里只有 Full 那一层真正产出缓存。(5) 的打分函数报告未给出,见 2.3 节的说明。
A.2 数字速查
每一个都能用一行算式复现,算式在右。
- 131,072 B:64 个 KV 头的 MHA,每层每 token。\(2\times64\times512\times2\)。
- 5.24 MB/token:上一条乘 40 层。\(131{,}072\times40\)。
- 1024 B:MLA 一个 512 维潜在,fp16。\(512\times2\)。
- 40.96 GB:1024 B × 40 层 × 1M 上下文。
- 2541:20 层 SWA 的感受野。\(1+20\times127\)。
- 640:一次全局稀疏读出的条目上界。\(512+128\)(短上下文或候选不足时更少)。
- 16,384:HSI 候选池上限。\(2048\times8\)。
- 288 B:主 KV 一条(FP4)。\(512/2+512/16\)。
- 68 B:Indexer K 一条。\(128/2+128/32\)。
- 2.5:等效份数 \(\sum1/m\)。\(3\times\tfrac12+1\)。
- 890 B:每 token 全局 KV。\(720+170\)。
- 3514.25 B:V4-Flash 的基线。\(21\times163+20\times4.5625\)。
- 3.95:省下的倍数。\(3514.25/890\)。
- 50.2%:N=32768 时 CED 的 prefill 比。\(657{,}920/1{,}310{,}720\)。
- 543.6B:MoE 路由专家参数总量(不含 40 个共享专家)。\(35.4\text{M}\times384\times40\)。
- 3.69:\(\alpha=0.8,\gamma=5\) 时期望的接受草稿数。\((1-0.8^6)/0.2\);实际输出长度再加 1(纠正或额外 token),为 \(4.69\)。
- 1024:
max_image_tokens,视觉 token 上限。\(1344\times1344\) 经 3×3 合并得 \(32\times32\),正好顶格。 - 576:\(1008\times1008\) 或 \(1344\times756\) 的视觉 token 数(\(24^2\) 与 \(32\times18\))。
- 5184 / 576:一张 1008² 的 patch 数与视觉 token 数。\(72^2\) 与 \(24^2\)。
- 4 / 8 / 40:内容、地址、查询的刷新次数(本篇的"三个时钟域"说法,报告未用此词)。
A.3 出处
本篇的全部结构数字来自 DeepSeek 的技术报告,解读框架来自 zartbot 的逐节分析;两本书只提供起点概念,不含报告里的任何数字。
- 技术报告:DeepSeek-V4.1-Flash: Pushing the Limits of KV Cache Compression。huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash 仓库下的
DeepSeek_V41_Tech_Report.pdf。 - 逐节解读(本篇的叙述顺序与若干"为什么"来自它):zartbot, DeepSeek-V4.1 Flash: 把 KV Cache 压缩推到极致, 2026 年 9 月。zartbot.github.io/blog/model_arch/dsv41flash_arch/
- 起点书一:Sebastian Raschka, Build a Large Language Model (From Scratch), Manning。中文镜像:musetask.github.io/bllm/。本篇引用的第 3、4、5 章。
- 起点书二:Sebastian Raschka, Build a Reasoning Model (From Scratch), Manning。中文镜像:musetask.github.io/barm/。本篇引用的 2.8 节(KV cache)。
- 本机已有推导:数学基础第 7 节(缩放与凸组合)、第 9 节(GQA 的字节账)、第 10 节(KV cache 的复杂度)。
报告引用的前身工作,按本篇出现的顺序:
- YoCo(You Only Cache Once)—— CED 的来源,arXiv:2405.05254。
- Cross-Layer Attention / IndexCache / You Only Index Once / HySparse —— 跨层复用 KV 或索引的四条路线,对应第 4.3 节的三种模式。
- HISA —— 分层索引(块级粗筛 + token 级精筛),HSI 的对照物。
- PowerAttention —— SWA 感受野随层衰减的实验依据,bounded replay 的取舍靠它。
三档出处的区分很重要:报告正文给出结构、290/890 一类结论与部署倍数;仓库 config.json 给出未写进正文的具体数值(max_image_tokens=1024、min_pixels=295936、kv_source_layer_ids、engram_layer_ids、dspark_*);本篇自己算的则有 4.6 的四步分解、2.5 的三本账、5 章的数学推导。报告没有披露的(Indexer 训练目标、DSpark 输入怎么取)在正文里已明确标注为外推。
A.4 术语表
- MLA(multi-head latent attention):K、V 由同一个低维潜在向量的上投影得到,缓存里只存潜在向量。
- SWA(sliding window attention):只看最近 \(W\) 个位置。
- CSA2(compressed sparse attention, v2):窗口 + 稀疏检索 + 跨层共享 KV 与索引的合成块。
- CED(causal encoder-decoder):前 20 层编码、后 20 层复用编码器末端隐状态导出的全局 KV。
- Full / Reindex / Reuse:三种缓存状态——三样都刷新 / 数据命中地址重算 / 全命中只读。
- HSI(hierarchical sparse indexer):先按块最大分选块,再在候选池内选位置。
- bounded replay:只重放最后 \(n_{\text{win}}\) 个位置来近似恢复 SWA KV;报告里有 Decoder(砍 prefill)与 Encoder(持久化缺 SWA KV 时补)两个版本。
- mHC:多条残差流,混合矩阵用 Sinkhorn 迭代约束为双随机。
- Engram:n-gram 哈希查表的条件记忆,196B 参数。
- DSpark:3 层草稿模型 + 并行 5 位 + Markov 头的投机解码。
- FP4 缓存格式:两种。主 KV 是 E2M1 + 每 16 通道一个 E4M3 缩放(跟 NVFP4 但去掉第二级全局缩放);Indexer K 是 V4 起就用的 OCP MXFP4(E2M1 + 每 32 元素一个 E8M0 缩放)。两者不要混成一个格式名。
- ViT:视觉 Transformer,双向、无因果掩码;这里 32 层、16 头、每头 64 维,patch 14,3×3 pixel-unshuffle,视觉 token 上限 1024。
- pixel-unshuffle:把 \(3\times3\) 邻域的 9 个 patch 沿通道维拼成 9216 维,位置数降 9 倍;不是"重排 token"。
- QAT(quantization-aware training):前向模拟量化、反向直通梯度,让模型适应低精度缓存。
- AGU / TLB:本篇的类比(报告没有这套语言),用来记 Indexer 与 HSI 候选池的分工。
A.5 三问自检
读完报告任意一节,用这三个问题检验自己是不是真的读懂了。
- 它动的是三个因子里的哪一个(条目大小 / 条数 / 层数)?如果答不出来,说明还没定位。
- 它省了多少字节或多少 FLOP?必须能写出算式,并且分母是同一口径(每 token、每层、还是每会话)。
- 它付了什么代价?三种常见代价:精度近似(bounded replay、FP4)、表达力受限(同一份 KV 的 512 维倾斜族)、训练复杂度(HSI 要求训推同构)。
判断方法
三个问题都答得出,这一节才算读完;只答得出第一个,是"知道名字"而不是"理解结构"。