Moe 混合多专家模型 原理 + 大模型的有性繁殖 + DIY 自己的 Moe 专家系统

Moe 混合多专家模型 原理 + 大模型的有性繁殖 + DIY 自己的 Moe 专家系统

    • MoE 介绍
      • 标准 Transformer 编码器
      • MoE Transformer 编码器
      • 专家网络层
    • 大模型的有性繁殖
      • mergekit 合并 多个专家模型 的方式
        • 1. SLERP(球面线性插值)
        • 2. TIES
        • 3. DARE
        • 4. Passthrough
        • 5. Linear
      • mergekit 合并 多个专家模型 实操
        • 1. TIES 合并 Mistral-7b、WizardMath-7b、CodeLlama-7b
        • 2. SLERP 合并 Llama3-8B、mistral-ft-optimized-1218
        • 3. DARE 合并 Mistral-7B、SamirGPT-v1
        • 4. Passthrough 合并 Llama3-8b、Phi-3
      • Moe 改进医学大模型

 


MoE 介绍

大模型最开始设计思路是 — 通用。

一个通才能够处理多个不同的任务,但一群专家能够更高效、更专业地解决多个问题。

  • Moe 混合多专家模型:术业有专攻,将任务分类,分给多个专家解决

与一个“通才网络”相比,一组术业有专攻的“专家网络”能够:

  • 让用户获得更快的响应速度

  • 提供更好的模型性能 — 每个专家模型都能针对不同的数据分布和构建模式进行搭建

  • 更好地完成复杂的多种任务

  • 在不显著增加计算成本的情况下大幅增加模型容量

  • 开发时间更短

    让一个大模型既代码牛逼,又医疗牛逼,还数学、角色扮演牛逼,你得烧多少算力、买多少数据,即使做到,项目开发周期非常长,搞不好新技术出来又颠覆了。

  • 模型越大,性能越好。

    今天的大模型,正迫切地需要变得更大。

    随着模型越来越大,稳定性也越来越差,种种综合原因让大模型参数量长久以来限制在百亿与千亿级别,难以进一步扩大。

这张图对比了标准 Transformer 编码器(左侧)和 MoE(专家混合)Transformer 编码器(右侧)的架构。

  • MoE Transformer 编码器引入了MoE(专家混合)层,而标准 Transformer 编码器没有。

  • 与传统大模型架构相比,MoE架构在数据流转过程中集成了一个专家网络层(红框部分)。

标准 Transformer 编码器

  1. 输入嵌入 + 位置嵌入:输入的嵌入向量和位置嵌入。
  2. 多头注意力机制:使用多头注意力机制来捕捉输入序列中不同位置之间的关系。
  3. 加法 & 归一化:将多头注意力机制的输出与输入进行残差连接,并进行归一化处理。
  4. 前馈神经网络(FFN):通过一个全连接的前馈神经网络对归一化后的输出进行进一步的处理。
  5. 加法 & 归一化:将前馈神经网络的输出与其输入进行残差连接,并进行归一化处理。
  6. 重复 Nx 次:上述步骤重复 N 次,得到编码器的最终输出。

MoE Transformer 编码器

  1. 输入嵌入 + 位置嵌入:输入的嵌入向量和位置嵌入。
  2. 多头注意力机制:使用多头注意力机制来捕捉输入序列中不同位置之间的关系。
  3. 加法 & 归一化:将多头注意力机制的输出与输入进行残差连接,并进行归一化处理。
  4. MoE 层:包含多个前馈神经网络(FFN₁, …, FFNₑ)。通过一个门控机制(Gating)来选择和激活其中的一部分前馈神经网络。这种机制使得模型可以选择性地激活特定的专家,从而增强模型的表示能力。
  5. 加法 & 归一化:将MoE层的输出与其输入进行残差连接,并进行归一化处理。
  6. 重复 (N/2)x 次:上述步骤重复 (N/2) 次,得到编码器的最终输出。

这种架构设计通过引入专家混合机制,使得模型在处理复杂任务时更具灵活性和适应性,同时也能够更有效地利用计算资源。

专家网络层


