歡迎 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 的方法。