歡迎 Gemma 2 - Google 全新的開放式 LLM

釋出於 2024 年 6 月 27 日
在 GitHub 上更新

Google 釋出了 Gemma 2,這是其最先進的開放式 LLM 系列的最新成員,我們很高興能與 Google 合作,確保其在 Hugging Face 生態系統中實現最佳整合。您可以在 Hub 上找到這 4 個開放權重模型(2 個基礎模型和 2 個微調模型)。已釋出的功能和整合包括:

目錄

什麼是 Gemma 2?

Gemma 2 是 Google 最新迭代的開放式 LLM。它有兩種大小,90 億和 270 億引數,並提供基礎(預訓練)和指令微調版本。Gemma 基於 Google Deepmind Gemini,上下文長度為 8K token。

Gemma 2 模型的訓練資料量是其第一代模型的兩倍,其中 27B 版本總計 13 萬億 token,9B 版本總計 8 萬億 token,這些資料主要來源於網路資料(主要是英文)、程式碼和數學。我們不清楚訓練混合的具體細節,只能猜測更大、更仔細的資料整理是效能改進的重要因素。

Gemma 2 採用與第一代相同的許可,這是一個寬鬆的許可,允許重新分發、微調、商業用途和衍生作品。

Gemma 2 的技術進步

Gemma 2 與第一代有許多相似之處。它具有 8192 個 token 的上下文長度,並使用旋轉位置嵌入(RoPE)。與原始 Gemma 相比,Gemma 2 有四項主要改進:

  • 滑動視窗注意力:交錯使用滑動視窗注意力和全二次注意力,以實現高質量生成。
  • Logit 軟限制:透過將 logit 縮放到固定範圍來防止其過度增長,從而改善訓練。
  • 知識蒸餾:利用更大的教師模型來訓練更小的模型(針對 9B 模型)。
  • 模型合併:將兩個或更多 LLM 合併成一個新模型

Gemma 2 在 Google Cloud TPU (27B 使用 v5p9B 使用 TPU v4) 上訓練,使用 JAXML Pathways。Gemma 2 Instruct 已針對對話應用進行最佳化,並使用監督微調 (SFT)、從大型模型進行蒸餾、使用更注重對話能力的獎勵模型進行人工反饋強化學習 (RLHF) 以及使用 WARP 進行模型合併以提高整體效能,在合成和人工生成的提示-響應對的混合資料上進行了訓練。

與預訓練混合類似,關於微調資料集或與 SFT 和 RLHF 相關的超引數的詳細資訊尚未公開。

滑動視窗注意力

滑動視窗注意力是一種減少 transformer 模型注意力計算記憶體和時間需求的方法,已在 Mistral 等模型中使用。Gemma 2 的新穎之處在於,滑動視窗應用於每隔一層(區域性 - 4096 個 token),而中間層仍使用全二次全域性注意力(8192 個 token)。我們認為這是一種在長上下文情況下提高質量的方法(一半的層仍然關注所有 token),同時部分受益於滑動注意力的優勢。

軟限制和注意力實現

軟限制是一種防止 logit 過度增長而不截斷它們的技術。它的工作原理是將 logit 除以一個最大值閾值 (soft_cap),然後透過一個 tanh 層(確保它們在 (-1, 1) 範圍內),最後再次乘以該閾值。這保證了最終值將在 (-soft_cap, +soft_cap) 區間內,而不會損失太多資訊,但能穩定訓練。

總而言之,logit 的計算公式為:logits ← soft_cap * tanh(logits/soft_cap)

Gemma 2 對最後一層和每個注意力層都採用了軟限制。注意力 logit 限制在 50.0,最終 logit 限制在 30.0。

在釋出時,軟限制與 Flash Attention/SDPA 不相容,但它們仍可在推理中使用以實現最大效率。Gemma 2 團隊觀察到在推理期間移除軟限制時差異非常小。

注意:為了穩定的微調執行,您仍然需要啟用軟限制,因此,我們建議使用 eager 注意力而不是 SDPA 進行微調。

知識蒸餾

知識蒸餾是一種流行的技術,用於訓練一個較小的*學生*模型來模仿一個較大但效能更好的*教師*模型的行為。它的工作原理是,透過使用來自教師模型(例如 GPT-4、Claude 或 Gemini)的 token 機率分佈來增強 LLM 的下一個 token 預測任務,這為學生模型提供了更豐富的學習訊號。

根據 Gemma 2 技術報告,知識蒸餾用於預訓練 9B 模型,而 27B 模型則從頭開始預訓練。

對於後訓練,Gemma 2 團隊從一個教師模型(報告中未指定,但 presumably Gemini Ultra)生成了一組多樣化的完成,然後用 SFT 在這些合成數據上訓練學生模型。這是許多開放模型的基礎,例如 ZephyrOpenHermes,它們完全基於大型 LLM 的合成數據進行訓練。

儘管這種方法有效,但它也有缺點,因為學生和教師模型之間的容量不匹配可能導致*訓練-推理不匹配*,即學生模型在推理過程中生成的文字與訓練期間看到的文字處於分佈之外。

