欢迎 Mixtral - Hugging Face 上 SOTA 专家混合模型

发布于 2023 年 12 月 11 日
在 GitHub 上更新

Mixtral 8x7b 是 Mistral 今天发布的一款令人兴奋的大型语言模型,它为开源模型树立了新的技术标杆,并在许多基准测试中超越了 GPT-3.5。我们很高兴能通过将 Mixtral 全面集成到 Hugging Face 生态系统中来支持其发布 🔥!

今天发布的功能和集成包括:

目录

Mixtral 8x7b 是什么?

Mixtral 的架构与 Mistral 7B 相似,但有所不同:它实际上是 8 个“专家”模型合二为一,这得益于一种称为专家混合 (MoE) 的技术。对于 transformer 模型,其工作原理是用稀疏 MoE 层替换一些前馈层。MoE 层包含一个路由器网络,用于选择哪些专家最有效地处理哪些 token。对于 Mixtral,每个时间步会选择两个专家,这使得模型能够以 12B 参数密集模型的速度进行解码,尽管其有效参数数量是其 4 倍!

有关 MoE 的更多详细信息,请参阅我们随附的博客文章:hf.co/blog/moe

Mixtral 发布摘要;

  • 发布基础版和指令版
  • 支持 32k token 的上下文长度。
  • 在大多数基准测试中超越 Llama 2 70B 并与 GPT-3.5 匹敌或超越
  • 支持英语、法语、德语、西班牙语和意大利语。
  • 编码能力强,HumanEval 达到 40.2%
  • Apache 2.0 许可证,商业友好

那么 Mixtral 模型到底有多好呢?以下是基础模型及其在 LLM 排行榜上与其他开源模型的性能比较(分数越高越好)

模型 许可证 商业用途? 预训练大小 [token] 排行榜分数 ⬇️
mistralai/Mixtral-8x7B-v0.1 Apache 2.0 未知 68.42
meta-llama/Llama-2-70b-hf Llama 2 许可证 2,000B 67.87
tiiuae/falcon-40b Apache 2.0 1,000B 61.5
mistralai/Mistral-7B-v0.1 Apache 2.0 未知 60.97
meta-llama/Llama-2-7b-hf Llama 2 许可证 2,000B 54.32

对于指令和聊天模型,在 MT-Bench 或 AlpacaEval 等基准测试中评估效果更好。下面,我们展示 Mixtral Instruct 与顶级的封闭和开源模型相比的性能(分数越高越好)

模型 可用性 上下文窗口 (token) MT-Bench 分数 ⬇️
GPT-4 Turbo 专有 128k 9.32
GPT-3.5-turbo-0613 专有 16k 8.32
mistralai/Mixtral-8x7B-Instruct-v0.1 Apache 2.0 32k 8.30
Claude 2.1 专有 200k 8.18
openchat/openchat_3.5 Apache 2.0 8k 7.81
HuggingFaceH4/zephyr-7b-beta 麻省理工 8k 7.34
meta-llama/Llama-2-70b-chat-hf Llama 2 许可证 4k 6.86

令人印象深刻的是,Mixtral Instruct 在 MT-Bench 上超越了所有其他开源模型,并且是第一个达到与 GPT-3.5 相当性能的模型!

关于命名

Mixtral MoE 被称为 **Mixtral-8x7B**,但它并非拥有 56B 参数。发布后不久,我们发现一些人误以为该模型表现类似于 8 个每个拥有 7B 参数的模型的集合,但 MoE 模型并非如此运作。模型中只有部分层(前馈块)被复制;其余参数与 7B 模型相同。总参数数量并非 56B,而是约 45B。一个更好的名称 可能是 Mixtral-45-8e,以更好地传达其架构。有关 MoE 如何运作的更多详细信息,请参阅 我们的“专家混合解释”文章

提示格式

基础模型没有提示格式。像其他基础模型一样,它可以用于通过合理的延续来继续输入序列,或用于零样本/少样本推理。它也是微调您自己的用例的绝佳基础。Instruct 模型具有非常简单的对话结构。

<s> [INST] User Instruction 1 [/INST] Model answer 1</s> [INST] User instruction 2[/INST]

为了有效使用,这种格式必须精确重现。我们稍后将展示如何使用 `transformers` 中提供的聊天模板轻松重现指令提示。

我们不知道的

与之前的 Mistral 7B 版本一样,关于这一新系列模型仍有几个未解之谜。特别是,我们没有关于用于预训练的数据集大小、其组成或如何进行预处理的信息。

同样,对于 Mixtral 指令模型,也没有分享关于微调数据集或与 SFT 和 DPO 相关的超参数的详细信息。

