使用 MergeKit 创建专家组合---将多个模型合并到同个 MoE 中

原文地址:create-mixtures-of-experts-with-mergekit

2024 年 3 月 27 日

由于 Mixtral 的发布,Mixture of Experts(MoE)架构近几个月开始流行。这种架构提供了一个有趣的权衡:以增加 VRAM 使用为代价获得更高的性能。虽然 Mixtral 和其他 MoE 架构是从头开始预训练的,但最近出现了另一种创建 MoE 的方法。感谢阿尔茜的MergeKit库,我们现在有了一种通过集成多个预训练模型来创建 MoE 的新方法。这些通常被称为frankenMoEs or MoErges,将它们与预先训练的 MoE 区分开来。

在本文中,我们将详细介绍 MoE 架构的工作原理以及 FrankenMoE 的创建方式。最后,我们将使用 MergeKit 制作我们自己的 FrankenMoE,并在几个基准上对其进行评估。该代码可在 Google Colab 上的名为LazyMergeKit的包装器中找到。

特别感谢MergeKit 的创建者Charles Goddard校对本文。

MoEs简介

专家混合是一种旨在提高效率和性能的架构。它使用多个专门的子网络,称为“专家”。与激活整个网络的密集模型不同,MoE 仅根据输入激活相关专家。这会带来更快的训练和更有效的推理。

MoE 模型的核心有两个组成部分:

  1. 稀疏 MoE 层:这些层取代了transformer架构中密集的前馈网络层。每个 MoE 层包含多个专家,并且只有这些专家的子集参与给定的输入。
  2. 门网络或路由器:该组件确定哪些令牌由哪些专家处理,确保输入的每个部分都由最合适的专家处理。

下面的示例展示了如何将 Mistral-7B 块转换为具有稀疏 MoE 层(前馈网络 1、2 和 3)和路由器的 MoE 块。此示例代表MoE拥有三名专家,其中目前有两名专家(FFN 1 和 FFN 3)。

MoE 也面临着自己的一系列挑战,特别是在微调和内存要求方面。由于模型的复杂性,微调过程可能很困难,需要在训练期间平衡专家的使用,以正确训练门控权重以选择最相关的权重。在内存方面,即使在推理过程中只使用了总参数的一小部分,但整个模型,包括所有专家,都需要加载到内存中,这需要很高的VRAM容量。

更具体地说,MoE 有两个基本参数:

  • 专家数量num_local_experts):这决定了架构中专家的总数(例如,Mixtral 为 8)。专家数量越多,VRAM 使用率越高。
  • 专家/令牌的数量num_experts_per_tok):这决定了每个令牌和每个层参与的专家数量(例如,Mixtral 为 2)。每个token的专家数量较多以提高准确性(但收益递减),而较少的专家数量则可实现快速训练和推理,需要进行权衡。

从历史上看,MoE 的表现不如密集模型。然而, Mixtral-8x7B于 2023 年 12 月的发布震撼了一切,并以其尺寸展现了令人印象深刻的性能。此外,据传 GPT-4 也是一个 MoE,这是有道理的,因为与密集模型相比,OpenAI 的运行和训练要便宜得多。除了这些最近优秀的 MoE 之外,我们现在还有一种使用 MergeKit 创建 MoE 的新方法:frankenMoEs,也称为 MoErges。

MoE 与 FrankenMoE

真正的 MoE 和 FrankenMoE 之间的主要区别在于它们的训练方式。在真正的 MoE 中,专家和路由器接受联合培训。对于 FrankenMoE,我们升级现有模型并随后初始化路由器。

换句话说,我们从基础模型中复制层归一化和自注意力层的权重,然后复制每个专家中找到的 FFN 层的权重。这意味着除了 FFN 之外,所有其他参数都是共享的。这解释了为什么具有八个专家的 Mixtral-8x7B 没有 8*7 = 56B 参数,而是大约 45B。这也是为什么每个令牌使用两名专家可以提供 12B 密集模型而不是 14B 的推理速度(FLOP)。

FrankenMoE 的目的是选择最相关的专家并正确初始化它们。 MergeKit 目前实现了三种初始化路由器的方法:

  1. 随机:随机权重。使用它时要小心,因为每次可能会选择相同的专家(它需要进一步微调 或num_local_experts = num_experts_per_tok,这意味着您不需要任何路由)。
  2. 廉价嵌入:它直接使用输入标记的原始嵌入,并在所有层上应用相同的转换。该方法计算成本低廉,适合在功能较弱的硬件上执行。
  3. 隐藏:它通过从LLMs的最后一层提取正面和负面提示列表来创建隐藏表示。对它们进行平均和标准化以初始化门。有关它的更多信息,请访问Charles Goddard 的博客。

正如您所猜测的,“隐藏”初始化是将令牌正确路由到最相关的专家的最有效方法。在下一节中,我们将使用这种技术创建我们自己的 FrankenMoE。

