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

社群

註冊登入 發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.