← 返回首页
推理加速2026-09-21 发布

DeepSeek-V4.1-Flash 推理加速解读

CED 层切分 + CSA2 跨层 KV 共享:四种推理配置的架构与路径图解

背景

两大核心正交优化

① CED(Causal Encoder-Decoder)——解决 Prefill「读」的计算开销

② CSA2(Compressed Sparse Attention 2)——解决 KV「存储」开销

叠加收益:CED + CSA2 组合,同一条请求的持久化 Prefix 缓存可压缩至原始基线的 1/8。

页面图示规划(本页配套图解)

说明:图内数值为基于官方报告口径的示意推导,仅用于横向对比,非硬件实测数据。

输入 30,000 tokens
输出 1,000 tokens
模型 552B MoE · 40 层(20 Enc + 20 Dec)
KV 格式 FP4
架构总览
模型架构:40 层主干怎么切

40 层主干被切成两段:前 20 层是因果编码器,后 20 层是解码器。 两段之间通过 KV 投影连接——解码器的全局 KV 不从自身生成,而是由编码器最后一层投射得到。

图 1 · 模型架构
flowchart TD classDef io fill:#f6f8fa,stroke:#8b949e,color:#1f2328,stroke-width:1.5px classDef enc fill:#ddf4ff,stroke:#0969da,color:#0969da,stroke-width:1.5px classDef dec fill:#fbefff,stroke:#8250df,color:#8250df,stroke-width:1.5px classDef proj fill:#fff,stroke:#d0d7de,color:#59636e,stroke-dasharray:4 3 IN["输入 tokens
文本 + 图像"]:::io subgraph ENC["因果编码器 · 20 层"] direction TB E1["层 1–20
每层内含 MoE 路由
Prefill 激活 8B/token"]:::enc end PROJ["KV 投影
每层独立投射权重
不涉及注意力 / MoE"]:::proj subgraph DEC["解码器 · 20 层"] direction TB D1["层 21–40
每层内含 MoE 路由
Decode 激活 16B/token"]:::dec end OUT["输出 tokens"]:::io IN --> ENC ENC -->|"H_20 隐藏态"| PROJ PROJ --> DEC DEC --> OUT
非对称 40 层:前 20 层编码器,后 20 层解码器
KV 投影:解码器 KV 由编码器最后一层投射,每层独立权重
MoE 路由:552B 总参数,每 token 只激活 8B 或 16B
40 层全为因果注意力层:无 DeltaNet 等线性注意力,层类型均匀
推理路径 · 总览
图 2 · 总体执行路径:Prefill 与 Decode 怎么衔接

先看整体节奏:Prefill 一次性读入 30,000 tokens,只跑编码器 20 层,产出全局 KV; Decode 每步拿 1 个新 token,跑全栈 40 层,直接复用这份 KV,逐步生成输出。 两条路径通过「KV 投影」衔接——这也是后面 CED 优化的切入点。

图 2 · 总体执行路径
flowchart LR classDef io fill:#f6f8fa,stroke:#8b949e,color:#1f2328,stroke-width:1.5px classDef pf fill:#ddf4ff,stroke:#0969da,color:#0969da,stroke-width:1.5px classDef dc fill:#fbefff,stroke:#8250df,color:#8250df,stroke-width:1.5px classDef kv fill:#dafbe1,stroke:#1a7f37,color:#1a7f37,stroke-width:1.5px subgraph PF["Prefill · 一次性"] direction LR A1["读入 30,000 tokens"]:::io --> A2["编码器 20 层
产出 H_20"]:::pf A2 --> A3["KV 投影
解码器全局 KV"]:::kv end subgraph DC["Decode · 逐步 × 1,000"] direction LR B1["每步 1 个新 token"]:::io --> B2["全栈 40 层
复用投影 KV"]:::dc --> B3["输出 token"]:::io end A3 -.->|"Prefill 一次性生成
Decode 每步直接复用"| B2
Prefill 一次性读入全部输入:30,000 tokens 只跑编码器 20 层(8B/token)
KV 投影是一次性桥梁:H_20 → 解码器全局 KV,Prefill 产出、Decode 复用
Decode 每步 1 个新 token 跑全栈:40 层都在工作,逐步生成 1,000 个输出
一句话总结:两条路径靠「KV 投影」衔接——Prefill 产出,Decode 复用。 Prefill 和 Decode 各自的详细路径见图 3、图 4。
推理路径 · Prefill
图 3 · Prefill 路径:只跑编码器 20 层