核心思想:

  • 门控网络:负责智能分配任务,将不同特征的数据分配给最适合的专家。
  • 专家模型:每个专家专注处理特定类型的数据特征,“让专业的人做专业的事”。
  • 加权融合:将各个专家的处理结果融合,得到更精准的输出。

MoE 有两个参数:

  • 专家数量 (num_local_experts):这决定架构中的专家总数,如 Mixtral-8x7B 有 8 个 7B 专家模型
  • 专家数量/tonke (num_experts_per_tok):在每个层中,每个token会被分配到多少个专家模型进行处理。例如,如果num_experts_per_tok为2,那么每个token会被分配给2个专家模型。

Moe 实现俩种方式:

  • MoE(原装训练):从头设计和训练,所有部分都精心协调,更像是制造一辆全新的跑车。

  • frankenMoE(后天组合):基于现有模型进行改装和升级,重点在于如何有效组合和协调,更像是对现有汽车进行高性能改装。

大模型的有性繁殖

mergekit 合并 多个专家模型 的方式

https%3A//github.com/arcee-ai/mergekit%23merge-methods

mergekit 有 7 种合并方式。

1. SLERP(球面线性插值)

问题:
为什么在某些情况下需要使用球面插值(SLERP)而不是线性插值?

解法:
在某些情况下,线性插值可能无法准确表示数据或模拟对象之间的连续变化,特别是涉及到在球面上的插值时。

为了保持曲线的平滑性和连续性,需要使用球面插值(SLERP)。

概念

  • SLERP是一种在两个向量之间进行平滑插值的方法,保持恒定的变化率,并保留向量所在的球形空间的几何属性。
  • 主要用于两个模型的合并,通过插值获得平滑过渡。

步骤

  1. 将输入向量归一化为单位长度。
  2. 使用它们的点积计算这些向量之间的角度。
  3. 根据角度进行插值,生成新向量。
2. TIES

概念

  • TIES旨在将多个特定任务的模型合并为一个多任务模型。
  • 通过修剪冗余参数和解决符号冲突来优化合并过程。

步骤

  1. 修剪:只保留最重要的参数,将其余参数重置为零。
  2. 选择符号:创建统一的符号向量,表示所有模型中最主要的变化方向。
  3. 不相交合并:平均对齐的参数值,不包括零值。
3. DARE

概念

  • 类似于TIES,但在修剪和重新缩放权重上有所不同。
  • 将微调的权重随机重置为原始值,并重新缩放权重以保持模型输出预期不变。

步骤

  1. 修剪:随机重置微调的权重为原始值。
  2. 重新缩放:重新缩放权重,使其与基本模型权重相结合。
4. Passthrough

概念

  • 与其他方法不同,Passthrough通过连接来自不同LLM(大规模语言模型)的层生成模型。
  • 适用于创建大参数模型。

步骤

  1. 直接连接来自不同模型的层。
  2. 生成一个新的模型,结合了多个模型的参数。

总结:

  • SLERP:适用于在两个模型之间进行平滑插值,保持向量几何属性。
  • TIES:通过修剪冗余参数和解决符号冲突来有效合并多个模型。
  • DARE:类似TIES,但在权重修剪和重新缩放上有所不同,保持输出预期不变。
  • Passthrough:通过连接不同模型的层创建大参数模型,适用于生成更强大的模型。
5. Linear

Linear就是一个简单的加权平均。

 


mergekit 合并 多个专家模型 实操

mergekit:https://github.com/arcee-ai/mergekit

 python3 -m pip install --upgrade pip              # 升级 pip 
 git clone https://github.com/cg123/mergekit.git   # 下载合并工具
 cd mergekit && pip install -q -e .                # 进入目录,下载所有依赖
 pip install -U transformers                       # 更新transformers 
 export HF_ENDPOINT=https://hf-mirror.com          # 改成抱抱网的镜像站

修改配置文件 config.yaml