演示

您可以在 Hugging Face Chat 上与 Mixtral 指令模型进行聊天!请点击此处查看:https://huggingface.co/chat/?model=mistralai/Mixtral-8x7B-Instruct-v0.1

推理

我们提供两种主要方式来运行 Mixtral 模型的推理:

  • 通过 🤗 Transformers 的 `pipeline()` 函数。
  • 使用 Text Generation Inference,它支持连续批处理、token 流式传输、用于多 GPU 快速推理的张量并行化等高级功能,以实现极快的推理速度。

对于每种方法,都可以以半精度 (float16) 或量化权重运行模型。由于 Mixtral 模型的大小大致相当于一个 45B 参数的密集模型,我们可以估算所需的最小显存量如下:

精度 所需显存
float16 >90 GB
8位 >45 GB
4位 >23 GB

使用 🤗 Transformers

通过 Transformers 4.36 版本,您可以使用 Mixtral 并利用 Hugging Face 生态系统中的所有工具,例如:

  • 训练和推理脚本以及示例
  • 安全文件格式 (safetensors)
  • 与 bitsandbytes (4 位量化)、PEFT (参数高效微调) 和 Flash Attention 2 等工具的集成
  • 用于模型生成运行的实用程序和辅助函数
  • 导出模型以进行部署的机制

请确保使用最新版本的 `transformers`

pip install --upgrade transformers

在下面的代码片段中,我们展示了如何使用 🤗 Transformers 和 4 位量化进行推理。由于模型尺寸较大,您需要至少 30 GB 显存的显卡才能运行。这包括 A100 (80 或 40GB 版本) 或 A6000 (48 GB) 等显卡。

from transformers import pipeline
import torch

model = "mistralai/Mixtral-8x7B-Instruct-v0.1"

pipe = pipeline(
    "text-generation",
    model=model,
    model_kwargs={"torch_dtype": torch.float16, "load_in_4bit": True},
)

messages = [{"role": "user", "content": "Explain what a Mixture of Experts is in less than 100 words."}]
outputs = pipe(messages, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)
print(outputs[0]["generated_text"][-1]["content"])

<s>[INST] 用少于 100 字解释什么是专家混合模型。[/INST] 专家混合模型是一种集成学习方法,它结合了多个模型,或称为“专家”,以进行更准确的预测。每个专家专注于数据的不同子集,并且一个门控网络决定为给定输入使用哪个合适的专家。这种方法允许模型适应数据中复杂的非线性关系,并提高整体性能。

使用文本生成推理

Text Generation Inference 是 Hugging Face 开发的生产就绪推理容器,旨在简化大型语言模型的部署。它具有连续批处理、token 流式传输、用于多 GPU 快速推理的张量并行化以及生产就绪的日志记录和跟踪等功能。

您可以在 Hugging Face 的 推理端点上部署 Mixtral,该端点使用 Text Generation Inference 作为后端。要部署 Mixtral 模型,请访问 模型页面,然后点击 部署 -> 推理端点 小部件。

注意:您可能需要通过电子邮件向 api-enterprise@huggingface.co 申请配额升级才能访问 A100。

您可以在我们的博客中了解更多关于如何使用 Hugging Face 推理端点部署 LLM 的信息。该博客包含有关支持的超参数以及如何使用 Python 和 Javascript 流式传输响应的信息。

您还可以使用 Docker 在两块 A100 (80GB) 上本地运行文本生成推理,如下所示:

docker run --gpus all --shm-size 1g -p 3000:80 -v /data:/data ghcr.io/huggingface/text-generation-inference:1.3.0 \
    --model-id mistralai/Mixtral-8x7B-Instruct-v0.1 \
    --num-shard 2 \
    --max-batch-total-tokens 1024000 \
    --max-total-tokens 32000

使用 🤗 TRL 进行微调

训练 LLM 在技术上和计算上都具有挑战性。在本节中,我们探讨 Hugging Face 生态系统中可用于在单个 A100 GPU 上高效训练 Mixtral 的工具。

以下是使用 OpenAssistant 聊天数据集微调 Mixtral 的示例命令。为了节省内存,我们使用 4 位量化和 QLoRA 来针对注意力块中的所有线性层。请注意,与密集 Transformer 不同,不应针对 MLP 层,因为它们是稀疏的,并且与 PEFT 的交互不佳。

首先,安装 🤗 TRL 的夜间版本并克隆仓库以访问训练脚本

pip install -U transformers
pip install git+https://github.com/huggingface/trl
git clone https://github.com/huggingface/trl
cd trl

然后你可以运行脚本

