ELAI S.r.l.

AI 模型只激活少数专家,为什么仍会过载?

用十六个 token 解释 MoE 模型的路由、局部容量和负载均衡:可复现计算、策略比较与研究解读。

AI 模型只激活少数专家,为什么仍会过载?

空闲资源的悖论

设想一个助手同时阅读许多技术文档。模型包含多个专门模块,每个文本片段只使用其中一个,看起来能自然地节省计算。但系统某处已经满载,其他部分却几乎空闲。仅看资源总量解释不了问题,还要看请求流向哪里。本文要回答:整体激活计算不多的模型,为什么会在局部过载?

摘要。本文研究每个 token 选择一个专家的混合专家层(Mixture of Experts,MoE)。十六个合成 token 用于推导容量、未处理分配和闲置空间,区分路由概率、离散分配、时间上的均衡及加速器上的物理放置。将历史上的 Switch 方法与 DeepSeek-V3、2026 年 LLEP 预印本中的发展进行比较,不把其基准结果套到本例。本文结果是已执行的 Python 计数,没有训练网络或测量 GPU。

专家不是人,token 也不是完整请求

Token 是文本切分后的单位,可以是词、词片段或符号。这里的专家是前馈网络,即作用于 token 表示的一组数值变换。各专家参数不同,它们不是相互讨论的智能体,也不必对应医生、工程师等职业。“专家”指可能学到的专门化,不是经过认证的能力。

路由器给模块打分并选择使用对象。Top-1 选最高分,top-k 选 k 个。稀疏性指每个 token 激活的专家数量,而不是整个模型停工;注意力、路由器等组件仍在计算。一个批次的十六个 token 也可能来自一段对话或多份文档,因此路由 token 数不等于服务用户数。

构造一个可检查的案例

取 T=16 个 token、E=4 个专家。十二个 token 偏向专家 1,两个偏向专家 2,专家 3、4 各一个,因此 n=[12,2,1,1]。n_i 是分给专家 i 的次数,总和十六,因为每个 token 只分配一次。这是为说明机制构造的批次,并非商业模型轨迹;平均负载四,最大十二,是均值三倍。

能否全部处理取决于局部容量 C。先假定等大的固定缓冲区:每个专家本轮最多接收 C 次分配,超出部分不会自动改派其他专家。四个窗口的类比有助于理解拥堵,但边界是专家权重不同,换一个模块可能改变所计算的函数。

为什么十六个槽位容不下十六个 token

令 c 为容量因子,即平均负载的无量纲倍数。模拟器向上取整:C=ceil(cT/E)。c=1 时 C=4,总容量 EC=16。总量与需求相等,分布却不一致:专家 1 的十二个分配只容纳四个,其他专家分别容纳 2、1、1,总共处理八个,另外八个超限。

C = ceil(c × T / E) A = Σ_i min(n_i, C) D = Σ_i max(n_i − C, 0) = T − A U = E × C − A

A 是已处理分配数,D 是超额分配数,U 是未使用槽位数,都是计数,不是秒、瓦或字节。第二式加总每个专家实际容纳的数量,而非假定位置可互换后的总容量。c=1 时 A=8、D=8、U=8,未满足需求与空闲空间同时存在,这就定量解释了开头的悖论。

c每专家 C超额 D总槽位空闲 U
148168
1.25572011
1.5662414
2843220
2.51024026
31204832

表格保持路由不变,只改变 c。容量翻倍得到 C=8,仍有四个超额分配;此批次要 C=12,即 c=3,才能清零,需为十六次分配预留四十八槽位。这不代表真实软件必定消耗三倍内存或时间,仍取决于缓冲表示和内核。这里是固定分配计数,不是加速器实测。

已执行的合成例子:固定路由下,提高容量因子会减少超额分配,却增加预留槽位。16 的线是请求分配数,不是内存限制;点为六个计算配置,连接线仅供阅读。
已执行的合成例子:固定路由下,提高容量因子会减少超额分配,却增加预留槽位。16 的线是请求分配数,不是内存限制;点为六个计算配置,连接线仅供阅读。

丢弃 token 不等于删除一个词

在 MoE 层中,token dropping 可以指容量耗尽时跳过专家贡献。所读 Switch 设置中,表示仍沿残差连接传递,并不是从文档删除一个词。模型仍可回答,但该 token 在该层没有得到原定变换。实验只统计缺失贡献,没有计算其语言质量影响。

其他实现用动态形状、分组或不同调度处理全部分配。此时 D 不再是真实运行时行为,而是超过假设 C 的数量;问题可能表现为更多内存、等待或最忙设备上的工作量。解释丢弃比例前必须知道具体策略,相同负载分布在不同系统中可产生不同后果。

概率接近均匀,决策却很不均衡

每个 token 给赢家概率 0.28,其他三个各 0.24,总和为一。偏好虽弱,top-1 仍选唯一赢家,不会把 token 分成四份。令 f_i=n_i/T 为实际分配比例,P_i 为批次平均路由概率。本例 f=[0.75,0.125,0.0625,0.0625],P=[0.27,0.245,0.2425,0.2425],混淆两者会掩盖过载。