创建 FrankenMoE

为了创建我们的 FrankenMoE,我们需要选择n专家。在这种情况下,我们将依靠 Mistral-7B,因为它很受欢迎且尺寸相对较小。然而,像 Mixtral 这样的 8 个专家相当多,因为我们需要将它们全部放入内存中。为了提高效率,我在此示例中仅使用四名专家,其中两名负责每个令牌和每个层。在这种情况下,我们最终将得到一个具有 24.2B 个参数的模型,而不是 4*7 = 28B 个参数。

在这里,我们的目标是创建一个全面的模型,它几乎可以做所有事情:写故事、解释文章、用 Python 编写代码等。我们可以将此需求分解为四个任务,并为每个任务选择最佳专家。我是这样分解的:

  • 聊天模型:大多数交互中使用的通用模型。我使用的是mlabonne/AlphaMonarch-7B,它完全满足要求。
  • 代码模型:能够生成好的代码的模型。我对基于 Mistral-7B 的代码模型没有太多经验,但我发现beowolx/CodeNinja-1.0-OpenChat-7B与其他模型相比特别好。
  • 数学模型:数学对于LLMs来说很棘手,这就是为什么我们需要一个专门研究数学的模型。由于 MMLU 和 GMS8K 分数较高,我为此选择了mlabonne/NeuralDaredevil-7B 。
  • 角色扮演模型:该模型的目标是编写高质量的故事和对话。我选择了SanjiWatsuki/Kunoichi-DPO-v2–7B,因为它具有良好的声誉和较高的 MT-Bench 分数(Mixtral 为 8.51 vs. 8.30)。

现在我们已经确定了要使用的专家,我们可以创建 MergeKit 将用来创建 FrankenMoE 的 YAML 配置。这使用了 MergeKit 的 mixtral 分支。您可以在此页面上找到有关如何编写配置的更多信息。这是我们的版本:

base_model: mlabonne/AlphaMonarch-7B
experts:
  - source_model: mlabonne/AlphaMonarch-7B
    positive_prompts:
    - "chat"
    - "assistant"
    - "tell me"
    - "explain"
    - "I want"
  - source_model: beowolx/CodeNinja-1.0-OpenChat-7B
    positive_prompts:
    - "code"
    - "python"
    - "javascript"
    - "programming"
    - "algorithm"
  - source_model: SanjiWatsuki/Kunoichi-DPO-v2-7B
    positive_prompts:
    - "storywriting"
    - "write"
    - "scene"
    - "story"
    - "character"
  - source_model: mlabonne/NeuralDaredevil-7B
    positive_prompts:
    - "reason"
    - "math"
    - "mathematics"
    - "solve"
    - "count"

对于每位专家,我提供了五个基本的积极提示。如果你愿意的话,你可以更花哨一点,写出整个句子。最好的策略包括使用应该触发特定专家的真实提示。您还可以添加负面提示来执行相反的操作。

准备就绪后,您可以将配置另存为config.yaml.在同一文件夹中,我们将下载并安装mergekit库(mixtral 分支)。

git clone -b mixtral https://github.com/arcee-ai/mergekit.git
cd mergekit && pip install -e .
pip install -U transformers

如果您的计算机有足够的 RAM(大约 24–32 GB RAM),您可以运行以下命令:

mergekit-moe config.yaml merge --copy-tokenizer

如果您没有足够的 RAM,您可以按如下方式对模型进行分片(这将需要更长的时间):

mergekit-moe config.yaml merge --copy-tokenizer --allow-crimes --out-shard-size 1B --lazy-unpickle

此命令会自动下载专家并在目录中创建 FrankenMoE merge。对于hidden门模式,您还可以使用--load-in-4bit--load-in-8bit选项以较低的精度计算隐藏状态。

或者,您可以将配置复制到LazyMergekit中,这是我为简化模型合并而制作的包装器。在此 Colab 笔记本中,您可以输入模型名称、选择分支mixtral、指定您的 Hugging Face 用户名/令牌,然后运行单元格。创建 FrankenMoE 后,它还会将其上传到 Hugging Face Hub,并附上格式良好的模型卡。

我将我的模型命名为Beyonder-4x7B-v3并使用AutoGGUF创建了它的GGUF 版本。如果您无法在本地计算机上运行 GGUF 版本,您还可以使用此Colab Notebook执行推理。

为了更好地了解其功能,我们根据三个不同的基准对其进行了评估:Nous 基准套件、EQ-Bench 和 Open LLM Leaderboard。该模型的设计目的并不是在传统基准测试中表现出色,因为代码和角色扮演模型通常不适用于这些环境。尽管如此,由于强大的通用专家的帮助,它的表现非常出色。