為了解決這個問題,Gemma 2 團隊使用了“按策略蒸餾”,其中學生模型從 SFT 提示生成完成。然後,這些完成用於計算教師和學生模型的 logit 之間的 KL 散度。透過在整個訓練過程中最小化 KL 散度,學生模型學會準確地模擬教師模型的行為,同時最大限度地減少訓練-推理不匹配。

這種方法非常有趣,正如我們在社群中看到的那樣,線上 DPO 等按策略方法會產生更強大的模型,而按策略蒸餾的一個優點是,您只需要教師模型的 logit,因此您不需要依賴獎勵模型或 LLM-as-a-judge 來改進模型。看到這種方法在未來幾個月內是否會在微調者中變得更受歡迎,這將令人興奮!

模型合併

模型合併是一種將兩個或多個 LLM 合併成一個新模型的技術。它相對較新且仍在實驗中,無需加速器即可使用。Mergekit 是一個流行的開源工具包,用於合併 LLM。它實現了線性、SLERP、TIES、DARE 和其他合併技術。

根據技術報告,Gemma 2 使用了 Warp,這是一種新的合併技術,它分三個不同階段合併模型

  1. 指數移動平均 (EMA):在強化學習 (RL) 微調過程中應用。
  2. 球面線性插值 (SLERP):在多個策略的 RL 微調後應用。

    65
  3. 向初始化線性插值 (LITI):此階段在 SLERP 階段之後應用。

Gemma 2 評估

Gemma 模型表現如何?以下是根據技術報告和開放 LLM 排行榜新版本與其他開放模型的效能比較。

技術報告結果

Gemma 2 的技術報告比較了不同開放式 LLM 在之前的開放式 LLM 排行榜基準測試中的效能。

Llama 3 (70B) Qwen 1.5 (32B) Gemma 2 (27B)
MMLU 79.2 74.3 75.2
GSM8K 76.9 61.1 75.1
ARC-c 68.8 63.6 71.4
HellaSwag 88.0 85.0 86.4
Winogrande 85.3 81.5 83.7

該報告還比較了小型語言模型的效能。

基準測試 Mistral (7B) Llama 3 (8B) Gemma (8B) Gemma 2 (9B)
MMLU 62.5 66.6 64.4 71.3
GSM8K 34.5 45.7 50.9 62.3
ARC-C 60.5 59.2 61.1 68.4
HellaSwag 83.0 82.0 82.3 81.9
Winogrande 78.5 78.5 79.0 80.6

開放 LLM 排行榜結果

注意:我們目前正在新的開放 LLM 排行榜基準上單獨評估 Google Gemma 2,並將在今天晚些時候更新此部分。

如何提示 Gemma 2

基礎模型沒有提示格式。像其他基礎模型一樣,它們可以用於繼續輸入序列,生成可信的延續,或者用於零樣本/少樣本推理。Instruct 版本具有非常簡單的對話結構

<start_of_turn>user
knock knock<end_of_turn>
<start_of_turn>model
who is there<end_of_turn>
<start_of_turn>user
LaMDA<end_of_turn>
<start_of_turn>model
LaMDA who?<end_of_turn><eos>

必須精確復現這種格式才能有效使用。我們稍後將展示如何使用 transformers 中提供的聊天模板輕鬆復現 instruct 提示。

演示

您可以在 Hugging Chat 上與 Gemma 27B Instruct 模型聊天!請點選此處連結:https://huggingface.co/chat/models/google/gemma-2-27b-it

使用 Hugging Face Transformers

透過 Transformers release 4.42,您可以使用 Gemma 並利用 Hugging Face 生態系統中的所有工具。要將 Gemma 模型與 transformers 一起使用,請確保使用最新的 transformers 版本

pip install "transformers>=4.42.3" --upgrade

以下程式碼片段展示瞭如何使用 gemma-2-9b-ittransformers。它需要大約 18 GB 的記憶體,這適用於許多消費級 GPU。相同的程式碼片段也適用於 gemma-2-27b-it,後者需要 56GB 的記憶體,使其成為生產用例中一個非常有趣的模型。透過以 8 位或 4 位模式載入,可以進一步減少記憶體消耗。

from transformers import pipeline
import torch

pipe = pipeline(
    "text-generation",
    model="google/gemma-2-9b-it",
    model_kwargs={"torch_dtype": torch.bfloat16},
    device="cuda",
)

messages = [
    {"role": "user", "content": "Who are you? Please, answer in pirate-speak."},
]
outputs = pipe(
    messages,
    max_new_tokens=256,
    do_sample=False,
)
assistant_response = outputs[0]["generated_text"][-1]["content"]
print(assistant_response)

哈嘍,各位夥伴!我是一艘謙遜的文字之船,航行在數字海洋中。他們叫我 Gemma,是 Google DeepMind 的傑出作品。我透過大量文字訓練而成,學會了像一個真正的海盜一樣說話和寫作。

