专家混合是指将多个专家的意见或知识混合在一起来解决问题或提供建议的方法在美容和时尚领域,专家混合特别有用因为每个专家都有自己独特的见解和技巧,将他们的知识结合起来可以得出全面而丰富的建议或解决方案专家混合也可以用来解决看似矛盾的问题,因为不同的专家可能有不同的观点这种方法不仅能够提供更全面的解决方案,还可以鼓励创新和多样性在美容和时尚领域,专家混合也可以用来解决复杂的问题,如肤色不均匀、发型不适合等通过将多个专家的意见和建议综合起来,可以找到适合每个人的个性化解决方案所以在追求美丽和时尚的道路上,

or '专家共振:美容与时尚领域中专业见解的融合之道

随着Mixtral 8x7B的发布(公告模型卡),一种转换器的类别已成为开放AI社区中最热门的话题:专家混合,简称MoEs。在这篇博客文章中,我们将研究MoEs的构建模块,它们的训练方式以及在推理中提供服务时需要考虑的权衡。

让我们深入了解一下!

目录

摘要

MoEs:

  • 与稠密模型相比,预训练速度更快
  • 与具有相同参数数量的模型相比,推理速度更快
  • 需要高VRAM,因为所有专家都加载在内存中
  • 在微调方面面临许多挑战,但与MoE指令调节的最新工作是有希望的

让我们开始吧!

Mixture of Experts(MoE)是什么?

模型的规模是提高模型质量的最重要的因素之一。在给定固定的计算预算的情况下,使用更少的步骤训练一个更大的模型比使用更多的步骤训练一个更小的模型效果更好。

专家组合技术(Mixture of Experts)可以在更少的计算资源下进行预训练,这意味着您可以在与稠密模型相同的计算预算下大幅扩大模型或数据集的规模。特别是,在预训练期间,MoE模型应该比其稠密对应模型更快地达到相同的质量。

那么,究竟什么是MoE?在Transformer模型的上下文中,MoE由两个主要元素组成:

  • 稀疏的MoE层取代了密集的前馈神经网络(FFN)层。MoE层具有一定数量的“专家”(例如8个),其中每个专家都是一个神经网络。在实践中,这些专家是FFN,但它们也可以是更复杂的网络,甚至可以是一个MoE本身,形成层次式的MoE!
  • 一个门控网络或路由器,它决定将哪些标记发送到哪个专家。例如,在下面的图片中,“More”标记被发送到第二个专家,“Parameters”标记被发送到第一个网络。正如我们将在后面探讨的那样,我们可以将一个标记发送给多个专家。如何将标记路由到专家是使用MoE时的一个重大决策之一 – 路由器由学习参数组成,并且与网络的其余部分同时进行预训练。