accelerate launch --config_file examples/accelerate_configs/multi_gpu.yaml --num_processes=1 \
    examples/scripts/sft.py \
    --model_name mistralai/Mixtral-8x7B-v0.1 \
    --dataset_name trl-lib/ultrachat_200k_chatml \
    --batch_size 2 \
    --gradient_accumulation_steps 1 \
    --learning_rate 2e-4 \
    --save_steps 200_000 \
    --use_peft \
    --peft_lora_r 16 --peft_lora_alpha 32 \
    --target_modules q_proj k_proj v_proj o_proj \
    --load_in_4bit

这在单个 A100 上需要大约 48 小时才能训练完成,但可以通过调整 `--num_processes` 为您可用的 GPU 数量轻松并行化。

Mixtral 量化

如上所述,该模型面临的挑战是如何使其在消费级硬件上运行,以供任何人使用,因为该模型仅以半精度(`torch.float16`)加载就需要约 90GB 的内存。

借助 🤗 transformers 库,我们支持使用 QLoRA 和 GPTQ 等最先进的量化方法进行开箱即用的推理。您可以在相应的文档部分中了解更多我们支持的量化方法。

使用 4 位量化加载 Mixtral

如推理部分所示,您可以通过安装 `bitsandbytes` 库(`pip install -U bitsandbytes`)并将 `load_in_4bit=True` 标志传递给 `from_pretrained` 方法来加载 4 位量化的 Mixtral。为了获得更好的性能,我们建议用户使用 `bnb_4bit_compute_dtype=torch.float16` 加载模型。请注意,您需要至少 30GB 显存的 GPU 设备才能正确运行以下代码片段。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

model_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
tokenizer = AutoTokenizer.from_pretrained(model_id)

quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16
)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)

prompt = "[INST] Explain what a Mixture of Experts is in less than 100 words. [/INST]"
inputs = tokenizer(prompt, return_tensors="pt").to(0)

output = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(output[0], skip_special_tokens=True))

这种 4 位量化技术是在 QLoRA 论文中引入的,您可以在文档这篇博文的相应部分了解更多信息。

使用 GPTQ 加载 Mixtral

GPTQ 算法是一种训练后量化技术,其中权重矩阵的每一行都独立量化,以找到最小化误差的权重版本。这些权重被量化为 int4,但在推理过程中会动态恢复为 fp16。与 4 位 QLoRA 不同,GPTQ 需要使用数据集对模型进行校准才能进行量化。Hugging Face Hub 上由 TheBloke 共享了即用型 GPTQ 模型,因此任何人都可以直接使用它们,而无需先进行校准。

对于 Mixtral,我们不得不通过确保我们**不**量化专家门控层来调整校准方法,以获得更好的性能。量化模型的最终困惑度(越低越好)为 `4.40`,而半精度模型为 `4.25`。量化模型可以在这里找到,要使用 🤗 transformers 运行它,您首先需要更新 `auto-gptq` 和 `optimum` 库。

pip install -U optimum auto-gptq

您还需要从源安装 transformers

pip install -U git+https://github.com/huggingface/transformers.git

安装后,只需使用 `from_pretrained` 方法加载 GPTQ 模型

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

model_id = "TheBloke/Mixtral-8x7B-v0.1-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id)

model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")

prompt = "[INST] Explain what a Mixture of Experts is in less than 100 words. [/INST]"
inputs = tokenizer(prompt, return_tensors="pt").to(0)

output = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(output[0], skip_special_tokens=True))

请注意,对于 QLoRA 和 GPTQ,您都需要至少 30 GB 的 GPU 显存才能容纳模型。如果您使用 `device_map="auto"`,就像上面的示例中那样,可以将一些层卸载到 CPU,从而使其在 24 GB 显存下工作。

免责声明和正在进行的工作

  • **量化**:MoEs 的量化是一个活跃的研究领域。我们与 TheBloke 进行了一些初步实验,如上所示,但随着对该架构的更多了解,我们期待取得更多进展!在未来几天和几周内,该领域的发展将令人兴奋。此外,最近的工作,如 QMoE,实现了 MoEs 的亚 1 位量化,也可以应用于此。
  • **高显存占用**:MoEs 推理速度很快,但仍需要大量显存(因此需要昂贵的 GPU)。这使得在本地设置中使用它具有挑战性。MoEs 非常适合具有许多设备和大量显存的设置。Mixtral 在半精度下需要 90GB 显存 🤯

其他资源

结论

我们对 Mixtral 的发布感到非常兴奋!在接下来的几天里,请准备好了解更多关于微调和部署 Mixtral 的方法。

社区

注册登录 发表评论