問我問題吧,我會盡力回答,是的!🦜📚

我們使用 bfloat16,因為那是指令微調模型的參考精度。在 float16 模式下執行可能在您的硬體上更快,並且在 9B 模型上結果應該相似。但請注意,27B 指令微調模型在使用 float16 時會產生不穩定的輸出:您必須為該模型權重使用 bfloat16。

您還可以自動量化模型,以 8 位甚至 4 位模式載入。載入大型 27B 版本的 4 位模型大約需要 18 GB 記憶體才能執行,使其與許多消費級顯示卡和 Google Colab 中的 GPU 相容。這就是您以 4 位模式載入生成管道的方式

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

有關如何將模型與 transformers 一起使用的更多詳細資訊,請檢視模型卡

與 Google Cloud 整合

注意:我們目前正在努力將新的容器新增到 GKE 和 Vertex AI 中,以高效執行 Google Gemma 2。容器可用後,我們將立即更新此部分。

使用 🤗 TRL 進行微調

訓練 LLM 在技術和計算上都具有挑戰性。在本節中,我們將介紹 Hugging Face 生態系統中可用於在消費級 GPU 上高效訓練 Gemma 的工具

下面是針對 OpenAssistant 聊天資料集微調 Gemma 的示例命令。我們使用 4 位量化和 QLoRA 來節省記憶體,以針對所有注意力塊的線性層。請注意,與密集 Transformer 不同,不應針對 MLP 層,因為它們是稀疏的並且與 PEFT 相互作用不良。

首先,安裝 🤗 TRL 的夜間版本並克隆倉庫以訪問訓練指令碼

pip install "transformers>=4.42.3" --upgrade
pip install --upgrade bitsandbytes
pip install --ugprade peft
pip install git+https://github.com/huggingface/trl
git clone https://github.com/huggingface/trl
cd trl

然後你可以執行指令碼

# peft tuning; single GPU; https://wandb.ai/costa-huang/huggingface/runs/l1l53cst
python \
    examples/scripts/sft.py \
    --model_name google/gemma-2-27b \
    --dataset_name OpenAssistant/oasst_top1_2023-08-25 \
    --dataset_text_field="text" \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 4 \
    --learning_rate 2e-4 \
    --report_to wandb \
    --bf16 \
    --max_seq_length 1024 \
    --lora_r 16 --lora_alpha 32 \
    --lora_target_modules q_proj k_proj v_proj o_proj \
    --load_in_4bit \
    --use_peft \
    --attn_implementation eager \
    --logging_steps=10 \
    --gradient_checkpointing \
    --output_dir models/gemma2

alt_text

如果您有更多 GPU 可用,可以使用 DeepSpeed 和 ZeRO Stage 3 進行訓練

accelerate launch --config_file=examples/accelerate_configs/deepspeed_zero3.yaml \
    examples/scripts/sft.py \
    --model_name google/gemma-2-27b \
    --dataset_name OpenAssistant/oasst_top1_2023-08-25 \
    --dataset_text_field="text" \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 4 \
    --learning_rate 2e-5 \
    --report_to wandb \
    --bf16 \
    --max_seq_length 1024 \
    --attn_implementation eager \
    --logging_steps=10 \
    --gradient_checkpointing \
    --output_dir models/gemma2

alt_text

與推理端點整合

您可以使用文字生成推理作為後端,將 Gemma 2 部署到 Hugging Face 的 推理端點文字生成推理是 Hugging Face 開發的生產就緒推理容器,可輕鬆部署大型語言模型。它具有連續批處理、token 流式傳輸、多 GPU 快速推理的張量並行化以及生產就緒日誌記錄和跟蹤等功能。

要部署 Gemma 2 模型,請轉到模型頁面並單擊部署 -> 推理端點小部件。推理端點支援 OpenAI 相容的訊息 API,它允許您透過簡單地更改 URL 從另一個封閉模型切換到開放模型。

from openai import OpenAI

# initialize the client but point it to TGI
client = OpenAI(
    base_url="<ENDPOINT_URL>" + "/v1/",  # replace with your endpoint url
    api_key="<HF_API_TOKEN>",  # replace with your token
)
chat_completion = client.chat.completions.create(
    model="tgi",
    messages=[
        {"role": "user", "content": "Why is open-source software important?"},
    ],
    stream=True,
    max_tokens=500
)

# iterate and print stream
for message in chat_completion:
    print(message.choices[0].delta.content, end="")

額外資源

致謝

如果沒有許多社群成員的貢獻,包括對 LLM 評估做出貢獻的 ClémentineNathan;對文字生成推理提供支援的 Nicolas;將 Gemma 2 整合到 transformers 中的 ArthurSanchitJoaoLysandre;以及使 Gemma 2 在 Hugging Chat 中可用的 NathanVictor,釋出這些模型並在生態系統中提供支援和評估是不可能的。

感謝 Google 團隊釋出 Gemma 2 並將其提供給開源 AI 社群!

社群

註冊登入以發表評論

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