菜单

专家混合 (MoE)

相关源文件

本文档提供了 DeepSeek-V3 中混合专家(MoE)实现的详细解释。MoE 是使 DeepSeek-V3 能够实现其令人印象深刻的参数效率的核心架构组件:尽管模型总共有 671B 个参数,但在推理过程中,每个 token 只激活 37B 个参数。有关多头潜在注意力(MLA)等其他关键架构组件的信息,请参阅 多头潜在注意力(MLA)

概述

混合专家(MoE)架构是一种稀疏激活的神经网络设计,其中模型的参数子集(“专家”)仅为每个输入 token 激活。这种方法在不按比例增加推理过程中的计算成本的情况下,显著提高了模型的容量。

在 DeepSeek-V3 中,MoE 层取代了大多数 Transformer 块中的标准前馈网络。每个 MoE 层包含多个专门的“专家”网络和一个门控机制,该机制决定哪些专家应处理每个 token。

来源: inference/model.py646-690 README.md47-48

核心组件

DeepSeek-V3 的 MoE 架构包含三个主要组件

  1. 门控 - 将输入 token 路由到最相关的专家
  2. 专家 - 处理特定输入模式的专用前馈网络
  3. 共享专家 - 应用于所有输入,无论路由如何

门控机制

门控网络负责确定哪些专家应处理每个输入 token。它会生成路由权重并为每个 token 选择 top-k 专家。

来源: inference/model.py532-595

专家实现

DeepSeek-V3 中的每个专家都实现为类似于标准 MLP 的前馈网络,但没有并行化功能。专家仅处理路由给它们​​的 token,并且它们的输出根据门控的路由权重进行加权。

来源: inference/model.py598-631

DeepSeek-V3 MoE 架构

DeepSeek-V3 中的 MoE 实现具有几个关键特征

  1. 稀疏激活:每 token 只激活 671B 参数中的 37B 个
  2. 专家分布:256 个路由专家 + 共享专家
  3. 专家选择:每个 token 激活 top-6 专家
  4. 无辅助损失策略:一种无需辅助损失即可进行负载均衡的新颖方法

关键配置参数

MoE 架构通过 ModelArgs 类中定义的几个参数进行配置

参数描述默认值
n_routed_experts路由专家的总数64(完整模型中为 256)
n_shared_experts共享专家的数量2
n_activated_experts每个token激活的专家数量6
n_expert_groups专家组的数量1
n_limited_groups路由的限制组数1
score_func路由的评分函数(“softmax”或“sigmoid”)“softmax”
route_scale路由权重的缩放因子1.0
moe_inter_dim专家 FFN 的中间维度1408

来源: inference/model.py54-84

MoE 实现细节

MoE 类结构

DeepSeek-V3 中的 MoE 类协调了整个混合专家过程

来源: inference/model.py633-690

前向传播算法

前向传播通过 MoE 层遵循以下步骤

  1. 输入 token 由门控处理,以确定路由权重和专家分配
  2. 专家仅处理路由给它们​​的 token
  3. 专家输出根据门控的路由权重进行加权
  4. 所有专家的结果被合并(包括多设备场景下的分布式专家)
  5. 共享专家应用于所有输入
  6. 合并后的输出被返回

来源: inference/model.py666-690

与 Transformer 架构集成

DeepSeek-V3 中的 MoE 层被纳入 Transformer 块中作为前馈网络。最初的几层使用标准的 MLP,而剩余的层使用 MoE。

来源: inference/model.py693-732 inference/model.py735-794

分布式 MoE 实现

DeepSeek-V3 支持跨多个设备的 MoE 架构的分布式执行。这通过以下方式实现:

  1. 专家分区:专家分布在各个设备上
  2. All-Reduce 通信:合并来自不同设备的结果

来源: inference/model.py654-664 inference/model.py687-689

优势和性能

DeepSeek-V3 中的 MoE 架构提供了几个关键优势

  1. 参数效率:总参数 671B,每个 token 仅激活 37B
  2. 训练效率:尽管模型规模庞大,但仅需 2.788M H800 GPU 小时
  3. 推理效率:以较低的计算成本实现更好的性能
  4. 可扩展性:能够构建更大的模型,而计算量不成比例增加

MoE 架构,结合多头潜在注意力(MLA)和用于负载均衡的无辅助损失策略,帮助 DeepSeek-V3 实现与领先的闭源模型相媲美的性能,同时在训练和推理方面都保持高效。

来源: README.md47-52 README.md65-67

代码实现详解

门控实现

Gate 类决定为每个输入 token 激活哪些专家

  • 使用线性投影计算路由分数
  • 对分数应用 softmax 或 sigmoid 函数
  • 可选地应用组路由来限制 token 分配
  • 为每个 token 选择 top-k 专家
  • 返回路由权重和专家索引

关键实现点

  • 门控使用形状为 [n_routed_experts, dim] 的可学习权重矩阵
  • 对于 softmax 评分,权重在专家之间进行归一化
  • 对于 sigmoid 评分,权重在专家选择后进行归一化
  • route_scale 参数缩放最终路由权重

来源: inference/model.py532-595

专家实现

每个专家是一个具有三个线性变换的前馈网络

  • w1:从 dim 投影到 inter_dim
  • w2:从 inter_dim 投影回 dim
  • w3:从 diminter_dim 的附加投影
  • w1 的输出应用 SiLU 激活
  • 激活后的输出与 w3 的输出逐元素相乘
  • 使用 w2 投影结果

来源: inference/model.py598-631

MoE 前向传播

MoE 类中的前向传播

  1. 将输入重塑为二维张量
  2. 从门控获取路由权重和专家索引
  3. 创建初始化为零的输出张量
  4. 计算路由到每个专家的 token 数量
  5. 对于每个分配了 token 的本地专家
    • 提取路由到该专家的 token
    • 将专家应用于这些 token
    • 对专家输出进行加权并将其添加到结果中
  6. 将共享专家应用于所有 token
  7. 如果分布式,则执行 all-reduce 以合并结果
  8. 以原始输入形状返回组合后的输出

来源: inference/model.py666-690