DeepSeek-V2: DeepSeekMoE 架构与负载均衡工程

From LLM Guide

本文内容为中文原文;Article content is the original Chinese source, and this page does not provide a translation.

DeepSeek-V2: DeepSeekMoE 架构与负载均衡工程

🔙 返回 14.1-DeepSeek 家族总览

原文基础: DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model (arXiv:2405.04434) 本文聚焦 DeepSeekMoE 的细粒度专家设计、负载均衡机制、通信优化和与同类 MoE 架构的系统对比.


1 设计动机: 为什么传统 MoE 不够经济

1.1 MoE 的基本价值与成本结构

混合专家 (Mixture of Experts, MoE) 的核心价值在于「稀疏激活」: 用一个总参数量巨大的模型, 但每次前向传播只激活其中一小部分参数. 这使得模型可以在不增加推理计算成本的情况下扩展容量.

然而, 传统 MoE 架构(如 GShard、Switch Transformer)存在以下问题:

  1. 专家粒度粗糙: 每个专家通常是一个完整的 FFN 层(如 2 个专家), 专家数量少导致专业化程度不足.
  2. 知识冗余: 所有专家都需要学习通用的语言建模知识, 导致大量参数被浪费在重复学习上.
  3. 负载均衡困难: 路由网络倾向于将大部分 token 发送到少数几个「明星专家」, 导致其他专家未被充分训练.

1.2 DeepSeekMoE 的核心洞察

DeepSeekMoE 的两个核心设计思想:

细粒度专家分割: 将专家分割为更细的粒度(如 160 个路由专家, 而非 8-16 个), 以实现更高的专家专业化. 直觉是: 如果每个专家只负责一个非常具体的知识子领域(如「Python 语法规则」或「微积分求导」), 那么专家可以更深入地学习该领域, 同时总参数量的利用效率更高.

共享专家隔离: 将一部分专家设为「共享专家」(所有 token 都必须经过), 其余设为「路由专家」(按 Top-K 选择). 共享专家负责学习通用的、跨领域的语言建模知识, 路由专家专注于学习差异化的、领域特定的知识. 这种隔离避免了路由专家之间的知识冗余.

译者注: 共享专家隔离的设计最早由 DeepSeek 团队在之前的工作(DeepSeekMoE 论文, 2024)中提出. 它的关键洞察是: 如果所有专家都是「自由竞争」的, 那么每个专家都会被迫学习一部分基础语言能力, 导致参数浪费. 通过强制一部分专家(共享专家)承担所有基础能力的学习, 路由专家可以完全专注于差异化知识, 从而实现更高程度的专业化. 这个设计后来被 Qwen2-MoE、GLM-5、MiniMax-M2 等模型广泛采用, 几乎成为 2024-2025 年 MoE 架构的事实标准.


2 核心架构: 细粒度专家与共享专家

2.1 前向计算流程

设 ut\mathbf{u}_t 为第 tt 个 token 的 FFN 输入, DeepSeekMoE 计算 FFN 输出 ht′\mathbf{h}_t^{\prime} 如下:

ht′=ut+∑i=1NsFFNi(s)(ut)⏟共享专家+∑i=1Nrgi,tFFNi(r)(ut)⏟路由专家(1)\mathbf{h}_t^{\prime} = \mathbf{u}_t + \underbrace{\sum_{i=1}^{N_s} \text{FFN}_i^{(s)}(\mathbf{u}_t)}_{\text{共享专家}} + \underbrace{\sum_{i=1}^{N_r} g_{i,t} \text{FFN}_i^{(r)}(\mathbf{u}_t)}_{\text{路由专家}} \tag{1}

门控值 gi,tg_{i,t} 由亲和度分数的 Top-K 选择决定:

