欢迎使用 Gemma 2 - Google 的新开源 LLM
Google 发布了 Gemma 2,这是其先进的开源 LLM 系列的最新成员,我们很高兴能与 Google 合作,确保其在 Hugging Face 生态系统中得到最佳集成。您可以在 Hub 上找到这 4 个开源权重模型(2 个基础模型和 2 个微调模型)。在发布的功能和集成中,我们有
- Hub 上的模型
- Hugging Face Transformers 集成
- 与 Google Cloud 和推理端点的集成
目录
- 什么是 Gemma 2?
- Gemma 2 的技术进展
- Gemma 2 评估
- 如何提示 Gemma 2
- 演示
- 使用 Hugging Face Transformers
- 与 Google Cloud 集成
- 与推理端点集成
- 使用 🤗 TRL 进行微调
- 其他资源
- 致谢
什么是 Gemma 2?
Gemma 2 是 Google 最新的开源 LLM 系列。它提供两种尺寸:90 亿和 270 亿参数,分别有基础(预训练)和指令微调版本。Gemma 基于 Google Deepmind 的 Gemini,上下文长度为 8K 令牌。
- gemma-2-9b:基础 90 亿参数模型。
- gemma-2-9b-it:基础 90 亿参数模型的指令微调版本。
- gemma-2-27b:基础 270 亿参数模型。
- gemma-2-27b-it:基础 270 亿参数模型的指令微调版本。
Gemma 2 模型接受了比第一代多约 2 倍的数据训练,总计 13 万亿个令牌(用于 270 亿参数版本)和 8 万亿个令牌(用于 90 亿参数版本),数据包括网页数据(主要是英语)、代码和数学。我们不清楚具体的训练混合比例,只能猜测更大、更精细的数据策展是性能提升的关键因素。
Gemma 2 沿用了与第一代相同的 许可协议,这是一项允许再分发、微调、商业用途和衍生作品的宽松许可协议。
Gemma 2 的技术进展
Gemma 2 与第一代有很多相似之处。它具有 8192 个令牌的上下文长度,并使用旋转位置嵌入 (RoPE)。与原始 Gemma 相比,Gemma 2 主要有四项技术进展:
- 滑动窗口注意力:交替使用滑动窗口和全二次注意力以实现高质量生成。
- logits 软阈值:通过将 logits 缩放到固定范围来防止其过度增长,从而提高训练效果。
- 知识蒸馏:利用更大的教师模型来训练一个更小的模型(针对 90 亿参数模型)。
- 模型合并:将两个或多个 LLM 合并成一个全新的模型。
Gemma 2 在 Google Cloud TPU (270 亿参数模型使用 v5p,90 亿参数模型使用 TPU v4) 上使用 JAX 和 ML Pathways 进行训练。Gemma 2 Instruct 已针对对话应用进行了优化,并使用监督微调 (SFT)、来自更大模型的蒸馏、基于人类反馈的强化学习 (RLHF)(使用更侧重于对话能力的奖励模型)以及模型合并(使用 WARP)来提高整体性能的混合数据进行训练。
与预训练的混合数据类似,关于微调数据集或与 SFT 和 RLHF 相关的超参数的详细信息并未公开。
滑动窗口注意力
滑动窗口注意力 是一种降低 Transformer 模型中注意力计算的内存和时间要求的方法,已用于 Mistral 等模型。Gemma 2 的新颖之处在于,滑动窗口应用于每隔一个层(局部 - 4096 令牌),而中间的层仍然使用全二次全局注意力(8192 令牌)。我们推测这是一种在长上下文情况下提高质量的方法(一半的层仍然关注所有令牌),同时部分受益于滑动注意力的优势。
软阈值和注意力实现
软阈值是一种技术,它可以在不截断 logits 的情况下防止其过度增长。它的工作原理是将 logits 除以最大值阈值(soft_cap),然后通过 tanh 层(确保它们在 (-1, 1) 范围内),最后再乘以阈值。这可以确保最终值在 (-soft_cap, +soft_cap) 区间内,同时不丢失太多信息,从而稳定训练。
总而言之,logits 的计算方式为:logits ← soft_cap ∗ tanh(logits/soft_cap)
Gemma 2 在最后一层和每一层注意力中都采用了软阈值。注意力 logits 的阈值设置为 50.0,最终 logits 的阈值设置为 30.0。
在发布时,软阈值与 Flash Attention / SDPA 不兼容,但它们仍可用于推理以获得最大的效率。Gemma 2 团队在推理时移除软阈值后,观察到非常微小的差异。
注意:为了进行稳定的微调,您仍然需要启用软阈值,因此,我们建议使用 eager 注意力而不是 SDPA 进行微调。
知识蒸馏
知识蒸馏是一种流行的技术,用于训练一个较小的学生模型来模仿一个更大但性能更好的教师模型的行为。这通过在 LLM 的下一个词预测任务中增加教师(例如 GPT-4、Claude 或 Gemini)的词概率分布来完成,为学生提供了更丰富的学习信号。
根据 Gemma 2 技术报告,知识蒸馏被用于预训练 90 亿参数模型,而 270 亿参数模型是从头开始预训练的。
在训练后,Gemma 2 团队从一个教师(报告中未指定,但可能为 Gemini Ultra)那里生成了一组多样化的完成内容,然后使用 SFT 在这些合成数据上训练学生模型。这是许多开源模型(如 Zephyr 和 OpenHermes)的基础,这些模型完全在大型 LLM 的合成数据上进行训练。
尽管有效,但这种方法存在缺点,因为学生和教师模型容量的差异可能导致训练-推理不匹配,即学生在推理过程中生成的文本与训练期间看到的文本不属于同一分布。
为了解决这个问题,Gemma 2 团队使用了“策略内蒸馏”,即学生从 SFT 提示中生成完成内容。然后使用这些完成内容来计算教师和学生 logits 之间的 KL 散度。通过在整个训练过程中最小化 KL 散度,学生可以学会准确模拟教师的行为,同时最小化训练-推理不匹配。
这种方法非常有趣,因为我们在社区中看到,像在线 DPO 这样的策略内方法可以产生更强大的模型,而策略内蒸馏的一个优点是您只需要教师的 logits,因此您不需要依赖奖励模型或 LLM-as-a-judge 来改进模型。令人兴奋的是,这种方法在未来几个月里是否会受到微调者的更多欢迎!
模型合并
模型合并 是一种将两个或多个 LLM 合并成一个全新模型的技术。它相对较新且仍处于实验阶段,可以在没有加速器的情况下使用。 Mergekit 是一个流行的用于合并 LLM 的开源工具包。它实现了线性、SLERP、TIES、DARE 等合并技术。
根据技术报告,Gemma 2 使用了 Warp,这是一种新的合并技术,分三个不同阶段合并模型:
- 指数移动平均 (EMA):这在强化学习 (RL) 微调过程中应用。
- 球形线性插值 (SLERP):这在多个策略的 RL 微调之后应用。
- 向初始化方向的线性插值 (LITI):此阶段在 SLERP 阶段之后应用。
Gemma 2 评估
Gemma 模型有多好?以下是基于技术报告和新版Open LLM 排行榜的其他开源模型的性能比较。
技术报告结果
Gemma 2 的技术报告比较了不同开源 LLM 在旧的 Open LLM 排行榜基准上的性能。
| Llama 3 (700 亿参数) | Qwen 1.5 (320 亿参数) | Gemma 2 (270 亿参数) | |
|---|---|---|---|
| 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 (70 亿参数) | Llama 3 (80 亿参数) | Gemma (80 亿参数) | Gemma 2 (90 亿参数) |
|---|---|---|---|---|
| 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 |
Open LLM 排行榜结果
注意:我们目前正在单独评估 Google Gemma 2 在新的 Open LLM 排行榜基准上的表现,并将于今日晚些时候更新此部分。
如何提示 Gemma 2
基础模型没有提示格式。与其他基础模型一样,它们可以用于继续输入序列以获得合理的续写,或用于零样本/少样本推理。指令版本具有非常简单的对话结构。
<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 4.42 版本,您可以使用 Gemma 并利用 Hugging Face 生态系统中的所有工具。要将 Gemma 模型与 transformers 一起使用,请确保使用最新的 transformers 版本。
pip install "transformers>=4.42.3" --upgrade
以下代码片段展示了如何使用 transformers 来使用 gemma-2-9b-it。它需要大约 18 GB 的 RAM,这对于许多消费级 GPU 来说是可以满足的。对于 gemma-2-27b-it,相同的代码片段也适用,它需要 56GB RAM,这使其成为生产用例中非常值得关注的模型。通过加载 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 运行可能更快,90 亿参数模型的结果应该相似。但请注意,270 亿参数指令微调模型在使用 float16 时会产生不稳定的输出:您必须为该模型权重使用 bfloat16。
您还可以自动量化模型,将其加载到 8 位甚至 4 位模式。大型 270 亿参数版本的 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 的 nightly 版本并克隆仓库以访问 训练脚本。
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
如果您有多余的 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
推理端点集成
您可以使用 Hugging Face 的推理端点部署 Gemma 2,后端使用 Text Generation Inference。 Text Generation Inference 是 Hugging Face 开发的一个生产级推理容器,可轻松部署大型语言模型。它具有连续批处理、令牌流式传输、用于多 GPU 快速推理的张量并行以及生产就绪的日志记录和跟踪等功能。
要部署 Gemma 2 模型,请转到模型页面,然后点击“部署 -> 推理端点”小部件。推理端点支持与 OpenAI 兼容的Messages 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="")
附加资源
- Hub 上的模型
- 开放式 LLM 排行榜
- Hugging Chat 上的聊天演示
- Google 博客
- Google Notebook即将推出
- Vertex AI 模型花园即将推出
致谢
要发布这些模型并获得生态系统的支持和评估,离不开众多社区成员的贡献,包括负责 LLM 评估的 Clémentine 和 Nathan;负责 Text Generation Inference 支持的 Nicolas;负责将 Gemma 2 集成到 transformers 中的 Arthur、Sanchit、Joao 和 Lysandre;以及负责使 Gemma 2 在 Hugging Chat 中可用的 Nathan 和 Victor。
感谢 Google 团队发布 Gemma 2 并将其提供给开源 AI 社区!