30 秒读懂
V4.1-Flash 是一个 552B 主干参数的多模态 MoE (每层 1 个共享专家 + 384 个路由专家,每 token 选 6 个),共 40 层。最反直觉的数字是 8B / 16B :处理输入(prefill)时每个 token 只激活 8B,生成输出(decode)时激活 16B。
差别不在专家路由,而在token 走过的层数 。CED 把 40 层切成 20 层因果 encoder + 20 层 decoder,并让 decoder 的全局 KV 直接由 encoder 最后一层的 hidden state 投影得到。于是输入 token 跑完前 20 层,就已经把后 20 层要用的全局 KV 留好了;只有生成下一个 token 时才必须走完 40 层。
代价是:decoder 每层仍保留自己的滑窗注意力(SWA),prefill 末尾要把最后 128 个 token 再过一遍 decoder,做近似重建(SWA Bounded Replay)。再配上跨层共享 KV 的 CSA2 和 FP4 缓存,全局 KV 降到 890 字节/token (V4-Flash 的约 1/4),持久化 KV 降到约 1/8。
这篇报告究竟要回答什么问题?
在输入远多于输出的 agent 负载下,能否让「读输入」只付一半的模型计算,同时把长上下文 KV 缓存再压到前代的 1/4,而且不掉能力?
8B / 16B
每 token 激活参数 prefill / decode
552B
主干参数 另有 196B Engram 查表参数
890 B
每 token 全局 KV V4-Flash 为 3,514 B
01 · 问题
普通 decoder-only 模型,为什么输入和输出一样贵?
先对齐口径。激活参数 指一个 token 前向时真正参与矩阵乘法的参数:每层的 attention 投影 + 1 个共享专家 + 路由选中的 6 个专家,再乘以它经过的层数。V4.1-Flash 在 prefill 和 decode 下的路由规则完全相同(都是 top-6),所以 8B 与 16B 的差别只能来自 token 经过的层数 。Engram 的 196B 是按 n-gram 哈希查的记忆表,像 embedding 一样只做查表,不计入激活参数。
那么,普通模型里输入 token 为什么必须走完所有层?看看两类 token 在一次请求里各自要做什么:
输出 token 的任务
给出下一个 token 的预测
预测来自最后一层的 hidden state 经过输出头,所以必须走完全部层 ,无可省略。
输入 token 的任务
在每一层给后面的 token 留下 KV
除最后一个外,输入 token 的预测根本没人用。它存在的意义只是让后续 token 在每层的 attention 里能读到它。
问题在于,标准结构里第 l 层的 KV 由第 l 层自己的 hidden state 投影而来 (KV_l = H_l · W_l)。想在第 40 层留下 KV,就得先把这个 token 一路算到第 40 层。于是「留 KV」和「做预测」一样贵,前代 V4-Flash 的 13B 激活对输入、输出一视同仁。
agent 负载把这个问题放大了:
输入远多于输出 :每次工具调用都会把文件内容、命令输出、网页塞回上下文,新增的 prefill 量往往远大于每轮生成。
缓存未命中就得重算 :前缀缓存过期或新内容进来,都要做一次完整深度的 prefill。
KV 越存越大 :长上下文的全局 KV 占满 HBM,为前缀复用而持久化的 KV 又占 SSD 容量和传输带宽。
报告的判断是:稀疏注意力已经把长序列的注意力计算 压得很低,现在剩下的瓶颈是 prefill 本身的计算量 ,以及 KV 的存储和搬运 。V4.1-Flash 的结构改动分别针对这两项。
03 · 核心答案
CED:让 decoder 的全局 KV 只依赖 encoder 的输出
CED 只改了一件事:decoder 各层全局注意力的 KV 从哪里来 。先看全局结构,再逐步拆开。
用公式写出来,区别只在 decoder 那一行:
C_l 是全局 KV 条目,Z_l 是对应的压缩权重(CSA2 用它把相邻 m 个 token 加权合成一个条目;decoder 的 m = 1)。关键在于右边只出现 H_20 :一个 token 只要算到第 20 层,它在第 21–40 层的全局 KV 就能直接投影出来。结合 CSA2 的配置,decoder 里只有第 21 层是 Full 层,真正执行这次投影,其余 19 层都复用它,所以 decoder 实际只存一份全局 KV 。
三个容易误读的点:
encoder 仍然是因果的 :它叫 encoder,但和 BERT 式双向编码器无关,只是「下半网络」。每个 token 仍只能看见自己和之前的 token,所以整体照常自回归生成。
只有全局 KV 改了道,SWA 没有 :decoder 每层的滑窗 KV 仍来自本层 hidden。这保住了上半网络的局部计算深度,也带来了下面要讲的 replay 代价。
16B 是整条路径,不是 decoder 的大小 :decode 时 encoder 和 decoder 都要跑,两半各约 8B。
走一遍:一轮 agent 交互在 CED 里怎么流动
设想一个 coding agent:上下文里已经缓存了约 200K token(系统提示、仓库文件、历史对话);这一轮 pytest 返回了 4,000 token 的报错日志 ,模型要据此写出约 400 token 的分析和下一步工具调用。逐步点「下一步」,再切到对照模式,看看同样 40 层但不用 CED 时有什么不同。
V4.1-Flash(CED)
对照:同样 40 层、不用 CED
每列代表一段 token,每格代表这段 token 在这一部分网络上的计算
已计算
近似重放(只补 SWA KV)
已在缓存,本轮不算
跳过,不计算
描边 = 本步新发生
— 每个输入 token 激活
— 每个输出 token 激活
— 本轮 prefill 的「token × 层」(相对不用 CED)
上一步
下一步
重置
8B 和 16B 的账是怎么算出来的
报告没有给出参数拆分,但用 §4.2.1 的超参(hidden 5120,每个专家中间维 2304,64 个 query head × 512 维等)可以粗算,结果和官方数字吻合:
项目 计算 约值
单个专家(SwiGLU 三个矩阵) 3 × 5120 × 2304 35.4M
每层激活的 MoE (1 共享 + 6 路由) × 35.4M 0.25B
每层 attention 投影 Q 低秩投影 + KV + 分组输出投影 + indexer 0.13B
每层激活合计 ≈ 0.38B
prefill:每个输入 token 20 层 × 0.38B ≈ 7.6B → 8B
decode:每个输出 token 40 层 × 0.38B + 输出头 0.66B ≈ 15.8B → 16B
校验:主干总参数 40 × (384 × 35.4M + 0.17B) + 词表矩阵 2 × 0.66B ≈ 552B ✓
结论很直接:8B / 16B 的差异就是 20 层与 40 层的差异 ,路由、专家数、每层宽度在两个阶段完全相同。prefill 时 decoder 唯一多出的工作,是第 21 层把 H_20 投影成全局 KV(不到 0.01B),以及末尾 128 个 token 的 replay。
attention 投影 0.13B 的拆分按报告超参逐项相乘;norm、router、mHC 系数等小项未计
投影 形状 参数
Q 压缩(hidden → query latent) 5120 × 1280 6.6M
Q 展开(latent → 64 head × 512) 1280 × 32768 41.9M
KV(hidden → 512 维共享 latent) 5120 × 512 2.6M
分组输出投影 A(8 组,每组 4096 → 1024) 8 × 4096 × 1024 33.6M
输出投影 B(8192 → hidden) 8192 × 5120 41.9M
indexer Q(latent → 32 head × 128) 1280 × 4096 5.2M
合计 ≈ 132M
词表约 129K(参考代码中图像 token id 为 129264),词表矩阵 ≈ 129K × 5120 ≈ 0.66B。是否把输入 embedding 计入激活参数会让结果差 0.66B 左右,不影响 20 层对 40 层的比例。
「接近减半」有个前提:新输入要足够长
报告给出的 prefill 复杂度是从 O(N·L) 降到 O(N·L/2 + n_win·L/2),其中 N 是本轮新输入的 token 数,n_win = 128 是滑窗大小。第二项就是末尾 replay 那 128 个 token 过 decoder 的固定开销,所以相对不用 CED 的比例约为 1/2 + 64/N :
本轮新输入 N 128 1,000 4,000 32,000 ≥ 128K
prefill「token × 层」相对不用 CED ≈ 100% ≈ 56% ≈ 52% ≈ 50.2% ≈ 50%
按报告公式推算,只计 Transformer 层的 token 数,不含注意力随上下文增长的部分;若前缀的 encoder SWA KV 已过期,还要多重放 128 个 token 的 encoder。
这也解释了为什么 replay 必须有界 。decoder 的 SWA 依赖逐层叠加:第 40 层看前 128 个位置的第 39 层状态,而这些状态又各自看前 128 个位置的第 38 层……精确重建需要 20 × 128 = 2,560 个 token 过 decoder。多轮对话里每轮新输入常常只有几百 token,这笔固定开销会吃掉大部分收益。报告引用 PowerAttention 的观察:SWA 的有效感受野远小于理论值 ,于是只重放最后 128 个 token、把 SWA 截断在重放段内,接受近似结果,并在 post-training 中模拟同样的 replay 做训练适配。
04 · 配套改动
把 KV 再压到 1/4:CSA2、FP4 与有界重放
CED 省下的是 prefill 计算 ;报告标题里的「KV 缓存压缩」主要靠另外三项。KV 的开销可以沿三个相乘的维度压缩:每个条目的大小 (GQA、MLA、量化)、序列维 (每 m 个 token 合成一个条目)、层维 (多层共用一份)。V4 主要压了前两维,V4.1 补上了层维,并把条目大小再减半。
CSA2:40 层里只有 4 层生产全局 KV
CSA2 保留了 CSA 的骨架(压缩 KV + indexer 选 Top-K + SWA 分支),但给每一层静态指定 三种模式之一:
Full :自己算主 KV,从主 KV 投影出 indexer K,再跑 indexer 选出新的 Top-K。等同于 V4 里一个完整的 CSA 层。
Reindex :复用最近一个 Full 层的主 KV 和 indexer K,但用自己的 indexer Q 重新打分,选出自己的 Top-K。同一份 KV,不同的选择。
Reuse :KV 和 Top-K 都复用最近一个产生索引的层,不跑 indexer,直接做稀疏注意力。
三种模式下,每层都保留自己的 query 和 SWA KV ,所以每层的注意力输出仍然不同。共享 KV 省的是存储,复用索引省的是 indexer 计算,两者解耦。
V4.1-Flash 的具体排布如下。把它和 CED 叠在一起看,就能看出哪些层生产 KV、prefill 在哪里停:
相对 V4 的 CSA,CSA2 还做了两处简化:压缩器去掉了相邻条目的重叠窗口和绝对位置编码 (CSA 用 2m 个原始条目生成一个压缩条目,相邻条目有重叠);indexer K 直接由主 KV 投影 ,不再从 hidden 单独压缩一路。另外,V4.1 全部使用 CSA2,不再混用 HCA。
Hierarchical Sparse Indexer:decoder 里后面的 indexer 只在候选池里找第 21 层圈出最多 16,384 个候选位置,后续 Reindex 层的打分量不再随上下文长度增长
FP4 主 KV 缓存
V4 已经用量化感知训练(QAT)把 indexer 的 Q、K 做成 FP4;V4.1 在 post-training 中把 QAT 扩展到主 KV 缓存 :
格式 :E2M1 数值,每 16 个通道共用一个 E4M3 缩放因子(类似 NVFP4,但去掉了第二级全局缩放)。报告论证 KV latent 经 RMSNorm 后幅度有上界(约 22.6),这个格式的动态范围足够。
只用于存储 :读出时先反量化再做注意力,不依赖硬件原生支持 FP4 矩阵乘,跨平台兼容。
在 RoPE 之后量化 ;SWA KV 对量化更敏感,仍保留 FP8。
相比 V4 的 FP8 主 KV,存储几乎减半,HBM 和 SSD 上都一样。CSA2 跨层共享叠加 FP4,正好把每 token 全局 KV 算到 890 字节:
890 字节/token 是怎么来的按报告配置推算:4 份全局 KV(encoder 3 份压缩比 2,decoder 1 份不压缩),每份含主 KV 与 indexer K
组成 每个条目 每 token 条目数 字节 / token
encoder 主 KV(3 个 Full 层,压缩比 2) 512 维 × FP4 = 256 B + 32 个 E4M3 缩放 = 288 B 3 × 0.5 = 1.5 432
encoder indexer K 128 维 × FP4 = 64 B + 4 个缩放(每 32 维一个)= 68 B 1.5 102
decoder 主 KV(1 个 Full 层,压缩比 1) 288 B 1 288
decoder indexer K 68 B 1 68
合计 890
indexer 的分组大小(32 维、E8M0 缩放)取自参考推理代码中的注释;推算结果与报告的 890 字节完全一致。SWA KV 有窗口上限、不随长度增长,不计入全局 KV。
SWA Bounded Replay:持久化缓存里不再存 SWA KV
有界重放在 CED 那里用来省 decoder 的 prefill;在部署层面,同一个技巧还解决了 V4 遗留的持久化缓存问题。SWA KV 的访问模式和持久化缓存不匹配:全局 KV 有长尾复用(几天后同一前缀还可能被命中),SWA KV 只在一个活跃会话的分钟级窗口 内有用,下一轮开始就作废了。
V4 的持久化缓存
SSD 上同时存全局 KV (完整前缀)和 SWA KV (在 prompt 结尾、输出结尾各存 128 个条目)
SWA KV 占了近一半容量,短轮次的多轮对话里尤其浪费
不存 SWA 的方案(Zero SWA Caching)需要重放 L × 128 个 token,生产上太贵
V4.1 的做法
持久化缓存只存全局 KV ,保证至少 72 小时
SWA KV 放进每台机器 10% 主机内存组成的分布式池,TTL 仅几分钟
命中全局 KV 但 SWA KV 已过期时,用 Encoder SWA Bounded Replay 重放前缀最后 128 个 token,只补 SWA KV
两个因子相乘:持久化缓存不再存 SWA KV(约减半),剩下的全局 KV 又是 V4 的 1/4,合起来约为 V4-Flash 的 1/8 。代价是重放得到的状态是近似的:从不同位置续接缓存时,后续算出的 KV 在数学上并不完全相同。报告称实验中对回答质量的影响可以忽略。
05 · 其他调整
其他架构调整一览
下面这些和「8B / 16B」没有直接关系,但都是这一代相对 V4 的结构变化。按需展开:
▸ Single-Pass mHC 残差流混合系数错位一层,让融合 kernel 只读写一遍残差,激活访存减半
V4 引入的 mHC 在相邻 block 之间维持 n = 4 路残差流,每个 block 根据当前残差 X_l 预测混合系数 (A_l, B_l, C_l)。问题在于输入混合 A_l·X_l 要等 A_l 算完,而 A_l 需要对整个 X_l 做归约,所以必须读两遍 X_l。
Single-Pass mHC 让每个 block 使用上一个 block 算出的 A_{l-1} 做输入混合,依赖消失。部署时残差更新、输入混合、系数预测融合成一个 Mega-mHC kernel,残差只读一次、写一次,激活访存相对原四 kernel 实现减半 。报告称这一错位带来的效果损失可以忽略。
▸ Engram 条件记忆(196B) 按 n-gram 哈希查表的稀疏记忆,把「记忆」从「计算」里拆出来,不计入激活参数
196B 参数平均分成两个模块,放在第 1、14 层(从 0 计数)。每个模块使用 2、3、4 阶 n-gram,8 个哈希头,每个头一张约 16M 行的表(行数取互不相同的素数),表和投影都用 FP8。
因为地址只由 token 序列决定,推理时可以提前通过 RDMA 从主机内存预取 ,与第一个 Transformer block 的计算重叠。相对原版 Engram 去掉了短因果卷积,因为收益抵不上推理栈的复杂度。
▸ DSpark 投机解码,取代 MTP 半自回归草稿 + 置信度调度验证长度;预训练后单独训练,不回传梯度给主干
drafter 由 3 个 Transformer block 组成(滑窗 128),一次前向并行给出 5 个草稿位置的 logits,再用一个轻量 Markov head 建模草稿 token 之间的依赖。置信度 head 预测每个位置被接受的概率,调度器结合引擎吞吐曲线,为每个请求动态选择验证长度 。
与 V3 的 MTP 不同,主干预训练时不带 MTP。DSpark 在预训练之后冻结主干单独训练;post-training 时随主干一起更新,但不把梯度传回主干,这样它能持续对齐策略,同时加速在线服务和 RL rollout。
▸ 原生多模态 从零训练的 DeepSeek-ViT + 3×3 pixel-unshuffle;图文 token 分别做负载均衡
DeepSeek-ViT(32 层,1024 维)用 2D-RoPE 支持任意分辨率,把 patch embedding 的卷积换成线性投影以适配 Muon。图像特征经 3×3 pixel-unshuffle,视觉 token 数降到 1/9 ,支持约 1344×1344 输入,再由 2 层 MLP 投影到 5120 维。
多模态数据从语言模型预训练一开始就加入,纯文本与多模态 token 比例约 7 : 1。MoE 的无辅助损失负载均衡为图像 token 和文本 token 各维护一套偏置 ,避免两种模态的不均衡在总体统计里互相掩盖。
▸ 优化器:head-wise Muon + Sinkhorn 平衡更新 Q/K 按 head 分别做 Muon;embedding、Engram 表和输出头用只需动量的 Sinkhorn 更新替代 Adam
head-wise Muon :Query / Key 权重按 head 切开后各自做 Muon 更新,相当于给每个 head 不同的预条件器,以适应 head 之间的异质性。
Sinkhorn 平衡更新 :对 196B 的 Engram 表用 Adam 会让优化器状态暴涨。V4.1 改为 Nesterov 动量后,交替对更新矩阵做行、列归一化(Sinkhorn),使行、列 RMS 近似为 1。它和 Muon 一样只需一个动量缓冲,报告称效果优于 Adam。
▸ 规格速查 40 层、hidden 5120、384 路由专家选 6、窗口 128、Top-512、45T token、1M 上下文
主干 :40 层(20 encoder + 20 decoder),hidden 5120,每层都是 MoE
MoE :1 共享 + 384 路由专家,每 token 选 6 个,专家中间维 2304,SwiGLU 截断阈值 10
注意力 :64 个 query head × 512 维,query 压缩维 1280;indexer 32 head × 128 维;稀疏注意力 Top-512;SWA 窗口 128
训练 :45T 多模态 token,从零开始用 64K 序列训练稀疏注意力(无 dense warmup),34T token 时扩展到 1M
后训练 :SFT → RL → on-policy distillation,报告明确说算法无创新,收益几乎全部来自数据与环境合成
06 · 证据与代价
效果如何,代价在哪
base 模型对比里,V4.1-Flash 以 V4-Pro 约 1/3 的总参数、约 1/4 的激活参数 ,在知识、推理和代码上接近或超过 V4-Pro,并全面优于 V4-Flash:
Base 模型 V4-Flash V4-Pro V4.1-Flash
激活参数 / 主干参数 13B / 284B 49B / 1.6T 8B·16B / 552B
MMLU-Pro 68.3 73.5 74.1
HumanEval 69.5 76.8 79.4
MATH 57.4 64.5 61.1
SimpleQA-Verified 30.1 55.2 42.3
LongBench-V2 44.7 51.5 45.2
读这张表要注意:这是整模型对比 ,同时变了数据(45T 多模态语料、更强的清洗)、规模和多处结构,不是 CED 的消融 。对于 CED 本身,报告只定性地说它「在减少近一半 prefill 计算的同时,性能与 baseline 相当」,没有给出同规模有无 CED 的对比数字。
输出侧其实更贵了
不对称是一种取舍,不是白赚。每个输出 token 激活 16B,比 V4-Flash 的 13B 还多:
粗略感受一下这笔账(只比较激活参数 × token 数 ,近似线性层计算量,忽略注意力、replay 和投机解码):
输入为主:一轮 agent 工具调用
输入 4,000 / 输出 400
V4.1:4,000 × 8 + 400 × 16 = 38,400 V4-Flash:4,400 × 13 = 57,200 约为前代的 2/3 。
输出为主:短问题、长回答
输入 200 / 输出 2,000
V4.1:200 × 8 + 2,000 × 16 = 33,600 V4-Flash:2,200 × 13 = 28,600 V4.1 反而更贵 (短输入时 replay 开销占比还更高)。
这是按激活参数做的示意,不是报告给出的实测;两代模型能力不同,长上下文下 V4.1 的注意力开销也明显更低。
报告自己承认的边界
近似机制的鲁棒性尚未完全刻画 :CSA2 的稀疏选择误差、SWA Bounded Replay 的近似重建,可能在未测到的极端情况下掉点。报告点名要加强测试的两类场景是超长上下文稀疏检索 和缓存续接边界处的 SWA 状态重建 。
长上下文与知识类仍落后更大的模型 :LongBench-V2 和 SimpleQA-Verified 与 V4-Pro 差距明显;需要专家级领域知识的科学类 agent 任务也仍有差距。
CED 的收益依赖负载形态 :新输入越长越接近减半;短轮次、输出为主的场景收益有限,甚至不如前代。
CED 让模型在 prefill 时每个 token 只激活 8B 参数,decode 时才激活 16B,这对输入密集型的 agent 场景尤其划算。
"This design enables the model to activate 8B parameters per token during prefill and 16B during decode, which is particularly cost-effective for input-heavy agentic scenarios."