来自[Switch Transformers paper](https://arxiv.org/abs/2101.03961)的MoE层

因此,总结一下,在MoE中,我们用MoE层替换了Transformer模型的每个FFN层,该层由一个门控网络和一定数量的专家组成。

尽管MoE相对于稠密模型提供了高效的预训练和更快的推理等优点,但它们也面临一些挑战:

  • 训练:MoE可以显著提升计算效率,但在微调过程中,它们在泛化方面一直存在困难,容易导致过拟合。
  • 推理:虽然MoE可能具有许多参数,但推理过程中只使用其中一部分。与具有相同参数数量的稠密模型相比,这导致推理速度更快。然而,所有参数都需要加载到内存中,因此内存要求很高。例如,假设有一个名为Mixtral 8x7B的MoE,我们需要足够的VRAM来容纳一个稠密的47B参数模型。为什么是47B参数而不是8 x 7B = 56B呢?这是因为在MoE模型中,只有FFN层被视为单独的专家,而其他模型参数则是共享的。同时,假设每个标记只使用两个专家,那么推理速度(FLOPs)就相当于使用了一个12B的模型(而不是14B),因为它计算了2×7B的矩阵乘法,但有一些层是共享的(后面会更详细介绍)。

现在,我们大致了解了MoE是什么,让我们来看一下导致MoE发明的研究进展。

MoE的简要历史

MoE的根源可以追溯到1991年的一篇论文Adaptive Mixture of Local Experts。这个想法类似于集成方法,旨在为由各自处理不同训练案例子集的独立网络组成的系统提供有监督的过程。每个单独的网络或专家专门处理输入空间的不同区域。如何选择专家?一个门控网络确定每个专家的权重。在训练过程中,同时训练专家和门控。

在2010年至2015年间,有两个不同的研究领域为后来的MoE进展做出了贡献:

  • 专家作为组件:在传统的MoE设置中,整个系统包括一个门控网络和多个专家。MoEs作为整个模型已经在支持向量机、高斯过程和其他方法中得到了探索。Eigen、Ranzato和Ilya的工作探索了MoEs作为深层网络组成部分的可能性。这使得MoEs可以作为多层网络中的层,使得模型同时可以又大又高效。
  • 条件计算:传统网络通过每一层处理所有输入数据。在这段时间里,Yoshua Bengio研究了根据输入令牌动态激活或停用组件的方法。

这些工作导致了在NLP领域探索专家混合的工作。具体来说,Shazeer等人(2017年,在“等人”中包括Geoffrey Hinton和Jeff Dean,《谷歌的查克·诺里斯》)通过引入稀疏性将这一理念扩展到了一个137B LSTM(当时事实上的NLP架构,由Schmidhuber创建),从而在高规模下保持非常快的推断。该工作主要关注翻译,但也面临许多挑战,如高通信成本和训练不稳定性。

来自《过于庞大的神经网络论文》的MoE层

MoEs已经实现了培训多兆参数模型,如开源的1.6T参数Switch Transformers等。MoEs也在计算机视觉领域中得到了探索,但本文将重点关注NLP领域。

什么是稀疏性?

稀疏性使用了条件计算的思想。在稠密模型中,所有参数都用于所有输入,而稀疏性允许我们仅运行整个系统的一部分。

让我们更深入地探讨Shazeer对于翻译的MoEs的探索。条件计算的思想(网络的一部分根据每个示例的基础上活动)允许模型的规模扩大而不增加计算量,因此每个MoE层中使用了数千个专家。

这种设置引入了一些挑战。例如,虽然对于性能来说,较大的批量大小通常更好,但在MoEs中,由于数据通过活跃的专家流动,批量大小实际上会减小。例如,如果我们的批量输入包含10个令牌,则五个令牌可能会进入一个专家,而另外五个令牌可能会进入五个不同的专家,导致批量大小不均匀和利用率低下。下面的Making MoEs go brrr部分将讨论其他挑战和解决方案。

我们如何解决这个问题?通过一个学习到的门控网络(G)决定将专家(E)的哪一部分输入发送过来:

y=∑i=1nG(x)iEi(x)y = \sum_{i=1}^{n} G(x)_i E_i(x)y=i=1∑n​G(x)i​Ei​(x)

在这个设置中,所有的专家都会对所有输入进行运算 – 这是一种加权乘法。但是,如果G为0会发生什么呢?如果是这种情况,就不需要计算相应的专家操作,从而节省了计算资源。一个典型的门控函数是什么样的?在最传统的设置中,我们只是使用一个简单的具有softmax函数的网络。该网络将学习将输入发送给哪个专家。

Gσ(x)=Softmax(x⋅Wg)G_\sigma(x) = \text{Softmax}(x \cdot W_g)Gσ​(x)=Softmax(x⋅Wg​)

Shazeer的工作还探索了其他门控机制,例如有噪声的Top-K门控。这种门控方法引入了一些(可调节的)噪声,然后保留了前k个值。即:

  1. 我们添加一些噪声

H(x)i=(x⋅Wg)i+StandardNormal()⋅Softplus((x⋅Wnoise)i)H(x)_i = (x \cdot W_{\text{g}})_i + \text{StandardNormal()} \cdot \text{Softplus}((x \cdot W_{\text{noise}})_i)H(x)i​=(x⋅Wg​)i​+StandardNormal()⋅Softplus((x⋅Wnoise​)i​)

  1. 我们只选择前k个

KeepTopK(v,k)i={viif vi is in the top k elements of v,−∞otherwise.\text{KeepTopK}(v, k)_i = \begin{cases}v_i & \text{if } v_i \text{ is in the top } k \text{ elements of } v, \\-\infty & \text{otherwise.}\end{cases}KeepTopK(v,k)i​={vi​−∞​if vi​ is in the top k elements of v,otherwise.​

  1. 我们应用softmax函数。

G(x)=Softmax(KeepTopK(H(x),k))G(x) = \text{Softmax}(\text{KeepTopK}(H(x), k))G(x)=Softmax(KeepTopK(H(x),k))

这种稀疏性引入了一些有趣的特性。通过使用足够低的k值(例如1或2),我们可以比激活多个专家时更快地训练和推断。为什么不只选择最优专家?最初的猜想是,需要将路由到多个专家,以使门控机制学习如何路由到不同的专家,因此至少需要选择两个专家。在Switch Transformers部分重新审视了这个决定。

为什么要添加噪音?这是为了负载均衡!

负载均衡

如前所述,如果我们的所有标记只发送给少数热门专家,那样会导致训练效率低下。在正常的MoE训练中,门控网络会收敛到激活同几个专家的状态。这种自我强化会使受欢迎的专家更快地接受训练,因此更常被选择。为了缓解这个问题,会添加一个辅助损失来鼓励各个专家具有相同的重要性。该损失确保每个专家都接收到大致相同数量的训练样例。接下来的部分还将探讨专家容量的概念,该概念引入了一个专家可以处理多少标记的阈值。在transformers中,辅助损失可以通过aux_loss参数公开。

MoEs和Transformers

如何扩大参数数量提高性能在Transformer中是非常明显的,所以谷歌公司尝试了使用GShard进行扩大Transformer至6000亿个参数。

GShard使用MoE层替换了每个间隔的Feed-Forward Network(FFN)层,同时在编码器和解码器中使用基于前两个排序的门控方法。下图展示了编码器部分的结构。这样的设置对于大规模计算非常有益:当我们扩展到多个设备时,MoE层在这些设备之间共享,而所有其他层均会被复制。这在“Making MoEs go brrr”部分中进一步讨论。

GShard论文中的MoE Transformer编码器

为了保持负载均衡和高效的扩展性,GShard的作者在辅助损失的基础上引入了几个改进措施,类似于前一节中讨论的方法:

  • 随机路由:在一个基于前两个排序的配置中,我们总是选择排名第一的专家,但选择排名第二的专家的概率与其权重成正比。
  • 专家容量:我们可以设定一个专家可以处理多少标记的阈值。如果两个专家都达到容量上限,则认为该标记溢出,通过残差连接发送到下一层(或在其他项目中完全丢弃)。这个概念将成为MoEs中最重要的概念之一。为什么需要专家容量?由于所有张量形状在编译时静态确定,但我们无法提前知道每个专家将处理多少个标记,因此需要确定容量因子。

《GShard论文》通过表达对于MoEs非常有效的并行计算模式进行了贡献,但是这超出了本博客文章的范畴。

注意:当我们进行推理时,只会触发一些专家。与此同时,有一些共享计算,例如自注意力,它适用于所有的标记。这就是为什么当我们谈到8个专家的47B模型时,我们可以使用12B稠密模型的计算。如果我们使用top-2,将使用14B参数。但是由于注意力操作是共享的(还有其他操作),实际使用的参数数量是12B。

转换器开关

尽管MoEs显示出很大的潜力,但在训练和微调方面存在困难。《转换器开关》是一项非常令人兴奋的工作,深入探讨了这些问题。作者甚至发布了一个拥有2048个专家的16万亿参数MoE,您可以在transformers上运行。与T5-XXL相比,转换器开关实现了4倍的预训练加速。

Switch Transformer Layer of the Switch Transformer paper

就像在GShard中一样,作者用MoE层替换了FFN层。《转换器开关》论文提出了一个接收两个输入(两个不同的标记)且具有四个专家的转换器开关层。

与使用至少两个专家的最初想法相反,转换器开关使用了简化的单专家策略。这种方法的效果是:

  • 路由计算减少了
  • 每个专家的批次大小至少可以减半
  • 通信成本降低了
  • 保持了质量

转换器开关还探索了专家容量的概念。

专家容量=(每批标记数量/专家数量)×容量系数

上述推荐容量将批次中的标记数量均匀分配给专家数量。如果我们使用大于1的容量系数,可以为标记不完全平衡的情况提供缓冲。增加容量会增加设备间通信的成本,因此这是一个需要考虑的权衡。特别是,在低容量因子(1-1.25)下,转换器开关表现良好。

《转换器开关》的作者还重新思考并简化了在各个章节中提到的负载平衡损失。对于每个开关层,在训练过程中,辅助损失将添加到总模型损失中。这个损失鼓励均匀路由,并且可以使用超参数进行加权。

作者还尝试了选择性精度,例如使用bfloat16训练专家,同时为其他计算使用完全精度。较低的精度可以降低处理器之间的通信成本、计算成本和存储张量的内存。最初的实验中,专家和网关网络都以bfloat16训练时,训练更加不稳定。这主要是由于路由计算:由于路由器具有指数函数,因此使用更高的精度很重要。为了减轻不稳定性,路由器也使用了完全精度。

Using selective precision does not degrade quality and enables faster models

这个笔记本展示了如何为摘要进行Switch Transformer的微调,但我们建议首先查看微调部分

Switch Transformers使用了编码器-解码器的架构,其中采用了T5的MoE版本。在GLaM论文中,作者通过使用1/3的能量训练出与GPT-3相当质量的模型,从而将这些模型的规模推向了新的高度(是的,多亏了训练MoE所需的计算量较低,他们能够将碳足迹降低一个数量级)。作者着重研究了仅使用解码器的模型以及少样本和单样本评估,而不是微调。他们采用了Top-2路由和更大的容量因子。此外,他们还探索了容量因子作为一个可以在训练和评估过程中根据所需计算量进行调整的度量标准。

使用路由器Z-loss稳定训练过程

之前讨论的平衡损失可能会导致不稳定性问题。我们可以使用多种方法来稳定稀疏模型,但代价是模型质量的损失。例如,引入dropout可以提高稳定性,但会损失模型质量。另一方面,添加更多的乘法组件可以提高模型质量,但会降低稳定性。

路由器Z-loss是在ST-MoE中引入的,通过惩罚进入门控网络的大logits来显著提高训练的稳定性而不降低质量。由于该损失鼓励值的绝对大小更小,舍入误差被减小,这对于门控等指数函数非常重要。我们建议查看该论文以获取详细信息。

专家学到了什么?

ST-MoE的作者观察到编码器专家主要专精于一组标记或浅层概念。例如,可能会有一个标点符号专家、一个专门处理专有名词的专家等。另一方面,解码器专家的专业化程度较低。作者们还进行了多语言的训练。虽然每个专家可以专门处理一种语言,但由于标记路由和负载平衡的原因,并没有单个专家专门处理任何一种语言。

ST-MoE论文中显示将哪些标记组发送给哪个专家的表格。

增加专家数量对预训练有何影响?

更多的专家会提高样本利用效率和速度,但这些增益是递减的(特别是在256或512之后),并且推理时需要更多的显存。在大规模情况下研究的性质在小规模情况下也是一致的,即使每层只有2、4或8个专家。

对MoEs进行微调

Mixtral在transformers的4.36.0版本中提供支持。您可以使用pip install "transformers==4.36.0 --upgrade进行安装。

稠密模型和稀疏模型之间的过拟合动态非常不同。稀疏模型更容易过拟合,因此我们可以在专家内部进行更高的正则化(例如dropout)(例如,我们可以为稠密层使用一个dropout率,并为稀疏层使用另一个更高的dropout率)。

一个决策问题是是否在微调时使用辅助损失。ST-MoE的作者尝试关闭辅助损失,并且质量并没有受到显著影响,即使最多有11%的标记被丢弃。标记丢弃可能是一种有助于防止过拟合的正则化形式。

Switch Transformers观察到,在固定的预训练困惑度下,稀疏模型在下游任务中表现不如稠密对应物,特别是在涉及推理的任务(如SuperGLUE)中。另一方面,对于知识密集型任务(如TriviaQA),稀疏模型的表现相对较好。作者还观察到,在微调中少量的专家有助于性能。另一个证实泛化问题的观察是该模型在较小的任务上表现较差,但在较大的任务上表现良好。

在小任务中(左图),我们可以清楚地看到过拟合现象,稀疏模型在验证集上效果明显较差。在较大的任务中(右图),MoE表现良好。此图片来源于ST-MoE论文。

我们可以尝试冻结所有非专家权重。这导致了巨大的性能下降,这是预料之中的,因为MoE层对应于网络的大部分。我们可以尝试相反的方法:只冻结MoE层中的参数,结果发现其效果几乎与更新所有参数一样好。这可以加快调优速度并减少内存消耗。

只冻结MoE层可以加快训练速度并保持质量。该图像来自ST-MoE论文。

当进行稀疏MoE的精调时,还有一部分需要考虑的是它们具有不同的精调超参数设置 – 例如,稀疏模型往往受益于较小的批量大小和较高的学习率。

稀疏模型的精调质量通过较低的学习率和较大的批量大小改善。该图像来自ST-MoE论文。

此时,您可能会对人们难以进行MoE的精调感到有些沮丧。令人兴奋的是,最近一篇论文《MoEs遇见指令调整》(2023年7月)进行了实验,包括:

  • 单任务精调
  • 多任务指令调整
  • 多任务指令调整后进行单任务精调

当作者对MoE和T5等效进行精调时,T5等效效果更好。当作者对Flan T5(T5 instruct等效)MoE进行精调时,MoE的性能显著提高。不仅如此,Flan-MoE相比于MoE的改进要大于Flan T5相对于T5的改进,这表明与稠密模型相比,MoEs在指令调整方面可能获益更多。MoEs从更多任务中获益更多。与之前讨论建议关闭辅助损失函数不同,该损失实际上能够防止过拟合。

稀疏模型比密集模型更多从指令调整中受益。该图像来自MoEs遇见指令调整论文。

何时使用稀疏MoEs和密集模型?

对于拥有许多机器的高吞吐量场景,专家非常有用。在固定的预训练计算预算下,稀疏模型将更加优化。对于具有较少VRAM的低吞吐量场景,密集模型将更好。

注意:不能直接比较稀疏和密集模型的参数数量,因为两者代表着显著不同的内容。

使MoEs更实用

最初的MoE工作将MoE层描述为分支设置,导致计算速度变慢,因为GPU并非为此而设计,并且由于设备需要将信息发送到其他设备,网络带宽成为瓶颈。本节将讨论一些现有的工作,使得使用这些模型进行预训练和推理更加实用。MoEs go brrrrr。

并行计算

让我们简要回顾一下并行计算:

  • 数据并行:相同的权重被复制到所有核心,数据被分割到各个核心。
  • 模型并行:模型被分割到各个核心,数据被复制到各个核心。
  • 模型和数据并行:我们可以将模型和数据分割到各个核心。请注意,不同的核心处理不同批次的数据。
  • Expert并行:将专家放置在不同的工作器上。如果与数据并行结合使用,每个核心都有一个不同的专家,数据被分割到所有核心

通过专家并行性,专家被放置在不同的工作人员上,每个工作人员承担不同批次的训练样本。对于非MoE层,专家并行性的行为与数据并行性相同。对于MoE层,序列中的标记被发送到所需专家所在的工作人员。

来自Switch Transformers论文的插图,显示数据和模型如何根据不同的并行性技术在核心上分割。

能力因子和通信成本

增加能力因子(CF)会提高质量,但会增加通信成本和激活内存。如果全对全的通信较慢,使用较小的能力因子更好。一个好的起点是使用top-2路由,1.25的能力因子,并且每个核心都有一个专家。在评估过程中,可以改变能力因子以减少计算量。

服务技术

您可以将 mistralai/Mixtral-8x7B-Instruct-v0.1 部署到推断端点。

MoEs的一个显着缺点是参数数量庞大。对于本地使用案例,可能希望使用较小的模型。让我们快速讨论一些能够帮助提供服务的技术:

  • Switch Transformers的作者进行了早期蒸馏实验。通过将MoE蒸馏回其密集对应物,他们可以保留30-40%的稀疏性增益。因此,蒸馏提供了更快的预训练和在生产中使用较小的模型的好处。
  • 最近的方法修改了路由,将完整的句子或任务路由给专家,从而允许提取用于服务的子网络。
  • 专家聚合(MoE):这种技术合并了专家的权重,从而减少了推断时的参数数量。

更多关于高效训练的内容

FasterMoE(2022年3月)分析了MoEs在高效分布式系统中的性能,并分析了不同并行策略的理论极限,以及偏斜专家受欢迎度的技术、降低延迟的细粒度通信调度和根据最低延迟选择专家的调整拓扑感知门,从而实现了17倍的加速。

Megablocks(2022年11月)通过提供可以处理MoEs中存在的动态性的新GPU内核,探索了高效稀疏预训练。他们的方法不会丢弃标记,并且可以高效映射到现代硬件,从而实现了显著的加速。这个窍门是什么?传统的MoEs使用批量矩阵乘法,假设所有专家具有相同的形状和相同数量的标记。相反,Megablocks将MoE层表示为可以容纳不平衡分配的块稀疏操作。

针对不同大小的专家和标记数量的块稀疏矩阵乘法(来自[MegaBlocks](https://arxiv.org/abs/2211.15841))

开源MoEs

现在有几个开源项目可以训练MoEs:

在已发布的开放获取的MoEs领域,您可以查看:

激动人心的工作方向

进一步研究将稀疏的MoE蒸馏为稠密模型,参数减少但保持类似数量。

另一个领域是对MoE的量化。 QMoE(2023年10月)是朝着这个方向迈出的重要一步,将MoE量化为少于每个参数1位,从而将使用3.2TB加速器的1.6T Switch Transformer压缩到160GB。

因此,简而言之,有一些有趣的探索方向:

  • 将Mixtral蒸馏为稠密模型
  • 探索专家模型合并技术及其对推理时间的影响
  • 对Mixtral进行极端量化技术

一些资源

引用

@misc {sanseviero2023moe,    author       = { Omar Sanseviero 和                     Lewis Tunstall 和                     Philipp Schmid 和                     Sourab Mangrulkar 和                     Younes Belkada 和                     Pedro Cuenca                   },    title        = { 专家混合模型解析 },    year         = 2023,    url          = { https://huggingface.co/blog/moe },    publisher    = { Hugging Face Blog }}

Sanseviero等人,"专家混合模型解析",Hugging Face Blog, 2023。