跳转到主要内容

DeepSeek V4.1 Flash:从架构到推理成本

拆解 CED、CSA2、Engram 与 DSpark:哪些计算被省下,哪些状态被共享,以及这些变化如何影响 Prefill、Decode 和缓存复用

· 约 13 分钟阅读

本文目录

长上下文推理的成本,不只有 attention 的乘加。相同历史在多少层各存一份、命中前缀后还要恢复哪些状态、一个输出 token 要走几次模型,都可能改变系统的瓶颈。

DeepSeek V4.1 Flash 把这些问题放进同一套设计:CED 缩短多数输入 token 的计算路径,CSA2 共享跨层历史,Engram 提供可提前寻址的条件记忆,DSpark 改变输出 token 的生成与验证方式。本文沿这些数据流分析成本,最后对照公开代码说明哪些能力还不能据此认定已经运行。

30 秒复习
  • 一句话:V4.1 Flash 同时压缩输入计算、全局缓存与重复索引,收益要分别放回 Prefill、Decode 和持久化缓存三个场景判断。
  • 三个判断:CSA2 的 Reuse 层仍执行 attention;890 B/token 是全局 KV 口径;DSpark 的 3 层 draft 模型与 5 个草稿位置是两个维度。
  • 核心模型:40 层 backbone,20 层 encoder + 20 层 decoder;384 routed experts、top-6、1 shared expert;SWA window 128,稀疏 top-k 512,最大上下文 1,048,576 token。
  • 边界:报告固定为 2609.19969v1,配置与参考代码固定为 dba1be0a,于 2026-09-20 核对。本文包含逻辑推导,没有独立的 GPU 性能实测。

关心架构先读第 1–3 节;关心容量看第 4 节;评估实际部署时结合第 5–8 节。文中的层号统一从 0 开始

1. 先区分参数规模、执行路径与存储规模

官方模型卡分别列出 552B backbone 参数196B Engram 参数,并报告 Prefill / Decode 每 token 激活参数约为 8B / 16B。这些数字描述的对象不同:backbone 是模型权重规模,Engram 是条件查询表,激活量描述一次计算经过的参数。不能将它们统一乘以某个字节数,直接得到一张 GPU 的显存需求。

配置对象发布值成本分析中的作用
Backbone layers40Decode 的网络深度
Hidden size5120投影、通信和残差流的基础维度
Query heads / head dim64 / 512attention 的 query 规模;不代表有 64 份独立 KV
Routed / activated / shared experts384 / 6 / 1区分权重容量、每 token 计算和专家通信
SWA window128 token每层局部历史窗口
Global sparse top-k512 entries最终全局 attention 的候选条目数上限
Global KV source layers2、8、14、20哪些层拥有独立的全局缓存
Index-producing layers2、8、14、20、24、28、32、36哪些层重新选择 top-k
Engram layers1、14条件记忆进入残差流的位置
DSpark depth / block size3 / 5draft 网络深度与并行草稿位置数
表 1 · 决定执行与缓存结构的配置 对照 dba1be0a 的 config.json 与 inference/config.json;层号从 0 开始。entries 是压缩后的历史条目,不总等于原始 token。

下面分别讨论三种减少成本的方法:少执行一些层、少存几份历史、少做重复索引。它们作用于不同环节,不能把各自的压缩比例直接相乘得到加速比。

2. CED:为什么输入和输出不再走同样长的路径

CED 的关键是 decoder 的全局 KV 从最终 encoder hidden states 投影得到。因此,为历史输入建立 decoder 全局缓存,不必让每个输入 token 完整经过全部 decoder 层。这是官方报告中 Prefill 激活量小于 Decode 的架构原因。

flowchart TB
    A[输入 embeddings] --> B[Encoder · 20 层]
    B --> C[Encoder 输出]
    C --> D[投影全局 KV]
    C --> E[末尾窗口恢复 SWA]
    D --> F[开始 Decode]
    E --> F
    F --> G[新 token:完整 40 层]
