MoE原理:总参数与激活参数
看到MoE模型的“总参数”和“激活参数”,首先要问统计口径。总参数描述模型保存了多少权重;激活参数通常描述处理一个token时涉及的权重子集。后一项较小,不等于其余专家可以从内存里永久删掉,也不等于同参数量的稠密模型有完全相同的速度。
先用一个虚构模型算清楚
假设模型有2亿共享参数,此外有8个互不共享权重的专家,每个专家1亿参数。路由器每个token选择2个专家,所有共享参数都参与这条计算路径;路由器本身已算在共享部分。于是:
总参数 = 2亿 + 8 × 1亿 = 10亿
单token涉及参数 = 2亿 + 2 × 1亿 = 4亿
这个简化例子假设只统计一组专家,并忽略参数复用的计数细节。真实模型可能有多层专家、共享专家和不同大小的模块,应逐层加总并阅读模型说明,不能把这个公式直接套进所有模型。
如果这10亿参数全部用16位紧凑保存,原始权重占2×10⁹字节,也就是2 GB;4亿是每token涉及的参数数量,并不能据此把整套权重预算改成0.8 GB。这里没有计算任何元数据、缓存或运行工作区。
稀疏的是调用,不是把专家变成零
在稀疏MoE层,路由器根据token表示选择专家。不同token可能选不同专家;一个批次合起来甚至能用到全部专家。未被某个token选中的权重仍是模型的一部分。
Switch Transformer原始预印本于2021年公开,2022年发表在同行评审期刊JMLR。它采用每token选一个专家的Switch路由。本文的top-2仅是原创计数示例,不是对该论文配置或实验的复现。
专家在部署时可以分布到不同设备,也可以采用其他存储安排;本地是否常驻全部权重,必须看具体服务。把权重放到别处并没有让它们消失,还需要考虑读取、传输与调度的成本。
一个批次为什么会挤到同一个专家
下面为8个虚构token指定top-2路由。总分派量是8×2=16次,8个专家平均各2次,但最忙的专家实际收到7次。所有专家都被至少一个token触及。这同时说明“单token激活少”和“整批负载均衡”不是同一件事。
from collections import Counter
shared, per_expert, experts, top_k = 200, 100, 8, 2 # millions
assert 1 <= top_k <= experts
total = shared + experts * per_expert
active = shared + top_k * per_expert
assert (total, active) == (1000, 400)
print("total / active per token:", total, active, "million")
# Invented routing decisions: eight tokens, two experts per token.
routes = [(0,1), (0,2), (0,3), (0,4),
(0,5), (0,6), (0,7), (1,2)]
load = Counter(e for route in routes for e in route)
counts = [load[e] for e in range(experts)]
assert sum(counts) == len(routes) * top_k == 16
assert counts == [7,2,2,1,1,1,1,1]
assert len(load) == experts
print("assignments per expert:", counts)
print("mean / peak:", sum(counts)/experts, max(counts))
代码已执行并核对参数总量、每token计数、总分派量、各专家负载和专家覆盖范围。它没有学习路由器、调用LLM或计时。这里的“分派一次”也不代表真实GPU上相等的耗时。
假设另一个理想批次中,每个专家恰好分到2次任务,两批的总分派量可以一样,但瓶颈不同。真实执行还涉及分组、批量矩阵乘法、通信及不同设备速度,不能仅用平均负载预测延迟。
参数比不能当成速度比
本例单token参数计数是总量的40%,但不能宣称因此只需40%的推理时间。共享部分、注意力、路由、数据搬运和专家计算各有开销。专家并行也可能让一个设备等待另一个设备完成。
| 数字 | 能回答的问题 | 不能单独回答的问题 |
|---|---|---|
| 总参数 | 权重存储的基础规模 | 推理峰值显存 |
| 激活参数 | 约定口径下的单token权重子集 | 端到端耗时与质量 |
| 专家分派量 | 路由任务数量 | 实际通信与计算时间 |
Switch论文讨论了通信、负载及训练稳定性。本文不引用其中的加速倍数;论文在特定训练与硬件设置下报告的成绩,不应变成任意MoE推理服务的承诺。
比较部署时,保留这些测量条件
可以先记录总参数与激活参数的定义、专家数、每token选择数、权重精度和设备分布,再用相同输入输出长度及并发测试。测量峰值内存、完成吞吐、首token延迟和后续生成间隔,保留任务质量结果。
量化位宽影响权重表示;GQA改变KV共享结构;MoE讨论不同token选择哪些专家。把三种机制分开看,才不会拿一个较小的“激活参数”数字代替完整部署预算。
资料来源
Switch Transformers, JMLR 2022; 论文原文; arXiv submission history.
支持
如果这篇文章对你有帮助,欢迎支持本站。
二维码可点击放大。更多支持方式见支持页面。


