前言

DeepSeek v4.1 Flash是一个支持多模态输入、最高支持1M上下文的MOE模型。它包含552B backbone以及额外的196B Engram条件记忆参数。通过精心设计的CED(causal encoder-decoder), CSA2(compressed sparse attention 2)架构使其能在prefill阶段每个token只激活8B参数,decode阶段激活16B参数。
得益于跨层 KV 共享、序列压缩和 FP4 KV 存储,DeepSeek v4.1 Flash将全局kv-cache降至每token 890字节,约为DeepSeek-V4-Flash的1/4。
下面具体来看其架构设计。

V4.1的架构设计

下图为DeepSeek v4.1 Flash完整的架构图,核心设计5大模块:
  • CED(Causal encoder-decoder)
  • CSA2 (compressed sparse attention 2)
  • Single-Pass mHC
  • Engram
  • DSpark
下面具体来看。
notion image

CED(Causal encoder-decoder)

这个设计思路源于YOCO。
DeepSeek v4.1 Flash总计有40层。它将前20层视作encoder,后20层视作decoder。由于都沿用causal mask,因此称为causal encoder-decoder。这样设计的核心目的在于降低prefill计算成本。
CED让decoder所需的全局KV可以直接从encoder输出构造,结合Decoder SWA Bounded Replay机制,使大部分prompt token不必再经过后半部分网络。
具体细节可以参考下面的图
notion image
这里有几点细节需要注意:
  • encoder 前两层只使用SWA;后面18层分成三个六层组,每组共享一套压缩比为 2 的全局 KV。
  • decoder的20层共享一套由encoder输出构造的全局KV,压缩比为1,但每层仍独立计算自己的SWA KV。
下面具体来看Decoder SWA Bounded Replay机制是什么。
CSA2的attention的KV由2部分组成:其一是SWA的KV,其二是sparse attention的KV。按照正常的SWA的感受野计算逻辑,window size为的SWA在层的感受野为
以=3,L=3为例。第3层的位置的输出实际上与输入层的前7个token的hidden state有关。
notion image
在全局KV已准备好的前提下,要精确恢复decoder各层末尾窗口的SWA KV,仅回放最后 个 encoder 输出还不够。SWA依赖逐层回溯,需要覆盖个输入位置。对于20层decoder、128的窗口大小,就是 2541个位置。
有没有更“便宜”的办法呢?
既有研究观察到,SWA中有效信息的传播范围可能小于理论感受野。这为截断回放提供了动机。DeepSeek-V4.1-Flash因此只将prompt最后个位置的 encoder 输出送入decoder,并将局部SWA限制在回放片段内,重建近似的decoder SWA KV。技术报告称,该策略在其评测中的质量影响很小,并在后训练中模拟相同回放过程,使模型适应这种近似。
注意:被截断的是局部SWA路径;不影响全局KV。

CSA2 (Compressed Sparse Attention 2)

下面再来看DeepSeek-v4.1 Flash的核心组件CSA-2。我们知道对于softmax attention 而言,KV-cache的大小主要由以下3个维度决定:
  • entry size。它代表每一个token的kv-cache是多少。之前的GQA/MQA/MLA都是从降低entry size的思路来降低kv-cache。
  • Sequence dimension。它代表有多少token需要做kv-cache。CSA、HCA 等方法沿序列维度压缩 KV。
  • Layer dimension。常规 causal Transformer 每层独立维护 KV cache,因此缓存总量通常随层数增加。跨层共享可以作用于不同对象:如IndexCache、YOIO通过共享索引或稀疏路由,减少重复索引计算;HySparse等方法通过共享 KV cache,减少缓存存储。CSA2 将 KV 共享与索引共享分开设计。
DeepSeek-v4.1 Flash从这3个维度进行设计,提出CSA2
CSA2有3种模式:1)full; 2)reindex; 3)reuse
notion image
这3种形式的核心差异取决3点:
  1. Main KV来源
  1. Indexer K来源
  1. TopK Index的来源