图 1 · CED 在 Prefill 边界分开两类历史状态 根据报告整理的生产路径示意。全局 KV 与各层 SWA 的来源不同;箭头不表示耗时,末尾窗口处理也不是完整 decoder Prefill。

全局 KV 可以这样建立,局部 SWA 却依赖各 decoder 层自己的 hidden states。报告采用 SWA Bounded Replay:让 prompt 末尾最多一个窗口的 encoder 输出继续通过 decoder,为开始 Decode 准备局部状态。Decode 生成的新 token 仍经过全部 40 层。

这给出了一个比“Prefill 只用一半参数”更实用的成本模型:

TprefillTE(S)+Tglobal projection(S)+TD,replay(min(S,W))+Truntime,W=128.T_{\mathrm{prefill}} \approx T_E(S)+T_{\mathrm{global\ projection}}(S) +T_{D,\mathrm{replay}}(\min(S,W))+T_{\mathrm{runtime}}, \qquad W=128.

这里 SS 是无前缀命中时的输入长度;各项按串行阶段记账,不假设相等,也不计排队时间;存在重叠时应改用实际墙钟关键路径。长输入时末尾 replay 相对较小;短输入时,它可能占据明显比例。因而 8B / 16B 激活量不能推出 TTFT 恰好减半,更不能推出 Decode 也减半。

3. CSA2:共享历史,不共享整层输出

3.1 先数清三个可复用对象

参考实现中,SharedAttentionRuntime 分别传递 compress_kvindex_ktopk_idxs。这三个对象对应历史表示、用于检索的 key、当前 query 选中的位置。

模式Main KV / indexer KTop-k 位置本层仍然计算什么
Full本层生成本层生成Query、SWA、稀疏 attention、输出投影
Reindex复用最近的 Full 层用本层 indexer query 重新选择Query、SWA、稀疏 attention、输出投影
Reuse复用最近的 Full 层复用最近一次索引结果Query、SWA、稀疏 attention、输出投影
表 2 · CSA2 三种模式的复用边界 根据固定版本的 Attention、Indexer 与 SharedAttentionRuntime 整理。Full 表示完整 CSA2 路径,不表示全历史 dense attention。

发布配置的安排可以直接读成下面的分组:

Encoder  0–1    SWA only
         2–7    Full + Reuse × 5     compression ratio 2
         8–13   Full + Reuse × 5     compression ratio 2
        14–19   Full + Reuse × 5     compression ratio 2

Decoder 20–23   Full + Reuse × 3     compression ratio 1
        24–27   Reindex + Reuse × 3  共享 layer 20 的 global KV
        28–31   Reindex + Reuse × 3  共享 layer 20 的 global KV
        32–35   Reindex + Reuse × 3  共享 layer 20 的 global KV
        36–39   Reindex + Reuse × 3  共享 layer 20 的 global KV

对容量建模,按 4 个 KV source 数缓存;对索引计算,按 8 个 index-producing layers 数操作;对 attention 与 MoE 计算,仍要按各层实际执行计数。把 Reuse 层整个删掉,会同时低估计算和通信。

3.2 两级索引缩短的是后续搜索域

Decoder 的 layer 20 先对可见历史评分,同时选择至多 2048 个块,每块 8 个位置,形成至多 16,384 个候选位置。后续 Reindex 层在这个池中重选自己的 top-512;它们选中的位置可以不同。

这里有三个不同规模:完整可见历史、候选池、最终 attention top-k。16,384 不是每层 attention 都要读取的条目数,512 也不是首次索引只需扫描的条目数。

对单个 Decode query,忽略常数项与选择开销,可以写出一个索引评分工作量的结构式:

Cindex(S)3S/2+S+4min(S,16384).C_{\mathrm{index}}(S)\propto 3\lfloor S/2\rfloor+S+4\min(S,16384).

前三项来自 encoder 的 3 个索引源、decoder 的首次全局索引及 4 次候选池重评分。这个式子仅数被评分的位置,不是 FLOPs 或 kernel 时间;它说明后续索引有上界,但整网仍保留随上下文增长的扫描项。

4. 890 B/token 是怎么得到的

