传统稠密大语言模型通常在每个 Transformer 层中使用一个完整的前馈网络。Mixture-of-Experts,简称 MoE,则将前馈网络替换为多个相互独立的专家,并由路由器为每个 Token 选择少量专家参与计算。
这种设计减少了每个 Token 实际激活的参数量,但也带来了一个新的部署问题:
虽然每个 Token 只计算少数专家,所有专家的参数仍然必须被加载到显存中。
《Not All Experts are Equal》提出两种互补的方法:
专家剪枝:永久删除作用较小的完整专家,主要减少模型参数量和显存占用;
动态专家跳过:推理时根据路由权重,临时跳过贡献较小的已选专家,主要减少单个 Token 的实际计算量。
这篇论文最大的特点,是没有继续剪单个权重,而是直接利用 MoE 模型已有的模块化结构,在专家粒度上进行压缩。
一、论文基本信息
| 项目 | 内容 |
|---|---|
| 论文题目 | Not All Experts are Equal: Efficient Expert Pruning and Skipping for Mixture-of-Experts Large Language Models |
| 主要方法 | Post-training Expert Pruning、Dynamic Expert Skipping |
| 作者 | Xudong Lu、Qi Liu、Yuhui Xu、Aojun Zhou、Siyuan Huang、Bo Zhang、Junchi Yan、Hongsheng Li |
| 会议 | ACL 2024 Main Conference Long Papers |
| 页码 | 6159–6172 |
| DOI | 10.18653/v1/2024.acl-long.334 |
| 主要模型 | Mixtral 8x7B、Mixtral 8x7B Instruct |
| 官方代码 | Lucky-Lance/Expert_Sparsity |
论文发表于 ACL 2024 长文,官方代码支持逐层专家剪枝、渐进式专家剪枝和动态专家跳过,并提供 C4、MATH 校准数据以及 LM Evaluation Harness 的评估流程。(ACL 论文集)
二、为什么 MoE 模型还需要剪枝
2.1 激活参数少,不代表模型存储小
Mixtral 8x7B 每个 MoE 层包含 8 个专家。对于每个 Token,路由器只选择其中得分最高的两个专家参与计算,因此它的单 Token 活跃参数远少于全部参数。
但是,推理系统仍然需要存储所有专家。论文指出,Mixtral 8x7B 总参数约为 47B,其中专家参数约为 45B,占全部模型参数的约 96%。使用 BF16 加载原始模型,论文的实验环境需要两张 A100 80GB GPU。
因此,MoE 实际上同时存在两种参数概念:
| 参数类型 | 含义 |
|---|---|
| 总参数 | 部署时必须加载的全部专家和共享参数 |
| 活跃参数 | 一个 Token 前向传播时真正参与计算的参数 |
MoE 减少的主要是活跃参数,但模型存储、显存占用和专家加载开销仍由总参数决定。
2.2 不同专家的作用并不完全相同
如果每个专家都同样重要,那么删除任何一个专家都会造成明显损失。
但实际训练中:
不同专家接收到的 Token 数量不同;
不同专家学习到的领域知识不同;
某些专家可能高度专业化;
某些专家之间可能存在功能重叠;
部分专家可能训练不足或贡献较小。
论文因此提出:
与其在所有专家内部平均删除权重,不如直接找出贡献较低的完整专家并将其移除。
这种做法更加符合 MoE 的模块化特征。
三、首先理解 Mixtral 的专家路由
在 Mixtral 8x7B 的每个 MoE 层中,路由器会为当前 Token 计算 8 个专家的路由分数,然后选择其中最高的两个专家。
假设路由器选择了专家 A 和专家 B:
专家 A 的权重较高;
专家 B 的权重较低;
两个专家分别处理同一个 Token;
最终输出是两个专家输出的加权和。
因此,原始 Mixtral 对每个 Token 都会计算两个专家,而不是从 8 个专家中只运行一个。
论文的两个方法分别从不同角度改造这一过程:
专家剪枝
原来每层有 8 个可选专家,剪枝后可能只剩 6 个或 4 个,但每个 Token 通常仍从剩余专家中选择两个。
动态专家跳过
每层可以继续保留原有专家,但当第二个专家的路由权重明显小于第一个专家时,只运行第一个专家。
这两种方法处理的是两个不同问题。
四、专家剪枝和动态跳过有什么区别
| 对比维度 | 专家剪枝 | 动态专家跳过 |
|---|---|---|
| 专家是否永久删除 | 是 | 否 |
| 是否减少模型参数 | 是 | 否 |
| 是否减少模型文件 | 是 | 否 |
| 是否降低显存占用 | 是 | 基本不降低 |
| 是否减少每 Token 活跃专家数 | 通常不减少 | 是 |
| 决策时间 | 部署前离线决定 | 推理时逐 Token 决定 |
| 主要目标 | 降低存储和显存 | 降低实际计算量 |
| 是否可同时使用 | 可以 | 可以 |
论文明确指出,单独的专家剪枝虽然减少了总参数,但每个 Token 仍然会被路由到两个专家,所以理论上的每 Token MoE FLOPs 并没有同步减少。专家剪枝的速度收益主要来自更少的 GPU、通信开销和更好的内存局部性;动态跳过才直接减少了部分 Token 的活跃专家数量。
五、方法一:后训练专家剪枝
5.1 核心思想
专家剪枝的基本目标是:
找出一组专家,使删除其他专家后,当前 MoE 层的输出尽可能接近原始输出。
这里并不是简单统计哪个专家被路由得最少,也不是比较专家权重大小,而是直接测量删除一组专家后,MoE 层输出发生了多大变化。
因此,它本质上是一种层输出重构方法。
5.2 第一步:准备校准数据
对于通用任务,论文从 C4 中抽取校准样本。
默认实验将文本整理为:
128 个序列;
每个序列包含 2048 个 Token。
然后使用完整的原始模型执行前向传播,并缓存每一个 MoE 层的:
输入特征;
原始输出特征。
这些缓存结果相当于每个 MoE 层剪枝时的参考答案。
5.3 第二步:枚举专家组合
假设每层原来有 8 个专家,希望最终保留 6 个。
算法会枚举所有“从 8 个专家中选 6 个”的组合。对于每一种组合:
暂时删除其他两个专家;
删除与这些专家对应的路由分支;
使用缓存的层输入重新执行该 MoE 层;
比较剪枝后输出和原始输出之间的差异。
输出差异最小的专家组合会被保留。
如果希望每层只保留 4 个专家,就枚举所有“8 选 4”的组合,并选择重构误差最低的一组。
5.4 为什么可以直接枚举
对于 Mixtral,每层只有 8 个专家。
保留 6 个时,只需要测试 28 种组合;保留 4 个时,需要测试 70 种组合。这个搜索空间并不算大,因此可以直接穷举。
论文报告,Mixtral 8x7B:
保留 6 个专家的剪枝约需 30 分钟;
保留 4 个专家的剪枝约需 90 分钟。
整个任务无须更新模型参数,也不需要剪枝后微调。
5.5 为什么逐层独立剪枝
论文采用的是layer-wise pruning:
每一层都使用原始模型缓存的输入和输出;
每一层独立搜索自己的最佳专家组合;
最后将所有剪枝后的 MoE 层重新组合成完整模型。
这种方式速度较快,也避免了前面层剪枝误差持续影响后面层的搜索。
论文还测试了渐进式方法:先剪第一层,再使用已经剪过的模型继续搜索下一层。渐进式搜索在保留 6 个专家时略好,但在只保留 4 个专家时反而更差,作者推测可能是小规模校准数据上的逐层过拟合。
六、为什么不能直接根据路由频率剪专家
一个非常自然的思路是:
哪个专家被路由器选择得最少,就删除哪个专家。
论文将这种方法称为 Frequency 基线。
但实验发现,基于激活频率的专家剪枝表现甚至经常低于随机剪枝。
原因可能是:
1. 调用频率不等于不可替代性
一个专家可能很少被调用,但它专门处理某类困难或少见输入。删除后,模型在这些样本上的能力会明显下降。
2. 高频专家之间可能高度冗余
两个专家可能经常被调用,但功能高度相似。保留所有高频专家未必是最好的组合。
3. 专家作用需要联合判断
删除专家 A 是否安全,可能取决于专家 B、C 是否仍然存在。单独给每个专家排一个频率分数,无法表达专家之间的互补关系。
4. 重构误差更接近实际影响
论文的方法直接回答:
删除这一组专家后,当前层输出变化多大?
这比“专家被调用多少次”更加接近最终剪枝目标。
七、为什么每层删除的专家不一样
专家剪枝不是从整个模型中选择两个专家并全局删除,而是每个 MoE 层独立保留不同的专家组合。
例如:
第 1 层可能保留专家 0、1、2、4、5、7;
第 2 层可能保留专家 0、2、3、4、6、7;
第 3 层可能又是另一种组合。
因为不同层承担的功能不同,同一个专家编号在不同层中也不是同一个网络,更没有必要强制所有层删除相同编号的专家。
这种逐层选择方式保留了更大的灵活性,但也意味着剪枝后仍然是一个层间异构的 MoE 模型。
八、通用专家剪枝的实验结果
论文在 Mixtral 8x7B 和 Mixtral 8x7B Instruct 上评估了 8 个零样本任务:
ARC-Challenge;
ARC-Easy;
BoolQ;
HellaSwag;
MMLU;
OpenBookQA;
RTE;
WinoGrande。
主要平均结果如下。
| 模型 | 每层保留专家数 | 零样本平均准确率 | 相对原模型变化 |
|---|---|---|---|
| Mixtral 8x7B | 8 | 67.58 | — |
| Mixtral 8x7B | 6 | 64.22 | -3.36 |
| Mixtral 8x7B | 4 | 59.57 | -8.01 |
| Mixtral 8x7B Instruct | 8 | 69.98 | — |
| Mixtral 8x7B Instruct | 6 | 67.45 | -2.53 |
| Mixtral 8x7B Instruct | 4 | 63.88 | -6.10 |
从两个模型平均来看,论文将其概括为:
删除两个专家,平均下降约 2.9 个百分点;
删除四个专家,平均下降约 7.1 个百分点。
这些结果是在没有额外训练的情况下获得的。
8.1 删除两个专家是比较合理的折中
每层从 8 个专家减少到 6 个时:
专家参数减少约四分之一;
整体零样本性能只出现约 2.5~3.4 个百分点下降;
原本需要两张 A100 80GB 的 BF16 模型可以装入一张 80GB GPU;
论文测得约 1.2 倍 Token 生成加速。
因此,保留 6 个专家是论文中更平衡的配置。
8.2 删除四个专家压缩更大,但损失明显
保留 4 个专家意味着每层永久删除一半专家。
模型实际内存从论文统计的 89,926 MB 降至 46,879 MB,约为原始模型的 52%。但零样本平均准确率下降约 6~8 个百分点。
这说明专家之间确实存在冗余,但不能认为“一半专家完全没有作用”。
九、与 Wanda 2:4 权重剪枝的比较
论文将每层保留 4 个专家的方案,与 Wanda 2:4 半结构化权重剪枝进行比较。两者都能够移除大约一半的专家相关参数,但形成的模型结构完全不同。
| 方法 | 删除对象 | 是否保留专家完整性 | 是否依赖稀疏内核 |
|---|---|---|---|
| Wanda 2:4 | 每 4 个权重删除 2 个 | 否 | 是 |
| 专家剪枝 r=4 | 每层删除 4 个完整专家 | 是 | 不需要特殊权重稀疏内核 |
实验中,专家剪枝在两个 Mixtral 模型上的平均任务性能均优于 Wanda 2:4。
| 模型 | Wanda 2:4 | 专家剪枝 r=4 |
|---|---|---|
| Mixtral 8x7B | 57.51 | 59.57 |
| Mixtral 8x7B Instruct | 62.80 | 63.88 |
Wanda 的实测速度反而低于原始模型,约为 0.91~0.92 倍;专家剪枝 r=4 达到约 1.27 倍。论文将 Wanda 的结果归因于半结构化稀疏需要专门硬件和实现支持,而完整删除专家更容易直接减少存储和通信。
不过,这并不能证明专家剪枝在所有优化后的 2:4 运行时上都必然更快。它只说明在论文使用的实现和测试环境中,专家级结构化删除更容易转化为实际收益。
十、方法二:面向特定任务的专家剪枝
10.1 通用校准数据可能选错专家
使用 C4 校准的目标,是尽量保持模型在通用文本分布上的行为。
但假设模型最终只用于数学推理,最重要的专家组合可能与通用语言任务完全不同。
论文发现,使用 C4 选择的 6 专家模型在 GSM8K 上:
Mixtral 8x7B 从 58.61 降到 41.02;
Mixtral 8x7B Instruct 从 63.46 降到 48.52。
通用任务上还算温和的剪枝,在数学任务上产生了更严重的退化。
10.2 改用领域数据进行校准
论文将校准数据从 C4 替换为 MATH 训练集。
剪枝流程没有改变:
仍然缓存 MoE 层输入和输出;
仍然枚举专家组合;
仍然选择重构误差最低的组合。
唯一变化是校准样本更集中于数学领域。
结果说明,专家重要性具有明显的任务依赖性。
论文可视化发现,在 Mixtral 的 32 层中,C4 和 MATH 选择出完全相同专家组合的层只有 4 个。
十一、数学任务结果
在 GSM8K 5-shot 评估中,使用 MATH 作为校准集明显优于使用 C4。
| 模型 | 每层保留专家数 | C4 校准 | MATH 校准 |
|---|---|---|---|
| Mixtral 8x7B | 6 | 41.02 | 51.25 |
| Mixtral 8x7B | 4 | 24.87 | 37.07 |
| Mixtral 8x7B Instruct | 6 | 48.52 | 58.38 |
| Mixtral 8x7B Instruct | 4 | 30.40 | 47.01 |
这组结果说明:
专家是否重要,取决于模型将要执行什么任务。
对数学任务不重要的专家,可能对通用问答很重要;通用任务中看似冗余的专家,也可能存储着数学领域需要的能力。
11.1 领域校准仍不能完全恢复性能
即使使用 MATH 校准,剪枝后仍存在明显损失。
例如 Mixtral 8x7B Instruct:
原始模型:63.46;
保留 6 个专家并使用 MATH 校准:58.38;
保留 4 个专家:47.01。
因此,领域数据只能帮助选择更合适的专家组合,不能完全补偿专家被永久删除造成的容量损失。
11.2 微调可以进一步恢复
作者又在 MetaMathQA 上对不同专家数的模型进行了完整微调。
对于 Mixtral 8x7B:
| 配置 | GSM8K | MATH |
|---|---|---|
| 8 专家 | 81.35 | 34.86 |
| 6 专家,C4 剪枝 | 79.53 | 32.48 |
| 6 专家,MATH 剪枝 | 79.53 | 33.58 |
| 7 专家,MATH 剪枝 | 81.20 | 34.40 |
保留 7 个专家并微调后,结果已非常接近完整 8 专家模型。Mixtral Instruct 也出现类似趋势。
但这里的代价很高:论文使用 16 张 A100 80GB,训练 900 步。因此,前面的专家剪枝是轻量后训练方法,而这部分恢复实验已经属于较昂贵的完整微调。
十二、方法三:动态专家跳过
12.1 专家剪枝为什么没有直接减少每 Token FLOPs
假设每层从 8 个专家剪到 6 个。
原始模型每个 Token 从 8 个专家中选两个;剪枝后仍然从 6 个专家中选两个。
因此,对于当前 Token 来说,仍然要执行两个完整专家,理论上的专家计算量没有变化。
模型之所以加速,主要是因为:
模型能够放到更少的 GPU 上;
专家参数读取量下降;
GPU 间通信减少;
缓存命中和内存预取更好;
专家块加载更加集中。
论文也明确将从 6 个专家进一步剪到 4 个专家后的加速,部分归因于更好的时间和空间局部性,而不仅是 GPU 间通信。
12.2 不是每个 Token 都需要两个专家
对于一个 Token,路由器选中的两个专家通常具有不同权重。
例如:
第一专家权重:0.90;
第二专家权重:0.10。
此时第二专家对最终输出的贡献可能非常有限。
动态跳过方法认为:
如果第二专家的路由权重远小于第一专家,就不运行第二专家,只使用第一专家。
如果两个专家权重接近,例如 0.55 和 0.45,则仍然执行两个专家。
12.3 如何决定“差得足够大”
论文为每一个 MoE 层分别设置一个阈值。
校准时:
在校准数据上执行模型;
记录每个 Token 的第二专家权重与第一专家权重之比;
对每一层分别统计这一比例;
使用该层所有比例的中位数作为阈值。
推理时:
若第二专家与第一专家的权重比低于阈值,就跳过第二专家;
否则仍执行两个专家。
使用中位数意味着,在与校准集相似的数据上,每层大约有一半 Token 可能只执行一个专家。不同层的阈值并不相同,而且 C4 与 MATH 校准得到的阈值也存在明显差异。
12.4 为什么只比较路由权重
路由权重本身反映了路由器对两个专家的相对偏好。
当第二专家权重很小时,它对加权输出的贡献通常也更小。论文附录从输出重构误差的角度给出解释:只要被跳过专家的总路由权重足够小,跳过后的输出误差就可以得到控制。该原则也可以从 top-2 扩展到一般 top-k 路由。
不过,这种推导使用了专家输出差异相对集中的近似,因此路由权重阈值仍然是一种经验化、易部署的判断,而不是严格保证每个 Token 输出误差的上界。
十三、动态跳过实验结果
论文将动态专家跳过应用于:
原始 8 专家模型;
已剪到 6 专家的模型;
已剪到 4 专家的模型。
通用零样本任务结果如下。
Mixtral 8x7B
| 保留专家数 | 专家剪枝 | 动态跳过 | 平均准确率 | 加速 |
|---|---|---|---|---|
| 8 | 否 | 否 | 67.58 | 1.00× |
| 8 | 否 | 是 | 66.37 | 1.08× |
| 6 | 是 | 否 | 64.22 | 1.19× |
| 6 | 是 | 是 | 62.91 | 1.23× |
| 4 | 是 | 否 | 59.57 | 1.27× |
| 4 | 是 | 是 | 57.91 | 1.31× |
Mixtral 8x7B Instruct
| 保留专家数 | 专家剪枝 | 动态跳过 | 平均准确率 | 加速 |
|---|---|---|---|---|
| 8 | 否 | 否 | 69.98 | 1.00× |
| 8 | 否 | 是 | 69.03 | 1.08× |
| 6 | 是 | 否 | 67.45 | 1.20× |
| 6 | 是 | 是 | 66.04 | 1.27× |
| 4 | 是 | 否 | 63.88 | 1.27× |
| 4 | 是 | 是 | 62.33 | 1.33× |
13.1 最有价值的对比
对于 Mixtral 8x7B Instruct:
保留 4 个专家、不跳过:63.88,1.27×;
保留 6 个专家、加入跳过:66.04,1.27×。
两者速度相同,但后者平均准确率高出 2.16 个百分点。
这说明:
为了获得同样的速度,不一定要永久删除更多专家。可以保留更多模型容量,再根据每个 Token 的难度动态减少计算。
这也是专家剪枝和动态跳过互补的核心原因。
十四、为什么动态跳过不会降低显存
动态跳过只是在推理过程中决定某个 Token 是否执行第二专家。
所有专家参数仍然存在于模型中,也必须被加载到设备。因此:
模型文件不会变小;
模型参数量不会下降;
静态显存基本不变;
只有部分 Token 的运行计算减少。
所以动态跳过适合解决计算和生成速度问题,而不能单独解决“模型装不进 GPU”的问题。
若显存是主要限制,应优先使用专家剪枝或量化;若模型已经能够装入设备,但生成速度不足,则动态跳过更有吸引力。
十五、实际显存与速度收益
论文报告的实际模型内存如下。
| 方法 | 配置 | 内存 | 原模型占比 |
|---|---|---|---|
| 原始 Mixtral | 8 专家 | 89,926 MB | 100% |
| Wanda | 2:4 | 51,214 MB | 57% |
| 专家剪枝 | 保留 6 专家 | 68,383 MB | 76% |
| 专家剪枝 | 保留 4 专家 | 46,879 MB | 52% |
保留 6 个专家后,模型可由两张 A100 80GB 降到一张 A100 80GB 加载。保留 4 个专家进一步减小内存,但在单卡环境中,速度提升不会仅来自减少 GPU 通信,作者认为内存局部性和专家块加载也发挥了作用。
需要注意,这些速度和内存数字依赖论文的:
GPU 数量;
模型并行方式;
BF16 精度;
Hugging Face 实现;
Batch 和生成配置;
专家加载和通信机制。
换用 TensorRT-LLM、vLLM、不同量化方式或专家并行策略后,绝对收益可能变化。
十六、校准样本需要多少
论文测试了 1、2、4、16、64、128 和 256 个 C4 序列,每个序列长度为 2048,用于将 Mixtral 8x7B 剪到每层 6 个专家。
平均任务结果如下。
| 校准序列数 | 平均准确率 |
|---|---|
| 1 | 62.63 |
| 2 | 63.93 |
| 4 | 63.53 |
| 16 | 63.59 |
| 64 | 64.32 |
| 128 | 64.22 |
| 256 | 63.94 |
64 和 128 个序列表现最好。只使用一个序列会出现一定下降,但从 2 到 256 个序列之间的变化总体不大。
这说明方法对校准样本数量相对稳定,但校准数据属于哪个领域比单纯增加样本数更加重要。
十七、这篇论文真正证明了什么
论文证明的不是:
Mixtral 中有一半专家完全无用,可以无损删除。
真实结果是:
删除两个专家,通用平均准确率下降约 2.9 个百分点;
删除四个专家,平均下降约 7.1 个百分点;
数学等特定任务对错误专家组合更加敏感;
动态跳过仍会造成小幅性能下降;
领域微调能够恢复,但成本较高。
论文真正证明的是:
MoE 专家具有不同的边际贡献,而且这种贡献取决于层和任务。使用层输出重构误差可以找到比随机、调用频率和部分权重剪枝方案更好的专家子集;同时,路由权重不平衡可以被用于动态减少单 Token 的活跃专家数量。
十八、与普通权重剪枝的区别
| 对比维度 | 权重剪枝 | 本文专家剪枝 |
|---|---|---|
| 最小删除单位 | 单个权重或权重块 | 完整专家 |
| 是否改变专家数量 | 否 | 是 |
| 模型结构规则性 | 可能不规则 | 高度规则 |
| 是否需要稀疏算子 | 通常需要 | 不需要权重稀疏算子 |
| 搜索自由度 | 高 | 相对低 |
| 精度保持 | 通常更灵活 | 删除粒度较大 |
| 模型文件是否直接缩小 | 取决于稀疏格式 | 是 |
| 是否减少专家并行通信 | 不一定 | 可以 |
专家剪枝可以被视为一种 MoE 特有的结构化剪枝。它利用专家本身就是独立 FFN 模块这一特点,删除后不需要重新构建不规则矩阵。
十九、与 LayerPrune 的区别
| 对比维度 | LayerPrune | 本文专家剪枝 |
|---|---|---|
| 删除对象 | 完整 Transformer 层 | MoE 层中的部分专家 |
| 注意力层是否删除 | 是 | 否 |
| 模型深度是否变化 | 是 | 否 |
| 每层宽度是否变化 | 否 | 专家数量减少 |
| 主要选择指标 | 跨层表示相似度 | MoE 层输出重构误差 |
| 是否需要恢复训练 | 通常使用 QLoRA Healing | 通用剪枝不需要 |
| 对推理的影响 | 每个 Token 少经过若干层 | 每层可选专家减少 |
LayerPrune纵向缩短模型深度,本文则横向减少 MoE 层中的专家容量。
两者理论上可以联合使用,但性能风险也会叠加。
二十、与 AST 半结构化稀疏训练的区别
| 对比维度 | AST | 本文 |
|---|---|---|
| 稀疏粒度 | 每组权重中的 2:4 | 完整专家 |
| 是否重新训练 | 是,使用数十亿 Token | 通用方案无需训练 |
| 掩码是否动态学习 | 是 | 专家组合离线确定 |
| 硬件依赖 | 依赖 2:4 支持 | 普通 MoE 实现即可加载 |
| 动态推理 | 没有改变每 Token 专家数 | 可动态跳过第二专家 |
| 主要模型 | LLaMA-2 等稠密模型 | Mixtral MoE |
AST改变的是专家内部权重结构,而本文改变的是专家数量与专家激活策略。
二十一、方法优点
21.1 符合 MoE 模型的天然结构
专家本身就是独立模块,删除完整专家比制造大量零权重更加规则。
21.2 无需通用剪枝后的额外训练
任务无关专家剪枝只需要少量校准数据和前向传播,不更新模型权重。
21.3 同时考虑专家组合
方法不是给每个专家单独打分,而是直接搜索一组专家的联合重构效果,因此能够考虑专家之间的替代和互补关系。
21.4 模型文件和显存真实下降
保留 4 个专家时,论文测得模型内存约降至原来的 52%,不是只报告理论 FLOPs。
21.5 给出了真实 Token 生成加速
论文报告约 1.2~1.33 倍生成速度提升,并分析了 GPU 通信和内存局部性的影响。
21.6 专家剪枝和动态跳过可以互补
永久删除用于减少静态容量,动态跳过用于按 Token 减少计算,可以在相同速度下获得比单独高比例剪枝更好的精度。
二十二、方法局限
22.1 枚举搜索无法扩展到大量专家
直接枚举在 8 个专家时可行,但若每层有 32、64 或更多专家,组合数量会迅速增长。
论文也将这一点列为主要局限:当前方法适合每层 4 或 8 个专家的模型,但面对每层 32 个专家时会非常繁重。
例如从 32 个专家中保留 16 个,组合数将达到数亿级,已经无法直接穷举。
22.2 只验证了 Mixtral 8x7B 系列
实验主要覆盖:
Mixtral 8x7B;
Mixtral 8x7B Instruct。
没有验证 DeepSeek-MoE、Qwen-MoE、DBRX、Switch Transformer 或更多专家数量的 MoE 模型,因此泛化性仍不充分。
22.3 删除比例在所有层中相同
当设置 r=6 时,每个 MoE 层都必须保留 6 个专家;设置 r=4 时,每层都保留 4 个。
但不同层的专家冗余程度可能不同:
某些层可以只保留 3 个;
某些关键层可能需要保留 7 个或全部 8 个。
统一专家预算实现简单,却可能不是全局最佳配置。
22.4 层与层之间独立搜索
每层选择的专家组合只保证当前层输出重构误差较小,不直接优化完整模型的最终语言建模损失或任务准确率。
前面层的微小误差可能在后面持续累积。渐进式搜索也没有稳定解决这一问题。
22.5 重构误差不一定保护高级能力
MoE 层输出接近,并不能保证:
数学推理能力不变;
事实知识不丢失;
长上下文行为一致;
指令遵循能力保持;
安全和拒答能力保持。
数学实验已经表明,使用通用 C4 重构得到的专家组合,在 GSM8K 上可能出现远大于通用任务平均值的损失。
22.6 动态跳过只看路由权重
路由权重低,不一定表示专家输出不重要。
一个权重较小的专家仍可能提供与第一专家完全不同、但关键的修正信息。论文的阈值方法没有直接计算当前 Token 的专家输出差异。
22.7 动态跳过的阈值依赖校准分布
阈值由 C4 或 MATH 上的路由权重比例中位数决定。
当部署数据与校准集差异较大时:
实际跳过比例可能变化;
性能损失可能增大;
某些领域需要重新校准阈值。
论文的数学任务实验也显示,动态跳过在领域任务上会带来比通用任务更明显的性能下降。
22.8 实际速度提升相对有限
即使专家参数减少约一半,端到端加速仍只有约 1.27~1.33 倍。
原因是:
每个 Token 仍包含注意力计算;
路由器仍需执行;
剩余专家仍然是大型 FFN;
KV Cache 和其他层没有减少;
动态批处理中的专家分组和调度存在开销。
因此,参数压缩比例不能直接等同于速度提升比例。
22.9 任务微调成本很高
虽然基础专家剪枝不训练,但论文中用于数学能力恢复的完整微调需要 16 张 A100 80GB。
所以“无需训练”只适用于原始后训练剪枝流程,不适用于希望进一步恢复领域能力的完整方案。
二十三、这篇论文最重要的启示
这篇论文真正重要的地方,是区分了 MoE 部署中的三种稀疏性。
第一种:模型级专家稀疏
永久删除完整专家,减少总参数、模型文件和显存。
第二种:路由稀疏
每个 Token 只从全部专家中选择 top-k,属于原始 MoE 自带机制。
第三种:动态计算稀疏
即使路由器选出了 top-k,也可以根据权重差异进一步减少实际运行的专家数量。
因此,MoE 模型压缩不能只问:
哪些权重应该置零?
还应该问:
哪些专家需要长期保留?哪些专家只对特定领域重要?当前 Token 真的需要运行所有被路由器选中的专家吗?
论文将静态模型容量和动态 Token 计算量分开优化,这一点比单一剪枝率指标更接近真实 MoE 部署问题。
二十四、一句话总结
《Not All Experts are Equal》先用少量校准数据缓存每个 MoE 层的原始输入输出,再逐层枚举专家组合,永久删除重构误差最小的低贡献专家,从而降低 Mixtral 的模型文件和显存;随后根据每个 Token 的两个路由权重是否高度不平衡,动态跳过贡献较小的第二专家,以进一步减少推理计算。实验中,每层保留 6 个专家可将 Mixtral 8x7B 从两张 A100 80GB 降到一张,并获得约 1.2 倍加速;结合动态跳过后最高达到约 1.33 倍,但专家重要性高度依赖任务,枚举搜索也难以扩展到每层拥有数十个专家的新型 MoE 模型。