- `--model_path1`: 第一个模型的目录路径,必须提供。
- `--model_path2`: 第二个模型的目录路径,必须提供。
- `--output_model_path`: 合并模型的保存路径,必须提供。
- `--gradient_values`: 梯度值列表,表示两个模型的张量应如何合并。示例中的`[1.0, 0.5, 0.0]`表示第一个模型的梯度值权重为1.0,第二个模型的梯度值权重为0.5,没有梯度值的张量权重为0.0- `--max_shard_size`: 保存模型时的最大分片大小,默认为"2000MiB"- `--layer_only`: 如果设置,则仅处理包含"layer"键的张量。此选项与`--no_layers`是互斥的,表示只处理特定层的张量。
- `--no_layers`: 如果设置,则仅处理不包含"layer"键的张量。此选项与`--layer_only`是互斥的,表示不处理特定层的张量。

这些参数用于指定程序的输入、输出以及其他配置选项,以便执行特定的模型合并操作。
1. TIES 合并 Mistral-7b、WizardMath-7b、CodeLlama-7b

将三个模型进行混合:Mistral-7b, WizardMath-7b和CodeLlama-7b。

修改配置文件 config.yaml

models:
   - model: mistralai/Mistral-7B-v0.1  # no parameters necessary for base model
   - model: WizardLM/WizardMath-7B-V1.0
     parameters:
       density: 0.5  # fraction of weights in differences from the base model to retain
       weight:   # weight gradient
         - filter: mlp
           value: 0.5
         - value: 0
   - model: codellama/CodeLlama-7b-Instruct-hf
     parameters:
       density: 0.5
       weight: 0.5
 merge_method: ties
 base_model: mistralai/Mistral-7B-v0.1
 parameters:
   normalize: true
   int8_mask: true
 dtype: float16

这段文本描述了一个模型合并的配置文件,让我逐步解释一下:

  1. models部分指定了要使用的模型和模型的层范围。在这里列出了三个模型,分别是"Mistral-7B-v0.1"、“WizardMath-7B-V1.0"和"CodeLlama-7b-Instruct-hf”,每个模型都指定了一个层范围。

  2. merge_method部分指定了如何合并models中指定的多个模型。在这里使用的是"ties"方法。

  3. base_model部分指定了基础模型,即在合并过程中将保留其结构的模型。在这里是"Mistral-7B-v0.1"。

  4. parameters部分指定了模型的参数。每个参数都有一个filter和一个valuefilter指定了参数的作用范围,value指定了参数的值。

  5. dtype部分指定了模型的数据类型,这里是"float16"。

这个配置文件的作用是指定了要合并的模型、合并方法、基础模型以及相关参数,以便进行模型合并操作。

运行合并命令:

mergekit-yaml ultra_llm_merged.yaml output_folder \
     --allow-crimes \ 
     --copy-tokenizer \ 
     --out-shard-size 1B \ 
     --low-cpu-memory \ 
     --write-model-card \ 
     --lazy-unpickle  
  1. mergekit-yaml: 这是一个命令行工具的名称,用于执行模型合并操作。

  2. ultra_llm_merged.yaml: 这是一个输入参数,指定了一个配置文件的路径,该配置文件描述了模型合并的相关信息。

  3. output_folder: 这是另一个输入参数,指定了合并模型的输出文件夹路径,合并后的模型将保存在这个文件夹中。

  4. --allow-crimes: 这是一个选项,表示允许混合不同架构的模型进行合并。

  5. --copy-tokenizer: 这是一个选项,表示在输出文件夹中复制一个分词器。

  6. --out-shard-size 1B: 这是一个选项,指定了每个输出分片中的参数数量。在这里设置为1B,即1字节。

  7. --low-cpu-memory: 这是一个选项,表示将结果和中间值存储在GPU上,适用于GPU显存大于系统内存的情况,以减少CPU内存的使用。

  8. --write-model-card: 这是一个选项,表示输出一个包含合并详细信息的README.md文件。

  9. --lazy-unpickle: 这是一个选项,表示使用实验性的懒惰反序列化器以减少内存使用量。

 


2. SLERP 合并 Llama3-8B、mistral-ft-optimized-1218

修改配置文件 config.yaml