ㅤ
Main Kv来源
Indexer K 来源
TopK Index来源
Full Mode
自行计算
从自己main KV的latent投影得到
自行计算
Reindex
复用Full Mode
复用对应FULL的 Indexer K
用自己的index query重新打分;启用分层索引时,在共享候选池内选择
Reuse
复用 Full Mode
无需计算索引,本层不读取 Indexer K
复用最近一次由 Full 或 Reindex 层生成的 TopK 索引
相比deepseek v4的CSA, CSA2做了以下几点改动:
  1. 引入3种CSA2模式:FULL, ReIndex,Reuse
  1. CSA2去除了CSA的overlap机制,也移除了score的可学习位置编码
  1. CSA2通过直接投影main KV latent来获取index K。避免CSA中需要额外调用compression path。

CSA2-FULL

其CSA2的核心数学形式可以表示为
与常规的attention不同,CSA的key,value是共享的,且是2个来源的拼接。其一来自sliding window attention (最后window size的key value);其二是从压缩后的全局KV中选出TopK entry 。
比较好理解。下面主要看 是怎么得到的。
总的来说, 的获取分为两步:首先从hidden states独立投影出待压缩的KV和压缩权重,随后按组聚合得到全局KV,随后Indexer再为每个query选择topk位置。
先看Compressor
在CSA中 (符号沿用DeepSeekV4的记法)
式中:是训练参数;是hidden states;m为compression ratio; 为token number; 是learnable positional biases; 沿组内token维度归一化。
有个细节需要注意⚠️:CSA/CSA2都采用shared key-value,即同一个KV向量同时作为key和value。
在CSA2中去除了CSA的overlap机制,也移除了压缩权重中的可学习位置偏置,其计算过程可以表述为:
Compressor 核心代码见: https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash/blob/main/inference/model.py#L465:
代码块中展示的是压缩比>1的计算链路。对于 decoder使用的,无需计算压缩权重,也不合并token,直接对hidden state做KV投影和 RMSNorm。
CSA中
其中:
  • 是token$t$的hidden state;
  • 是压缩的latent vector;
  • 是index query, 是head 的index query;
  • 是token 与 位置的KV的index score
  • ;
    • 是indexer的head dimension;
    • 是indexer的head number;
  • 是index K, 它是用前面Compressor方法计算indexer keys(并未沿用,而是新计算了一个)。
最终得到sparse KV
为该token的因果可见位置集合。
在CSA2中,Index K 不再重新通过compressor的方法计算,而是从投影得到。其它与CSA一致。

CSA2-ReIndex

CSA2 ReIndex的CoreAttention计算方式与CSA2-Full的一致。区别在于:
ㅤ
Main Kv来源
Indexer K 来源
TopK Index来源
Full Mode
自行计算
从自己main KV的latent投影得到
自行计算,在因果可见的全局位置中选择
Reindex
复用对应Full 的Main KV
复用对应FULL的 Indexer K
用自己的index query重新打分;启用分层索引时,在共享候选池内选择
先看Main KV复用
对于Main KV,CSA2-ReIndex无需计算Main KV,直接沿用上一个CSA2-Full的Main KV结果。 相关代码: https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash/blob/main/inference/model.py#L747-L748
Indexer K的复用 对于CSA2-ReIndex,直接复用对应CSA2-FULL的indexer K。indexer query需要重新计算。
CSA2-ReIndex topk index的来源
常规情况下,indexer会给每一个compress KV entry打分
是token 与 位置的KV的index score
对于CSA2-FULL,从全部因果可见位置获取topk索引
为该token的因果可见位置集合。
CSA2-ReIndex与FULL的区别在topk的候选集合。
首先,将KV entry的位置索引按照block size 划分为多个block
上面的集合式子假定了N能被s整除。
给每个block$\mathcal{B}_i$进行打分,打分的规则为:将block索引范围内index score最高的分数作为该block的分数
随后选取分数最高的个块,合并后作为候选池(candidate pool)这里可见,candidate pool是由前置CSA2-FULL决定的。
最后在该候选池中,构建KV的topk索引
有2个细节需要注意:
  • candidate pool是有由前置CSA2-FULL决定,但具体的index score仍然由ReIndex计算。实现中,会将本层的index score$I$用前置的candidate pool进行mask,将非候选区域的score置为-inf,确保不会被选中。
  • 代码中会将包含当前query最新因果可见KV entry的block分数设置为来保证这个block能被选中。
