欢迎 Gemma - Google 新的开放式 LLM

发布于 2024 年 2 月 21 日
在 GitHub 上更新

本文发布两个月后,Gemma 模型发布了更新,请在此合集中查看最新版本。

Google 今天发布了 Gemma,这是一个全新的、最先进的开放式 LLM 家族!我们很高兴看到 Google 加强其对开源 AI 的承诺,并且我们很高兴能够通过在 Hugging Face 中的全面集成,全力支持此次发布。

Gemma 有两种尺寸:7B 参数版本,适用于在消费级 GPU 和 TPU 上的高效部署和开发;2B 版本,适用于 CPU 和设备端应用。两种尺寸都有基础模型和指令调优模型两种变体。

我们与 Google 合作,确保将其最佳地集成到 Hugging Face 生态系统中。你可以在 Hub 上找到 4 个开放访问的模型 (2 个基础模型和 2 个微调模型)。在我们发布的功能和集成中,包括:

目录

什么是 Gemma?

Gemma 是 Google 基于 Gemini 开发的 4 个新 LLM 模型家族。它有两种尺寸:2B 和 7B 参数,每种都有基础 (预训练) 和指令调优版本。所有变体都可以在各种消费级硬件上运行,甚至无需量化,并且上下文长度为 8K tokens。

在初次发布一个月后,Google 发布了指令模型的新版本。该版本在编码能力、事实性、指令遵循和多轮对话质量方面表现更佳。此外,该模型也不太倾向于以「当然 (Sure)」开头回答问题。

Gemma logo

那么,Gemma 模型有多好呢?以下是基础模型及其在 LLM 排行榜上与其他开放模型的性能比较 (分数越高越好):

模型 许可证 商业用途? 预训练大小 [token] 排行榜得分 ⬇️
LLama 2 70B Chat (参考) Llama 2 许可证 2T 67.87
Gemma-7B Gemma 许可证 6T 63.75
DeciLM-7B Apache 2.0 未知 61.55
PHI-2 (2.7B) MIT 1.4T 61.33
Mistral-7B-v0.1 Apache 2.0 未知 60.97
Llama 2 7B Llama 2 许可证 2T 54.32
Gemma 2B Gemma 许可证 2T 46.51

Gemma 7B 是一个非常强大的模型,其性能可与 7B 权重级别中的最佳模型 (包括 Mistral 7B) 相媲美。Gemma 2B 就其尺寸而言是一个有趣的模型,但它在排行榜上的得分不如同等尺寸的最强模型,例如 Phi 2。我们期待收到社区关于实际使用情况的反馈!

请注意,LLM 排行榜特别适用于衡量预训练模型的质量,而对聊天模型的衡量效果不佳。我们鼓励对聊天模型运行其他基准测试,例如 MT Bench、EQ Bench 和 lmsys Arena!

提示词格式

基础模型没有提示词格式。像其他基础模型一样,它们可以用于以合理的续写来继续输入序列,或用于零样本/少样本推理。它们也是根据你自己的用例进行微调的绝佳基础。指令版本有一个非常简单的对话结构。

<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>

必须精确复现这种格式才能有效使用。我们稍后将展示如何使用 transformers 中提供的聊天模板轻松复现 instruct 提示。

探索未知

技术报告包含了基础模型的训练和评估过程信息,但没有关于数据集构成和预处理的详尽细节。我们知道它们是使用来自各种来源的数据进行训练的,主要是网页文档、代码和数学文本。数据经过筛选以去除 CSAM 内容和 PII,并进行了许可证检查。

同样,对于 Gemma 指令模型,也没有分享关于微调数据集或与 SFT 和 RLHF 相关的超参数的详细信息。

Demo

你可以在 Hugging Chat 上与 Gemma 指令模型聊天!请点击此链接查看: https://huggingface.co/chat/models/google/gemma-1.1-7b-it

使用 🤗 Transformers

通过 Transformers 4.38 版本,你可以使用 Gemma 并利用 Hugging Face 生态系统中的所有工具,例如:

  • 训练和推理脚本以及示例
  • 安全文件格式 (safetensors)
  • 与 bitsandbytes (4 位量化)、PEFT (参数高效微调) 和 Flash Attention 2 等工具的集成
  • 用于模型生成运行的实用程序和辅助函数
  • 导出模型以进行部署的机制

此外,Gemma 模型与带 CUDA 图的 torch.compile() 兼容,使其在推理时速度提升约 4 倍!

要使用 transformers 加载 Gemma 模型,请确保安装最新版本的 transformers

pip install --upgrade transformers

以下代码片段展示了如何使用 transformers 加载 gemma-7b-it。它需要大约 18 GB 的 RAM,适用于 3090 或 4090 等消费级 GPU。

from transformers import pipeline
import torch

pipe = pipeline(
    "text-generation",
    model="google/gemma-7b-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=True,
    temperature=0.7,
    top_k=50,
    top_p=0.95
)
assistant_response = outputs[0]["generated_text"][-1]["content"]
print(assistant_response)

嘿,伙计。我是一个公海上的海盗,准备好烧杀抢掠了。准备听一个关于冒险和战利品的故事吧!

