DeepSeekMoE 完全拆解:细粒度专家切分与共享专家隔离

7892 字
39 分钟
DeepSeekMoE 完全拆解:细粒度专家切分与共享专家隔离

为什么 DeepSeekMoE 值得单独拆解#

DeepSeekMoE(论文)由 DeepSeek-AI 于 2024 年 1 月发布在 arXiv 上(后被 ICLR 2024 接收),是与 DeepSeek LLM 67B 同期的工作。它是 DeepSeek 从稠密模型转向稀疏模型的第一块基石,也是此后所有 DeepSeek 大模型——V2(236B 总参数)、V3(671B 总参数)、甚至 2026 年的 V4(1.6T 总参数)——MoE 骨架的共同祖先。本站的 DeepSeek 技术全景 只用几句话概括了它;这篇把它单独拆开讲透。

理解 DeepSeekMoE 有两个层面的价值:

  • 架构层面:它回答了一个在 2024 年初还没有被认真回答的问题——MoE(Mixture of Experts,混合专家)的专家到底应该”多大”?传统 GShard 式架构用 8~16 个大专家、每 token 激活 top-2,专家专业化程度很低。DeepSeekMoE 用”细粒度切分 + 共享专家”两条策略,把专家专业化推到接近极限,2B 规模的模型性能就几乎摸到了同参数量稠密模型的上限。
  • 推理层面:MoE 的推理成本完全由”每 token 激活多少参数”决定。DeepSeekMoE 确立的”总参数大、激活参数小”路线,让 671B 的模型每 token 只激活 37B——这正是 DeepSeek 能把 API 价格打到行业最低的根源。共享专家始终激活、路由专家按需调度,这两类专家在显存、带宽、调度上承担完全不同的角色,理解它们的差异是理解 MoE 推理服务的起点。

传统 MoE 的困境:知识混杂与知识冗余#

MoE 的基本框架#

先建立术语。一个标准 Transformer 块由注意力(self-attention)与逐位前馈网络(Feed-Forward Network, FFN)组成,第 ll 层对第 tt 个 token 的计算可以写成:

utl=SelfAtt(h1:Tl1)+htl1,htl=FFN(utl)+utl\mathbf{u}_t^{l} = \mathrm{SelfAtt}(\mathbf{h}_{1:T}^{l-1}) + \mathbf{h}_t^{l-1}, \qquad \mathbf{h}_t^{l} = \mathrm{FFN}(\mathbf{u}_t^{l}) + \mathbf{u}_t^{l}

其中 htlRd\mathbf{h}_t^{l} \in \mathbb{R}^{d} 是第 tt 个 token 经过第 ll 个 Transformer 块后的隐藏状态,dd 是隐藏维度,TT 是序列长度。FFN 通常是两层线性变换夹一个激活函数:FFN(x)=W2σ(W1x)\mathrm{FFN}(x) = W_2\,\sigma(W_1 x),中间维度一般是 4d4d 左右——一个 Transformer 里参数和算力的大头都在 FFN 上。

MoE(Mixture of Experts,混合专家)的做法是把 FFN 替换成”多个专家 + 一个路由器”。每个专家(expert)结构上就是一个标准 FFN;路由器(router)为每个 token 计算与各专家的亲和度(affinity),只把 token 送给亲和度最高的 KK 个专家。GShard(论文,2021 年)就是这种 top-K 路由的经典实现。一个 MoE 层的输出为:

htl=i=1Ngi,tFFNi(utl)+utl\mathbf{h}_t^{l} = \sum_{i=1}^{N} g_{i,t}\,\mathrm{FFN}_i(\mathbf{u}_t^{l}) + \mathbf{u}_t^{l}

其中 NN 是专家总数,FFNi()\mathrm{FFN}_i(\cdot) 是第 ii 个专家,gi,tg_{i,t} 是门控值,只有 KK 个非零:

