首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AI 架构新风口!MoE 模型深度拆解,手把手教你用 Llama3+Phi-3 组 “超级大脑”

在当今快速发展的人工智能领域,大模型的性能与效率始终是研究者和开发者关注的焦点。而人的专注力有限,想要深入理解复杂的 MoE 模型,我们需要高效且系统的学习。

接下来,就让我们一起揭开 MoE 模型的神秘面纱。

一、MoE 模型:专家混合架构的奥秘

(一)核心概念与优势

MoE(Mixture of Experts)即专家混合模型,是一种旨在提升效率和性能的架构。它突破了传统密集模型的局限,采用多个专用子网 ——“专家” 协同工作。不同于激活整个网络的密集模型,MoE 会依据输入内容,精准激活相应的专家,从而显著加快训练速度,提升推理效率。

设想一下,若要打造一个既精通代码编写,又擅长教育教学的大模型,采用传统方式不仅开发周期漫长,且当项目完成时,技术可能早已更新迭代。而 MoE 模型则为解决此类问题提供了新的思路。

(二)两大核心组成部分

稀疏 MoE 层

这一层取代了变压器架构中的密集前馈网络层。每个 MoE 层包含多个专家,在处理特定输入时,仅部分专家参与工作,有效降低了计算量。

Gate Network 或 Router

该组件如同智能导航员,能够准确判断哪些 tokens 由哪些专家处理,确保每项输入任务都能交由最合适的专家完成。

以将 Mistral - 7B 转换为具有稀疏 MoE 层和路由 MoE 为例,通过图示我们可以清晰看到三名专家如何协同处理输入,前馈网络 1、2、3 在路由的调配下发挥各自专长 。

(三)复杂特性与挑战

尽管 MoE 模型优势显著,但其自身结构复杂,微调难度较大。在训练过程中,需要精心平衡专家的使用,以正确训练门控权重,精准选择最相关的权重。在显存需求方面,即便推理时仅使用部分参数,整个模型(含所有专家)仍需全部加载到内存中,这对 VRAM 提出了极高要求。

MoE 的两个关键参数 —— 专家数量(num_local_experts)和每个 token 的专家数量(num_experts_per_tok),直接影响着模型性能与显存需求。例如,Mixtral 模型中,专家数量越多,VRAM 需求越高;而每个令牌的准确性与较少专家数量带来的快速训练和推理之间,始终存在着微妙的平衡。

(四)研究进展与新方法

MoE 一直是人工智能领域的热门研究方向。在星球中,我们分享了大量关于 MoE 的技术论文和实践案例。早期,MoE 模型的表现曾落后于密集型模型,但 2023 年 12 月发布的 Mixtral - 8x7B 令人眼前一亮。此外,有传言称 GPT - 4 也采用了 MoE 架构,从降低运行和训练成本的角度来看,这一说法具有一定的合理性。

如今,借助 MergeKit 创建 MoE 的新方法 ——frankenMoE(别称 MoErges)应运而生。它与传统 MoE 的核心区别在于训练方式:传统 MoE 的专家和路由器需一同训练;而 frankenMoE 则是对现有模型进行升级改造后,再初始化路由器并组合而成。具体而言,我们从基础模型复制层范数和自注意力层的权重,以及每个专家中 FFN 层的权重,除 FFN 外的其他参数均为共享。这也解释了为何八位专家的 Mixtral - 8x7B 参数并非 8*7 = 56B,而是 45B。

MergeKit 目前提供了三种初始化路由器的方法:

随机

通过 torch.randn 函数生成随机权重,随机决定由哪个专家响应输入。例如,if mode == "random": return torch.randn((model_cfg.num_hidden_layers, len(experts), model_cfg.hidden_size)),此代码在 mode 为 "random" 时,生成一个形状由模型隐藏层数、专家数量和隐藏层尺寸决定的随机张量。

嵌入向量