Nous:Beyonder-4x7B-v3 是 Nous 基准测试套件中最好的模型之一(使用LLM AutoEval进行评估),并且显着优于 v2。在这里查看整个排行榜。

EQ-Bench:它也是EQ-Bench 排行榜上最好的 4x7B 模型,优于旧版本的 ChatGPT 和 Llama-2–70b-chat。 Beyonder 与 Mixtral-8x7B-Instruct-v0.1 和 Gemini Pro 非常接近,这两个模型(据说)要大得多。

Open LLM 排行榜:最后,它在 Open LLM 排行榜上也表现强劲,明显优于 v2 模型。

除了这些定量评估之外,我建议使用LM Studio上的 GGUF 版本以更定性的方式检查模型的输出。测试这些模型的常见方法是收集一组私人问题并检查其输出。通过这种策略,我发现与其他模型(包括 AlphaMonarch-7B)相比,Beyonder-4x7B-v3 对于用户和系统提示的变化相当稳健。这非常酷,因为它总体上提高了模型的实用性。

FrankenMoE 是一种很有前途但仍处于实验阶段的方法。较高的 VRAM 需求和较慢的推理速度等权衡使得很难看到它们相对于 SLERP 或 DARE TIES 等更简单的合并技术的优势。特别是,当您仅与两名专家一起使用 FrankenMoE 时,它们的性能可能不如您简单地合并两个模型那么好。然而,FrankenMoE 擅长保存知识,这可以产生更强大的模型,正如 Beyonder-4x7B-v3 所证明的那样。有了合适的硬件,这些缺点就可以得到有效缓解。

结论

在本文中,我们介绍了专家混合架构。与从头开始训练的传统 MoE 不同,MergeKit 有助于集成专家创建 MoE,提供创新方法来提高模型性能和效率。我们详细介绍了使用 MergeKit 创建 FrankenMoE 的过程,重点介绍了选择和组合不同专家以生成高质量 MoE 所涉及的实际步骤。

References

  • Mixtral of Experts by Jiang et al. (2023)
  • Mixture of Experts for Clowns by Charles Goddard (2023)
  • Mixture of Experts Explained by Sanseviero et al. (2023)
  • Adaptive Mixture of Local Experts by Jacobs et al. (1991)
  • Sparse Upcycling: Training Mixture-of-Experts from Dense Checkpoints by Komatsuzaki et al. (2022)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/507508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】联合体、枚举: 联合体与结构体区别,枚举的优点

目录 1、联合体 1.1、什么是联合体 1.2、联合体的声明 1.3、联合体的特点 1.4、联合体与结构体区别 1.5、联合体的大小 2、枚举 2.1、枚举类型的声明 2.2、枚举类型的优点 3、三种自定义类型:结构体、联合体、枚举 正文 1、联合体 1.1、什么是联合体 联…

脑部肿瘤检测YOLOV8

脑部肿瘤检测,采用YOLOV8训练得到PT模型,然后转换成ONNX,OPENCV调用,支持C/PYTHON/ANDORID开发脑部肿瘤检测YOLOV8

台球王子,Android小游戏开发

使用 Android Studio 开发了一款休闲游戏 —— 《台球王子》 关键词:台球 A. 项目描述 台球作为一项优雅、策略性强的运动,在众多游戏类型中却相对较少。因此,开发《台球王子》小游戏,可以让更多玩家能够轻松享受到台球的乐趣。…

Mysql数据库故障排查与优化

目录 前言 一、Mysql数据库的单实例故障 1.故障一——拒绝连接数据库 1.1故障内容 1.2问题分析 1.3解决方法 2.故障二——密码错误 2.1故障内容 2.2问题分析 2.3解决方法 3.故障三——数据库处理较慢 3.1故障内容 3.2问题分析 3.3解决方法 4.故障四——数据库表…

学习【Redis原理篇】这一篇就够了

目录 1. 数据结构1-1. 动态字符串(SDS)1-2. intset1-3. Dict 2. 网络模型3. 通信协议4. 内存策略 1. 数据结构 1-1. 动态字符串(SDS) 我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字…

gdb调试运行中的多线程

步骤如下: 一、查看线程状态和打印变量值 1、gdb -p 进程号 2、thread apply all bt (查看所有线程都运行到了哪里,是否 有hang住的地方,以及确定要打印的变量属于哪个thread下、属于哪个堆栈帧) 3、thread $THRE…

KUKA机器人调整示教器灵敏度(校屏)

KUKA机器人KRC4的示教器升级后,示教器屏幕由之前的电阻屏改为电容屏,不仅在外观上有所变化,屏幕校准的方法也有所不同。通过以下方法分别对新旧两款示教器进行屏幕校正,调整示教器屏幕灵敏度。 对新款示教器而言: 一…

Electron + Vue3 + TS + Vite 搭建桌面应用