gi,t={si,t,si,tTopk({sj,t1jN},K)0,otherwiseg_{i,t} = \begin{cases} s_{i,t}, & s_{i,t} \in \mathrm{Topk}\big(\{s_{j,t} \mid 1 \le j \le N\},\, K\big) \\ 0, & \text{otherwise} \end{cases}

亲和度 si,ts_{i,t} 由 token 隐藏状态与专家质心向量的内积经过 softmax 得到:

si,t=Softmaxi(utleil)s_{i,t} = \mathrm{Softmax}_i\big(\mathbf{u}_t^{l\top}\,\mathbf{e}_i^{l}\big)

这里 eil\mathbf{e}_i^{l} 是第 ll 层第 ii 个专家对应的可学习”质心”向量(centroid),softmax 的作用是把 NN 个内积分数归一化成概率分布。

门控的稀疏性(NN 个里只有 KK 个非零)就是 MoE 的经济性来源:模型参数可以很多(记在总参数里),但每个 token 只花 K/NK/N 的 FFN 算力

两个病根:知识混杂与知识冗余#

GShard 式的经典配置是 N=8N=81616 个大专家、K=1K=122。论文指出这种配置有两个互为因果的缺陷:

知识混杂(knowledge hybridity)。专家数量少意味着每个专家分到的 token 数量多,而 token 是多种知识的混合体——一句”苹果公司发布了新手机”同时含商业、技术、产品三类知识。当一个专家被迫同时存储差异很大的知识时,这些知识在参数里互相干扰,难以被同时有效利用。

知识冗余(knowledge redundancy)。不同专家服务的 token 常常需要公共知识(句法结构、通用语义、常见搭配)。既然没有专门的地方存放这些公共知识,多个专家就会各自在参数里重复学习一份,造成参数浪费。

这两个问题合起来,就是论文标题里”终极专家专业化(ultimate expert specialization)“的反面:专家没有”各管一摊”,而是”人人都会一点、人人都不精”。结果就是 MoE 的实际效果远低于同参数量稠密模型的理论上限。

核心思想:两条策略,一个目标#

DeepSeekMoE 的答案可以压缩成一句话:把专家切小、切多,让每个 token 激活更多更小的专家(细粒度专家切分,Fine-Grained Expert Segmentation);再单独设几个永远激活的共享专家去吸收公共知识(共享专家隔离,Shared Expert Isolation),让路由专家专心做差异化分工。

DeepSeekMoE 架构图解:左为传统 top-2 路由 MoE,中为细粒度专家切分,右为细粒度切分加共享专家的完整 DeepSeekMoE(图片来源:DeepSeekMoE 论文 Figure 2)
DeepSeekMoE 架构图解:左为传统 top-2 路由 MoE,中为细粒度专家切分,右为细粒度切分加共享专家的完整 DeepSeekMoE(图片来源:DeepSeekMoE 论文 Figure 2)

图:论文 Figure 2——三种 MoE 层结构的对比。三种结构的专家总参数与计算开销完全一致,变的只是”怎么切、怎么激活”。

上图的三个子图值得逐一读:

  • (a) 是传统做法:16 个大专家,每个 token 激活 top-2,激活的 2 个专家直接相加;
  • (b) 是细粒度切分:把每个大专家沿 FFN 中间维度切成 4 份,16 个变成 64 个,每个 token 激活 8 个——注意 (b) 里每个小专家是 (a) 里大专家的 1/4 宽,8 个小专家的参数量和算力恰好等于 (a) 的 2 个大专家,总参数与计算量保持不变
  • (c) 是完整 DeepSeekMoE:在 (b) 的基础上隔离出 1 个共享专家(图中深色、横跨所有 token),其余 63 个为路由专家,每个 token 激活共享专家 + 7 个路由专家——激活总数仍是 8 份小专家,计算量依旧不变。

论文给出一个极具冲击力的组合数对比。设 N=16N=16、top-2,传统路由的可能组合数是:

(162)=120\binom{16}{2} = 120

如果把每个专家切成 4 份(m=4m=4),变成 64 个专家、激活 mK=8mK=8 个:

(648)=4,426,165,368\binom{64}{8} = 4{,}426{,}165{,}368

组合空间从 120 膨胀到 44 亿量级。同样的算力预算下,模型选择”谁来处理这个 token”的自由度大了 7 个数量级——这就是细粒度切分的本质收益:知识分解得更细、组合方式更灵活,模型更可能为每个 token 找到一组恰好覆盖所需知识的专家。

下面两节分别拆开讲两条策略的设计细节与实验依据。

策略一:细粒度专家切分#

做法与公式#

把每个专家 FFN 的中间隐藏维度缩小为原来的 1/m1/m,同时把专家数量从 NN 增加到 mNmN、激活数量从 KK 增加到 mKmK。由于每个专家变小了 mm 倍、激活数量多了 mm 倍,总专家参数与总计算量都不变。细粒度 MoE 层的输出变为:

htl=i=1mNgi,tFFNi(utl)+utl\mathbf{h}_t^{l} = \sum_{i=1}^{mN} g_{i,t}\,\mathrm{FFN}_i(\mathbf{u}_t^{l}) + \mathbf{u}_t^{l}gi,t={si,t,si,tTopk({sj,t1jmN},mK)0,otherwiseg_{i,t} = \begin{cases} s_{i,t}, & s_{i,t} \in \mathrm{Topk}\big(\{s_{j,t} \mid 1 \le j \le mN\},\, mK\big) \\ 0, & \text{otherwise} \end{cases}

门控公式与原来完全同构,只是专家总数与激活数分别换成 mNmNmKmK;亲和度仍是 softmax 形式。

为什么这样设计#

直觉上,“多而小”的专家比”少而大”的专家更有利于专业化,论文给出两条理由:

  1. 知识分解更细。一个 token 内含的多类知识,被路由到 8 个不同的小专家时,每个专家只需存一类知识;路由到 2 个大专家时,每个专家必须”一口吞下”多类知识。前者每个专家的知识更聚焦,利用率更高。
  2. 组合更精准。44 亿种组合意味着 token 与专家子集的匹配可以精细到”这个 token 只需要这几块知识”。对下游任务而言,模型能够挑选最相关的专家组合,训练效率与效果都更好。

m 取多大:实验依据#

论文在 2B 验证模型上做了切分粒度消融(图 3,见下文”消融实验”一节):在总参数与激活参数完全一致的前提下,把 16 个专家分别切成 32 个(m=2m=2)和 64 个(m=4m=4),性能单调提升。切得越细越好,但论文同时承认一个工程上限:专家过小会降低计算效率。GPU 上每个专家都是一组矩阵乘法,专家中间维度太小(比如低于张量核心友好的 64 的倍数)时,算子难以充分利用硬件。因此 16B 模型选择”每个专家为标准 FFN 的 1/4”(m=4m=4),并明确写道”更大规模下仍可采用更细的粒度”——这句话在 145B 模型上兑现了:专家缩到标准 FFN 的 1/8(m=8m=8)。

策略二:共享专家隔离#

做法与公式#

在细粒度切分的基础上,隔离出 KsK_s共享专家(shared experts):它们不经过路由器,每个 token 都被确定性(deterministically)地送进去计算。为了维持计算量不变,路由专家中激活的数量相应减去 KsK_s。完整 DeepSeekMoE 层的输出为:

htl=i=1KsFFNi(utl)+i=Ks+1mNgi,tFFNi(utl)+utl\mathbf{h}_t^{l} = \sum_{i=1}^{K_s} \mathrm{FFN}_i(\mathbf{u}_t^{l}) + \sum_{i=K_s+1}^{mN} g_{i,t}\,\mathrm{FFN}_i(\mathbf{u}_t^{l}) + \mathbf{u}_t^{l}gi,t={si,t,si,tTopk({sj,tKs+1jmN},mKKs)0,otherwiseg_{i,t} = \begin{cases} s_{i,t}, & s_{i,t} \in \mathrm{Topk}\big(\{s_{j,t} \mid K_s+1 \le j \le mN\},\, mK-K_s\big) \\ 0, & \text{otherwise} \end{cases}

公式第一项是共享专家(索引 11KsK_s,无门控),第二项是路由专家(索引 Ks+1K_s+1mNmN,top-(mKKs)(mK-K_s) 门控)。最终结构参数为:共享专家 KsK_s 个,路由专家 mNKsmN - K_s 个,非零门控数 mKKsmK - K_s 个。

为什么这样设计#

“知识冗余”的根源是公共知识没有固定的存放位置。共享专家的作用就是给公共知识一个明确的”家”:语法、语序、通用语义这类所有 token 都需要的能力,全部压进少数几个始终激活的专家;路由专家于是不再需要各自存一份公共知识,可以集中参数去学差异化知识。从另一个角度看,这等于把 MoE 层拆成了”一个永远在场的稠密小骨干(shared experts)+ 一个按需调用的稀疏部分(routed experts)”。

论文特意交代了出处:共享专家的雏形可追溯到 2022 年的 DeepSpeed(Rajbhandari et al., 2022),但那是从工程角度(减少推理时专家加载次数)提出的;DeepSeekMoE 是从算法角度(提升专家专业化)独立发展出这一设计。一个想法从工程技巧升格为架构原则,这是关键一步。

共享专家与路由专家的比例:1:3#

论文在 64 个专家的配置上固定总专家数与激活数,尝试隔离 1、2、4 个共享专家,Pile 测试集上的交叉熵损失分别为 1.808、1.806、1.811——差异很小,说明比例并不敏感。取边际最优的 1:3(1 个共享专家对应 3 个激活的路由专家)作为后续放大模型的默认比例:16B 模型是 2 共享 + 6 路由,145B 模型是 4 共享 + 12 路由,共享与激活路由专家数之比恒为 1:3。

负载均衡:两道辅助损失#

自动学习的路由器有一个臭名昭著的问题:路由坍缩(routing collapse)——模型逐渐倾向于只选少数几个专家,其余专家得不到充分训练,最终退化成”伪稠密”模型。即使不坍缩,专家负载不均也会让计算出现瓶颈:一个批处理里,热门专家被挤爆、冷门专家闲着,GPU 利用率上不去。论文采用两道辅助损失(auxiliary loss),都是 Softmax-MoE 社区的标准做法:

专家级均衡损失(expert-level balance loss),约束每个路由专家被选中的频率与门控分数:

LExpBal=α1i=1NfiPi\mathcal{L}_{\mathrm{ExpBal}} = \alpha_1 \sum_{i=1}^{N'} f_i\, P_ifi=NKTt=1T1(token t 选择了专家 i),Pi=1Tt=1Tsi,tf_i = \frac{N'}{K' T}\sum_{t=1}^{T} \mathbb{1}(\text{token } t \text{ 选择了专家 } i), \qquad P_i = \frac{1}{T}\sum_{t=1}^{T} s_{i,t}

其中 N=mNKsN' = mN - K_s 是路由专家总数,K=mKKsK' = mK - K_s 是激活的路由专家数,TT 是序列长度,1()\mathbb{1}(\cdot) 是指示函数。fif_i 是专家 ii 被选中的归一化频率(所有专家都均匀时 fi=1f_i=1),PiP_i 是该专家门控分数的均值。两者都接近 1 时损失最小,起到把负载拉平的作用;α1\alpha_1 是平衡因子(balance factor)。

设备级均衡损失(device-level balance loss)。当专家被分布到多台设备(专家并行)时,真正需要平衡的不是专家个体而是设备:如果所有热门专家恰好落在同一张卡上,那张卡就会成为计算瓶颈。把路由专家分成 DD{E1,,ED}\{\mathcal{E}_1, \ldots, \mathcal{E}_D\}、每组部署在一台设备上:

LDevBal=α2i=1DfiPi\mathcal{L}_{\mathrm{DevBal}} = \alpha_2 \sum_{i=1}^{D} f_i'\, P_i'fi=1EijEifj,Pi=jEiPjf_i' = \frac{1}{|\mathcal{E}_i|}\sum_{j \in \mathcal{E}_i} f_j, \qquad P_i' = \sum_{j \in \mathcal{E}_i} P_j

fif_i' 是设备 ii 上专家的平均选择频率,PiP_i' 是设备 ii 上门控分数之和。

论文的实践取值很有讲究:专家级因子设小、设备级因子设大。原因在于,专家级强均衡会损害模型性能——强行让每个专家流量相等,等于禁止模型把相关任务集中到少数专家上,专业化就无从谈起;而设备级均衡只关心”每张卡干活量差不多”,约束宽松得多,不伤性能。2B 验证模型专家全在单卡上,只用了 α1=0.01\alpha_1 = 0.01;16B 用流水线并行(每层专家在同一设备),α1\alpha_1 降到 0.001;145B 引入专家并行后加回设备级损失,α2=0.05\alpha_2 = 0.05α1=0.003\alpha_1 = 0.003

这套”小专家级 + 大设备级”的取舍对推理同样重要:路由均衡直接决定推理时专家并行(expert parallelism)的利用率。后续 DeepSeek-V3 的 EPLB(专家并行负载均衡器)就是在推理服务中继续解决同一问题——把热门专家复制到多张卡、把流量波动下的负载重新摊平。

2B 验证实验:逼近 MoE 的理论上限#

实验设置#

为了在可控成本下验证架构,论文训练了一批 2B 规模的模型:9 层 Transformer、隐藏维度 1280、10 个注意力头(每头 128 维)。所有 MoE 模型的专家总参数固定为标准 FFN 的 16 倍激活专家参数为标准 FFN 的 2 倍(约 0.3B 激活参数),训练 100B token。参与对比的五个模型:

模型总参数激活参数结构
Dense0.2B0.2B标准稠密 Transformer
Hash Layer2.0B0.2Btop-1 哈希路由(固定路由)
Switch Transformer2.0B0.2Btop-1 可学习路由
GShard2.0B0.3Btop-2 可学习路由
DeepSeekMoE2.0B0.3B1 共享 + 63 路由,激活 1+7

所有模型共用同一训练语料与超参数,保证对比干净。注意 DeepSeekMoE 与 GShard 的激活参数同为 0.3B——这是一场”同算力预算”的公平对决。

结果:全面碾压同预算 MoE#

基准DenseHash LayerSwitchGShardDeepSeekMoE
Pile (loss ↓)2.0601.9321.8811.8671.808
HellaSwag38.846.249.150.554.8
ARC-easy41.045.345.943.949.4
HumanEval0.01.22.43.74.9
TriviaQA4.96.58.910.216.6
NaturalQuestions1.41.42.53.25.7

(数据来自论文 Table 1;表中 Dense 为 0.2B 稠密基线。)

三个观察:稀疏架构整体碾压同激活参数的稠密基线;GShard 因激活参数更多略胜 Switch;DeepSeekMoE 在激活参数与 GShard 完全相同的情况下全面大幅领先,TriviaQA 领先 6.4 个点、Pile 损失低 0.059。这些差距在 100B token 的小训练量下就清晰可见,说明优势来自架构本身而非规模。

更强的对比:打平 GShard×1.5,逼近 Dense×16#

更关键的对比是”需要多大模型才能追平 DeepSeekMoE”:

  • GShard ×1.5:专家尺寸放大 1.5 倍,总专家参数 2.83B、激活 0.35B,FLOPs 从 4.3T 涨到 5.8T。结果 Pile 损失同为 1.808,HellaSwag 54.4 vs 54.8、PIQA 71.1 vs 72.3——DeepSeekMoE 用 1/1.5 的专家参数和算力打平了它
  • Dense ×16:用 16 个”共享专家”模拟一个 FFN 参数放大 16 倍的稠密模型(总专家参数 1.89B、激活 1.89B),这是 MoE 模型在容量上的严格上限——所有专家全激活的稠密化版本。Dense ×16 的 Pile 损失是 1.806,DeepSeekMoE 是 1.808,HellaSwag 55.1 vs 54.8。

论文由此给出一个极强结论:至少在 2B 规模、100B token 训练量下,DeepSeekMoE 的性能已经与 MoE 的理论上限(对应稠密模型)基本重合。传统 MoE 架构离上限的差距,被架构设计吃掉了。

消融实验:两个策略各自的贡献#

DeepSeekMoE 消融实验:所有对比模型总参数与激活参数完全一致,性能按最优值归一化(图片来源:DeepSeekMoE 论文 Figure 3)
DeepSeekMoE 消融实验:所有对比模型总参数与激活参数完全一致,性能按最优值归一化(图片来源:DeepSeekMoE 论文 Figure 3)

图:论文 Figure 3——每组柱子的模型从左到右依次是:GShard、GShard + 1 共享专家、切分为 32 个专家的 DeepSeekMoE、切分为 64 个专家的 DeepSeekMoE(即完整版)。

消融分两步,每一步都在总参数与激活参数不变的条件下进行:

  1. 只加共享专家:在 GShard 基础上隔离 1 个共享专家(激活的路由专家从 2 减到 1),多数基准上性能提升——共享专家隔离单独成立;
  2. 再加细粒度切分:继续把专家切成 32 个、64 个,性能随粒度变细单调提升——细粒度切分单独成立。

两条策略的收益可以叠加,且切分粒度越大、收益越明显。

专家专业化:三组实验证据#

架构设计的最终目标是”每个专家掌握不重叠、聚焦的知识”。论文设计了三个实验直接度量专业化程度,都很有启发性。

证据一:禁用 top 路由专家——DeepSeekMoE 对”缺人”更敏感#

对每个 token,把路由概率最高的前若干专家”禁用”(不能参与 top-K 选择),观察 Pile 损失的上升幅度。对比对象是与 DeepSeekMoE Pile 损失相同(1.808)的 GShard ×1.5,两者起点一致,禁用后的落差就是冗余度的度量:

禁用不同比例的 top 路由专家后的 Pile 损失变化:DeepSeekMoE 更敏感,说明路由专家冗余度更低(图片来源:DeepSeekMoE 论文 Figure 4)
禁用不同比例的 top 路由专家后的 Pile 损失变化:DeepSeekMoE 更敏感,说明路由专家冗余度更低(图片来源:DeepSeekMoE 论文 Figure 4)

图:论文 Figure 4——横轴为禁用 top 路由专家的比例,纵轴为 Pile 交叉熵损失。

DeepSeekMoE 的损失随禁用比例急剧上升,GShard ×1.5 则平缓得多。解释很直观:冗余度越低,每个专家越”不可替代”,少任何一个都会明显掉性能。GShard 的专家们知识重叠严重,禁用 top-1 后第二名还能顶上大部分活。

证据二:禁用共享专家——损失暴涨 0.6#

把唯一的共享专家禁掉、同时多激活一个路由专家,保持计算量不变。Pile 损失从 1.808 暴涨到 2.414——这相当于多激活一个路由专家完全无法弥补共享专家的缺失。结论:共享专家里存的是”基础且必需”的知识(公共知识),路由专家没有能力也没有意愿去学它。这个实验同时验证了公共知识确实被成功”隔离”进了共享专家。

证据三:更少的激活专家、更少的激活参数#

两个相关实验:

  • 把激活的路由专家数从 7 一路降到 3:只激活 4 个路由专家时,Pile 损失就已经与 GShard(激活 2 个完整专家)相当

激活不同数量路由专家时的 Pile 损失:只激活 4 个路由专家即可达到 GShard 的水平(图片来源:DeepSeekMoE 论文 Figure 5)
激活不同数量路由专家时的 Pile 损失:只激活 4 个路由专家即可达到 GShard 的水平(图片来源:DeepSeekMoE 论文 Figure 5)

图:论文 Figure 5——横轴为激活的路由专家数量,虚线为 GShard 的 Pile 损失参考线。

  • 更进一步,从零训练一个只激活 3 个路由专家(加 1 个共享专家,共激活 0.17B 专家参数)的模型,与 GShard 全配置(0.35B 激活专家参数)对比:

一半激活专家参数、从零训练的 DeepSeekMoE 仍全面优于 GShard(图片来源:DeepSeekMoE 论文 Figure 6)
一半激活专家参数、从零训练的 DeepSeekMoE 仍全面优于 GShard(图片来源:DeepSeekMoE 论文 Figure 6)

图:论文 Figure 6——相同总专家参数下,DeepSeekMoE 只用 GShard 一半的激活专家参数训练(左),多项基准上仍然领先(右)。

这说明 DeepSeekMoE 激活参数中”有效参数”的比例远高于 GShard——同样的算力预算,DeepSeekMoE 能买到更多真实能力。这正是”终极专家专业化”的量化体现。

放大到 16B:40% 算力打平 7B 稠密模型#

配置与训练细节#

DeepSeekMoE 16B 的配置:28 层、隐藏维度 2048、16 个注意力头(每头 128 维)、100K 词表,在 2T token 的双语(中英)语料上训练,训练超参数与 DeepSeek 7B 稠密模型完全对齐,保证对比公平。每个 MoE 层由 2 个共享专家 + 64 个路由专家组成,每个专家是标准 FFN 的 1/4,每个 token 激活 2 个共享专家 + 6 个路由专家。总参数约 16.4B,激活参数约 2.8B。

两个值得注意的工程细节:

  • 第一层的 FFN 保持稠密,不替换成 MoE 层。论文观察到第一层的负载均衡收敛明显更慢——模型刚接触输入时路由还不稳定,硬上 MoE 只会拖慢训练。这是”该稀疏的地方稀疏、不该稀疏的地方稠密”的务实取舍。
  • 训练采用流水线并行(pipeline parallelism)而非专家并行:每层全部 66 个专家部署在同一设备上,因此不需要设备级均衡损失,只用很小的专家级因子 α1=0.001\alpha_1 = 0.001(实验发现更大的专家级因子在流水线并行下不提升计算效率,反而伤性能)。

结果:打平 DeepSeek 7B 与 LLaMA2 7B#

与同语料训练的 DeepSeek 7B(6.9B 稠密)对比:FLOPs 仅为后者的 40.5%,Pile 的 bits-per-byte(BPB)0.74 vs 0.75 略优,HellaSwag 77.1 vs 75.4、TriviaQA 64.8 vs 59.7、NaturalQuestions 25.5 vs 22.2 明显领先。

与 LLaMA2 7B(论文)对比:总参数是其 245%,但算力只需 39.6%,多数基准上反超——代码与数学上差距尤其大(HumanEval 26.8 vs 14.6,MBPP 39.2 vs 21.8),中文基准上更是碾压(CHID 89.4 vs 37.9、CEval 40.6 vs 33.9),这主要来自训练语料的中文与代码占比。

论文同时诚实报告了短板:MMLU、CEval、CMMLU 这类多选选择题上落后(MMLU 45.0 vs 48.2)。归因很清晰:DeepSeekMoE 16B 的注意力参数只有约 0.5B,而 DeepSeek 7B 有 2.5B——MoE 只稀疏化了 FFN,注意力仍是稠密的,所以模型越大、注意力占比越小,而多选任务恰好对注意力容量敏感(此前 DeepSeek 7B MQA 变体在 MMLU 上同样吃亏)。这个短板在后续 V2 里由 MLA 从另一个角度部分缓解。这也解释了为什么后来的 DeepSeek 模型在扩 MoE 参数的同时从不压缩注意力结构。

在 Open LLM Leaderboard 上与一批开源模型(LLaMA 7B、Falcon 7B、GPT-J 6B、Open LLaMA、Pythia 2.8B、BLOOM 3B 等)比较:

Open LLM Leaderboard 对比:横轴为激活参数,纵轴为平均分。DeepSeekMoE 16B 大幅超越同激活参数模型,与约 2.5 倍激活参数的 LLaMA2 7B 相当(图片来源:DeepSeekMoE 论文 Figure 1)
Open LLM Leaderboard 对比:横轴为激活参数,纵轴为平均分。DeepSeekMoE 16B 大幅超越同激活参数模型,与约 2.5 倍激活参数的 LLaMA2 7B 相当(图片来源:DeepSeekMoE 论文 Figure 1)

图:论文 Figure 1——红色虚线是对除 DeepSeekMoE 外所有模型的线性拟合。

图里横轴是激活参数(不是总参数)——这正是 MoE 推理成本的度量轴:横轴上越靠左、推理越便宜。DeepSeekMoE 16B 位于图中左上角:推理成本只有 7B 稠密模型的四成,性能却打平甚至超过它们。

推理侧的直接收益#

论文在部署部分给出一组具体数字:DeepSeekMoE 16B 可以在单张 40GB 显存的 GPU 上不做任何量化直接部署;配合算子优化,推理速度约为 7B 稠密模型的 2.5 倍。这个”单卡能跑”的里程碑式结果,是 MoE 稀疏激活的显存与算力红利第一次以完整模型的形式落地——也是后来 DeepSeek-V2 把 API 价格打下来的前奏。对推理而言,16.4B 总参数意味着权重文件约 33GB(BF16),40GB 显存恰好放下;2.8B 激活意味着每个 token 的 FFN 计算只相当于一个 2.8B 稠密模型。

SFT 对齐#

论文还对 16B 做了有监督微调(Supervised Fine-Tuning, SFT),在 1.4M 条内部对话数据上训练 8 个 epoch,构造出 DeepSeekMoE Chat 16B。与同数据微调的 LLaMA2 SFT 7B、DeepSeek Chat 7B 相比,40% 算力下多数基准打平或更好,代码(HumanEval 45.7、MBPP 46.2)与中文基准明显领先。这打破了当时”MoE 微调收益小”的普遍印象,也验证了架构的实用性。

初步扩展:145B——28.5% 算力打平 67B 稠密#

论文最后的扩展实验把 DeepSeekMoE 推到 145B 规模(62 层、隐藏维度 4096、32 注意力头),配置为 4 共享 + 128 路由专家、每个专家是标准 FFN 的 1/8、每 token 激活 4+12 个,总参数 144.6B、激活 22.2B,训练 245B token。这一规模下首次启用了专家并行(每层 128 个路由专家均匀分布在 4 台设备上),因此重新引入设备级均衡损失(α2=0.05\alpha_2 = 0.05)。

对照组与结果(论文 Table 6 节选):

模型总参数激活参数相对算力Pile (loss ↓)HellaSwagTriviaQA
DeepSeek 67B (Dense)67.4B67.4B100%1.90574.857.2
GShard 137B136.5B21.6B27.8%1.96172.052.5
DeepSeekMoE 145B144.6B22.2B28.5%1.87675.861.1
DeepSeekMoE 142B(半激活)142.3B12.2B18.2%1.88874.959.8

三个结论:

  1. 同规模同算力下,DeepSeekMoE 145B 大幅领先 GShard 137B(Pile 1.876 vs 1.961),架构优势在 140B 规模依然成立;
  2. 只用 28.5% 的算力,DeepSeekMoE 145B 追平 DeepSeek 67B 稠密模型,多数基准甚至反超;
  3. 只激活一半专家参数的 DeepSeekMoE 142B(2 共享 + 6 路由)用 18.2% 的算力仍能匹配 67B 稠密模型、并超过 GShard 137B——专家专业化带来的参数效率在最大规模上再次兑现。

对推理系统的意义:为什么这套架构改变了服务成本#

把架构机制翻译成推理侧的账,DeepSeekMoE 的每个设计点都有明确的服务端含义:

激活参数 = 每 token 推理算力。解码是显存带宽受限的:每生成一个 token,要把激活参数对应的权重全部从显存读一遍(weight streaming)。激活 22.2B 意味着每 token 只需读约 44GB(BF16)权重,而 67B 稠密模型要读 134GB。稀疏激活直接把带宽需求除以 3 以上,这是 MoE 推理快于同性能稠密模型的物理根源。

共享专家是”固定开销”。共享专家永远激活,意味着:它们的权重必须常驻显存(无法卸载)、每个 token 都要计算它们(算力不可省)。但作为交换,它们让路由专家更专业,从而允许整体激活数更少。共享专家的存在还给显存规划提出了特殊要求——DeepSeek-V3 里共享专家 + 高频路由专家是显存中优先保证的常驻部分。

路由专家是”可调度资源”。路由专家只在被选中时工作,天然适合专家并行(expert parallelism):把不同专家放在不同 GPU 上,按路由结果做 all-to-all 通信。但热门专家会成为热点——V3 的 EPLB 把高频专家复制到多卡、按设备负载动态重排专家分布,正是延续 DeepSeekMoE 论文中”设备级均衡”的思想;本站拆解过的 ExpertPlex 用共享专家+注意力发起的单边通信解决 MoE 高吞吐服务,FreeToken 在边缘设备上按带宽自适应调度 MoE 专家,都是在同一套架构约束下做文章。

门控开销与批量效应。每 token 都要对 128+ 个专家算亲和度并做 top-k,路由本身有少量开销;批处理下不同 token 激活不同专家,带来访存模式的散乱,这正是 MoE kernel 优化的主战场(如专家融合 kernel、PTX 通信内核)。这也是 DeepSeekMoE 论文中”用 CUDA 与 Triton 开发门控与专家线性层融合 kernel”的直接原因。

后续演进:从 145B 到 V2/V3/V4#

DeepSeekMoE 确立的骨架此后被一代代沿用,只做增量修改:

模型(发布时间)总参数 / 激活MoE 配置相对 DeepSeekMoE 的增量
DeepSeekMoE 16B(2024.01)16.4B / 2.8B2 共享 + 64 路由,top-6架构定型
DeepSeek-V2(2024.05)236B / 21B2 共享 + 160 路由,top-6归一化 sigmoid 门控替代 softmax(缓解负载不均与冗余);注意力换 MLA
DeepSeek-V3(2024.12)671B / 37B1 共享 + 256 路由,top-8FP8 训练与推理、EPLB 专家并行负载均衡、MTP(Multi-Token Prediction,多 token 预测)自投机解码
DeepSeek-V4-Pro(2026.04)1.6T / 49B共享 + 路由专家,FP4 量化FP4 专家权重、CSA/HCA 混合稀疏注意力、TileLang 融合 kernel

门控机制本身也经历了重要演变。DeepSeekMoE 论文里亲和度用的是 softmax(公式见前文),softmax 天然把分数归一成”竞争性”分布——一个专家分数高,其他专家必须压低,这加剧了专家间的知识冗余与负载不均。DeepSeek-V2 改用了归一化 sigmoid 门控:先对每个专家独立计算 sigmoid(uei)\mathrm{sigmoid}(\mathbf{u}^{\top}\mathbf{e}_i),再做归一化,各专家的门控不再相互竞争,允许”多个专家同时高分”。这一改动直接继承了 DeepSeekMoE 的”路由专家应专注差异化”思想,是同一逻辑的延续。想深入了解 V2 的注意力侧创新(MLA,Multi-head Latent Attention,多头潜在注意力——低秩 KV 压缩)可读本站的 MLA 完全拆解

另一个视角:DeepSeekMoE 也是推理优化的”上游约束”。本站拆解过的 连续批处理PagedAttention 处理的是注意力与 KV 缓存;而 MoE 层的不规则访存、专家负载、带宽压力,则催生了 EPLB、融合 MoE kernel、专家并行调度等一系列下游技术。V4 的 TileLang 融合 kernel 能同时重叠计算/通信/访存,正是把这条线推到极致的产物。

小结#

DeepSeekMoE 的全部内容可以压缩为三条:

  1. 细粒度专家切分:把大专家切成 1/m1/m 大小的小专家、激活数乘 mm,在总参数与算力不变的前提下,把”谁处理这个 token”的组合空间从 120 种扩到 44 亿种,知识分解更细、组合更精准;
  2. 共享专家隔离:设 KsK_s 个永远激活的专家吸收公共知识,路由专家不再重复存储通用能力,参数冗余被结构性消除;
  3. 两级负载均衡:小权重专家级损失防路由坍缩、大权重设备级损失促多卡均衡,且专家级约束刻意放松以保住专业化。

实验上,2B 规模就追平了 1.5 倍算力的 GShard 并逼近稠密模型上限;16B 用 40% 算力打平 LLaMA2 7B 且单卡 40GB 可部署;145B 用 28.5% 算力匹配 67B 稠密模型。此后 V2/V3/V4 一路沿用并微调这套骨架。对推理从业者而言,DeepSeekMoE 最大的启示是:模型的”便宜”不只来自算法优化,更来自架构设计本身对激活参数规模的约束——它决定了推理服务的算力、带宽与显存下限。

参考资料#

  1. DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models(arXiv:2401.06066,ICLR 2024)
  2. deepseek-ai/DeepSeek-MoE(GitHub 仓库)
  3. deepseek-ai/deepseek-moe-16b-base(Hugging Face 模型仓库)
  4. DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model(arXiv:2405.04434,sigmoid 门控出处)
  5. DeepSeek-V3 Technical Report(arXiv:2412.19437,EPLB 与 MTP 出处)
  6. GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding(arXiv:2006.16668)
  7. Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity(arXiv:2101.03961)
  8. DeepSpeed: System Optimizations Enable Training Deep Learning Models with Over 100 Billion Parameters(arXiv:2207.00032,共享专家雏形出处)
  9. LLaMA 2: Open Foundation and Fine-Tuned Chat Models(arXiv:2307.09288)
  10. The Neural Base: DeepSeek Shared Experts(MoE 高级课程中对共享专家的解读)
  11. DeepWiki: deepseek-ai/DeepSeek-MoE 代码结构解析

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

DeepSeekMoE 完全拆解:细粒度专家切分与共享专家隔离
https://pinghaoyang.com.cn/aigc/posts/deepseek-moe/
作者
平昊阳
发布于
2026-08-29
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
平昊阳
乘长风,破巨浪, 展鸿图于未央!
--
总访问量
--
访客数
公告
欢迎来到我的个人博客!欢迎关注交流吖!
更多相关公告,见
社交-留言」。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
站点统计
文章
87
分类
18
标签
111
总字数
736,012
运行时长
0
最后活动
0 天前

文章目录