我们使用了 bfloat16,因为这是参考精度,也是所有评估的运行方式。在你的硬件上使用 float16 可能会更快。

你还可以自动量化模型,以 8-bit 甚至 4-bit 模式加载。4-bit 加载需要大约 9 GB 内存,使其与许多消费级显卡以及 Google Colab 中的所有 GPU 兼容。以下是如何以 4-bit 加载生成管道:

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

有关使用 transformers 加载模型的更多详细信息,请查看模型卡

JAX 权重

所有 Gemma 模型变体都可用于 PyTorch (如上所述) 或 JAX / Flax。要加载 Flax 权重,你需要使用仓库中的 `flax` 修订版,如下所示:

import jax.numpy as jnp
from transformers import AutoTokenizer, FlaxGemmaForCausalLM

model_id = "google/gemma-2b"

tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.padding_side = "left"

model, params = FlaxGemmaForCausalLM.from_pretrained(
        model_id,
        dtype=jnp.bfloat16,
        revision="flax",
        _do_init=False,
)

inputs = tokenizer("Valencia and Málaga are", return_tensors="np", padding=True)
output = model.generate(**inputs, params=params, max_new_tokens=20, do_sample=False)
output_text = tokenizer.batch_decode(output.sequences, skip_special_tokens=True)

['瓦伦西亚和马拉加是西班牙最受欢迎的两个旅游目的地。两座城市都拥有丰富的历史和充满活力的文化,']

查看此 notebook,以获得关于如何在 Colab TPU 上并行化 JAX 推理的全面实践演练!

与 Google Cloud 集成

你可以使用文本生成推理和 Transformers,通过 Vertex AI 或 Google Kubernetes Engine (GKE) 在 Google Cloud 上部署和训练 Gemma。

要从 Hugging Face 部署 Gemma 模型,请转到 模型页面 并点击 部署 -> Google Cloud。这将带你到 Google Cloud 控制台,在那里你可以一键将 Gemma 部署到 Vertex AI 或 GKE。文本生成推理为 Google Cloud 上的 Gemma 提供支持,这是我们与 Google Cloud 合作的第一个集成项目。

deploy on GCP

你也可以直接通过 Vertex AI Model Garden 访问 Gemma。

要从 Hugging Face 调优 Gemma 模型,请转到 模型页面 并点击 训练 -> Google Cloud。这将带你到 Google Cloud 控制台,在那里你可以访问 notebook,在 Vertex AI 或 GKE 上调优 Gemma。

train on GCP

这些集成标志着我们作为与 Google 合作的成果,共同推出的首批产品。敬请期待更多精彩内容!

与推理端点集成

你可以在 Hugging Face 的 推理端点上部署 Gemma,它使用文本生成推理作为后端。文本生成推理 是 Hugging Face 开发的生产级推理容器,可轻松部署大型语言模型。它具有连续批处理、token 流式传输、在多个 GPU 上进行快速推理的张量并行以及生产级日志记录和跟踪等功能。

要部署 Gemma 模型,请转到 模型页面 并点击 部署 -> 推理端点小部件。你可以在之前的博客文章中了解更多关于使用 Hugging Face 推理端点部署 LLM 的信息。推理端点通过文本生成推理支持消息 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="")

使用 🤗 TRL 进行微调

训练 LLM 在技术上和计算上都可能具有挑战性。在本节中,我们将探讨 Hugging Face 生态系统中可用于在消费级 GPU 上高效训练 Gemma 的工具。

下面可以找到在 OpenAssistant 的聊天数据集上微调 Gemma 的示例命令。我们使用 4-bit 量化和QLoRA来节省内存,以针对所有注意力块的线性层。

首先,安装 🤗 TRL 的夜间版本并克隆仓库以访问训练脚本

pip install -U transformers trl peft bitsandbytes
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 google/gemma-7b \
    --dataset_name OpenAssistant/oasst_top1_2023-08-25 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 1 \
    --learning_rate 2e-4 \
    --save_steps 20_000 \
    --use_peft \
    --lora_r 16 --lora_alpha 32 \
    --lora_target_modules q_proj k_proj v_proj o_proj \
    --load_in_4bit \
    --output_dir gemma-finetuned-openassistant

在单个 A10G 上训练大约需要 9 个小时,但可以通过将 `--num_processes` 调整为你可用的 GPU 数量来轻松实现并行化。

其他资源

致谢

如果没有许多社区成员的贡献,在生态系统中发布这样的模型并进行支持和评估是不可能的,包括 Clémentine 和 Eleuther Evaluation Harness 的 LLM 评估; OlivierDavid 的文本生成推理支持; Simon 在 Hugging Face 上开发了新的访问控制功能; Arthur, Younes, 和 Sanchit 将 Gemma 集成到 transformers 中; Morgan 将 Gemma 集成到 optimum-nvidia (即将推出) 中; Nathan, Victor, 和 Mishig 使 Gemma 在 Hugging Chat 中可用。

并感谢 Google 团队发布 Gemma 并将其提供给开源 AI 社区!

社区

注册登录 发表评论