← 返回首页
推理加速2026-09-21 发布
DeepSeek-V4.1-Flash 推理加速解读
CED 层切分 + CSA2 跨层 KV 共享:四种推理配置的架构与路径图解
背景
- 固有瓶颈:Transformer 每一层都独立保存专属 K、V 张量——层数越多、上下文越长,KV Cache 的显存占用与内存带宽开销同步上涨;
- 核心卖点:DeepSeek V4.1-Flash 在 1M 上下文场景下,KV Cache 成本显著低于同级别大模型;
- 实现路径:整套方案由两套正交优化构成——CED 优化 Prefill 计算开销,CSA2 压缩 KV 存储开销。
两大核心正交优化
① CED(Causal Encoder-Decoder)——解决 Prefill「读」的计算开销
- 做法:Prefill 阶段仅执行编码器 20 层;解码器侧 KV 不再逐层计算,直接由编码器隐藏态一次性投影生成;
- 收益:输入 Prefill 阶段计算量减少一半。
② CSA2(Compressed Sparse Attention 2)——解决 KV「存储」开销
- 做法:解码器内 4 个全注意力层共享同一份 KV 缓存,每层配套小型转换模块完成跨层映射;
- 收益:KV 存储容量压缩至原基线的 1/4。
叠加收益:CED + CSA2 组合,同一条请求的持久化 Prefix 缓存可压缩至原始基线的 1/8。
页面图示规划(本页配套图解)
- 图 1:CED + CSA2 整体架构切分示意图;
- 图 2–4:完整执行链路拆解——图 2 总执行路径、图 3 Prefill 执行路径、图 4 Decode 执行路径;
- 图 5–6:CED、CSA2 机制对比差异;
- 图 7–10:同一条请求(输入 30k token / 输出 1k token)在 4 种不同配置下的端到端推演对比。
说明:图内数值为基于官方报告口径的示意推导,仅用于横向对比,非硬件实测数据。
输入 30,000 tokens
输出 1,000 tokens
模型 552B MoE · 40 层(20 Enc + 20 Dec)
KV 格式 FP4
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
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
基准
完整落盘
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
无变化
完整落盘
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 同步压缩
两个优化正交叠加: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 格式。
实际部署会受硬件、量化方案、批次大小等因素影响,此处为示意性估算。