Prefill 阶段的产出有两个:对输入的完整理解(H_20)和 解码器要用的全局 KV。解码器的 20 层在这个阶段完全不执行。

图 3 · Prefill 路径
flowchart LR classDef io fill:#f6f8fa,stroke:#8b949e,color:#1f2328,stroke-width:1.5px classDef enc fill:#ddf4ff,stroke:#0969da,color:#0969da,stroke-width:1.5px classDef proj fill:#fff,stroke:#d0d7de,color:#59636e,stroke-dasharray:4 3 classDef kv fill:#dafbe1,stroke:#1a7f37,color:#1a7f37,stroke-width:1.5px classDef dec fill:#fbefff,stroke:#8250df,color:#8250df,stroke-width:1.2px A1["输入
30,000 tokens"]:::io --> A2["编码器 20 层
8B/token 激活"]:::enc A2 --> A3["H_20
浓缩全部上下文"]:::proj A3 --> A4["KV 投影
每层独立投射权重
不涉及注意力 / MoE"]:::proj A4 --> A5["解码器全局 KV
≈ 640 B/token"]:::kv X["解码器 20 层
本阶段不执行"]:::dec A5 -.-> X
维度Prefill(读)
执行层数 只跑编码器 20 层
每 token 激活参数 8B
解码器 KV 来源 从编码器第 20 层隐藏态 H_20 投影生成,每层独立投射权重,不涉及注意力 / MoE
处理 token 数 30,000(全部输入,一次性)
编码器在做什么 承担长上下文的主要计算
Prefill 只跑编码器:输入 token 只穿过前 20 层,解码器不参与 Prefill 计算
KV 投影是一次性的:H_20 → 解码器 KV,每 token 只做一次,Decode 阶段直接复用
推理路径 · Decode
图 4 · Decode 路径:跑全栈 40 层,逐步生成

Decode 阶段跑全栈 40 层:编码器轻量处理新生成的单个 token, 解码器基于 Prefill 投影的全局 KV 做注意力,逐步生成输出。

图 4 · Decode 路径
flowchart LR classDef io fill:#f6f8fa,stroke:#8b949e,color:#1f2328,stroke-width:1.5px classDef enc fill:#ddf4ff,stroke:#0969da,color:#0969da,stroke-width:1.5px classDef dec fill:#fbefff,stroke:#8250df,color:#8250df,stroke-width:1.5px B1["新 token
每步 1 个"]:::io --> B2["编码器 20 层
轻量处理单 token"]:::enc B2 --> B3["解码器 20 层
16B/token 激活
复用投影 KV"]:::dec B3 --> B4["输出 token"]:::io B4 -.->|"自回归循环
共 1,000 步"| B1
维度Decode(写)
执行层数 跑全栈 40 层(20 Enc + 20 Dec)
每 token 激活参数 16B
解码器 KV 来源 直接复用 Prefill 阶段生成的投影 KV
处理 token 数 1,000(逐步生成,每步 1 个)
解码器在做什么 逐层计算注意力,基于投影 KV 生成输出
Decode 跑全栈:编码器也在工作,只是每次只处理 1 个新 token,计算量很小
省的是 Prefill 计算量:30,000 个输入 token 少跑 20 层,这是 CED 的最大收益来源
一句话总结:Prefill 只跑编码器(8B/token)产出全局 KV;Decode 跑全栈(16B/token)逐步生成, 直接复用投影 KV。后面的 CED 和 CSA2 都是在这条基本执行路径上做的优化。
机制说明 CED 做了什么?—— 让 Prefill 少跑一半的层