slices:
  - sources:
      - model: OpenPipe/mistral-ft-optimized-1218
        layer_range: [0, 32]
      - model: shenzhi-wang/Llama3-8B-Chinese-Chat
        layer_range: [0, 32]
merge_method: slerp
base_model: OpenPipe/mistral-ft-optimized-1218
parameters:
  t:
    - filter: self_attn
      value: [0, 0.5, 0.3, 0.7, 1]
    - filter: mlp
      value: [1, 0.5, 0.7, 0.3, 0]
    - value: 0.5
dtype: bfloat16
  1. slices部分指定了要使用的模型和模型的层范围。在这里列出了两个模型,分别是"OpenPipe/mistral-ft-optimized-1218"和"mlabonne/NeuralHermes-2.5-Mistral-7B",每个模型都指定了一个层范围。

  2. merge_method部分指定了如何合并slices部分指定的多个模型。在这里使用的是"slerp"方法,即球面线性插值方法。

  3. base_model部分指定了基础模型,即在合并过程中将保留其结构的模型。在这里是"OpenPipe/mistral-ft-optimized-1218"。

  4. parameters部分指定了模型的参数。这里包含了三个参数,分别是"self_attn"、"mlp"和一个没有指定名称的参数。每个参数都有一个filter和一个valuefilter指定了参数的作用范围,value指定了参数的值。

  5. dtype部分指定了模型的数据类型,这里是"bfloat16",即16位浮点数。

运行命令:

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

 


3. DARE 合并 Mistral-7B、SamirGPT-v1

修改配置文件 config.yaml

models:
  - model: mistralai/Mistral-7B-v0.1
    # No parameters necessary for base model
  - model: samir-fama/SamirGPT-v1
    parameters:
      density: 0.53
      weight: 0.4
  - model: abacusai/Slerp-CM-mist-dpo
    parameters:
      density: 0.53
      weight: 0.3
  - model: EmbeddedLLM/Mistral-7B-Merge-14-v0.2
    parameters:
      density: 0.53
      weight: 0.3
merge_method: dare_ties
base_model: mistralai/Mistral-7B-v0.1
parameters:
  int8_mask: true
dtype: bfloat16
  1. models部分指定了要使用的模型和模型的相关参数。在这里列出了四个模型,分别是"Mistral-7B-v0.1"、“SamirGPT-v1”、“Slerp-CM-mist-dpo"和"Mistral-7B-Merge-14-v0.2”。

    • 对于"SamirGPT-v1"、“Slerp-CM-mist-dpo"和"Mistral-7B-Merge-14-v0.2”,指定了densityweight参数。density指定了要保留的参数比例,weight指定了该模型的权重。
  2. merge_method部分指定了如何合并models部分指定的多个模型。在这里使用的是"dare_ties"方法。

  3. base_model部分指定了基础模型,即在合并过程中将保留其结构的模型。在这里是"Mistral-7B-v0.1"。

  4. parameters部分指定了模型合并的其他参数。在这里指定了int8_mask参数为true,表示在模型合并过程中使用int8掩码。另外还指定了模型的数据类型为"bfloat16",即16位浮点数。

运行命令:

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

 


4. Passthrough 合并 Llama3-8b、Phi-3

修改配置文件 config.yaml

slices:
  - sources:
    - model: cognitivecomputations/dolphin-2.9-llama3-8b
      layer_range: [0, 32]
  - sources:
    - model: shenzhi-wang/Llama3-8B-Chinese-Chat
      layer_range: [24, 32]
merge_method: passthrough
dtype: bfloat16

运行命令:

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

Moe 改进医学大模型

问题: 医疗健康领域的大型语言模型普遍缺乏针对医学子专业的特化,导致不能满足各子专业的独特需求。

现有的医学语言模型往往将医疗健康视为一个单一领域,忽视了其复杂的子专业。

解法: 将内科重新定义为11个不同的子专业。

  • 多样性 —— 每个子专业都有其复杂和独特的语言。
  • 专业性高 —— 每个子专业都要求有高水平的专业知识。