可从配置和参考代码里的量化分组,独立推导一个理想紧凑存储口径。

Main KV 每条 512 维,4 bit 数据配每 16 维一个 1 byte scale;indexer K 每条 128 维,4 bit 数据配每 32 维一个 1 byte scale。因此:

bmain=512/2+512/16=288 B/entry,b_{\mathrm{main}}=512/2+512/16=288\ \mathrm{B/entry}, bindex=128/2+128/32=68 B/entry.b_{\mathrm{index}}=128/2+128/32=68\ \mathrm{B/entry}.

三个 encoder source 各以 2:1 压缩保存历史,一个 decoder source 以 1:1 保存。忽略页尾取整后,每个原始 token 对应的全局缓存是:

bglobal=(32+1)(288+68)=890 B/token.b_{\mathrm{global}} =\left(\frac{3}{2}+1\right)(288+68) =890\ \mathrm{B/token}.

这与模型卡给出的全局 KV 数字一致。按此口径,1,048,576 token 的单请求逻辑全局缓存为 890 MiB。这里已经包含 main KV 和 indexer K 的 scale,不能再只按“4 bit × 维度”计算。

这不是一张卡的完整显存

890 B/token 不包含各层 SWA、模型权重、Engram 表、临时工作区、页表与对齐,也没有定义各 rank 的分片和复制。FP4 量化运算的存在,还不等于运行时以紧凑 FP4 格式保存缓存;第 8 节的参考代码就需要单独区分。

这套设计把“需要保存多少份历史”与“每份历史需要多少字节”一起降低。与此同时,每层 query 仍需访问所选历史;共享存储不自动保证跨层共享 HBM 读取,需要实际 kernel 和 cache 行为支持。

5. Prefix 复用:容量换回来的是什么

Global KV 和 SWA KV 的生命周期不同。前者覆盖长历史,适合持久化;后者是每层近期窗口,恢复时还受前层状态影响。

报告中的 Encoder SWA Bounded Replay 处理一种具体情况:全局前缀缓存命中,但 encoder SWA 状态已不在。系统重放命中前缀末尾一个窗口,复用已有 global KV,重建 SWA,再处理新增后缀。Decoder 则在 Prefill 末尾为 Decode 准备 SWA,不将其作为持久化前缀状态。

这个恢复是近似的。 只重放一个窗口,截断了更早的局部依赖;它与完整前向的 SWA 状态并不数学等价。报告中的质量验证不能替代具体部署对 cache-hit 边界、任务和精度的验证。

因此,评估这种缓存设计至少要同时记录三件事:省下的持久化字节数、命中后的 replay 开销、恢复路径的输出质量。只给 hit ratio 会漏掉恢复成本;只要求逐位一致,又会把原设计的近似语义误当成实现 bug。

6. Engram:先知道地址,才可能提前取数据

在固定配置中,Engram 位于 layer 1 和 14。参考 Engram.forward 的数据流是:token n-gram hash → 查询 embedding rows → K/V 投影 → 与当前 hidden state 计算 gate → 写入残差流。它查询离散 token 历史,不随请求增长为另一套 KV Cache。

每个模块采用 2、3、4 阶 n-gram,每阶 8 个 hash heads,每个 head 取 256 维。忽略重复地址和传输对齐,每 token、每模块的查询结果逻辑大小为:

(41)×8×256=6144 elements.(4-1)\times8\times256=6144\ \mathrm{elements}.

如果传回 FP8 行,则约为 6 KiB/module/token,两个模块约 12 KiB/token,另有量化元数据。这是请求的数据量估算,不是 196B 参数整表的搬运量,也不是已经测得的网络流量。

地址由 token 决定,使它有机会早于消费层发起预取。若选择 host / RDMA 放置,性能问题应写成“传输有多少暴露在关键路径上”:

Texposedmax ⁣(0, Tlookup+TtransferTlead).T_{\mathrm{exposed}} \approx\max\!\left(0,\ T_{\mathrm{lookup}}+ T_{\mathrm{transfer}}-T_{\mathrm{lead}}\right).

