面向 NLG 模型的专家混合

在本教程中,我们将介绍如何将 DeepSpeed 专家混合 (MoE) 应用于 NLG 模型,这可以将训练成本降低 5 倍,并将 MoE 模型大小降低 3 倍(有关详细信息,请参阅我们的 博客)。我们将使用 Megatron-LM 框架中的类似 GPT-3 的模型作为示例。在阅读本教程之前,我们建议您先阅读有关 专家混合Megatron-LM GPT 预训练 的教程。

1. 安装

您需要安装 DeepSpeed v0.6.0 或更高版本才能使用 MoE 功能。面向 NLG 模型的 MoE 示例位于 Megatron-DeepSpeed 存储库的 MoE 文件夹中。

2. 训练 NLG+MoE 模型

2.1. 模型变更

为了将 MoE 应用于 GPT 样式模型,我们对 Megatron 框架进行了若干更改,主要是在 megatron/model/ 中,我们将 MoE 层添加到模型中。

2.2. 预训练标准 MoE 模型

我们在 examples_deepspeed/MoE 下提供示例训练脚本,我们使用这些脚本在我们的 博客 中执行了实验。对于标准 MoE 模型,有一些新的超参数

--num-experts:每个 MoE 层的专家数量。在我们的实验中,我们将其设置为 128。较多的专家往往能提供更好的收敛性,但收益递减。

--moe-expert-parallel-size:MoE 专家并行性的程度。换句话说,每个 GPU 上将有 num-experts/moe-expert-parallel-size 个专家。因此,--moe-expert-parallel-size 不应超过 GPU 数量和 --num-experts

--moe-loss-coeff:将 MoE 损失添加到模型损失的缩放系数。在我们的实验中,我们发现 0.01 是一个不错的设置。

--moe-train-capacity-factor--moe-eval-capacity-factor--moe-min-capacity:这些配置决定单个专家可以处理多少个标记。较大的数字会导致更好的收敛性,但也会导致更慢的训练,因为不同专家的负载将更加不平衡。

--disable-moe-token-dropping:这将完全消除对单个专家可以处理多少个标记的限制。出于与上述相同的原因,我们仅建议在推理/评估期间使用此功能。

2.3. 预训练 PR-MoE 模型

PR-MoE 是一种新设计的 MoE 模型,代表金字塔残差 MoE,与标准 MoE 相比,它将参数效率提高了 3 倍。有关更多详细信息,请参阅我们的 博客。我们在 examples_deepspeed/MoE 下提供示例训练脚本。与标准 MoE 相比,PR-MoE 模型有几个不同的超参数

--num-experts:您需要提供一个列表,而不是一个单一数字,列表的长度与 MoE 层的数量相同,以启用金字塔 MoE。我们建议在模型的后期阶段(接近输出)使用更多专家。

--mlp-type:从 [standard, residual] 中选择。当它为残差时,将启用残差 MoE。

除了上面提到的标准 MoE 和 PR-MoE 的新超参数之外,对于 NLG+MoE 模型,我们发现降低学习率并增加学习率衰减持续时间(与基础密集模型相比)是有帮助的。可以在示例训练脚本中找到我们的调整详细信息。

关于训练数据,我们无法发布我们的内部数据,但任何用于 Megatron-LM 预训练的公共数据都可以直接用于训练 MoE 模型(但需要考虑它可能无法提供与我们的实验中完全相同的模型质量)。例如,我们评估了 The Pile 数据集 (pile.eleuther.aigithub.com/EleutherAI/the-pile),以用于密集模型和 MoE 模型。下表 1 显示了这种公共数据提供的评估结果与我们的内部数据类似。

模型大小 LAMBADA:完成预测 PIQA:常识推理 BoolQ:阅读理解 RACE-h:阅读理解 TriviaQA:问答 WebQs:问答
密集 NLG            
350M,内部数据 0.5203 0.6931 0.5364 0.3177 0.0321 0.0157
350M,公共 Pile 0.5106 0.6589 0.5933 0.3196 0.0257 0.0064
标准 MoE NLG            
350M+MoE-128,内部数据 0.6270 0.7459 0.6046 0.3560 0.1658 0.0517
350M+MoE-128,公共 Pile 0.6128 0.7323 0.6040 0.3349 0.1111 0.0335
PR-MoE NLG            
350M+MoE-128,内部数据 0.6365 0.7399 0.5988 0.3569 0.1630 0.0473
PR-MoE + MoS NLG            
350M+MoE-128,内部数据 0.6346 0.7334 0.5807 0.3483 0.1369 0.0522

表 1:不同密集 NLG 和 MoE NLG 模型的零样本评估结果(最后六列)。所有零样本评估结果都使用准确率指标。

2.4. 训练 MoS 并减少模型大小

MoS 代表专家混合,是一种基于分阶段蒸馏的技术,用于压缩大型 MoE 模型。MoS 进一步将模型大小降低了 12.5%,与 PR-MoE 相比,与标准 MoE 相比,模型大小降低了 3.7 倍。减少的模型大小有助于在推断期间减少延迟和成本。要训练 MoS 模型,需要指定一些额外的参数。我们将使用 PR-MoE 作为示例

--mos:这将通过知识蒸馏启用专家混合。

--load-teacher:这指定了教师模型检查点的路径。这是使用 MoS 的强制参数,教师模型检查点可以通过训练标准 MoE 或 PR-MoE 来获得。

num-layers-teacher--hidden-size-teacher--hidden-size-teacher--num-experts-teacher:除了教师模型检查点路径之外,我们还需要指定教师模型的模型架构,例如其层数、隐藏维度大小和每个 MoE 层的专家数量。对于 PR-MoE,我们还需要为教师模型提供专家列表,从教师模型中移除一些专家层。

除了上面提到的新参数之外,我们观察到在整个训练过程中使用教师 PR-MoE 可能会对最终学生模型的准确率产生负面影响。在我们的实验中,我们使用了一种分阶段蒸馏方法,在训练过程的早期阶段停止蒸馏(例如,在 400K 步之后),并在训练的剩余部分仅针对标准语言建模损失执行优化。

我们在 examples_deepspeed/MoE 下提供示例训练脚本。可以在示例训练脚本中找到我们的参数设置详细信息。可以在我们的 博客文章 和我们的 论文 中查看 MoS 的性能结果。

更新: