专家混合模型 (MoE) 详解:Mixtral 8X7B、DBRX 和 Deepseek-V2 的架构与应用

深入了解专家混合模型 (MoE) 的架构与工作原理,探索Mixtral 8X7B、DBRX 和 Deepseek-v2等热门MoE模型的应用与优势。通过Python实现MoE模型,并评估其在逻辑推理、摘要和实体提取等任务中的表现。

专家混合模型 (MoE) 这个概念在大型语言模型 (LLMs) 领域火了很久了。它不仅让模型的效率和可扩展性有了质的飞跃,还为处理复杂任务提供了新的思路。简单来说,MoE 模型就是把一个大模型拆分成多个小模型,每个小模型专注于特定的任务或数据类型。这样一来,模型在处理任务时,只需要激活相关的“专家”,而不需要整个模型都参与,从而大大节省了计算资源。

在本文中你将:

  • 搞懂 MoE模型的基本架构和工作原理
  • 了解几个热门的MoE模型,比如Mixtral 8X7B、DBRX 和 Deepseek-v2
  • 通过Python代码在Google Colab上实现MoE模型
  • 评估一个典型的MoE模型在逻辑推理、摘要和实体提取等任务上的表现
  • 了解MoE模型在自然语言处理和代码生成等复杂任务中的优势和挑战

1 什么是专家混合模型 (MoE)?

现在的深度学习模型大多基于人工神经网络,这些网络由多个层组成,每一层包含很多“神经元”。每个神经元处理输入数据,进行简单的数学运算(比如激活函数),然后把结果传递给下一层。更高级的模型,比如 Transformer,引入了自注意力机制,能够捕捉数据中的复杂模式。

不过,传统的密集模型在处理每个输入时,整个网络都要参与计算,这会导致计算成本非常高。为了解决这个问题,Mixture of Experts (MoE) 模型采用了稀疏架构,只激活与当前任务相关的部分网络,也就是“专家”。这样一来,MoE 模型在处理复杂任务时,比如自然语言处理,消耗的计算资源就少了很多。

试想一下,在一个团队项目中,团队成员被分成多个小组,每个小组专注于不同的任务。MoE 模型的工作方式与此类似。它把一个复杂问题分解成多个子任务,每个子任务由专门的“专家”负责处理。

MoE 模型的主要优势有:

  • 预训练速度更快:相比传统的密集模型,MoE 模型的预训练过程更加高效。
  • 推理速度更快:即使参数数量相同,MoE 模型的推理速度也更快。
  • 对 VRAM 需求较高:由于所有专家必须同时存储在内存中,MoE 模型对显存的需求较大。

MoE结构示意

MoE 模型由两个关键组件组成:专家(Experts),即专注于特定任务的小型神经网络;以及路由器(Router),它根据输入数据选择性地激活相关专家。这种选择性激活通过仅使用每个任务所需的专家来提高效率。

2 几个典型的 MoE 模型

近年来,MoE 模型在 AI 研究中备受关注,因为它能够在保持高性能的同时,高效扩展大型语言模型。其中,Mixtral 8x7B 是一个典型的例子,它采用了稀疏的专家混合架构。该模型只对每个输入激活其专家的子集,从而在实现与更大、完全密集模型相当的性能的同时,显著提高了效率。

接下来,我们来看看几个热门的 MoE 模型,并通过在 Google Colab 上使用 Ollama 进行 Python 实现,感受一下它们的魅力。

2.1 Mixtral 8X7B

Mixtral 8X7B 的架构基于decoder-only的 Transformer。模型输入是一系列tokens,这些tokens被嵌入为向量,然后通过解码器层进行处理。输出是每个位置被某个单词占据的概率,从而实现文本填充和预测。

MoE Decoder

每个解码器层包含两个关键部分:一个注意力机制,用于整合上下文信息;以及一个稀疏专家混合 (SMOE) 部分,用于分别处理每个词向量。MLP 层是计算资源的消耗大头。SMOE 有多个层(“专家”)可用。对于每个输入,取最相关专家输出的加权和。因此,SMOE 层可以在计算成本相对较低的情况下学习复杂的模式。

模型的关键特性

  • 专家总数:8
  • 激活的专家数量:2
  • 解码器层数:32
  • 词汇表大小:32000
  • 嵌入大小:4096
  • 每个专家的大小:56 亿参数,而不是 70 亿。剩余的参数(70亿 - 56亿)来自共用组件,如嵌入层、归一化层和门控机制。
  • 激活参数总数:128 亿
  • 上下文长度:32k tokens

在加载模型时,所有 448 亿(8*56 亿参数)必须加载(以及所有共享参数),但我们只需要使用 2×56 亿(128 亿)激活参数进行推理。

Mixtral 8x7B 在文本生成、理解、翻译、摘要、情感分析、教育、客户服务自动化、研究辅助等多个领域表现出色。其高效的架构使其成为跨多个领域的强大工具。

2.2 DBRX

DBRX 由 Databricks 开发,是一个基于 Transformer 的decoder-only大型语言模型 (LLM),使用下一个标记预测(next-token prediction)进行训练。它采用细粒度的专家混合 (MoE) 架构,总参数为 1320 亿,其中每个输入激活 360 亿参数。它在 12 万亿个文本和代码数据上进行了预训练。与其他开源的 MoE 模型(如 Mixtral 和 Grok-1)相比,DBRX 粒度更细,使用了更多的小型专家。DBRX 有 16 个专家并选择 4 个,而 Mixtral 和 Grok-1 有 8 个专家并选择 2 个。

架构的关键特性

  • 细粒度专家:通常情况下,从标准 FFN 层过渡到专家混合 (MoE) 层时,只需多次复制 FFN 以创建多个专家。然而在细粒度专家的背景下,我们的目标是生成更多专家而不增加参数数量。为此,可以将单个 FFN 划分为多个段,每个段作为一个单独的专家。DBRX 采用细粒度的 MoE 架构,有 16 个专家,从中为每个输入选择 4 个专家。
  • 该模型还采用了其他创新技术,如旋转位置编码 (RoPE)、门控线性单元 (GLU) 和分组查询注意力 (GQA)。

模型的关键特性

  • 专家总数:16
  • 每层激活的专家数量:4
  • 解码器层数:24
  • 激活参数总数:360 亿
  • 总参数数:1320 亿
  • 上下文长度:32k tokens

DBRX 模型在代码生成、复杂语言理解、数学推理和编程任务等用例中表现出色,特别是在需要高准确性和效率的场景中,如生成代码片段、解决数学问题以及对复杂提示提供详细解释。

2.3 Deepseek-v2

Deepseek-v2 的 MoE 架构中,利用了两个关键思想:

  • 细粒度专家:将专家细分为更细的粒度,以实现更高的专家专业化和对知识的更准确获取。
  • 共享专家:该方法侧重于指定某些专家作为共享专家,确保它们始终处于激活状态。这种策略有助于收集和整合适用于各种上下文的通用知识。

DeepSeekMoE

模型的关键特性

  • 总参数数:2360 亿
  • 激活参数总数:210 亿
  • 每层路由的专家数:160(其中选择 2 个)
  • 每层共享专家数:2
  • 每层激活的专家数:8
  • 解码器层数:60
  • 上下文长度:128k tokens

该模型在 8.1 万亿个tokens的庞大数据集上进行了预训练。

DeepSeek-V2 特别擅长进行对话,因此适用于聊天机器人和虚拟助手。该模型可以生成高质量的文本,因此适用于内容创作、语言翻译和文本摘要。该模型还可以高效地用于代码生成用例。

3 用 Python 实现 MoE 模型

MoE 模型是一种先进的机器学习模型,它动态选择不同的专家网络来处理不同的任务。接下来,我们来看看如何用 Python 实现 MoE 模型,并感受一下它的强大之处。

3.1 步骤1:安装所需的 Python 库

首先,我们需要安装一些必要的 Python 库:

1
2
3
4
5
!sudo apt update
!sudo apt install -y pciutils
!pip install langchain-ollama
!curl -fsSL https://ollama.com/install.sh | sh
!pip install ollama==0.4.2

3.2 步骤2:启用线程

接下来用threading来运行 Ollama 服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import threading
import subprocess
import time

def run_ollama_serve():
  subprocess.Popen(["ollama", "serve"])

thread = threading.Thread(target=run_ollama_serve)
thread.start()
time.sleep(5)

3.3 步骤3:拉取 Ollama 模型

拉取一个 Ollama 模型,比如 DBRX:

1
!ollama pull dbrx

3.4 步骤4:查询模型

查询测试模型,看看它的表现如何:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama.llms import OllamaLLM
from IPython.display import Markdown

template = """Question: {question}

Answer: Let's think step by step."""

prompt = ChatPromptTemplate.from_template(template)

model = OllamaLLM(model="dbrx")

chain = prompt | model

# 准备输入以进行调用
input_data = {
    "question": '将以下内容总结成一句话:"Bob 是一个男孩。Bob 有一只狗。Bob 和他的狗去散步。Bob 和他的狗走到公园。在公园里,Bob 扔了一根棍子,他的狗把它带回来。狗追了一只松鼠,Bob 追着它跑。Bob 把他的狗找回来,他们一起走回家。"'
}

# 使用输入数据调用链并显示响应
response = chain.invoke(input_data)
display(Markdown(response))

4 Mixtral 8x7B 模型的实际效果

在比较不同 MoE 模型的输出时,我们可以从逻辑推理、摘要和实体提取等任务的表现来分析它们的差异。

逻辑推理问题

1
给我一个包含 13 个单词的清单,每个单词有 9 个字母。

输出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Sure,here are thirteen words,each with nine letters:
1. Agriculture
2. Beautiful
3. Chocolate
4. Dangerous
5. Encyclopedia
6. Fireplace
7. Grammarly
8. Hamburger
9. Important
10. Juxtapose
11. Kitchener
12. Landscape
13. Necessary
I hope this list helps! If you have any other questions or need further assistance,feel free to ask.

从上面的输出可以看出,所有响应的单词都不包含 9 个字母。在 13 个单词中,只有 8 个单词包含 9 个字母。因此回复部分正确。

摘要问题

1
将以下内容总结成一句话:"Bob 是一个男孩。他有一只狗。Bob 和他的狗去散步。Bob 和他的狗走到公园。在公园里,Bob 扔了一根棍子,他的狗把它带回来。狗追了一只松鼠,Bob 追着它跑。Bob 把他的狗找回来,他们一起走回家。"

输出

1
小男孩Bob很享受与他爱犬一起进行的一次活跃郊游。他们一起走到公园,一起玩捡球游戏、追松鼠,然后一起回到家。

从上面的输出可以看出,回复总结得相当好。

实体提取

1
从文本中提取所有数值及其对应单位:"马拉松长42公里,超过30,000人参加。"

输出

1
2
3
4
5
6
7
1. 在给定的文本中,有两个数值及其对应的单位:
   - 42(马拉松的长度,文中未提及单位,但后面提到可以推断为千米)
   - 30,000(参与人数)
2. 文中后来提供了马拉松长度的单位:千米。由于没有为这个值指定其他单位,我们假设它是以千米为单位。
3. 因此,最终答案是:
   - 42(千米,马拉松长度)
   - 30,000(参与人数)

从上面的输出可以看出,结果正确提取了所有数值和单位。

数学推理问题

1
我有2个苹果,然后我又买了2个。我用2个苹果烤了一个派。吃完半个派后,我还剩下多少苹果?

输出

1
2
3
4
1. 开始时有2个苹果。
2. 再买2个苹果,这样你就有4个苹果了(2 + 2 = 4)。
3. 用2个苹果做一个派,这样你还剩下2个苹果(4 - 2 = 2)。
4. 吃掉一半的派,但由于我们不知道派里有多少个苹果,仅凭这些信息无法确定还剩下多少个苹果。

模型的输出不准确。准确的输出应该是2,因为4个苹果中有两个做了苹果派,剩下的两个苹果还在。

5 总结

MoE 模型通过仅激活每个任务的相关专家,提供了一种高效的深度学习方法。这种选择性激活使得 MoE 模型能够在与传统密集模型相比减少计算资源的情况下执行复杂操作。但MoE 模型也需要进行取舍,因为它需要大量的 VRAM 来存储所有专家。

Mixtral 8X7B 架构是一个典型的例子,它利用稀疏专家混合 (SMoE) 机制,仅激活专家的子集以实现高效的文本处理,显著降低了计算成本。它拥有 128 亿激活参数和 32k tokens的上下文长度,在从文本生成到客户服务自动化的广泛应用中表现不错。Databricks 的 DRBX 模型也因其创新的细粒度 MoE 架构而脱颖而出,允许其在每个输入时仅激活 360 亿参数的情况下利用 1320 亿参数。同样,DeepSeek-v2 利用细粒度和共享专家,提供了一个强大的架构,拥有 2360 亿参数和 128,000 tokens的上下文长度,使其成为聊天机器人、内容创作和代码生成等多样化应用的理想选择。

5.1 关键要点

  • MoE 模型通过仅激活特定任务的相关专家,提高了深度学习的效率,与传统密集模型相比减少了计算资源的使用。
  • 尽管 MoE 模型提供了计算效率,但它们需要大量的 VRAM 来存储所有专家,突显了计算能力和内存需求之间的关键权衡。
  • Mixtral 8X7B 采用稀疏专家混合 (SMoE) 机制,激活其 128 亿激活参数的子集以实现高效的文本处理,并支持 32,000 标记的上下文长度,使其适用于各种应用,包括文本生成和客户服务自动化。
  • Databricks 的 DBRX 模型采用细粒度的专家混合架构,在每个输入时仅激活 360 亿参数的情况下高效利用 1320 亿总参数,展示了其在处理复杂语言任务中的能力。
  • DeepSeek-v2 结合了细粒度和共享专家策略,形成了一个强大的架构,拥有 2360 亿参数和 128,000 标记的上下文长度,使其在聊天机器人、内容创作和代码生成等多样化应用中表现出色。

6 常见问题

Q1. 什么是专家混合模型 (MoE)?

A. MoE 模型使用稀疏架构,仅激活每个任务最相关的专家,从而减少与传统密集模型相比的计算资源使用。

Q2. 使用 MoE 模型的利弊是什么?

A. 尽管 MoE 模型提高了计算效率,但它们需要大量的 VRAM 来存储所有专家,需要在计算能力和内存需求之间权衡。

Q3. Mixtral 8X7B 模型的激活参数数量是多少?

A. Mixtral 8X7B 有 128 亿(2×56 亿)激活参数,占总数 448 亿(8×56 亿参数)的一部分,使其能够高效处理复杂任务并提供更快的推理。

Q4. DBRX 模型与其他 MoE 模型(如 Mixtral 和 Grok-1)有何不同?

A. DBRX 采用细粒度的专家混合方法,每层有 16 个专家和 4 个激活专家,而其他 MoE 模型每层有 8 个专家和 2 个激活专家。

Q5. DeepSeek-v2 与其他 MoE 模型有何不同?

A. DeepSeek-v2 结合了细粒度和共享专家,以及其庞大的参数集和广泛的上下文长度,使其成为多种应用的强大工具。

7 推荐阅读

  1. Mixtral of experts | Mistral AI | Frontier AI in your hands
  2. DeepSeekMoE: MoE with Segmented and Shared Experts
  3. Mixtral of Experts
  4. DBRX: A Large-Scale Decoder-Only Language Model with Fine-Grained Mixture of Experts
Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%