CED 把 40 层 Transformer 拆成 20 层编码器 + 20 层解码器。Prefill 只跑编码器, 解码器的 KV 缓存不再由自己计算,而是直接从编码器输出投影得到。计算量因此减半。

图 5 · CED 机制
flowchart TD classDef enc fill:#ddf4ff,stroke:#0969da,color:#0969da,stroke-width:1.5px classDef dec fill:#fbefff,stroke:#8250df,color:#8250df,stroke-width:1.5px classDef bad fill:#ffebe9,stroke:#cf222e,color:#cf222e,stroke-width:1.5px classDef good fill:#dafbe1,stroke:#1a7f37,color:#1a7f37,stroke-width:1.5px classDef io fill:#f6f8fa,stroke:#8b949e,color:#1f2328,stroke-width:1.5px subgraph OLD["无 CED · Prefill 跑满 40 层"] direction LR A1["输入
30K tokens"]:::io --> B1["编码器
20 层"]:::enc B1 --> C1["解码器
20 层
自己算 KV"]:::dec C1 --> D1["Prefill 激活
480,000 B"]:::bad end subgraph NEW["有 CED · Prefill 只跑 20 层"] direction LR A2["输入
30K tokens"]:::io --> B2["编码器
20 层"]:::enc B2 -->|"KV 投影"| C2["解码器
20 层
不重算 KV"]:::dec C2 --> D2["Prefill 激活
240,000 B"]:::good end
机制说明 CSA2 做了什么?—— 让 KV 缓存不再每层都存一份

CSA2 把 40 层分成若干共享组,每组只有部分层存储完整的「主 KV + 索引器 K + Top-K 索引」, 其余层通过 Reindex(复用 KV、重选 Top-K)或 Reuse(KV 与 Top-K 全复用)来工作。 存储量因此大幅下降。

图 6 · CSA2 机制
flowchart LR classDef full fill:#0969da,stroke:#0969da,color:#ffffff,stroke-width:1.5px classDef reindex fill:#54aeff,stroke:#0969da,color:#1f2328,stroke-width:1.2px classDef reuse fill:#cae8ff,stroke:#0969da,color:#1f2328,stroke-width:1.2px classDef src fill:#ddf4ff,stroke:#0969da,color:#0969da,stroke-width:1.5px ENC["编码器 · 层 1–20
正常逐层前向"]:::src --> H20["H_20 · 编码器末层隐藏态
解码段 层 21–40 全局 KV 的唯一来源"]:::src H20 -->|"KV 投影 W₂₁"| FA H20 -->|"KV 投影 W₂₅"| FB H20 -->|"KV 投影 W₂₉"| FC H20 -->|"KV 投影 W₃₃"| FD H20 -->|"KV 投影 W₃₇"| FE subgraph GA["共享组 1 · 层 21–24"] direction LR FA["层 21 · Full
投影 W₂₁(H_20) 持有
主 KV + 索引器 K + Top-K"]:::full RA["层 22 · Reuse
KV 与 Top-K 全复用"]:::reuse RB["层 23 · Reindex
复用 KV,重选 Top-K"]:::reindex RC["层 24 · Reuse
KV 与 Top-K 全复用"]:::reuse FA -.->|共享| RA FA -.->|共享| RB FA -.->|共享| RC end subgraph GB["共享组 2 · 层 25–28"] direction LR FB["层 25 · Full
投影 W₂₅(H_20) 持有
主 KV + 索引器 K + Top-K"]:::full RD["层 26 · Reuse
KV 与 Top-K 全复用"]:::reuse RE["层 27 · Reindex
复用 KV,重选 Top-K"]:::reindex RF["层 28 · Reuse
KV 与 Top-K 全复用"]:::reuse FB -.->|共享| RD FB -.->|共享| RE FB -.->|共享| RF end subgraph GC["共享组 3 · 层 29–32"] direction LR FC["层 29 · Full
投影 W₂₉(H_20) 持有
主 KV + 索引器 K + Top-K"]:::full RG["层 30 · Reuse
KV 与 Top-K 全复用"]:::reuse RH["层 31 · Reindex
复用 KV,重选 Top-K"]:::reindex RI["层 32 · Reuse
KV 与 Top-K 全复用"]:::reuse FC -.->|共享| RG FC -.->|共享| RH FC -.->|共享| RI end subgraph GD["共享组 4 · 层 33–36"] direction LR FD["层 33 · Full
投影 W₃₃(H_20) 持有
主 KV + 索引器 K + Top-K"]:::full RJ["层 34 · Reuse
KV 与 Top-K 全复用"]:::reuse RK["层 35 · Reindex
复用 KV,重选 Top-K"]:::reindex RL["层 36 · Reuse
KV 与 Top-K 全复用"]:::reuse FD -.->|共享| RJ FD -.->|共享| RK FD -.->|共享| RL end subgraph GE["共享组 5 · 层 37–40"] direction LR FE["层 37 · Full
投影 W₃₇(H_20) 持有
主 KV + 索引器 K + Top-K"]:::full RM["层 38 · Reuse
KV 与 Top-K 全复用"]:::reuse RN["层 39 · Reindex
复用 KV,重选 Top-K"]:::reindex RO["层 40 · Reuse
KV 与 Top-K 全复用"]:::reuse FE -.->|共享| RM FE -.->|共享| RN FE -.->|共享| RO end
流程 01
无优化 · Baseline

