欢迎 Mixtral - Hugging Face 上 SOTA 专家混合模型
Mixtral 8x7b 是 Mistral 今天发布的一款令人兴奋的大型语言模型,它为开源模型树立了新的技术标杆,并在许多基准测试中超越了 GPT-3.5。我们很高兴能通过将 Mixtral 全面集成到 Hugging Face 生态系统中来支持其发布 🔥!
今天发布的功能和集成包括:
- Hub 上的模型,附带模型卡和许可证(Apache 2.0)
- 🤗 Transformers 集成
- 与推理端点集成
- 与 Text Generation Inference 集成,实现快速高效的生产级推理
- 一个使用 🤗 TRL 在单个 GPU 上微调 Mixtral 的示例。
目录
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 的方法。