本文将介绍 MoE 的构建模块、训练方法以及在利用它们举行推理时需求考虑的权衡因素。
大师混合 (MoE) 是 LLM 中常用的一种技术,旨在提高其效率和准确性。这种方法的工作原理是将复杂的任务划分为更小、更易于管理的子任务,每一个子任务都由专门的迷你模型或「大师」处理。
早些时候,有人爆料 GPT-4 是采用了由 8 个大师模型组成的集成系统。近日,Mistral AI 发布的 Mixtral 8x7B 同样采用这种架构,实现了非常不错的性能(传送门:一条磁力链接席卷 AI 圈,87GB 种子直接开源 8x7B MoE 模型)。
OpenAI 和 Mistral AI 的两波推力,让 MoE 一时间成为开放人工智能社区最热门的话题 。
本文将介绍 MoE 的构建模块、训练方法以及在利用它们举行推理时需求考虑的权衡因素。
混合大师架构简称 MoE,它的特点如下:
与稀薄模型相比,预训练速率更快;
与参数数目相同的模型相比,推理速率更快;
因为要把一起大师模型都加载在内存中,所以需求大量显存;
在微调方面面临许多挑战,但最近在 MoE 指令微调方面的工作很有希望能解决这些问题。
什么是混合大师(MoE)?
模型的规模是决定模型质量的最重要因素之一。在预算固定的情况下,用较少的步骤训练较大的模型要优于用较多的步骤训练较小的模型。
MoE 可以用较少的估计开销对模型举行预训练,这意味着可以用与稀薄模型相同的估计开销,大幅扩大模型或数据集的规模。特别是,在预训练过程中,MoE 模型能更快地达到与稀薄模型相同的性能。
那么,究竟什么是 MoE?从 Transformer 模型的角度来说,MoE 包含两个主要元素:
利用稀薄的 MoE 层代替稀薄的前馈搜集(FFN)层。MoE 层中有一定数目(如 8 个)的 「大师」,每一个大师都是一个神经搜集。实际上,大师可以是 FFN,也可以是更复杂的搜集,甚至是 MoE 本身,这样就会形成有多层 MoE 的 MoE。
利用门控搜集或者路由来决定将哪个 token 发送给哪个大师。例如,在下图中,「More」被发送给第二个大师,而 「Parameters」被发送到第一个大师。如何将 token 通过路由发送给大师是利用 MoE 时需求计划的重点之一,这是因为路由同样由学习到的参数组成,并与搜集的其他部分同时举行预训练。
Switch Transformers 中的 MoE 层 (https://arxiv.org/abs/2101.03961)
简而言之,在 MoE 中,一个 MoE 层取代了 transformer 中的每一个 FFN 层,MoE 层由一个门控搜集和一定数目的大师搜集组成。
虽然与稀薄模型相比,MoE 具有高效预训练和快速推理等优点,但也面临着一些挑战:
训练:MoE 能够大大提高预训练的估计效率,但在微调过程中难以实现泛化,从而导致过拟合。
推理:虽然 MoE 可能有很多参数,但在推理过程中只利用其中的一部分。与参数数目相同的稀薄模型相比,推理速率要快得多。然而,一起参数都需求加载到 RAM 中,因此对内存的要求很高。例如,给定一个像 Mixtral 8x7B 这样的 MoE,需求有足够的 显存 来容纳一个 47B 参数的稀薄模型。为什么是 47B 参数而不是 8 x 7B = 56B?这是因为在 MoE 模型中,只有 FFN 层被视为独立的大师搜集,其余模型的参数都是共享的。同时,假设每一个 token 只传入两个大师搜集,那么推理速率(FLOPs)就像利用 12B 模型(而不是 14B 模型),因为它举行的是 2x7B 的矩阵乘法运算,同时有些层是共享的(后文将详细介绍)。
在对 MoE 有了一个大致的介绍后,一起来了解一下 MoE 的发展轨迹。
MoE 简史
MoE 起源于 1991 年的论文《Adaptive Mixture of Local Experts》(https://www.cs.toronto.edu/~hinton/absps/jjnh91.pdf)。该论文的理念与集合方法类似,都是为由分歧搜集组成的系统提供监督程序,每一个搜集处理分歧的训练集子集。每一个独立的搜集或者说大师擅长于输入空间的分歧区域。至于如何选择大师这个问题,是由门控搜集来决定每一个大师搜集的权重。在训练过程中,大师搜集和门控搜集都要接受训练。
2010-2015 年间,两个研究领域的发展共同促成了 MoE 后来的进步:
大师搜集组件化:在传统的 MoE 中,整个系统由一个门控搜集和多个大师搜集组成。在 SVM、高斯过程和其他方法中,研究者们对作为整体模型的 MoE 举行了探究。Eigen、Ranzato 和 Ilya 的研究,将 MoE 作为更深层搜集的组成部分举行了探究。MoE 能够作为多层搜集中的组成部分,使得模型既庞大又高效成为可能。
条件估计:传统搜集每一层都会对一起输入数据举行处理。接着,Yoshua Bengio 研究了根据输入的 token 动态激活或停用组件搜集的方法。
这些工作促使研究者们在 NLP 的背景下探究混合大师模型。具体来说,Shazeer 及 Geoffrey Hinton 、Jeff Dean,谷歌的 Chuck Norris 通过对引入稀薄搜集,将这一想法扩展到了 137B LSTM(https://arxiv.org/abs/1701.06538),从而即使在大规模下也能保持极快的推理速率。这项工作的重点目标是机器翻译,同时也存在一些缺点,如通信成本高和训练不稳定。
论文 Outrageously Large Neural Network 中的 MoE 层
MoE 可以训练数万亿级参数的模型,例如开源的 1.6T 参数的 Switch Transformer。估计机视觉领域也在探究 MoE,但这里还是先侧重讲解 NLP 领域。
什么是稀薄化?
稀薄化一词来源于条件估计理念。在稀薄模型中,一起参数都发挥作用,而稀薄化可以只运行整个系统的某些部分。
前文提到 Shazeer 对机器翻译中的 MoE 举行了探究。条件估计(搜集中只有某些部分处于活动状态)使得在不增加估计量的情况下能够扩大模型的规模,因此,每层 MoE 都可以包含成千上万的大师搜集。
但是这种设计带来了一些挑战。例如,虽然扩大 batch size 通常更有利于提高模型性能,但 MOE 中的 batch size 会随着数据在激活状态的大师搜集中的流动而缩小。例如,如果 batch size 为 10 个 token,其中 5 个 token 可能在一个大师搜集中结束,而另外 5 个 token 可能在 5 个分歧的大师搜集中结束,从而导致 batch size 大小不均和利用率不足的情况。
如何解决这个问题?方法之一是让学习后的门控搜集(G)决定向哪些大师搜集(E)传达输入信息:
在这种情况下,全部的大师搜集会对一起输入举行运算 — 用一种加权乘法的方式。但是,如果 G 为 0 时会怎样呢?这种情况下,就不需求经过相应的大师搜集运算,节省了估计开销。那么典型的门控函数又是怎么样的呢?在最传统的设置中,只需利用一个带有 softmax 函数的简单搜集。该搜集将学习向哪个大师传递输入数据。
Shazeer 的研究还探究了其他门控机制,如 Top-K 噪声门控。这种门控方法会引入一些(可调整的)噪声,然后保留前 K 个。也就是说:
1. 添加一些噪音
2. 只选择前 k 个
3. 用 softmax 激活。
这种稀薄化操作带来了一些有趣的特性。通过利用足够小的 k(例如一个或两个),研究者发现训练和推理速率比激活许多大师搜集的设置更快。那为什么不直接保留 top=1 时的大师搜集呢?研究者最初的猜想是,需求路由到一个以上的大师,才能让门控搜集学习如何路由到分歧的大师,因此至少要选择两个大师。Switch Transformer 的部分将重新讨论了这一决策。
为什么要添加噪声?这是为了负载平衡。
MoE 的 token 负载平衡
如前所述,如果一起的 token 都只发送给少数几个受欢迎的大师搜集,训练效率将变得低下。通常 MoE 训练中,门控搜集会收敛到频繁激活同样的几个大师搜集。这种情况会随着训练的举行趋于显著,因为受青睐的大师搜集会更快地得到训练,从而更容易被选中。为了缓解这种情况,可以添加一个辅助损失,以鼓励给予一起大师同等的重要性。该损失可确保一起大师获得大致相同数目的训练样本。后文将探讨大师能力的概念,即大师可以处理 token 的数目阈值。在 transformer 中,辅助损失通过 aux_loss 参数显示。
MoE 和 Transformer
Transformer 是一个增加参数数目可以提高性能的非常明显的例子,因此,谷歌顺理成章地在 GShard 上沿用这种思维,将其中 Transformers 的参数目扩展到 6000 亿以上。
GShard 在编码器和解码器中都利用了 top-2 门控技术,用 MoE 层取代了 FFN 层。下图显示了编码器的部分情况。
GShard 中的 MoE Transformer 编码器
这种设置对大规模估计非常有利:当扩展到多个设备时,MoE 层将在设备间共享,而一起其他层都将被复制。具体细节在下文的 「高效训练 MoE」中进一步讨论。
为了保持均衡负载和规模效率,GShard 的作家除了采用与上一节讨论的类似的辅助损耗外,还引入了一些改进:
随机路由:在 top-2 的设置中,研究者总是选择排名第一的大师,同时第二位大师以与其权重成正比的概率被选中。
大师容量:还可以设定一个阈值,即一个大师可以处理多少 token。如果两位大师的处理能力都已达到阈值,则 token 会被视为溢出,并通过剩余连接发送到下一层(或在其他项目中完全丢弃)。这一概念将成为 MoEs 最重要的概念之一。为什么需求设置大师容量呢?因为一起张量形状都是在编译时静态确定的,但无法提前知道每一个大师将获得多少 token 作为输入,所以需求确定容量。
GShard 的贡献在于为 MoEs 确定了并行估计模式。需求注意的是:推理时,只有部分大师搜集会被触发。与此同时,还有一些需求共享数据的步骤,比如自注意力机制,适用于一起 token。这就是为什么对于一个由 8 个大师组成的 47B 模型时,GShard 可以用一个 12B 的稀薄模型举行估计。如果利用 top-2,则需求 14B 个参数。但考虑到注意力操作是共享的,实际利用的参数数目为 12B。
Switch Transformer
尽管 MoE 前景广阔,但它们在训练和微调不稳定性方面仍有弊端。Switch Transformer (https://arxiv.org/abs/2101.03961)的出现意义非凡,作家甚至在 Hugging Face 发布了一个拥有 2048 个大师的 1.6 万亿个参数的模型(https://huggingface.co/google/switch-c-2048)。与 T5-XXL 相比,Switch Transformer 的预训练速率提高了 4 倍。
Switch Transformer 论文中的 Switch Transformer 层
正如在 GShard 中作家用 MoE 层取代了 FFN 层一样,Switch Transformer 论文提出了一个 Switch Transformer 层,该层接收两个输入(两个分歧的 token),有四个大师搜集。
与至少利用两个大师搜集的最初想法相反,Switch Transformers 采用了简化的单一大师策略。这种方法的效果如下:
减少了路由的估计量
每一个大师的 batch size 至少减半
通信成本降低
模型的质量仍能得到保证
Switch Transformer 还探究了大师容量的概念。
上面推荐的容量估计方法是将 batch size 中的 token 数目平均分配给大师。如果利用大于 1 的容量系数,就能在 token 不完全平衡时提供缓冲。增加容量会导致设备间的通信费用增加,因此需求注意 trade-off。尤其是在容量系数较低(1-1.25)的情况下,Switch Transformer 的表现尤为出色。
Switch Transformer 的作家还重新审视并简化了章节中提到的负载平衡损耗。对于每一个交换层,辅助损耗会在训练过程中添加到模型总损耗中。这种损耗会鼓励模型倾向于统一路由,并可利用超参数加权。
Switch Transformer 的作家还尝试了选择性精度,例如利用 bfloat16 的参数精度来训练大师,而在其他估计中利用全精度。较低的精度可以降低处理器之间的通信成本、估计成本和用于存储张量的内存。在最初的实验中,大师和门控搜集都利用 bfloat16 举行了训练,但训练结果并不稳定。这主要是由于路由搜集参与估计造成:由于路由搜集具有指数函数,因此更高的精度非常重要。为了减少不稳定性,路由也利用了全精度。
利用选择性精度不会降低质量,并能更快地训练模型。
微调部分中,Switch Transformer 利用了编码器 – 解码器设置,并将 T5 与 MoE 对应。GLaM (https://arxiv.org/abs/2112.06905)探讨了如何用三分之一的估计开销训练出与 GPT-3 质量相匹配的模型,从而扩大模型的规模。GLaM 作家的研究重点是纯解码器模型以及小样本及零样本的评估结果,并不是微调。他们利用了 Top-2 路由和更大的容量系数。此外,他们还将容量因子作为一个指标举行了调研,在训练和验证过程中,可以根据想要利用的估计量举行改变。
稳定训练基于 Z-loss 损失函数的路由搜集
上文讨论的平衡损失可能会导致不稳定问题。但是可以利用许多方法以牺牲质量为代价来稳定稀薄模型。例如,引入 dropout 可以提高稳定性,但有损于模型的性能质量。另一方面,添加更多的乘法分量可以提高模型的性能质量,但会降低稳定性。
ST-MoE(https://arxiv.org/abs/2202.08906)中引入的路由器 z 损失,通过惩罚进入门控搜集的较大的对数值,在不降低质量的情况下显著提高了训练的稳定性。由于这种损失会鼓励数值变小,因此舍入误差会减少,这对门控中的指数函数会产生很大影响。
大师搜集能学到什么?
根据 ST-MoE 作家的观察,编码大师搜集专注于组别 token 或浅层概念。例如,标点符号大师、专有名词大师等。另一方面,解码大师搜集的专业化程度较低。其作家还在多语言环境中举行了训练。分歧于想象之中,每一个大师搜集都精通一种语言:由于 token 被路由分发和负载平衡的原因,没有任何一种语言的大师搜集是专业的。
ST-MoE 论文中的表格,显示分歧的 token 组分别被发送给了哪个大师。
扩大大师数目对预训练的影响
大师数目越多,采样效率越高,速率越快,但收益也会递减(尤其是在 256 或 512 的量级之后),推理需求更多的显存。Switch Transformers 中研究的大规模特性在小规模中也是一致的,即使每层有 2、4 或 8 个大师也是如此。
微调 MoE
Mixtral 支持 4.36.0 版本的 transformers 。利用 pip install "transformers==4.36.0 –upgrade 举行更新。
稀薄模型和稀薄模型的过拟合动态截然分歧。稀薄模型更容易出现过拟合,因此可以在大师本身内部探究更高的正则化(例如,可以为稀薄层设定一个 dropout,为稀薄层设定另一个更高的 dropout)。
还有一个需求决策的问题是:是否利用辅助损失(auxiliary loss )举行微调。ST-MoE 的作家曾尝试关闭辅助损耗,结果发现即使有高达 11% 的 token 被丢弃,质量也没有受到明显影响。token dropping 可能是正则化的一种形式,有助于防止过拟合。
Switch Transformer 的作家观察到,在固定的预训练困惑度下,稀薄模型在下游任务中的表现不如稀薄模型,尤其是在推理任务繁重的任务中,如 SuperGLUE。另一方面,在 TriviaQA 等知识密集型语料集中,稀薄模型的表现却好得出乎意料。作家还观察到,大师较少有助于微调。对泛化问题的另一个观察结果是,模型在较小的任务中表现较差,但在较大的任务中表现良好。
在小型任务(左图)中,可以看到明显的过拟合,稀薄模型在验证集中的表现要差得多。而在大型任务中(右图),MoE 的表现很好。图片来自 ST-MoE 论文。
尝试冻结一起非大师权重导致了性能的大幅下降,不过这在意料之中,因为 MoE 层占据了大部分搜集。尝试相反的方法:只冻结 MoE 层的参数后,结果发现效果几乎与更新一起参数一样好。这个发现有助于加快微调速率并减少内存占用。
通过只冻结 MoE 层,可以在保证质量的同时加快训练速率。本图来自 ST-MoE 论文。
在微调稀薄化 MoE 时需求考虑的最后一个问题是,分歧的 MoE 有分歧的微调超参数 — 例如,稀薄模型往往更受益于较小的批大小和较高的学习率。
稀薄模型的微调质量随着学习率的增大和 batch size 的降低而提高。本图来自 ST-MoE 论文。
研究者们一直在努力对 MoE 举行微调,这个过程是充满曲折的。最近的一篇论文《MoEs Meets Instruction Tuning》行了这样的实验:
单任务微调
多任务指令微调
多任务指令调整后举行单任务微调
论文中,当作家微调 MoE 和 T5 后,T5 等效模拟输出的效果更好。当作家对 Flan T5 和 MoE 举行微调后,MoE 的表现明显更好。不仅如此,Flan-MoE 相对于 MoE 的改进幅度大于 Flan T5 相对于 T5 的改进幅度,这表明 MoE 可能比密集模型更受益于指令调优。任务变多会让 MoE 受益更多。与之前建议关闭辅助损失函数的结论分歧,损失函数实际上可以防止过拟合。
与稀薄模型相比,稀薄模型更受益于 instruct-tuning。图片来自《MoEs Meets Instruction Tuning》论文
何时利用稀薄 MoE,何时利用稀薄 MoE?
大师模型适用于利用多台机器的高吞吐量场景。在预训练运算预算固定的情况下,稀薄模型将更为理想。对于显存较少的低吞吐量场景,稀薄模型会更好。
注意:不能直接比较稀薄模型和稀薄模型的参数目,因为二者所代表的意义明显分歧。
高效训练 MoE
最初的 MoE 工作将 MoE 层作为一个分支设置,导致模型估计速率缓慢,因为 GPU 并非为此而设计,而且由于设备需求向其他设备发送信息,搜集带宽成为瓶颈。本节将讨论现有的一些工作,以使这些模型的预训练和推理更加实用。
并行估计
并行估计的种类:
数据并行:相同的权重在一起内核上复制,数据在内核上分割。
模型并行:模型在分歧内核间分区,数据在分歧内核间复制。
模型和数据并行:在分歧内核间划分模型和数据。请注意,分歧的内核处理分歧批次的数据。
大师并行:将大师放在分歧的工作站上。如果与数据并行相结合,则每一个内核都有分歧的大师,数据在一起内核之间举行分割
在大师并行模式下,大师被置于分歧的工作站上,每一个工作站采集分歧批次的训练样本。对于非 MoE 层,大师并行的行为与数据并行相同。对于 MoE 层,序列中的 token 会被发送到所需的大师所在的工作站。
Switch Transformers 论文中的插图,显示了数据和模型是如何通过分歧的并行技术在内核上分割的。
容量系数和通信成本
提高容量因子 (CF) 可以提高模型质量,但会增加通信成本和内存开销。如果全连接通信(all-to-all communications)速率较慢,利用较小的容量因子会更好。这里提供一个可以参考的配置:利用容量系数为 1.25 的 top-2 路由机制,每一个内核留有一名大师。在验证过程中,可以改变容量系数以减少估计量。
服务器
mistralai/Mixtral-8x7B-Instruct-v0.1 可以被部署到推理终端上。
MoE 的一大缺点是参数较多。本地用例可能希望利用更小的模型。以下是几种有助于本地部署的技术:
Switch Transformer 的作家举行过蒸馏实验。将 MoE 蒸馏到稀薄模型中,可以保留 30-40% 的稀薄化增益。因此,蒸馏可以带来更快的预处理速率以及模型更小的好处。
创新的路由算法:将完整的句子或任务路由至大师搜集,利用用于提取的子搜集来提供服务。
MoE 聚合:这种技术可以合并大师权重,从而减少推理时利用的参数。
其他高效训练的方法
FasterMoE(2022 年 3 月提出)分析了高效分布式系统中 MoE 的性能,并分析了分歧并行策略的理论极限,还分析了倾斜大师受欢迎程度的技术、减少延迟的细粒度通信调度,以及根据最低延迟挑选大师的拓扑感知门控,从而使速率提高了 17 倍。
Megablocks(https://arxiv.org/abs/2211.15841)推出了一款全新的 GPU 内核,能处理 MoE 中存在的动态问题,探究了高效的稀薄化预训练。论文中建议不要丢弃任何一个 token,并实现了高效地 token 映射技术,从而显著提高了速率。诀窍在于,传统的 MoE 利用分批矩阵乘法,假定一起大师都具有相同的形状和相同数目的 token。相比之下,Megablocks 将 MoE 层表示为块稀薄运算,可以适应不平衡分配。
针对分歧大小的大师和 token 数目的块稀薄矩阵乘法。图片摘自 MegaBlocks 论文。
开源的 MoE 算法
当前的 MoE 开源项目:
Megablocks: https://github.com/stanford-futuredata/megablocks
Fairseq: https://github.com/facebookresearch/fairseq/tree/main/examples/moe_lm
OpenMoE: https://github.com/XueFuzhao/OpenMoE
已发布的 MoE:
Switch Transformer (Google):从 8 到 2048 个大师的基于 T5 的模拟引擎集合。最大的模型有 1.6 万亿个参数。
NLLB MoE (Meta):NLLB 翻译模型的 MoE 变体。
OpenMoE:基于 Llama 的 MoE 。
Mixtral 8x7B (Mistral):一种高质量的翻译模型,其性能优于 Llama 2 70B,推理速率也更快。
未来展望
以下是一些值得探究的有趣的领域:
将 Mixtral 提炼为稀薄模型
探究大师模型的合并技术,分析其对推理时间的影响
Mixtral 的量化技术
原文链接:https://huggingface.co/blog/moe?continueFlag=a09556ebd7121bce97f7bbb8eb2598c8