candidate pool的构建逻辑
notion image

CSA2-Reuse

CSA2-Reuse 复用前置 Full 层提供的 Main KV,并复用针对这份 Main KV 最近一次由 Full 或 Reindex 层生成的 TopK 索引。它不生成 Indexer Q,也不重新计算索引分数,但仍使用本层的主 Attention Q 和 SWA KV 完成 Attention,得到新的输出。

Single-Pass mHC

为了理解single-pass mHC,下面我们先简单的回顾一下HC和mHC。
在标准的transformer架构中,层与层之间通过residual connection来传递状态。HC(Hyper-Connections)认为,单条残差流传递的信息太少,于是将其扩展为多条,并允许混合,以此提升残差通路的表达力。
普通残差
这里的可以代表Attention或FFN(也包含Normalization)
HC将一条残差流扩展到了条
HC残差
其中:
  • ,用于将多流的信息融合成单流
  • ,用于将单流的信息分配各流
  • ,用于混合各个残差流的信息
  • 它包含projection和normalization。并且是输入的映射,因此是data dependent的。
代码中的系数预测计算逻辑大致为:
原始的HC虽然提升了残差通路的表达力,但横跨多层后,直通项为
如果不对进行约束,连乘后可能变得不稳定。因此,在mHC (manifold-Constrained hyper connection)中,对约束为一个双随机矩阵,即满足:
双随机矩阵有2个很好的性质:
  • 2个双随机矩阵相乘后仍然是双随机矩阵;
  • 双随机矩阵的谱范数(最大奇异值)不超过1,即,因此可以约束深层残差连接中混合路径的信号放大,改善原始HC的稳定性。
在实现上,原始mHC通过Sinkhorn–Knopp算法将B变为双随机矩阵,即从正值矩阵出发,交替进行行归一化与列归一化,使其逼近双随机矩阵。
有了上面的基础,再理解single pass mHC就比较简单了,其核心目的在于减少多流的重复访存。形式上很简单,只是做了下面的替换。
下面具体来看,为什么做这个替换,能够减少多流的重复访存。
两个相邻block残差连接可以视作映射:,其中
具体来看可以分为3步:
第一步和第二步可以在一次遍历中完成,可以对hidden state的维度进行分块遍历,每一次遍历tile都能计算:
  • 当前tile的更新残差流
  • 累加系数预测的线性投影
  • 累加RMS所需的平方和
但第三步无法放在上述遍历中。因为系数预测中的线性投影和 RMS 统计量,都需要跨越全部 hidden tiles 完成归约。因此,在遍历结束之前无法得到完整的,也就无法直接完成使用的输入混合。故而,需要在第一次的遍历结束得到完整的后,再进行第二次的tile 遍历,得到最终的。
可见,对于常规的mHC算法可以用two pass算法进行优化。其访存为: 第一次遍历:
读取访存为:
写入访存为:
第二次遍历:
读取访存为:
写入访存为:
总访存为:
上述的访存计算是单token的,且忽略小项()与预测权重
在single-pass mHC中,残差的映射变更为:
此时3个步骤,都能在一次遍历中完成,访存为:
读取,访存为:
写入,访存为:
总访存为:
相比two pass mHC少了一次的读取。

Engram

V4.1增加了两个Engram模块,总计196B参数。算法基本沿用了之前的设计,主要做了2点改动:
  1. 抛弃了short causal convolution。性能增益不足以覆盖其引入的推理复杂度
  1. engram使用带动量的更新,再进行Sinkhorn balancing,以降低优化器状态开销。

DSpark

DeepSeekv4.1-flash沿用了其提出的DSpark算法,本文暂不做详细阐述。

小结

本文主要梳理了deepseek 4.1 flash中CED、CSA2和 Single-Pass mHC的计算过程。如有疏漏之处,敬请指出~
 
LinearAttention系列解读(四):当 Delta Rule 遇上 Gating (GDN/KDA/GDN-2)diffusion model(一):DDPM技术小结 (denoising diffusion probabilistic)
Loading...