内科的子专业包括:

  • 心脏病学(Cardiology):专注于心脏和循环系统的疾病。
  • 内分泌学(Endocrinology):研究内分泌系统和激素相关疾病,如糖尿病。
  • 胃肠病学(Gastroenterology):关注消化系统的疾病。
  • 肾脏病学(Nephrology):专门处理肾脏疾病。
  • 呼吸系统病学(Pulmonology):研究肺和呼吸系统的疾病。
  • 风湿病学(Rheumatology):关注关节、肌肉和骨骼的疾病。
  • 血液学(Hematology):研究血液、血液生成器官和血液疾病。
  • 感染病学(Infectious Disease):专注于由微生物引起的疾病。
  • 肿瘤学(Oncology):研究癌症及其治疗。
  • 神经内科(Neurology):虽然通常被视为独立于内科的专业,但它涉及到中枢和外周神经系统的疾病。

每个子专业都需要特定的知识和技能集,因为它们涵盖的健康问题、治疗方法和研究领域各不相同。

这种细分有助于医疗专业人员更精确地诊断和治疗各种疾病,同时也支持了医学研究的深入发展。

那 Moe 分别搞,再组合成一个医学大模型,效果绝对比纯大模型好。

虽然都是医学,都属于内科,但其实差距很大。

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

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

相关文章

露营涮火锅小朋友不慎烫伤大腿 家长抱娃涮河急救获医生点赞

近日,陈女士一家三口在西安市长安区附近露营涮火锅,却不料小朋友在起身时不小心打翻了吃火锅的锅,导致腿被烫伤,陈女士急忙抱着孩子到临近河边,用河水来冲洗小朋友烫伤的腿,随后立刻赶至西安国际医学中心医…

Kroma宣布推出Spectrum:以太坊Layer-2的先进原生质押服务

