欢迎 Mixtral - 当前 Hugging Face 上最先进的 MoE 模型
最近,Mistral 发布了一个激动人心的大语言模型: Mixtral 8x7b,该模型把开放模型的性能带到了一个新高度,并在许多基准测试上表现优于 GPT-3.5。我们很高兴能够在 Hugging Face 生态系统中全面集成 Mixtral 以对其提供全方位的支持 !
Hugging Face 对 Mixtral 的全方位支持包括:
- Hub 上的模型,包括模型卡以及相应的许可证 (Apache 2.0)
- transformers 的集成
- 推理终端的集成
- TGI 的集成,以支持快速高效的生产级推理
- 使用 TRL 在单卡上对 Mixtral 进行微调的示例
目录
Mixtral 8x7b 是什么?
Mixtral 的架构与 Mistral 7B 类似,但有一点不同: 它实际上内含了 8 个“专家”模型,这要归功于一种称为“混合专家”(Mixture of Experts,MoE) 的技术。当 MoE 与 transformer 模型相结合时,我们会用稀疏 MoE 层替换掉某些前馈层。MoE 层包含一个路由网络,用于选择将输入词元分派给哪些专家处理。Mixtral 模型为每个词元选择两名专家,因此,尽管其有效参数量是 12B 稠密模型的 4 倍,但其解码速度却能做到与 12B 的稠密模型相当!
欲了解更多有关 MoE 的知识,请参阅我们之前的博文: hf.co/blog/zh/moe。
本次发布的 Mixtral 模型的主要特点:
- 模型包括基础版和指令版
- 支持高达 32k 词元的上下文
- 性能优于 Llama 2 70B,在大多数基准测试上表现不逊于 GPT3.5
- 支持英语、法语、德语、西班牙语及意大利语
- 擅长编码,HumanEval 得分为 40.2%
- 可商用,Apache 2.0 许可证
那么,Mixtral 模型效果到底有多好呢?下面列出了 Mixtral 基础模型与其他先进的开放模型在 LLM 排行榜 上表现 (分数越高越好):
模型 | 许可证 | 是否可商用 | 预训练词元数 | 排行榜得分 ️ |
---|---|---|---|---|
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 与顶级闭源或开放模型相比的表现 (分数越高越好):
模型 | 可得性 | 上下文窗口(词元数) | 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 | MIT | 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 如何运行的详细信息,请参阅我们之前发表的 《MoE 详解》 一文。
提示格式
基础模型 没有提示格式,与其他基础模型一样,它可用于序列补全或零样本/少样本推理。你可以对基础模型进行微调,将其适配至自己的应用场景。指令模型 有一个非常简单的对话格式。
<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 Instruct 模型聊天!点击 此处 开始体验吧。
推理
我们主要提供两种对 Mixtral 模型进行推理的方法:
- 通过 transformers 的
pipeline()
接口。 - 通过 TGI,其支持连续组批、张量并行等高级功能,推理速度极快。
以上两种方法均支持半精度 (float16) 及量化权重。由于 Mixtral 模型的参数量大致相当于 45B 参数的稠密模型,因此我们可以对所需的最低显存量作一个估计,如下:
精度 | 显存需求 |
---|---|
float16 | >90 GB |
8-bit | >45 GB |
4-bit | >23 GB |
使用 transformers
从 transformers 4.36 版 开始,用户就可以用 Hugging Face 生态系统中的所有工具处理 Mixtral 模型,如:
- 训练和推理脚本及示例
- 安全文件格式 (
safetensors
) - 与 bitsandbytes (4 比特量化) 、PEFT (参数高效微调) 和 Flash Attention 2 等工具的集成
- 使用文本生成任务所提供的工具及辅助方法
- 导出模型以进行部署
用户唯一需要做的是确保 transformers
的版本是最新的:
pip install -U "transformers==4.36.0" --upgrade
下面的代码片段展示了如何使用 transformers 及 4 比特量化来运行推理。由于模型尺寸较大,你需要一张显存至少为 30GB 的卡才能运行,符合要求的卡有 A100 (80 或 40GB 版本) 、A6000 (48GB) 等。
from transformers import AutoTokenizer
import transformers
import torch
model = "mistralai/Mixtral-8x7B-Instruct-v0.1"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = transformers.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."}]
prompt = pipeline.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipeline(prompt, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)
print(outputs[0]["generated_text"])
<s>[INST] Explain what a Mixture of Experts is in less than 100 words. [/INST] A
Mixture of Experts is an ensemble learning method that combines multiple models,
or "experts," to make more accurate predictions. Each expert specializes in a
different subset of the data, and a gating network determines the appropriate
expert to use for a given input. This approach allows the model to adapt to
complex, non-linear relationships in the data and improve overall performance.
使用 TGI
TGI 是 Hugging Face 开发的生产级推理容器,可用于轻松部署大语言模型。其功能主要有: 连续组批、流式词元输出、多 GPU 张量并行以及生产级的日志记录和跟踪等。
你可在 Hugging Face 的 推理终端 上部署 Mixtral,其使用 TGI 作为后端。要部署 Mixtral 模型,可至 模型页面,然后单击 Deploy -> Inference Endpoints 按钮即可。
注意: 如你的账号 A100 配额不足,可发送邮件至 api-enterprise@huggingface.co 申请升级。
你还可以阅读我们的博文 用 Hugging Face 推理终端部署 LLM 以深入了解如何部署 LLM,该文包含了推理终端支持的超参以及如何使用 Python 和 Javascript 接口来流式生成文本等信息。
你还可以使用 Docker 在 2 张 A100 (80GB) 上本地运行 TGI,如下所示:
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
来加载模型。请注意,你的 GPU 显存至少得有 30GB 才能正确运行下面的代码片段。
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 论文 提出,你可以通过 相应的 Hugging Face 文档 或 这篇博文 获取更多相关信息。
使用 GPTQ 加载 Mixtral
GPTQ 算法是一种训后量化技术,其中权重矩阵的每一行都是独立量化的,以获取误差最小的量化权重。这些权重被量化为 int4,但在推理过程中会即时恢复为 fp16。与 4 比特 QLoRA 相比,GPTQ 的量化模型是通过对某个数据集进行校准而得的。TheBloke 在 Hub 上分享了很多量化后的 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))
请注意,你的 GPU 显存至少得有 30GB 才能运行 Mixtral 模型的 QLoRA 和 GPTQ 版本。如果你如上例一样使用了 device_map="auto"
,则其在 24GB 显存时也可以运行,因此会有一些层被自动卸载到 CPU。
免责声明及正在做的工作
- 量化: 围绕 MoE 的量化还有许多研究正如火如荼地展开。上文展示了我们基于 TheBloke 所做的一些初步实验,但我们预计随着对该架构研究的深入,会涌现出更多进展!这一领域的进展将会是日新月异的,我们翘首以盼。此外,最近的工作,如 QMoE,实现了 MoE 的亚 1 比特量化,也是值得尝试的方案。
- 高显存占用: MoE 运行推理速度较快,但对显存的要求也相对较高 (因此需要昂贵的 GPU)。这对本地推理提出了挑战,因为本地推理所拥有的设备显存一般较小。MoE 非常适合多设备大显存的基础设施。对 Mixtral 进行半精度推理需要 90GB 显存 。
更多资源
总结
我们对 Mixtral 的发布感到欢欣鼓舞!我们正围绕 Mixtral 准备更多关于微调和部署文章,尽请期待。
英文原文: https://hf.co/blog/mixtral
原文作者: Lewis Tunstall,Philipp Schmid,Omar Sanseviero,Pedro Cuenca,Olivier Dehaene,Leandro von Werra,Younes Belkada
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。
欢迎 Mixtral - 当前 Hugging Face 上最先进的 MoE 模型的更多相关文章
- 道德与社会问题简报 #3: Hugging Face 上的道德开放性
使命: 开放和优秀的机器学习 在我们的使命中,我们致力于推动机器学习 (ML) 的民主化,我们在研究如何支持 ML 社区工作并有助于检查危害和防止可能的危害发生.开放式的发展和科学可以分散力量,让许多 ...
- Git是目前世界上最先进的分布式版本控制系统
一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...
- 时下世界上最先进的液晶面板技术---ips
IPS是英文In-Plane Switching的缩写,英文含义为平面转换屏幕技术,由日立公司于2001推出的液晶面板技术,俗称“Super TFT”,是目前世界上最先进的液晶面板技术,目前已经广泛使 ...
- Git是目前世界上最先进的分布式版本控制系统(没有之一)。
http://zhidao.baidu.com/link?url=NSYPiSvtGTMoqMA9vt68FRRF8WbfYVmwWeMh47_2lkp0K3jFMl--1Co1tg1R4VshTQV ...
- ILLA Cloud: 调用 Hugging Face Inference Endpoints,开启大模型世界之门
一个月前,我们 宣布了与 ILLA Cloud 与达成的合作,ILLA Cloud 正式支持集成 Hugging Face Hub 上的 AI 模型库和其他相关功能. 今天,我们为大家带来 ILLA ...
- IIS 之 Web 服务器上的 ASP.NET 进程模型设置
配置 Microsoft Internet 信息服务 (IIS) Web 服务器上的 ASP.NET 进程模型设置. processModel 节只能在 Machine.config 文件中进行设置, ...
- CUDA上的量化深度学习模型的自动化优化
CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...
- OpenAI的GPT-2:用Python构建世界上最先进的文本生成器的简单指南
介绍 "The world's best economies are directly linked to a culture of encouragement and positive f ...
- 🤗 PEFT: 在低资源硬件上对十亿规模模型进行参数高效微调
动机 基于 Transformers 架构的大型语言模型 (LLM),如 GPT.T5 和 BERT,已经在各种自然语言处理 (NLP) 任务中取得了最先进的结果.此外,还开始涉足其他领域,例如计算机 ...
- YbSoftwareFactory 代码生成插件【十七】:先进的权限模型体系设计
目前权限管理系统不少,但通用.灵活.符合现代企事业单位实际工作需要的不多.现有的权限系统绝大多数都是以模块为核心,而本权限模型将摒弃此类普遍的做法,将以组织机构为核心来进行权限系统的设计,因为这更符合 ...
随机推荐
- Oracle-复制表结构存在的问题
在生产中,创建一个新表tbl_A,要求与已有表结构tbl_B一致 create table tbl_A AS select * from tbl_B where 1=2; --拷贝表结构tbl_B给t ...
- CF431C
题目简化和分析: k叉树,乍一看好像是树论,但我们通过分析条件,发现它每个阶段要做的事情一样,皆为:\(1\sim k\) 中选数字,这就很明显是DP. \(\mathit{f}_{i,0}\) 表示 ...
- Interesting Array 题解
Interesting Array 题目大意 构造一个序列 \(a\),使其满足若干限制条件,每个限制条件是形如 l r q 的式子,其意义是:\(\&_{i=l}^ra_i=q\). 题意分 ...
- 使用卷积神经网络训练手写数字识别模型(CNN)
https://www.cnblogs.com/zylyehuo/ 效果展示 目录结构 README.md # Basic MNIST Example pip install -r requireme ...
- C#经典十大排序算法(完结)
C#冒泡排序算法 简介 冒泡排序算法是一种基础的排序算法,它的实现原理比较简单.核心思想是通过相邻元素的比较和交换来将最大(或最小)的元素逐步"冒泡"到数列的末尾. 详细文章描述 ...
- jenkins 原理篇——pipeline流水线 声明式语法详解
大家好,我是蓝胖子,相信大家平时项目中或多或少都有用到jenkins,它的piepeline模式能够对项目的发布流程进行编排,优化部署效率,减少错误的发生,如何去写一个pipeline脚本呢,今天我们 ...
- vscode双击没反应,后台也看不到进程的解决方案
百度找的解决方案: cmd窗口执行 netsh winsock reset 重置命令. 删除Romaing下的Code文件夹 修改Code/User/locale.json(我没找到这个文件)中的&q ...
- Java内部类与匿名类
内部类 定义: 一个类的内部又完整的嵌套了另一个类结构,被嵌套的类就被我们称为内部类,嵌套内部类的类被我们称为外部类 //外部类 class Outer { //内部类 class Inner { } ...
- JS逆向实战25——某壳找房模拟登录+百度喵星人指纹加密破解.
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标 目标网站 aHR0c ...
- [Python急救站课程]Hello Kitty的绘制
我女朋友喜欢Hello Kitty,当她知道我会用Python画图,让我给画一个,怎么说呢,当然要安排上啦!请看程序 import math import turtle as t # 计算长度.角度 ...