六十一:DeepSeek-V3:MLA、DeepSeekMoE 与多 Token 预测¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484903&idx=1&sn=84519a78828338246bc41f759d18b8bd&chksm=f01eb69ec7693f882f43d955b849033e38802ad344840384983de583f0ebb199c3ce40ba2516#rd
1. 学习范围¶
本日围绕 DeepSeek-V3 的三项核心结构展开: - Multi-head Latent Attention,MLA通过联合低秩压缩 Key 和 Value,大幅降低自回归推理的 KV cache。
-
DeepSeekMoE通过细粒度路由专家和共享专家,在控制每 token 激活参数量的同时扩展总参数容量。
-
Multi-Token Prediction,MTP训练时让每个位置顺序预测多个未来 token,增加监督密度,并可复用于推测解码。
学习重点包括它们各自解决的问题、完整公式、V3 的具体参数、训练与推理数据流、常见误区和工程失败模式。
2. DeepSeek-V3 总览¶
DeepSeek-V3 是基于 Transformer 的 Mixture-of-Experts 语言模型。官方技术报告披露的关键数据如下: 项目 DeepSeek-V3 配置 主模型总参数量 671B 每个 token 激活参数量 37B Transformer 层数 61 隐藏维度 7168 上下文长度 128K 预训练 token 数 14.8T 预训练算力消耗 2.664M H800 GPU hours 完整训练算力消耗(预训练 + 上下文扩展 + 后训练) 2.788M H800 GPU hours 官方 Hugging Face 权重总大小对应约 685B 参数,其中包括 671B 主模型和约 14B MTP 模块参数。MTP 模块可以在普通推理时丢弃,因此不能把 685B 全部视为每次推理都必须参与的主模型参数。
V3 的主要架构关系可以概括为:
token embedding
-> Transformer blocks,共 61 层
attention: MLA
FFN: 前 3 层为 dense FFN,其余层为 DeepSeekMoE
-> main output head,预测 next token
训练时额外连接 1-depth MTP module,预测再下一个 token
MLA 和 DeepSeekMoE 已在 DeepSeek-V2 中验证;V3 在此基础上引入无辅助损失为主的负载均衡策略,并设置 MTP 训练目标。
3. 三项技术对应的系统瓶颈¶
三个模块解决的瓶颈不同: 技术 主要瓶颈 核心方法 主要收益 MLA 长上下文解码的 KV cache 容量占用与显存带宽压力 联合压缩 KV,仅缓存隐表征 latent 与位置 Key 显著减少 KV 缓存显存占用、降低显存读写开销 DeepSeekMoE 稠密模型单 Token 计算量随总参数量同步增长 每个 Token 动态路由激活少量专家子网络 扩充模型参数量与知识容量,同时约束推理 FLOPs MTP 单步 Next-Token 监督信号稀疏,表征仅适配单步预测 同时预测多个时序未来 Token 丰富训练监督信号;可用于投机解码加速推理 MLA 主要优化 attention 的推理状态,MoE 主要优化 FFN 的容量-计算关系,MTP 主要改变训练目标。三者不能互相替代。
4. 自回归推理中的 KV Cache¶
标准因果自注意力在生成第 t 个 token 时,需要让当前 Query 访问此前所有位置的 Key 和 Value。若每一步都重新计算历史 token,会产生大量重复计算,因此推理系统缓存每层历史 K/V。详细见五十一:KV cache。
对 L 层、序列长度 S、KV 头数 H_kv、每头维度 D_h 和每元素字节数 B,单请求 KV cache 近似为:
2 分别代表 Key 和 Value。批量、beam、多并发请求还会继续放大缓存。
长上下文解码通常不是只受矩阵 FLOPs 限制,还受显存容量和从 HBM 读取历史 KV 的带宽限制。减少每 token、每层需要缓存和读取的元素数,可以提高可服务并发并改善 decode 吞吐。
5. MHA、MQA、GQA 与 MLA 的缓存演进¶
5.1 Multi-Head Attention¶
MHA 为每个 Query 头保留独立 K/V 头。若有 H 个头,每个历史 token 每层缓存:
5.2 Multi-Query Attention¶
MQA 让所有 Query 头共享一组 K/V:
缓存显著降低,但过强共享可能影响质量或模型容量。5.3 Grouped-Query Attention¶
GQA 使用少于 Query 头数的 H_kv 个 K/V 头,每组 Query 共享一个 K/V 头:
5.4 Multi-head Latent Attention¶
MLA 不直接缓存展开后的各头 K/V,而是把 Key 和 Value 联合压缩到一个低维 latent,并额外保存用于 RoPE 的位置 key。各头内容 K/V 可从 latent 还原,或者在推理 kernel 中通过矩阵吸收直接在 latent 空间计算。
MLA 仍能形成每头不同的内容表示,但缓存不再正比于完整 H * D_h,是一种可学习的连续低秩压缩方案。
6. MLA 的符号与 V3 维度¶
设某一 attention 层第 t 个 token 的输入为:
d_h + d_h^R = 192,Value 每头维度为 128。
7. MLA 的 KV 联合压缩¶
先把隐藏状态压缩成共享的 KV latent:
形状为:
再通过两个上投影分别恢复所有头的内容 Key 和 Value:形状为:
将结果切成 128 个头后,每个k_t,i^C 和 v_t,i^C 都是 128 维。
这里的“联合压缩”指 K 和 V 共享同一个 c_t^KV,但使用不同的上投影矩阵恢复。它不是简单地令 K=V。
本设计的目的是为了大幅降低 KV Cache 显存占用(这也是长上下文最痛的瓶颈)。 但是这样子做,RoPE无法进行矩阵吸收了,所以又设计了下面的方法:
8. 解耦 RoPE¶
矩阵吸收(Projection Absorption)成立的前提:整条路径上只有固定权重矩阵,不能混入随位置变化的算子。RoPE 每个位置 pos 的旋转矩阵都不一样,是位置相关变换;只要 W_UK 外面包着 RoPE,W_UK 就没法被合并进 Query 投影。 直接把 RoPE 应用于从 latent 恢复出的完整 Key,会使旋转矩阵依赖位置,从而妨碍把上投影矩阵吸收到 Query 侧。MLA 把内容子空间和位置子空间分开。标准的RoPE方法见四:位置编码与 RoPE。
位置 Key 为:
其维度为d_h^R=64,并被所有 attention heads 共享。每头完整 Key 为:
这种设计称为 decoupled RoPE:
- 内容部分 k^C 不施加 RoPE,适合低秩压缩和矩阵吸收。
-
位置部分
k^R单独施加 RoPE,保留相对位置信息。 -
解码时除了 KV latent,还需缓存每个位置的
k^R。
位置 Key 跨头共享不代表 Query 的位置部分也共享;每个 Query 头有自己的 q_t,i^R。
这样子,一个完整的K就被分成了这么两个部分:
前半部分代表语义的部分,不加入RoPE,不会对矩阵吸收有影响;而后半部分的带RoPE部分的,由于后面这部分是一个维度很小(论文64维)的部分,所以这部分的开销还是可控的。 总结就是:矩阵吸收是 MLA 为了弥补「升降维带来的额外算力」专门设计的优化手段,所以它才必须解决 RoPE 冲突。
9. Query 的低秩压缩¶
V3 也对 Query 做低秩压缩:
对应形状:
W^DQ: [d_c', d] = [1536, 7168]
c_t^Q: [1536]
W^UQ: [n_h * d_h, d_c'] = [16384, 1536]
W^QR: [n_h * d_h^R, d_c'] = [8192, 1536]
q_t,i^C: [128]
q_t,i^R: [64]
q_t,i: [192]
c_t^Q 不像历史 KV 那样长期缓存。
10. MLA 的注意力输出¶
每个头的注意力为:
V3 的缩放分母是:
拼接所有头后通过输出投影: 因果 mask 仍然存在。MLA 改变的是 Q/K/V 参数化与缓存形式,不改变因果 attention 的基本语义。11. MLA 的缓存量估算¶
V3 的 MLA 每个历史 token、每层只需缓存:
若用相同的 128 个 K/V 头、每头 128 维构造 MHA 基线,则每 token、每层需要: 理论元素数约减少 56.9 倍。这个比值只比较逻辑 KV 元素,不等于端到端吞吐一定提升 56.9 倍;实际收益还受数据类型、页管理、kernel、量化、并行和通信影响。12. MLA 的矩阵吸收¶
若每次 decode 都把 c_j^KV 上投影成完整 K/V,会重新引入大量计算与内存流量。MLA 可以利用线性运算结合律,把部分上投影吸收到 Query 和输出投影中。
内容打分可改写为:
于是可以先把当前 Query 投到 KV latent 空间,再直接与缓存的 c_j^KV 点积。
Value 路径也可把 W^UV 与各头输出投影的相关部分组合,避免为每个历史位置显式恢复完整 Value。实际系统通常为 prefill 和 decode 选择不同 kernel,因为两阶段的算术强度和序列形态不同。
13. MLA 的收益与边界¶
MLA 的主要收益是: - 显著减少长上下文 KV cache。
-
降低 decode 读取历史状态的显存带宽。
-
提升单卡或单实例可容纳的并发数。
-
Query 低秩压缩可减少训练激活内存。
主要代价和风险包括: - 参数化和高性能 kernel 比 MHA/GQA 更复杂。
-
latent 维度太小会形成信息瓶颈。
-
解耦 RoPE 与矩阵吸收需要专门实现。
-
量化 latent 和位置 key 时需要分别验证精度。
-
端到端效果依赖推理框架是否真正使用 MLA 优化路径。
MLA 的低秩投影属于模型架构,不是 LoRA 参数高效微调。两者都出现低秩矩阵,但训练目标、参数角色和使用阶段不同。
14. 稠密 FFN 与 MoE FFN¶
Transformer 层通常由 attention 和 FFN 组成。稠密 FFN 对每个 token 激活同一组参数,因此增加 FFN 宽度会同步增加每 token FLOPs。
MoE 把 FFN 替换成多个专家,通过 router 为每个 token 选择少量专家:
这使模型总参数量可以很大,而每 token 激活参数和计算量相对受控。代价是路由、跨设备 all-to-all、负载不均与部署复杂度。15. DeepSeekMoE 的两项核心设计¶
DeepSeekMoE 相对传统 MoE 强调: - 细粒度专家分割把大专家拆成更多较小专家,并让每个 token 选择多个,以产生更丰富的专家组合。
- 共享专家隔离保留始终激活的共享专家,学习跨领域通用知识;路由专家更专注于差异化知识。
共享专家不是 router 的保底候选,而是每个 token 都执行。路由专家才参与 Top-K 选择。
16. DeepSeek-V3 的 MoE 配置¶
V3 的前 3 层使用稠密 FFN,其余 FFN 替换为 MoE。每个 MoE 层包含: - 1 个共享专家。
-
256 个路由专家。
-
每个 token 选择 8 个路由专家。
-
每个专家中间维度为 2048。
-
每个 token 最多发送到 4 个节点。
因此每个 token 在 MoE 层会执行共享专家和 8 个路由专家,但总模型仍保存所有 256 个路由专家的参数。这是 671B 总参数与 37B 激活参数差距的主要来源。 前几层保持 dense 可以让低层通用表示稳定形成,也避免在输入分布尚未充分抽象时过早路由;这是一种架构选择,不表示所有 MoE 都必须保留 3 个 dense 层。
17. Router 打分与 Top-K 选择¶
设 token 表示为 u_t,第 i 个路由专家的中心向量为 e_i。V3 使用 sigmoid 计算亲和度:
选择 Top-K 专家后,未选专家权重置零,选中专家按原始亲和度归一化:
MoE 输出可写为:
h'_t = u_t
+ sum_{i=1}^{N_s} FFN_i^(shared)(u_t)
+ sum_{i=1}^{N_r} g_i,t * FFN_i^(routed)(u_t)
Sigmoid 分数彼此独立,Top-K 后再对选中分数归一化。不能把它直接等同于在 256 个专家上先做全局 softmax。
18. MoE 负载不均问题¶
如果 router 长期偏好少数专家,会出现: - 热门专家超载,其他专家空闲。
-
all-to-all 通信和计算等待最慢设备,形成 straggler。
-
容量受限实现可能丢弃 token。
-
专家缺少训练样本,产生路由坍塌。
-
总参数很多,但有效容量没有被利用。
传统方案在语言建模损失之外增加 load-balancing auxiliary loss。辅助损失把每个专家的路由频率和平均概率推向均匀,但权重过大时会干扰语言建模目标,强迫本应专业化的领域 token 平均分散。
19. 无辅助损失负载均衡¶
DeepSeek-V3 为每个路由专家维护一个动态 bias b_i。选择专家时使用:
s_i,t:
每个训练 step 结束后,根据整个 batch 的专家负载更新 bias:
这相当于一个闭环负载控制器。bias 只影响路由选择,不直接乘到专家输出,也不通过语言建模梯度学习,从而减少平衡目标对模型能力目标的干扰。
V3 的 gamma 在前 14.3T token 设为 0.001,最后 500B token 设为 0,使训练末期路由分布固定下来。
20. “Auxiliary-Loss-Free”的准确边界¶
V3 主要依靠动态 bias 做 batch-wise 负载平衡,但仍保留一个权重极小的 sequence-wise balance loss,用于防止单条序列内部出现极端不均:
其中 f_i 是按原始 affinity 的 Top-K 统计得到的序列级归一化代理负载,P_i 表示该专家在序列上的平均归一化亲和度。由于主要路由还会加入动态 bias,f_i 不应与 bias 调整后的实际发送计数机械等同。
因此严谨表述是“主要负载均衡策略不依赖辅助损失”或“auxiliary-loss-free routing balance with a tiny complementary sequence-wise loss”,而不是“训练目标中绝对没有任何平衡辅助项”。
21. Batch-Wise 与 Sequence-Wise 平衡¶
动态 bias 根据整个训练 batch 更新,属于 batch-wise 平衡。它允许不同领域的序列选择不同专家,只要整体负载接近均衡,因此更有利于专家专业化。 强 sequence-wise 辅助损失要求每条序列内部都接近均匀。若一条序列属于代码领域,它仍被迫把 token 分散到所有专家,可能削弱领域专家形成。
论文消融显示,在实现相近 batch-wise 负载平衡时,batch-wise auxiliary loss 与无辅助损失方法可得到相近验证损失;关键优势很大程度来自更灵活的平衡粒度,而不只是“有没有 loss”这一名称差异。
22. 节点受限路由与通信¶
MoE 专家跨 GPU、跨节点部署后,一个 token 的 8 个专家可能分散在很多设备,触发昂贵 all-to-all 通信。V3 使用 node-limited routing,把每个 token 限制在最多 M=4 个节点。
节点选择依据每个节点上最高 K_r/M 个专家分数之和。V3 中 K_r=8、M=4,因此可理解为按每节点最高 2 个候选专家的分数聚合后选择节点。
训练时路由专家均匀部署在 64 个 GPU、8 个节点上。限制节点数能减少跨节点 InfiniBand 流量,并配合 DualPipe 与通信 kernel 隐藏 all-to-all 延迟。
23. No Token Dropping 与容量管理¶
部分 MoE 系统为每个专家设置固定 capacity,专家超载时丢弃或旁路部分 token。这样能保持静态张量形状,却可能损伤模型质量。 V3 报告由于负载均衡有效,训练和推理都不丢 token。其含义是每个 token 的路由计算都被执行,不是“不限制专家负载”。系统仍需通过动态 bias、调度和推理时冗余专家部署控制热点。
24. DeepSeekMoE 的收益与代价¶
收益包括: - 总参数容量远大于每 token 激活参数。
-
共享专家吸收共性知识,路由专家形成专业化。
-
细粒度专家组合比少数大专家有更丰富的组合空间。
-
无辅助损失为主的平衡减少能力损失。
代价包括: - Router 和 Top-K 引入离散、动态执行路径。
-
Expert parallelism 需要 all-to-all 通信。
-
负载、节点故障和请求领域偏移会影响尾延迟。
-
总权重仍需存储,单机部署并不会因为只激活 37B 就只需存 37B 参数。
“激活参数少”主要意味着每 token 计算量较低,不意味着模型下载体积和总显存自动等于激活参数量。
25. Next-Token Prediction 的监督结构¶
标准语言模型在位置 i 的隐藏状态 h_i^0 上预测下一 token t_{i+1}:
T 的序列提供约 T 个 next-token 标签。每个隐藏状态只被直接要求预测一步未来,较远未来的约束需要通过多层表示和后续位置间接传递。
26. Multi-Token Prediction 的目标¶
MTP 把每个位置的预测范围扩展到多个未来 token。论文给出两个直觉: - 增加每段训练文本提供的监督信号,提高数据效率。
- 迫使当前表示考虑更远未来,形成一定的预规划能力。
DeepSeek-V3 与“多个独立 head 并行预测不同未来位置”的方案不同。它使用串行 MTP 模块,并为每个预测深度保留完整因果链。
27. V3 的串行 MTP 模块¶
第 k 个 MTP 深度包含:
- 与主模型共享的 embedding。
-
与主模型共享的 output head。
-
独立 Transformer block
TRM_k。 -
投影矩阵
M_k in R^[d, 2d]。
在位置 i,先组合上一深度表示和当前已知真值 token 的 embedding:
2d 维,经 M_k 投回 d 维。随后:
第 k 层 MTP 模块在获得到 t_(i+k) 为止的因果信息后,预测 t_(i+k+1),没有偷看目标 token。
28. MTP 损失¶
每个深度计算独立交叉熵:
所有深度平均并乘权重: V3 中: -D=1。
-
前 10T 训练 token 使用
lambda=0.3。 -
后 4.8T token 使用
lambda=0.1。
后期降低 MTP 权重,可以让最终优化更聚焦主模型 next-token 目标。lambda 太高可能使附加目标压制主任务,太低则难以形成有效远期监督。
29. MTP 对主模型的影响¶
即使普通推理时丢弃 MTP 模块,训练阶段的 MTP loss 仍通过 h_i^0 反向传播到主模型,要求主模型隐藏状态包含足以预测更远未来的信息。
共享 embedding 和 output head 还让主模型与 MTP 使用一致的 token 表示和词表映射,并节省额外参数。论文消融在小型和大型 MoE 基线上都观察到多数 benchmark 改善,而且丢弃 MTP 后比较模型的普通推理成本相同。
MTP 改善主模型是训练效应,不意味着部署时必须保留额外模块。
30. MTP 与推测解码¶
MTP 模块可以作为 draft mechanism 提出额外 token,再由主模型验证。标准推测解码的关键是: - 草稿模块快速提出候选 token。
-
目标模型并行计算候选位置的概率。
-
按接受规则保留候选;拒绝后从目标分布修正采样。
在正确实现接受-拒绝算法时,推测解码不应改变目标模型输出分布;MTP 预测越准,接受率越高,加速越明显。 V3 报告额外 token 接受率约为 85% 到 90%,并在其实验配置中达到约 1.8 倍 TPS。这个数字依赖任务、batch、硬件、kernel 和服务负载,不能视为所有部署的固定收益。
31. MTP 的边界与失败模式¶
主要风险包括: - 训练使用真值前序 token,推测阶段使用候选 token,存在分布差异。
-
MTP loss 与主 next-token loss 可能产生梯度冲突。
-
额外模块增加训练参数、激活和计算。
-
接受率低时,验证开销可能抵消加速。
-
共享 output head 节省参数,但也限制不同深度完全独立建模。
-
未实现严格接受校正时,所谓“推测解码”可能改变输出质量或分布。
评估时要同时报告主模型质量、训练开销、MTP 接受率、每轮接受长度、TPS、时延和输出一致性。
32. 三项技术的协同关系¶
MLA、MoE 和 MTP 的协同可以从训练与推理两侧理解:
训练:
DeepSeekMoE 扩大参数容量但引入 all-to-all
MLA 压缩 attention 表示并节省激活
MTP 增加额外监督,但增加约 14B 训练模块
FP8、DualPipe 和通信优化承接系统成本
推理:
DeepSeekMoE 每 token 只算共享 + Top-8 routed experts
MLA 只缓存 512-d latent + 64-d RoPE key
MTP 可丢弃,或作为 draft 加速 decode
33. 关键消融与证据边界¶
V3 论文报告: - 在 15.7B 总参数小型 MoE 和 228.7B 总参数大型 MoE 基线上,加入 1-depth MTP 后多数 benchmark 提升;测试时丢弃 MTP,因此普通推理成本相同。
-
将纯辅助损失平衡替换为无辅助损失动态 bias 后,多数 benchmark 改善。
-
Batch-wise auxiliary loss 与动态 bias 在相近整体平衡下可得到相近验证损失,支持“平衡粒度更灵活”是重要原因。
-
MTP 额外 token 在多类生成任务上接受率约 85% 到 90%,报告约 1.8 倍 TPS。
这些是论文配置下的经验结果。不同模型规模、数据、专家数、并行拓扑和推理框架都需要重新消融。
34. 实现与调试指标¶
34.1 MLA 指标¶
-
每层每 token 实际 KV cache bytes。
-
Prefill 与 decode 分阶段 latency。
-
latent reconstruction 或吸收路径的数值误差。
-
不同上下文长度下的 attention 正确性。
-
KV cache 量化后的困惑度和长上下文回归。
34.2 MoE 指标¶
-
每专家 token count、均值、最大值、变异系数。
-
Top-K 路由熵、专家利用率和专家专业化。
-
每节点发送/接收 token 数与 all-to-all 时间。
-
热点专家、尾部延迟和 token dropping 数。
-
动态 bias 的分布、漂移速度和冻结后的稳定性。
34.3 MTP 指标¶
-
L_NTP、各深度L_MTP^k和梯度范数。 -
丢弃 MTP 后主模型 benchmark。
-
候选 token 接受率和平均接受长度。
-
开启/关闭 MTP 的 TPS、P50/P99 延迟和成本。
-
严格验证输出分布与质量是否保持。
35. 常见概念误区¶
35.1 MLA 等同于 MQA¶
不准确。MQA 让所有 Query 头共享一组显式 K/V;MLA 缓存共享 latent,但可通过不同上投影恢复每头内容表示,并另有解耦位置子空间。
35.2 37B 激活参数等于只需存储 37B 权重¶
错误。每 token 只计算部分专家,但路由可能选择任意专家,部署仍需保存或分布式承载 671B 主模型权重。
35.3 Auxiliary-loss-free 表示没有任何平衡辅助项¶
不严谨。主要 batch-wise 平衡使用动态 bias,但 V3 仍有 alpha=0.0001 的极小 sequence-wise balance loss 防止极端情况。
35.4 MTP 在 V3 中有两个额外预测模块¶
错误。V3 的 D=1,主模型预测下一 token,唯一附加模块预测再下一个 token,总计覆盖未来两个 token。
35.5 推测解码接受率高就可以跳过验证¶
错误。严格验证和拒绝修正是保持目标模型分布的关键。MTP 候选是草稿,不是未经检查的最终输出。
36. 紧凑知识总结¶
DeepSeek-V3:
671B total / 37B activated / 61 layers / d=7168 / 14.8T tokens
MLA:
h -> c^KV(512) -> per-head content K/V
h -> decoupled RoPE key(64)
cache per token per layer = 512 + 64 = 576 elements
Q 另压缩到 1536,128 heads,content 128 + RoPE 64
DeepSeekMoE:
前 3 层 dense,后续为 1 shared + 256 routed,Top-8
sigmoid affinity,selected score normalization
selection 用 s_i+b_i,gate weight 仍用原始 s_i
过载减 bias、欠载加 bias;每 token 最多到 4 nodes;no token dropping
MTP:
D=1
main h_i -> t_(i+1)
[h_i; Emb(t_(i+1))] -> one MTP block -> t_(i+2)
L = L_NTP + lambda * L_MTP
lambda: 前 10T 为 0.3,后 4.8T 为 0.1
普通推理可丢弃;推测解码可复用,论文报告 85%-90% 接受率、约 1.8x TPS
37. 参考资料¶
-
DeepSeek-V3 技术报告:https://arxiv.org/abs/2412.19437
-
DeepSeek-V3 官方仓库:https://github.com/deepseek-ai/DeepSeek-V3
-
DeepSeek-V3 官方模型卡:https://huggingface.co/deepseek-ai/DeepSeek-V3-Base
-
DeepSeek-V2 与 MLA:https://arxiv.org/abs/2405.04434
-
DeepSeekMoE 原论文:https://arxiv.org/abs/2401.06066
-
Better & Faster Large Language Models via Multi-token Prediction:https://arxiv.org/abs/2404.19737
-
苏剑林 MLA 讲解:https://spaces.ac.cn/archives/10091
-
MoE 讲解:https://zhuanlan.zhihu.com/p/15797610465
-
MTP 讲解:https://zhuanlan.zhihu.com/p/15823898951
预览时标签不可点<div class="