这里 TleadT_{\mathrm{lead}} 是可用的提前量。带宽、请求粒度、并发争用和重复行复用都会改变结果。确定性地址只提供调度机会,不能证明完全隐藏传输;而 host 放置也应被当作部署选择,不能仅凭模型含有 Engram 就认定已经 offload。

7. DSpark:看每轮提交多少 token

配置中的 num_nextn_predict_layers=3 描述 draft 模型深度;dspark_block_size=5 描述并行草稿位置数。参考代码还单独实现了 Markov head 与 confidence head,所以不能把它简化成“普通 MTP 连跑三步”。

草稿生成、target 验证和最终提交是三个阶段。对单个请求的连续验证轮,评估收益时可以统计:

Ttoken=rTround,rrNcommitted,r.\overline{T}_{\mathrm{token}} =\frac{\sum_r T_{\mathrm{round},r}} {\sum_r N_{\mathrm{committed},r}}.

分子是该请求观测窗口内各轮实际耗时,分母是同期提交的输出 token,包含实现规定的 bonus / correction token;不要只除以 draft 长度或被接受的草稿数。若组件并行执行,各组件耗时之和也不能直接代替整轮墙钟时间。服务整体吞吐另以总提交 token 数除以观测窗口墙钟时间计算,不能将并发请求的轮耗时相加作为分母。

报告描述的 confidence 调度会结合接受概率预测与 engine profile 选择验证长度。要在自己的服务里认定这条路径生效,至少要看到实际 draft/verify 调用、每轮验证长度和提交数。配置字段、模型里存在 forward_spec,都不足以证明生成循环已经启用投机解码。

8. 公开参考代码与报告路径:逐项核对

本次核对的 inference/README.md 将其定位为可读参考实现,并明确生成采用普通自回归采样。具体到 model.py,可以得到更精确的范围:

能力固定版本参考代码中的证据可以据此下的判断
CSA2 复用source layers + SharedAttentionRuntime可以检查 global KV 与 top-k 的拥有者
两级索引select_candidate_blocks + uses_candidates可以检查候选池和最终 top-k 的区别
CED Prefill 省算Transformer.forward 对输入遍历全部 self.layers;KV compressor 接收本层输入不能直接用这条路径复现报告的 encoder-only 主 Prefill 与 decoder KV 来源
紧凑 FP4 KV 存储量化后将数值写回浮点 cache buffer能检查量化语义,不能直接从 buffer 占用验证 890 B/token
DSpark 生成forward_spec;README 声明生成仍为普通 ARdraft 模块存在不等于完整投机生成已启用
Engram offloadParallelEngramEmbedding 与查询、投影路径不能据此认定 host/RDMA 预取已经接入
表 3 · 参考实现能回答哪些问题 仅针对 dba1be0a/inference 的源码核对;不是所有框架的支持矩阵,也不代表官方生产系统。没有运行此模型做正确性或性能测试。

读模型源码时,这一步应当先于性能估算。同一份权重在不同 runtime 中可能采用不同缓存布局和执行路径;报告、参考实现与某个实际服务的结果需要分别引用。

9. 与 Kimi K3 放在一起看

Kimi K3 把多数层的历史压进固定 recurrent state;V4.1 Flash 保留可检索的压缩全局历史,同时减少跨层副本与重复索引。两者让性能分析关注不同的对象:

  • K3 要看 state 更新与搬运、周期性 MLA 扫描,以及 KDA checkpoint 与 MLA cache 的共同命中边界。
  • V4.1 Flash 要看 KV source 的共享关系、索引搜索域、SWA 恢复和 CED 实际执行路径。
  • 两者都仍需单独分析 MoE 权重访问、专家通信及调度;attention 更省不代表整网瓶颈同比例缩小。

下一步的验证应从固定 runtime 的真实路径开始:确认 cache dtype/layout、Prefill 层执行、prefix 恢复和投机生成,再在相同硬件、并发及输入/输出长度下比较 TTFT、TPOT 与满足 SLO 的吞吐。本文的推导提供待测对象,不给出未经测量的速度排名。

相关页面

主要来源

修改历史1 次提交