参考:https://blog.csdn.net/mo911108/article/details/131456698 npm -v 10.2.4npm create vitelatest gcto-electron-app --template vue-ts运行项目 npm run dev切换镜像源并安装electron,需要设置ELECTRON_MIRROR才行,win10操作如下&am…

波奇学Linux:TCP协议

TCP协议传输层有发送缓冲区和接收缓冲区 read,recv,send的函数调用发送缓冲区,本质并不是数据发送到网络当中,数据什么时候发送,发送多少,出错了怎么办,由TCP协议自主决定 发送到对方缓冲区本…

Elasticsearch是什么及作用

初识Elasticsearch 一、Elasticsearch是什么? es是款强大的开源搜索技术,具备非常多强大的功能,能够帮助我们开发人员从海量数据中快速找到需要的内容。例如在GitHub上搜索代码,在jd、tb网站中搜索商品、在baidu中搜索答案。 二、…

智慧停车系统运行原理和影响评估

一:智慧停车系统概述 智慧停车系统运用信息通信技术,整合传感器、摄像头、车牌识别设备,实时监控停车场情况,为车主提供便捷快速的停车体验。主要功能包括车位查询、预约停车、自动计费、无感支付等。车主可通过手机APP或自助终端…

Autodesk Maya 2025 mac玛雅三维动画特效软件

Autodesk Maya 2025 for Mac是一款功能强大、操作简便的三维动画软件,适用于电影、电视、游戏、建筑、工业设计、虚拟现实和动画等领域。无论是专业设计师还是初学者,都可以通过Maya 2025实现自己的创意和想法,创作出高质量的三维作品。 软件…

NEO 学习之 MLE(最大似然估计)

文章目录 简单题目MLE 在不同的分布的运用正态分布指数分布均匀分布泊松分布 如何理解 最大似然估计? 就是我们先取出一堆样本,得到一个L( θ \theta θ) 函数,然后的话,这个是关于 θ \theta θ 的一个函数,那么由于存…

C++学习笔记(入门)

c学习笔记&#xff08;入门&#xff09; 文章目录 c学习笔记&#xff08;入门&#xff09;前言精华一、&#xff08;1&#xff09;c语言结构基础1.头文件2.指明空间&#xff1a;using namespace std3.输入输出&#xff1a;cin >>&#xff0c;cout << ... << …

3.29 文章翻译RO——Robust scheduling of building energy system under uncertainty

highlight 我们建立了一个带有冷却器和冰热能储存的建筑能源系统模型。 提出了一种两阶段鲁棒策略来调度系统运行。 具有适当参数的鲁棒策略优于确定性方法。 鲁棒策略和MPC方法的性能相似。 本文提出了一种鲁棒调度策略&#xff0c;用于在预测不确定的情况下管理具有太阳能发电…

目标检测——服饰属性标签识别数据集

一、重要性及意义 首先&#xff0c;随着电商、时尚推荐等业务的发展&#xff0c;服饰属性标签识别已经成为一项关键的计算机视觉任务。这些标签&#xff0c;如颜色、款式、材质等&#xff0c;对于实现图像搜索、时尚推荐等业务需求至关重要。服饰属性标签识别数据集为此类任务…

编程语言 MoonBit 本周有超多重磅更新等你来探索:expect 测试添加 inspect 函数,还有……

MoonBit 更新 1. expect 测试添加 inspect 函数 expect 测试添加针对 Show 接口的 inspect 函数&#xff0c;签名如下&#xff1a; pub fn inspect(obj: Show,~content: String "",~loc: SourceLoc _,~args_loc: ArgsLoc _ ) -> Result[Unit, String]⚠️ 此…

svn拉代码乱码请执行清理命令

代码有冲突&#xff0c;突然就svn就不好使了&#xff0c;报错&#xff0c;清理也报错 解决办法&#xff1a; 1、下载SQLite工具 地址&#xff1a;SQLite 下载页面 2、新建一个临时文件夹&#xff0c;使用英文名字&#xff0c;将解压后的sqlite.exe文件复制到这个临时文件夹下…

如何利用生成式人工智能(AI)推广海外仓储机器人?

随着全球物流行业的迅速发展&#xff0c;仓储机器人在提高效率和降低成本方面发挥着越来越重要的作用。然而&#xff0c;要在海外市场推广仓储机器人&#xff0c;需要制定一系列有效的营销策略。以下是一些关键步骤&#xff1a; 市场调研和定位 在海外市场推广仓储机器人之前…

OSPF---开放式最短路径优先协议

1. OSPF描述 OSPF协议是一种链路状态协议。每个路由器负责发现、维护与邻居的关系&#xff0c;并将已知的邻居列表和链路费用LSU报文描述&#xff0c;通过可靠的泛洪与自治系统AS内的其他路由器周期性交互&#xff0c;学习到整个自治系统的网络拓扑结构;并通过自治系统边界的路…