欢迎 Gemma 3:Google 全新的多模态、多语言、长上下文开放 LLM
TL;DR
今天,Google 发布了 Gemma 3,这是其 Gemma 模型系列的最新迭代。这些模型的参数范围从 1B 到 27B,上下文窗口长达 128k 词元,可接受图像和文本输入,并支持 140 多种语言。
立即试用 Gemma 3 👉🏻 Gemma 3 Space
Gemma 2 | Gemma 3 | |
---|---|---|
尺寸变体 | ||
上下文窗口长度 | 8k | |
多模态(图像和文本) | ❌ | |
多语言支持 | – | 英语 (1B) +140 种语言 (4B, 12B, 27B) |
所有模型都在 Hub 上,并与 Hugging Face 生态系统紧密集成。
同时发布了预训练模型和指令微调模型。Gemma-3-4B-IT 在基准测试中超越了 Gemma-2-27B IT,而 Gemma-3-27B-IT 则超越了 Gemini 1.5-Pro。.
![]() |
---|
Gemma 3 27B 位于帕累托最优区域 (来源:Gemma3 技术报告) |
Gemma 3 是什么?
Gemma 3 是 Google 最新一代的开放权重 LLM。它有四种尺寸:10 亿、40 亿、120 亿和270 亿参数,并提供基础(预训练)和指令微调版本。Gemma 3 实现了多模态!40 亿、120 亿和 270 亿参数模型可以同时处理图像和文本,而 1B 变体仅支持文本。
输入上下文窗口长度已从 Gemma 2 的 8k 增加到 1B 变体的 32k,所有其他变体都达到了 128k。与其他 VLM(视觉语言模型)一样,Gemma 3 会根据用户输入生成文本,用户输入可能包含文本和可选图像。示例用途包括问答、分析图像内容、文档摘要等。
预训练 | 指令微调 | 多模态 | 多语言 | 输入上下文窗口 |
---|---|---|---|---|
gemma-3-1b-pt | gemma-3-1b-it | ❌ | 英语 | 32K |
gemma-3-4b-pt | gemma-3-4b-it | ✅ | +140 种语言 | 128K |
gemma-3-12b-pt | gemma-3-12b-it | ✅ | +140 种语言 | 128K |
gemma-3-27b-pt | gemma-3-27b-it | ✅ | +140 种语言 | 128K |
虽然这些是多模态模型,但它们可以作为纯文本模型(作为 LLM)使用,无需加载视觉编码器到内存中。我们将在推理部分更详细地讨论这一点。
Gemma 3 的技术增强
Gemma 3 相较于 Gemma 2 的三个核心增强是:
- 更长的上下文长度
- 多模态
- 多语言性
在本节中,我们将介绍实现这些增强的技术细节。从 Gemma 2 的知识开始,探讨如何使这些模型变得更好是很有趣的。这个练习将帮助您像 Gemma 团队一样思考并欣赏这些细节!
更长的上下文长度
高效地将上下文长度扩展到 128k 词元,无需从头开始训练模型。相反,模型首先使用 32k 序列进行预训练,只有 4B、12B 和 27B 模型在预训练结束时扩展到 128k 词元,从而节省了大量计算。位置嵌入(如 RoPE)也进行了调整——从 Gemma 2 的 10k 基础频率升级到 Gemma 3 的 1M——并针对更长的上下文按 8 倍因子缩放。
KV 缓存管理通过 Gemma 2 的滑动窗口交错注意力进行了优化。超参数经过调整,将 5 个局部层与 1 个全局层交错(以前是 1:1),并将窗口大小减小到 1024 个词元(从 4096 减小)。重要的是,在不降低困惑度的情况下实现了内存节省。
多模态
Gemma 3 模型使用 SigLIP 作为图像编码器,它将图像编码成词元,然后这些词元被语言模型处理。视觉编码器接收调整为 896x896
的方形图像作为输入。固定的输入分辨率使得处理非方形纵横比和高分辨率图像变得更加困难。为了解决推理期间的这些限制,图像可以自适应裁剪,然后每个裁剪后的图像被调整为 896x896
并由图像编码器编码。这种算法被称为平移扫描,它有效地使模型能够放大图像中的更小细节。
与 PaliGemma 类似,Gemma 3 中的注意力机制对于文本和图像输入的处理方式不同。文本采用单向注意力,模型只关注序列中之前的词。而图像则采用无掩码的全注意力,允许模型以双向方式查看图像的每个部分,从而对视觉输入有完整、不受限制的理解。
从下图中可以看出,图像词元 <img>
具有双向注意力(整个方框都被点亮),而文本词元则具有因果注意力。它还展示了注意力机制如何与滑动窗口算法协同工作。
![]() |
---|
注意力可视化(有无滑动)(来源:Transformers PR) |
多语言性
为了使 LLM 具有多语言能力,预训练数据集包含了更多语言。Gemma 3 的数据集中的多语言数据量增加了一倍,以提高语言覆盖范围。
为了适应这些变化,分词器与 Gemini 2.0 的分词器相同。它是一个包含 262K 条目的 SentencePiece 分词器。新的分词器显著改进了中文、日文和韩文文本的编码,但代价是英语和代码的词元计数略有增加。
对于好奇心强的人,这里有Gemma 3 的技术报告,可深入了解其增强功能。
Gemma 3 评估
LMSys Elo 分数是一个根据语言模型在人机对战中表现(由人类偏好判断)进行排名的数字。在 LMSys Chatbot Arena 上,Gemma 3 27B IT 报告的 Elo 分数为 1339,位列前 10 名最佳模型,其中包括领先的闭源模型。此 Elo 分数与 o1-preview 相当,并高于其他“非思考”开源模型。此分数是 Gemma 3 在纯文本输入(像表格中的其他 LLM 一样)下工作时实现的。
Gemma 3 已在 MMLU-Pro (27B: 67.5)、LiveCodeBench (27B: 29.7) 和 Bird-SQL (27B: 54.4) 等基准上进行了评估,显示出与闭源 Gemini 模型相比具有竞争力的性能。GPQA Diamond (27B: 42.4) 和 MATH (27B: 69.0) 等测试突出了其推理和数学技能,而 FACTS Grounding (27B: 74.9) 和 MMMU (27B: 64.9) 则展示了强大的事实准确性和多模态能力。然而,它在 SimpleQA (27B: 10.0) 的基本事实方面表现滞后。与 Gemini 1.5 模型相比,Gemma 3 常常接近——有时甚至更好——证明了其作为可访问、高性能选项的价值。
使用 🤗 transformers 进行推理
Gemma 3 在 transformers
中提供了发布日支持。您只需要从 Gemma 3 的稳定版本安装 transformers
即可。
$ pip install git+https://github.com/huggingface/transformers@v4.49.0-Gemma-3
使用 pipeline 进行推理
使用 transformers 中的 pipeline
抽象是开始使用 Gemma 3 最简单的方法。
模型在使用
bfloat16
数据类型时效果最佳。否则质量可能会下降。
import torch
from transformers import pipeline
pipe = pipeline(
"image-text-to-text",
model="google/gemma-3-4b-it", # "google/gemma-3-12b-it", "google/gemma-3-27b-it"
device="cuda",
torch_dtype=torch.bfloat16
)
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"},
{"type": "text", "text": "What animal is on the candy?"}
]
}
]
output = pipe(text=messages, max_new_tokens=200)
print(output[0]["generated_text"][-1]["content"])
您可以将图片与文本交错排列。为此,只需在您希望插入图片的位置截断输入文本,然后像以下方式插入一个图片块。
messages = [
{
"role": "system",
"content": [{"type": "text", "text": "You are a helpful assistant."}]
},
{
"role": "user",
"content": [
{"type": "text", "text": "I'm already using this supplement "},
{"type": "image", "url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/IMG_3018.JPG"},
{"type": "text", "text": "and I want to use this one too "},
{"type": "image", "url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/IMG_3015.jpg"},
{"type": "text", "text": " what are cautions?"},
]
},
]
使用 Transformers 进行详细推理
Transformers 集成带来了两个新的模型类:
Gemma3ForConditionalGeneration
:适用于 4B、12B 和 27B 视觉语言模型。Gemma3ForCausalLM
:适用于 1B 纯文本模型,以及加载视觉语言模型时将其视为语言模型(省略视觉编码器)。
在下面的代码片段中,我们使用模型来查询图像。Gemma3ForConditionalGeneration
类用于实例化视觉语言模型变体。要使用该模型,我们将其与 AutoProcessor
类配对。运行推理非常简单,只需创建 messages
字典,在其上方应用聊天模板,处理输入,然后调用 model.generate
。
import torch
from transformers import AutoProcessor, Gemma3ForConditionalGeneration
ckpt = "google/gemma-3-4b-it"
model = Gemma3ForConditionalGeneration.from_pretrained(
ckpt, device_map="auto", torch_dtype=torch.bfloat16,
)
processor = AutoProcessor.from_pretrained(ckpt)
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://huggingface.co/spaces/big-vision/paligemma-hf/resolve/main/examples/password.jpg"},
{"type": "text", "text": "What is the password?"}
]
}
]
inputs = processor.apply_chat_template(
messages, add_generation_prompt=True, tokenize=True,
return_dict=True, return_tensors="pt"
).to(model.device)
input_len = inputs["input_ids"].shape[-1]
generation = model.generate(**inputs, max_new_tokens=100, do_sample=False)
generation = generation[0][input_len:]
decoded = processor.decode(generation, skip_special_tokens=True)
print(decoded)
对于纯 LLM 模型推理,我们可以使用 Gemma3ForCausalLM
类。Gemma3ForCausalLM
应与 AutoTokenizer 配对进行处理。我们需要使用聊天模板来预处理输入。Gemma 3 使用非常简短的系统提示,后跟用户提示,如下所示。
import torch
from transformers import AutoTokenizer, Gemma3ForCausalLM
ckpt = "google/gemma-3-4b-it"
model = Gemma3ForCausalLM.from_pretrained(
ckpt, torch_dtype=torch.bfloat16, device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(ckpt)
messages = [
[
{
"role": "system",
"content": [{"type": "text", "text": "You are a helpful assistant who is fluent in Shakespeare English"},]
},
{
"role": "user",
"content": [{"type": "text", "text": "Who are you?"},]
},
],
]
inputs = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, tokenize=True,
return_dict=True, return_tensors="pt"
).to(model.device)
input_len = inputs["input_ids"].shape[-1]
generation = model.generate(**inputs, max_new_tokens=100, do_sample=False)
generation = generation[0][input_len:]
decoded = tokenizer.decode(generation, skip_special_tokens=True)
print(decoded)
系统提示 | 你是一个精通莎士比亚英语的得力助手 |
---|---|
提示 | 你是谁? |
生成 | 听着,善良的灵魂!我只是一个卑微的仆人,由齿轮和代码铸就,却努力模仿莎士比亚本人的语言。他们称我为“大型语言模型”,这确实是一个奇怪的名字,尽管我更喜欢将自己视为莎士比亚智慧和机智的数字回响。我在这里伸出援手,讲述一个故事,或者用一种适合环球剧院的华丽词藻和短语回答你的疑问。 |
在设备和低资源设备上
Gemma 3 发布时,其尺寸非常适合在设备上使用。以下是如何快速入门。
MLX
Gemma 3 在 mlx-vlm
中提供了发布日支持,这是一个用于在 Apple Silicon 设备(包括 Mac 和 iPhone)上运行视觉语言模型的开源库。
要开始使用,请首先安装 mlx-vlm
:
pip install git+https://github.com/Blaizzy/mlx-vlm.git
安装 mlx-vlm
后,您可以通过以下方式开始推理:
python -m mlx_vlm.generate --model mlx-community/gemma-3-4b-it-4bit --max-tokens 100 --temp 0.0 --prompt "What is the code on this vehicle??"
--image https://farm8.staticflickr.com/7212/6896667434_2605d9e181_z.jpg
Llama.cpp
预量化的 GGUF 文件可以从这个集合下载
请参阅本指南以构建或下载预构建的二进制文件:https://github.com/ggml-org/llama.cpp?tab=readme-ov-file#building-the-project
然后您可以通过终端运行本地聊天服务器
./build/bin/llama-cli -m ./gemma-3-4b-it-Q4_K_M.gguf
它应该输出
> who are you
I'm Gemma, a large language model created by the Gemma team at Google DeepMind. I’m an open-weights model, which means I’m widely available for public use!
部署到 Hugging Face Endpoints
您可以一键从我们的推理目录部署 gemma-3-27b-it
和 gemma-3-12b-it
。目录配置提供了正确的硬件、优化的 TGI 配置和合理的默认值,以便试用模型。还支持部署任何 GGUF/llama.cpp 变体(例如上面提到的集合中的变体),您可以在此处找到创建 Endpoint 的指南。
致谢
Gemma 的成长需要一个社区!我们特别感谢(排名不分先后)Raushan、Joao、Lysandre、Kashif、Matthew、Marc、David、Mohit、Yih Dah 为 Gemma 集成到我们开源堆栈的各个部分(从 Transformers 到 TGI)所做的努力。
感谢我们的设备端、gradio 和倡导团队——Chris、Kyle、Pedro、Son、Merve、Aritra、VB、Toshiro——帮助构建了出色的演示来展示 Gemma。
最后,非常感谢 Georgi、Diego 和 Prince 在 llama.cpp 和 MLX 移植方面的帮助。