f_i = n_i / T P_i = (1/T) × Σ_t p_i(t) B = E × Σ_i f_i P_i

B 是 Switch 式均衡项,尚未乘训练目标中的权重系数。分配与概率都均匀时为一,本例却在一半分配超过 C=4 的同时得到 B=1.05375。这不是说该项无用,而是其值并非缺失 token 计数,也不是每批次硬约束;也不声称一对所有可行 f、P 都是全局下界。

路由器通过连续分数学到偏好,最大值选择却离散变化,因此统计正则化与容量保证回答不同问题:前者引导学习,后者必须规定每次分配如何处理。任意增大均衡权重也可能让目标从任务质量偏向均匀性,评估这一权衡需要受控训练,本文未执行。

全天均值可以隐藏每次局部峰值

换成四个连续窗口,每窗八个 token,依次全部去专家 1、2、3、4。整个时段每专家都收到八个,汇总直方图完全均衡。但 c=1 时每窗 C=8/4=2,每次六个超限,三十二次分配中共二十四次超限。汇总比例看不出缓冲区真正面对的峰值。

这没有证明短窗口总更差,也没有要求每份文档使用全部专家;证明的是汇总会丢失信息。真实测量需按层、批次和设备记录负载,时间尺度与约束一致。若内存按微批次分配,全天均值回答的问题就不同于瞬时耗尽。

专家均衡与设备均衡不是一回事

专家是逻辑模块,GPU 是物理设备,可承载多个专家。第二个计数有八专家,负载 [8,8,0,0,4,4,4,4],四设备各承载两个。相邻专家配对得到设备负载 [16,0,8,8],改成 (1,3)、(2,4)、(5,6)、(7,8) 则为 [8,8,8,8]。没有 token 换专家,只改变执行地点。

这只是分配上的可能性,不是实测加速。迁移或复制权重消耗内存与通信,结果要返回来源,训练时梯度还需正确汇总,下一批负载也可能变化。物理均衡保留了路由器的语义选择,却引入调度问题,因此仅凭激活参数量无法确定延迟、峰值内存或服务成本。

研究增加了什么,我们没有复现什么

Fedus、Zoph、Shazeer 的 Switch Transformers 发表于 2022 年 JMLR,并非 2026 年新成果。已阅读路由、容量、目标和实验;表 1 使用 C4 预训练与 32 个 TPUv3 核心,其时间不代表本例或 EL-AI 基础设施。

DeepSeek-V3 技术报告 v2(2025 年 2 月 18 日)区分选择偏置与组合权重,并保留小的序列辅助项。所读双尺度消融保持数据和架构可比;本文未复现训练或基准,“loss-free”不意味着完全没有任何辅助损失。

为联系近期研究,已读 Nguyen 等人的 Least-Loaded Expert Parallelism,arXiv v1,2026 年 1 月 23 日。它重分配工作与权重,受控实验用八块 H200,并区分单层与完整模型。收益依赖通信、批大小和阈值;本文不是穷尽前沿的综述。

从可复现计数走向设计决策

下方 Python 重复首表:ceil 规定取整,min 限定每专家接收量,减法得到超额与闲置槽位。完整附件加入概率、均衡项、时间窗口和放置。输入确定,无种子,也没有模型生成 token。概率计数 O(TE),保存 T×E 矩阵;仅容量计数每配置 O(E)。这描述教学脚本,不是 MoE 内核。

真实评估需固定检查点、层、top-k、精度、硬件、运行时、批次和文档分布,分别测专家与设备负载、峰值内存、通信、延迟,再检查回答质量及少见领域表现。比较应使用相同输入并计入均衡开销。这是待执行协议;本实验帮助在昂贵测量前确定问题。

答案很具体:每 token 少激活专家,只限制部分工作量,并不保证工作流向有容量的位置。本批次十六槽位仍让八次分配缺少专家贡献,接近均匀的概率与全局均值也不足以发现问题。容量、路由学习和物理放置是不同手段,各有成本。企业评估助手时,除了激活参数量,更应问自己的文档带来何种负载、质量如何、受何种约束。

参考文献与可复现材料

Fedus, Zoph, Shazeer — Switch Transformers, JMLR 23, 2022, sections 2.1–2.4.

DeepSeek-AI et al. — DeepSeek-V3 Technical Report, arXiv v2, 18 February 2025, sections 2.1.2 and 4.5.

Nguyen, Pandit, Xu, Xiong, Joty — Least-Loaded Expert Parallelism, arXiv v1, 23 January 2026, sections 3–5.

from math import ceil
loads = [12, 2, 1, 1]
tokens, experts = sum(loads), len(loads)
for factor in (1, 1.25, 1.5, 2, 2.5, 3):
    capacity = ceil(factor * tokens / experts)
    accepted = sum(min(n, capacity) for n in loads)
    print(factor, capacity, tokens-accepted, experts*capacity-accepted)

代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 10 月 4 日。