gi,t={si,t,si,t∈Top-K({sj,t},Kr)0,otherwise(2)g_{i,t} = \begin{cases} s_{i,t}, & s_{i,t} \in \text{Top-}K(\{s_{j,t}\}, K_r) \\ 0, & \text{otherwise} \end{cases} \tag{2}

亲和度分数通过 softmax 计算:

si,t=Softmaxi(utTei)(3)s_{i,t} = \text{Softmax}_i(\mathbf{u}_t^T \mathbf{e}_i) \tag{3}

其中 NsN_s 和 NrN_r 分别表示共享专家和路由专家的数量; FFNi(s)(⋅)\text{FFN}_i^{(s)}(\cdot) 和 FFNi(r)(⋅)\text{FFN}_i^{(r)}(\cdot) 分别表示第 ii 个共享专家和路由专家; KrK_r 表示激活的路由专家数量; ei\mathbf{e}_i 是第 ii 个路由专家的质心(可学习的路由参数).

2.2 DeepSeek-V2 的具体配置

参数 DeepSeek-V2 DeepSeek 67B (对比)
总参数 236B 67B
激活参数 21B 67B
共享专家数 NsN_s 2 — (稠密模型)
路由专家数 NrN_r 160 —
激活路由专家数 KrK_r 6 —
每层 FFN 输出维度 5120 8192

236B 总参数 / 21B 激活参数的配置意味着: 每个 token 只使用了约 8.9% 的总参数, 但模型容量(总参数量)是 67B 的 3.5 倍. 这种「大容量、低激活」的策略是 MoE 经济性训练的核心.


3 通信优化: 设备限制路由

3.1 专家并行中的通信瓶颈

当采用专家并行 (Expert Parallelism, EP) 时, 不同的专家被放置在不同的 GPU 设备上. 每个 token 根据路由决策被发送到持有目标专家的设备上计算, 计算结果再传回原设备. 这个过程中涉及 All-to-All 通信.

通信成本与两个因素成正比:

  1. 每个 token 激活的专家数量 KrK_r
  2. 这些专家分布的设备数量

对于 DeepSeekMoE 的细粒度设计, Kr=6K_r = 6, 但专家总数 Nr=160N_r = 160. 如果没有限制, 这 6 个专家可能分布在多个设备上, 导致每个 token 需要与大量设备通信.

3.2 设备限制路由机制

DeepSeek-V2 设计了「设备限制路由」来限制通信成本:

对于每个 token:

  1. 首先选择亲和度分数最高的 MM 个设备
  2. 然后仅在这 MM 个设备的专家中进行 Top-KrK_r 选择

在实践中, M=3M = 3. 这意味着每个 token 最多只需要与 3 个设备通信, 而不是所有设备.

通信量减少分析:

  • 无限制路由: 6 个专家可能分布在最多 6 个设备上(最坏情况)
  • 设备限制路由 (M=3M=3): 6 个专家最多分布在 3 个设备上
  • 通信量减少: 从最多 6 次设备间通信降至 3 次, 减少 50%

论文中的实验表明, 当 M≥3M \geq 3 时, 性能损失很小. 这说明:

  • 最优专家通常集中在少数几个设备上
  • 或者, 第 4 名及以后的专家的贡献边际递减

译者注: 设备限制路由是一个典型的「工程权衡」设计. 它用「略牺牲路由灵活性」换取「大幅削减通信开销」. 这种权衡在分布式训练中非常常见: All-to-All 通信的延迟往往比计算延迟更难以隐藏, 因此限制通信跨度是提升训练效率的关键手段. 值得注意的是, M=3M=3 这个数值是通过实验确定的, 而非理论推导——这意味着在不同硬件拓扑(如 NVLink vs InfiniBand)或不同专家数量配置下, 最优的 MM 值可能不同.


4 负载均衡: 三重辅助损失

4.1 为什么负载均衡至关重要

MoE 训练中的负载不均衡会导致两个问题:

  1. 路由崩溃 (Routing Collapse): 如果大部分 token 都被路由到少数几个专家, 这些专家会被过度训练(甚至过拟合), 而其他专家则未被充分训练, 导致模型整体能力下降.
  2. 计算效率下降: 在专家并行下, 如果某些设备的负载远高于其他设备, 负载低的设备会处于空闲等待状态, 造成计算资源浪费.

4.2 三重辅助损失的设计

DeepSeek-V2 设计了三种辅助损失, 分别从专家级、设备级和通信级三个维度控制负载均衡:

专家级均衡损失 (LExpBal\mathcal{L}_{\text{ExpBal}}):

LExpBal=α1∑i=1NrfiPi(4)\mathcal{L}_{\text{ExpBal}} = \alpha_1 \sum_{i=1}^{N_r} f_i P_i \tag{4}fi=NrKrT∑t=1T1(Token t selects Expert i)(5)f_i = \frac{N_r}{K_r T} \sum_{t=1}^{T} \mathbb{1}(\text{Token } t \text{ selects Expert } i) \tag{5}Pi=1T∑t=1Tsi,t(6)P_i = \frac{1}{T} \sum_{t=1}^{T} s_{i,t} \tag{6}

其中 fif_i 是专家 ii 的「实际使用频率」, PiP_i 是路由器对专家 ii 的「平均偏好概率」. 当某个专家被过度使用(fif_i 高)且路由器倾向于向它发送 token (PiP_i 高)时, 损失增大, 从而惩罚这种不均衡.

设备级均衡损失 (LDevBal\mathcal{L}_{\text{DevBal}}):

LDevBal=α2∑i=1Dfi′Pi′(7)\mathcal{L}_{\text{DevBal}} = \alpha_2 \sum_{i=1}^{D} f_i^{\prime} P_i^{\prime} \tag{7}

其中 fi′f_i^{\prime} 和 Pi′P_i^{\prime} 是设备级别的频率和概率聚合.

通信均衡损失 (LCommBal\mathcal{L}_{\text{CommBal}}):

LCommBal=α3∑i=1Dfi′′Pi′′(8)\mathcal{L}_{\text{CommBal}} = \alpha_3 \sum_{i=1}^{D} f_i^{\prime\prime} P_i^{\prime\prime} \tag{8}

其中 fi′′f_i^{\prime\prime} 是设备 ii 接收 token 的频率, Pi′′P_i^{\prime\prime} 是相关概率聚合.

4.3 超参数配置与权衡

损失类型 目标 系数 作用范围
专家级均衡 防止路由崩溃 α1=0.003\alpha_1 = 0.003 每个路由专家
设备级均衡 跨设备计算均衡 α2=0.05\alpha_2 = 0.05 每个设备
通信均衡 All-to-All 收发均衡 α3=0.02\alpha_3 = 0.02 每个设备

三种损失的形式都是「频率 ×\times 概率」的乘积和. 这种形式的直觉是: 当「实际使用」和「路由偏好」同时偏高时, 惩罚最大.

译者注: 三重辅助损失的设计反映了 DeepSeek 团队对 MoE 训练稳定性的深刻理解. 负载均衡不是单一指标, 而是需要从多个维度同时优化的系统问题. 但辅助损失有一个根本性的缺陷: 它直接加在语言建模的损失上, 干扰了语言建模的梯度信号. 理想情况下, 路由决策应该完全由「哪个专家最适合处理当前 token」来决定, 但辅助损失强制要求「每个专家处理的 token 数量大致相等」. 这可能导致次优路由(一个 token 本来应该路由到专家 A, 但由于 A 已经「满员」, 被强制路由到专家 B)和专家同质化(所有专家被迫处理均衡的数据分布, 难以形成深度专业化). 这也是 DeepSeek-V3 后来放弃辅助损失、转向 auxiliary-loss-free 方法的根本原因.


5 Token 丢弃策略与训练稳定性

5.1 机制设计

虽然均衡损失旨在鼓励负载均衡, 但它们不能保证严格的负载均衡. 为了进一步缓解由负载不均衡造成的计算浪费, DeepSeek-V2 在训练期间引入了「设备级 token 丢弃策略」:

  1. 计算每个设备的平均计算预算(容量因子等价于 1.0)
  2. 丢弃每个设备上亲和度分数最低的 token, 直到达到计算预算
  3. 确保约 10% 的训练序列的 token 永远不会被丢弃

第 3 点是一个关键的安全网: 它保证所有 token 都有机会被训练到, 防止丢弃策略引入系统性偏差.

5.2 风险分析

Token 丢弃策略存在以下风险:

  • 信息损失: 丢弃的 token 不参与梯度更新, 可能导致某些训练信号丢失.
  • 数据偏差: 如果丢弃策略与训练数据的某些特征相关(如长序列更容易被丢弃), 可能引入隐式的数据过滤.
  • 训练-推理不一致: 推理时通常不丢弃 token(或采用不同的丢弃阈值), 这可能导致训练和推理行为的不一致.

论文中的缓解措施(10% 安全序列)是务实的, 但并非完美解决方案. 在后续 V3 中, token 丢弃策略被进一步优化, 与 auxiliary-loss-free 的负载均衡机制协同工作.


6 从 V2 到 V3: MoE 架构的演进

6.1 关键改进对比

维度 DeepSeek-V2 DeepSeek-V3 演进动机
总参数 236B 671B 扩展模型容量
激活参数 21B 37B 保持高质量推理
路由专家数 160 256 更细粒度的专业化
激活路由专家数 6 8 略微增加以匹配更大容量
共享专家数 2 1 简化架构
负载均衡 三重辅助损失 Auxiliary-loss-free 消除梯度干扰
训练精度 BF16 FP8 利用 H100 Tensor Core 的 FP8 算力
流水线并行 Zero-bubble PP DualPipe 更极致的通信-计算重叠
预训练数据 8.1T 14.8T 更多高质量数据

6.2 Auxiliary-loss-free 的范式转变

DeepSeek-V3 放弃了三重辅助损失, 改用动态偏置调整:

gi,t′=1[si,t+bi∈Top-K({sj,t+bj})](9)g_{i,t}^{\prime} = \mathbb{1}\left[s_{i,t} + b_i \in \text{Top-}K(\{s_{j,t} + b_j\})\right] \tag{9}

偏置 bib_i 通过反馈规则更新:

bi←bi−γ⋅sign(loadi−target)(10)b_i \leftarrow b_i - \gamma \cdot \text{sign}(\text{load}_i - \text{target}) \tag{10}
方法 影响梯度? 需要调参? 专家专业化程度 核心优势
辅助损失 (V2) 是 (直接加在损失上) 3 个系数 受限 (强制均衡) 简单直接
偏置调整 (V3) 否 (只影响路由决策) 1 个学习率 更高 (自由竞争) 不干扰语言建模

Auxiliary-loss-free 的核心优势在于: 偏置只影响路由决策(哪个专家被选中), 不影响门控值(选中后的权重). 因此, 它完全不干扰语言建模的梯度信号. 这使得路由专家可以在自由竞争中形成更深度的专业化.


7 训练效率的量化分析

7.1 成本构成

组件 DeepSeek 67B (稠密) DeepSeek-V2 (MoE) 变化
每万亿 token GPU 小时 300.6K 172.8K -42.5%
总预训练 token 2T 8.1T +4.05 倍
理论总 GPU 小时 ~600K ~1.4M —

注意: 虽然每万亿 token 的成本降低了 42.5%, 但由于 V2 使用了 8.1T token(而 67B 可能只用了 2T), 总训练成本实际上是增加的. 但单位性能成本(每分每 MMLU 点)是下降的.

7.2 MFU 与推理吞吐量

Model FLOPs Utilization (MFU) 是实际训练吞吐量与理论峰值的比例. MoE 模型理论上 MFU 较低, 因为:

  1. All-to-All 通信引入同步开销
  2. 负载不均衡导致部分 GPU 空闲等待
  3. 专家并行引入了额外的数据传输

但 DeepSeek-V2 通过以下优化实现了相对较高的 MFU:

  • 共享专家计算与 all-to-all 通信重叠
  • 自定义 CUDA kernel 优化路由和融合计算
  • 不需要张量并行(因激活参数少), 减少了通信量

V2 的推理吞吐量是 67B 的 5.76 倍, 这个提升来自三个因素的乘积:

  1. KV 缓存减少 (MLA): -93.3% → batch size 可增大约 10 倍
  2. 激活参数减少 (MoE): 21B vs 67B → 每 token 计算量减少约 3.2 倍
  3. FP8 量化 + KV 量化: 内存带宽需求进一步降低
吞吐量提升≈10×6721×量化收益≈5.76\text{吞吐量提升} \approx 10 \times \frac{67}{21} \times \text{量化收益} \approx 5.76

译者注: 5.76 倍的吞吐量提升是一个「乘积效应」的结果, 而非单一技术的功劳. 这说明了 DeepSeek-V2 的整体设计哲学: MLA 解决推理显存瓶颈, DeepSeekMoE 减少每 token 计算量, 两者协同产生指数级的效率提升. 但这种设计也有代价: MLA 的训练-推理不对称增加了代码复杂度, MoE 的专家并行引入了通信开销. 在工程落地时, 这些隐形成本需要被纳入总体评估.


8 技术谱系定位

Dense FFN (Transformer, 2017)
    └── MoE
           ├── GShard [Fedus et al., 2021]
           ├── Switch Transformer [Fedus et al., 2022]
           └── DeepSeekMoE [DeepSeek, 2024]
                  ├── DeepSeek-V2 (236B/21B, 160 路由专家)
                  ├── DeepSeek-V2-Lite (15.7B/2.4B)
                  └── DeepSeek-V3 (671B/37B, 256 路由专家, auxiliary-loss-free)

DeepSeekMoE 在算法家族树中的位置: 它是从「粗粒度专家」(GShard/Switch)向「细粒度专家 + 共享隔离」演进的关键节点. 细粒度分割(160-256 个专家)和共享专家隔离的设计, 几乎被后续所有主流 MoE 模型(Qwen2-MoE、GLM-5、MiniMax-M2、MiMo 等)采用, 成为 MoE 架构的事实标准.

V2 的历史意义在于: 它是首个将 DeepSeekMoE 成功应用于大规模生产级模型的工作, 证明了「细粒度专家 + 共享隔离 + 专家并行」组合在工程上的可行性, 为 V3 的进一步扩展(256 专家、auxiliary-loss-free)奠定了架构基础.


本文档同步至: docs/sections/llm-guide/14-主流开源模型全景解析与技术报告精读/14.1-DeepSeek/03-DeepSeek-V2/05-DeepSeek-V2-DeepSeekMoE.md