Kroma宣布推出备受期待的Spectrum,这是一项先进的原生质押服务,旨在彻底改变以太坊 Layer-2格局。Spectrum将于2024年5月14日开始运营,为用户提供利用质押ETH、stETH和eETH的奖励机会,助力用户在去中心化金融(DeFi&…

Python 海龟画图(Turtle)命令大全

移动和绘制 forward() | fd() 使用语法: ​​turtle.forward(距离)​​ ​​turtle.fd(距离)​​ 参数说明: 距离 一个数字 (整数 或者 浮点) (注:单位是像素) 代码示例: import turtle turtle.forward(200) …

docker镜像中搭建FastDfs

docker镜像中搭建FastDfs 一、搭建过程二、docker端口映射三、映射的方法三、配置Tracker 和 Storage 环境:腾讯云服务器上 ubuntu20.04镜像 一、搭建过程 正常直接在云服务器上搭建过程参考博客: https://blog.csdn.net/qq_38531706/article/details/…

分享如何通过定时任务调用lighthouse前端测试脚本+在持续集成测试中调用lighthouse前端测试脚本

最近写了个小工具来优化lighthouse在实际工作中的使用,具体实现了:通过定时任务调用前端测试脚本在持续集成测试中调用前端测试脚本。由于在公司中已经应用,所以就不能提供源码了,这里简单说一下实现思路,希望可以帮助…

武汉星起航:亚马逊跨境电商助力全球贸易:卖家轻松触达全球市场

作为全球最大的电子商务平台之一,亚马逊以其强大的品牌影响力和完善的服务体系,为全球卖家提供了一个展示和销售各类商品的广阔舞台。亚马逊跨境电商业务的快速发展,不仅为卖家打开了通向全球市场的大门,也为买家带来了更多元化、…

JS+JQ+Layui菜单栏点击URL跳转后保持选中状态

目录 一.问题描述 二.问题分析 三.问题解决 3.1JQuery解决 3.2原生JS解决 四.衍生问题 五.衍生问题解决方式 5.1JQ解决 5.2JS解决 六.效果 七.建议 一.问题描述 后端使用“Flask”开发 最近在开发个人网站,其中使用了“Layui”组件库来做“菜单导航栏…

Nginx日志格式配置

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Nginx(“engine x”…

数据库SQL语言实战(九)(索引)

目录 1实战目标 2前提知识 2.1索引失效的情况 2.1.1数据准备 2.1.2插入数据 2.1.3失效情况 3练习题(利用索引提高查询速度) 题目一 题目二​ 题目三​ 题目四​ 题目五​ 总结 1实战目标 对比有无索引情况下数据检索速度,学会如何能够使用索引,掌握如何…

130.哈希表:赎金信(力扣)

题目描述 代码解决 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 创建一个大小为26的整数数组,用于存储每个字母在magazine中的出现次数int hash[26] {0};// 遍历magazine,将每个字母的出现次数记录在hash数组…

The 13th Shandong ICPC Provincial Collegiate Programming Contest

The 13th Shandong ICPC Provincial Collegiate Programming Contest The 13th Shandong ICPC Provincial Collegiate Programming Contest A. Orders 题意:有n个订单, 每日可生产k个产品,每个订单给出交付日和交付数量,是否能…

谈谈【软件测试的基础知识,基础模型】

关于软件测试的基本概念和基本模型 前言一个优秀的测试人员具备的素质关于需求测试用例软件错误(BUG)概念开发模型瀑布模型(Waterfall Model)螺旋模型(Spiral Model) 前言 首先,什么是软件测试? 通俗来讲:软件测试就是找BUG&…

Vitis HLS 学习笔记--优化本地存储器访问瓶颈

目录 1. 简介 2. 代码解析 2.1 原始代码 2.2 优化后 2.3 分析优化措施 3. 总结 1. 简介 在Vitis HLS中,实现II(迭代间隔) 1是提高循环执行效率的关键。II1意味着每个时钟周期都可以开始一个新的迭代,这是最理想的情况&…

Java面试八股之HashSet和TreeSet有什么区别

Java中HashSet和TreeSet有什么区别 1. 底层数据结构 HashSet: 基于哈希表(实际上是 HashMap 的内部实现)实现。每个元素通过其 hashCode() 方法计算出哈希码,并通过哈希码确定其在哈希表中的位置。这种结构使得 HashSet 在插入、删除和查找…

Win11下Java环境安装指南

Windows下Java环境安装指南 前言一、安装简介JDK与JRE安装包 二、JDK安装检查操作系统类型基于Win11基于Win10 安装包准备工作 三、配置环境配置JAVA_HOME配置Path配置CLASSPATH 四、检验配置是否打开cmd命令行窗口输出java -version命令 五、注意事项 前言 在Windows系统上安…

数据结构-栈(带图)

目录 栈的概念 画图理解栈 栈的实现 fun.h fun.c main.c 栈的概念 栈(Stack)是一种基本的数据结构,其特点是只允许在同一端进行插入和删除操作,这一端被称为栈顶。遵循后进先出(Last In, First Out, LIFO&#…

yarn : 无法加载文件 C:\app\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本

系统运行yarn命令报错 解决办法: 一、点击电脑右下角的开始,菜单出来后,直接按键盘输入powerShell搜索,然后右键以管理员身份运行 二、以管理员运行后,会出现下面命令窗口 在窗口上执行:set-ExecutionPoli…

羊大师分析,羊奶健康生活的营养源泉

羊大师分析,羊奶健康生活的营养源泉 羊奶,作为一种古老的饮品,近年来因其独特的营养价值和健康益处而备受关注。今天,羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…

哪家PMP培训机构比较优秀?

不同的培训机构在服务、收费和师资上会有一些差异,但基本都差不多。老师的授课方式对学习兴趣很重要,价格在3000-4000左右,选择中间价位比较好。服务也很关键,有的机构提供代报名和PDU等额外服务。关于机构排名的文章可以参考&…

InnoDB 事务处理机制

文章目录 前言1. 事务处理挑战1.1 事务机制处理的问题1.2 并发事务带来的问题 2. InnodDB 和 ACID 模型2.1 Innodb Buffer Pool2.2 Redo log2.3 Undo log2.4 应用案例 3. 隔离级别和锁机制3.1 事务隔离级别3.1.1 READ UNCOMMITTED3.1.2 READ COMMITTED3.1.3 REPEATABLE READ3.1…