40 层全部执行,KV 缓存不做任何压缩。这是对比的起点:读输入最贵,记输入也最占内存。

图 7 · 流程 01 · 无优化
Prefill 激活计算量
480,000 B 基准
30,000 × 16B/token
KV 缓存占用
110.4 MB 基准
31,000 × 3,560 B
持久化缓存(SSD)
110.4 MB 基准
完整落盘
流程 02
仅开 CED

Prefill 只跑 20 层编码器,计算量直接减半。解码器的 KV 由编码器输出投影得到,不需要自己再算一遍。 但 KV 缓存本身没有压缩——省的是「读」的成本,不是「记」的成本。

图 8 · 流程 02 · 仅开 CED
Prefill 激活计算量
240,000 B ↓ 50%
30,000 × 8B/token
KV 缓存占用
110.4 MB 无变化
仍 31,000 × 3,560 B
持久化缓存(SSD)
110.4 MB 无变化
完整落盘
流程 03
仅开 CSA2

40 层仍然全跑,Prefill 计算量不变。但 KV 缓存被 CSA2 压缩到 1/4:跨层共享主 KV,索引复用, 部分层直接复用其他层的 Top-K 索引。省的是「记」的成本,不是「读」的成本。

图 9 · 流程 03 · 仅开 CSA2
Prefill 激活计算量
480,000 B 无变化
30,000 × 16B/token
KV 缓存占用
27.6 MB ↓ 75%
31,000 × 890 B
持久化缓存(SSD)
27.6 MB ↓ 75%
随 HBM 同步压缩
流程 04
CED + CSA2 全开

两个优化正交叠加:Prefill 只跑编码器,KV 缓存同时被 CSA2 压缩。 持久化缓存进一步受益于 SWA Bounded Replay,降到约 1/8。 这是同一条请求的完整形态。

图 10 · 流程 04 · 全开
Prefill 激活计算量
240,000 B ↓ 50%
30,000 × 8B/token
KV 缓存占用
27.6 MB ↓ 75%
31,000 × 890 B
持久化缓存(SSD)
≈ 13.8 MB ↓ 87.5%
SWA Bounded Replay
数据口径:数字基于 DeepSeek-V4.1-Flash 官方技术报告推导。 Baseline 的 KV 缓存按 890 B/token × 4 ≈ 3,560 B/token 估算。 四个流程共用同一条请求:30,000 tokens 输入、1,000 tokens 输出、FP4 KV 格式。 实际部署会受硬件、量化方案、批次大小等因素影响,此处为示意性估算。
首页