内容提要
DeepSeek-V4.1 的 CSA2 通过跨层共享压缩全局 KV,将 KV cache 从每 token 5.41 条降至 2.5 条。每层全局注意力包含 main KV、indexer K、top-k 索引和注意力四部分,前三者可跨层共用,形成 Full、Reindex、Reuse 三种模式:Full 自建 KV 并选索引,Reindex 复用 KV 但重选索引,Reuse 两者均复用。38 层中仅 4 层为 Full,压缩算子去除了重叠与位置偏置,indexer K 改由 main KV 投影。
延伸解读
跨层共享的三种模式:Full、Reindex、Reuse
CSA2 将一层全局注意力拆成 main KV、indexer K、top-k 索引和注意力四部分,前三者可跨层共用。Full 模式自建 KV 并选索引;Reindex 复用 KV 但重选索引;Reuse 两者均复用。这种设计让 38 层中仅 4 层为 Full,其余层通过共享大幅减少 KV cache 存储。
压缩算子简化:去重叠与位置偏置
V4 的 CSA 压缩算子让相邻条目共用一半 token,并引入可学习位置偏置。CSA2 将其退回为每组独立压缩,softmax 逐通道进行,无位置偏置。当 m=1 时,softmax 权重恒为 1,连压缩权重投影都不需要,简化了实现并加速训练。
indexer K 改由 main KV 投影
V4 的 indexer K 有独立的压缩算子,参数约 210 万。CSA2 改为直接由 main KV 经线性投影得到,仅 65536 个参数,且去掉了量化前的 Hadamard 旋转。打分公式不变,但头数从 64 降到 32,每头仍 128 维。
共享池机制与层间协作
共享池 SharedAttentionRuntime 只有四个槽:compress_kv、index_k、topk_idxs 和 candidates。Full 层写入,Reuse 层读取,Reindex 层重写 topk_idxs。层按顺序执行,一个 Full 层写入后,直到下一个 Full 层覆盖前,中间层都读同一份。KV cache 常驻 4 份 main KV 和 4 份 indexer K。
Q&A
DeepSeek-V4.1 的 CSA2 如何把 KV cache 从每 token 5.41 条降到 2.5 条?
CSA2 通过跨层共享压缩全局 KV 来减少存储。具体来说,38 层中只有 4 层是 Full 模式,这些层自己生成 main KV 和 indexer K,并选出 top-512 索引;其余层复用这些共享的 KV 和索引。每 token 的全局 KV 条数只由 Full 层决定:encoder 有 3 个 Full 层,每个每 2 个 token 存一条,贡献 3×1/2=1.5 条;decoder 有 1 个 Full 层,每个 token 存一条,贡献 1 条,合计 2.5 条。而 V4-Flash 有 41 层全局注意力,每层自己存一份,平均每 token 5.41 条。
CSA2 的 Full、Reindex、Reuse 三种模式有什么区别?
三种模式在跨层共享上的行为不同:Full 模式自己生成 main KV 和 indexer K,并自己选 top-512 索引;Reindex 模式复用前面的 main KV 和 indexer K,但用自己的 indexer query 重新选 top-512 索引;Reuse 模式则复用前面的 main KV 和 top-512 索引,不跑 indexer。三种模式都保留自己的 query、滑窗 KV 和输出投影。
为什么 DeepSeek-V4.1 的 38 层全局注意力中只有 4 层是 Full 模式?
因为 Full 层需要自己生成并存储 main KV 和 indexer K,每增加一个 Full 层就会增加每 token 的 KV 条数(encoder 每多一个 Full 层多 0.5 条,decoder 每多一个多 1 条)。为了压缩 KV cache,设计上只保留最少的 Full 层:encoder 每 6 层一组,每组 1 个 Full 层,共 3 个;decoder 只有 1 个 Full 层(第 20 层),负责从 encoder 末态投影出全局 KV。这样总条数降至 2.5 条/token。
CSA2 的压缩算子相比 V4 的 CSA 做了哪些简化?
CSA2 的压缩算子去掉了重叠和位置偏置。V4 的 CSA 让相邻两个条目共用一半的 token,并加入可学习的块内位置偏置,每个 token 要算两套 C 和 Z 投影。CSA2 改为每个条目只由自己这一组的 m 个 token 得到,相邻条目不共用 token,softmax 仍是逐通道的,但没有位置偏置。当 m=1 时(decoder 的 Full 层),softmax 权重恒为 1,连 Z 的投影矩阵都不建。
CSA2 中 indexer K 是如何生成的?与 V4 有何不同?
在 CSA2 中,indexer K 直接由刚算好的 main KV 条目投影得到:k_i^I = RMSNorm(C_i^Comp W^{IK}),其中 W^{IK} 是 512×128 的矩阵。投影用的是加 RoPE 之前的 main KV,投影后最后 64 维再加自己的 RoPE。V4 则从隐藏态另走一路,用一套独立的压缩算子(4 个投影矩阵加位置偏置)生成 indexer K。CSA2 不再需要那套压缩算子,参数从约 210 万降到 6.5 万。
Reuse 层共用 top-512 索引,但每层的 query 不同,注意力权重如何计算?
Reuse 层共用的是“看哪 512 条”这个集合,即 top-512 索引。在这 512 条上如何分配注意力,仍由每层自己的 query 计算:输出 = Σ_{s∈S_t ∪ 滑窗} softmax_s(q_t^{(l)} · k_s) v_s,其中 S_t 是共用的索引集合,q_t^{(l)} 是本层的 query。因此两个 Reuse 层可以把注意力集中在这 512 条里完全不同的几条上。这个设计基于相邻层选出的 top-k 高度相似的假设,IndexCache 的实验表明去掉 75% 的 indexer 质量下降可忽略。
Reindex 模式在 decoder 中起什么作用?代价和收益是什么?
Reindex 模式让 decoder 不必只选一次 top-512 索引。decoder 只有第 20 层是 Full 层,如果其余 19 层全是 Reuse,整个 decoder 对每个 token 只选一次 512 条,会限制效果。Reindex 层不生成 KV,只用自己的 indexer query 在候选池中重新选 top-512,每 4 层换一批条目,20 层共有 5 次选择。代价:不增加存储,只多约 540 万参数(indexer query 和头权重投影),但需要跑一遍 indexer 给所有可见条目打分,在 1M 上下文下要处理 100 万条,这是主要计算开销。收益:在不增加 KV 存储的前提下,让 decoder 有多样化的选择。