get_cheap_embedding函数通过将输入文本转换为 one - hot 编码,与嵌入矩阵相乘,再结合注意力掩码处理,最终归一化并重复嵌入向量以匹配模型层数,实现计算文本嵌入向量的功能 。

隐藏状态表示

get_hidden_states函数可获取语言模型在不同层对输入文本的隐藏状态表示,并能根据需求选择返回每层隐藏状态的平均值或最后一个时间步的隐藏状态,最终得到输入的最终隐藏状态表示。

二、创建 MoE 模型的常用算法

创建 MoE 模型的方法多样,以下为四种常用算法:

(一)SLERP(球面线性插值)

SLERP 是一种在两个向量间实现平滑插值的方法,能够保持恒定变化率,保留矢量所在球形空间的几何属性。相较于传统线性插值,在高维空间中,SLERP 可避免插值向量幅度减小,更注重权重方向变化所蕴含的特征学习和表示信息。

其实现步骤如下:

将输入向量归一化为单位长度;

通过点积计算向量间角度。

不过,SLERP 仅支持一次合并两个模型。以下是配置示例:

(二)TIES

TIES 旨在将多个特定任务模型高效合并为单个多任务模型,有效解决模型合并中的两大难题:

消除参数冗余

通过关注微调期间的变化,识别并丢弃特定任务模型中前 k% 不重要的参数。

解决符号分歧

当不同模型对同一参数调整方向冲突时,创建统一符号向量,代表所有模型中最主要的变化方向。

TIES - 合并分为修剪、选择符号和不相交合并三个步骤,且可一次合并多个模型。配置示例如下:

(三)DARE

DARE 与 TIES 类似,但存在两点关键差异:

修剪方式

将微调权重随机重置为原始值(基本模型的值)。

重新缩放

重新缩放权重,确保模型输出大致不变,将多个模型的重新缩放权重按比例添加到基本模型权重中。

配置示例:

(四)Passthrough

Passthrough 与上述方法截然不同,它通过连接不同 LLM 的层,能够生成具有特殊参数的模型,如将两个 7B 参数模型合并为 9B 模型。目前,该技术已成功应用于多个令人瞩目的模型创建,如 goliath - 2 70b 和 SOLAR - 10.7B - v1.0。配置示例:

三、实战演练:Llama3 与 Phi-3 组成 MoE

(一)模型选择与准备

在实际操作中,我们可以根据任务需求,选择自己的模型或 Hugging Face 上的其他模型进行组合。常见的模型类型包括聊天模型、代码模型、数学模型和角色扮演模型等。本次实例中,我们选用 cognitivecomputations/dolphin - 2.9 - llama3 - 8b 和 shenzhi - wang/Llama3 - 8B - Chinese - Chat 两个模型。若您有自己微调的垂直领域模型,替换也十分便捷。

建议使用 Linux 系统以确保兼容性,本次操作基于 wsl 系统。

(二)环境搭建与配置

(三)配置文件解读与运行

打开合并配置文件 config.yaml,其各部分作用如下:

slices

指定参与合并的模型及层范围,如本示例中两个模型均使用前 32 层。

merge_method

采用 slerp 方法进行模型合并。

base_model

确定基础模型为 shenzhi - wang/Llama3 - 8B - Chinese - Chat。

parameters

设置模型参数,包括 self_attn、mlp 等参数的值。

dtype

指定模型数据类型为 bfloat16。

修改配置文件中的模型路径,即可替换为其他 Hugging Face 上的模型。完成配置后,直接运行命令mergekit-yaml config.yaml merge --copy-tokenizer --allow-crimes --out-shard-size 1B --lazy-unpickle --trust-remote-code,程序将自动加载配置文件、下载模型并进行合并。若本地已有模型,放置在root\.cache\huggingface\hub目录下,程序将自动调用。

若您的 VRAM 资源有限,可通过修改配置文件,尝试其他创建方法。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OUBYM4EexxrAsELrHbZkx82A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券