Google DeepMind 发布 Gemma 4 多模态模型家族
Welcome Gemma 4: Frontier multimodal intelligence on device
Google DeepMind 在 HF 发布 Gemma 4 多模态模型家族,采用 Apache 2.0 许可,支持图像、文本和音频输入并生成文本。模型提供 E2B、E4B、12B Unified、31B 和 26B A4B 五个尺寸,最大上下文窗口 256K,其中 12B Unified 去掉独立视觉与音频编码器,直接把原始图像块和音频波形投影到 LLM 嵌入空间。
Gemma 4 五档模型覆盖端侧到 MoE,附各推理引擎与微调工具链的接入方式,可据此判断本地部署路径。
Google DeepMind 的 Gemma 4 多模态模型系列已在 HF Mirror 上线,支持你常用的智能体、推理引擎和微调库 🤗
这些模型货真价实:采用 Apache 2 许可证的真正开放、在帕累托前沿竞技场分数上表现出的高质量、包含音频的多模态能力,以及随处可用的尺寸——包括端侧。Gemma 4 建立在之前系列的基础上,并将它们的进展融为一体。在我们使用预发布检查点进行的测试中,其能力令我们印象深刻,以至于我们很难找到合适的微调示例,因为它们开箱即用就如此出色。
我们与 Google 和社区合作,让它们随处可用:transformers、llama.cpp、MLX、WebGPU、Rust,应有尽有。这篇博客文章将展示如何用你最喜欢的工具进行构建,所以请告诉我们你的想法!
目录
- Gemma 4 有什么新变化?
- Overview of Capabilities and Architecture
- 多模态能力
- Deploy Anywhere
- 多 token 预测草稿模型
- DiffusionGemma:通过扩散进行文本生成
- Fine-tuning & Demos
- 试用 Gemma 4
- 基准测试结果
- 致谢
Gemma 4 有什么新变化?
与 Gemma-3n 类似,Gemma 4 支持图像、文本和音频输入,并生成文本回复。文本解码器基于 Gemma 模型,支持长上下文窗口。图像编码器与 Gemma 3 的类似,但有两个关键改进:可变纵横比,以及可配置的图像 token 输入数量,以便在速度、内存和质量之间找到最佳平衡点。所有模型都支持图像(或视频)和文本输入,而小型变体(E2B、E4B)和 12B Unified 模型还支持音频。
Gemma 4 有五种尺寸,均提供基础版和指令微调版:
| 模型 | 参数规模 | 上下文窗口 | 检查点 |
|---|---|---|---|
| Gemma 4 E2B | 2.3B 有效参数,含嵌入为 5.1B | 128k | base、IT |
| Gemma 4 E4B | 4.5B 有效参数,含嵌入为 8B | 128k | base、IT |
| Gemma 4 12B Unified | 11.95B 稠密,无编码器 | 256K | base、IT |
| Gemma 4 31B | 31B 稠密模型 | 256K | base、IT |
| Gemma 4 26B A4B | 混合专家模型,4B 激活/26B 总参数 | 256K | base、IT |
能力与架构概览
Gemma 4 沿用了此前 Gemma 版本和其他开放模型中的若干架构组件,并去掉了复杂或没有定论的功能,例如 Altup。这种组合旨在实现跨库和跨设备的高度兼容性,能够高效支持长上下文和智能体用例,同时非常适合量化。
如上方基准测试所示,这种功能组合(结合训练数据和配方)使 31B 稠密模型达到约 1452 的 LMArena 得分(纯文本),而 26B MoE 仅用 4B 激活参数就达到 1441 🤯。我们还将看到,多模态操作至少在与文本生成相比的非正式和主观测试中表现相当。
这些是 Gemma 4 的主要架构特征:
- 交替的局部滑动窗口和全局全上下文注意力层。较小的稠密模型使用 512 token 的滑动窗口,而较大的模型使用 1024 token。
- 双 RoPE配置:滑动层使用标准 RoPE,全局层使用剪枝 RoPE,以支持更长的上下文。
- 逐层嵌入(PLE):第二个嵌入表,向每个解码器层提供一个小型残差信号。
- 共享 KV 缓存:模型最后 N 层复用来自较早层的键值状态,消除了冗余的 KV 投影。
- 视觉编码器(12B 除外):使用学习到的 2D 位置和多维 RoPE。保留原始宽高比,并可将图像编码为几种不同的 token 预算(70、140、280、560、1120)。
- 音频编码器(E2B、E4B):USM 风格 conformer,其基础架构与 Gemma-3n 中的相同。
- 统一无编码器多模态(仅 12B):12B Unified 变体去掉了单独的视觉和音频编码器,将原始图像块和音频波形直接投影到 LLM 的嵌入空间。参见 统一多模态(12B)。
逐层嵌入(PLE)
较小 Gemma 4 模型最独特的特征之一是逐层嵌入(PLE),该特征此前已在 Gemma-3n 中引入。在标准 transformer 中,每个 token 在输入时获得单个嵌入向量,并且这个相同的初始表示是所有层残差流构建的基础,迫使嵌入预先加载模型可能需要的一切。PLE 在主残差流之外增加了一条并行的、较低维度的条件路径。对于每个 token,它通过组合两个信号为每一层生成一个小型专用向量:一个 token 身份分量(来自嵌入查找)和一个上下文感知分量(来自主嵌入的学习投影)。每个解码器层随后在注意力和前馈之后,使用其对应的向量通过一个轻量级残差块来调制隐藏状态。这为每一层提供了自己的通道,仅在 token 特定信息变得相关时接收它,而不需要将所有内容都打包到一个预先嵌入中。由于 PLE 维度远小于主隐藏大小,这以适度的参数成本增加了有意义的逐层特化。对于多模态输入(图像、音频、视频),PLE 在软 token 合并到嵌入序列之前计算——因为 PLE 依赖于 token ID,而一旦多模态特征替换了占位符,这些 token ID 就会丢失。多模态位置使用 pad token ID,实际上接收中性的逐层信号。
共享 KV 缓存
共享 KV 缓存是一种效率优化,可在推理过程中同时降低计算量和内存占用。模型的最后 num_kv_shared_layers 层不会计算自己的 key 和 value 投影。相反,它们会复用来自同一注意力类型(滑动或全注意力)的最后一个非共享层的 K 和 V 张量。
在实践中,这对质量的影响极小,同时在长上下文生成和设备端使用方面效率要高得多(无论是在内存还是计算方面)。
统一多模态(12B)
Gemma 4 12B 统一模型没有单独的视觉或音频编码器。相反,原始图像块和音频波形通过轻量级线性层直接投影到 LLM 的嵌入空间中,所有模态都流入单个仅解码器 transformer。这降低了多模态延迟,并允许整个模型在一次训练中完成微调。其 checkpoint 大小使其非常适合在消费级硬件上部署。
多模态能力
在我们的测试中,Gemma 4 开箱即支持全面的多模态能力。我们不知道训练数据的具体配比,但我们成功将其用于 OCR、语音转文本、目标检测或指向等任务。它还支持纯文本和多模态函数调用、推理、代码补全与纠正。
这里,我们展示了不同模型规模下的几个推理示例。你可以方便地通过这个 notebook 运行它们。我们鼓励你尝试这些 demo,并在本博客下方分享!
多模态输入顺序
Gemma 4 在训练时采用了一种特定的约定来交错输入模态:
- 图像内容放在提示中文本的前面。
- 音频内容放在提示中文本的后面。
具体来说,以下是为聊天模板准备输入的正确片段:
image_url = "https://hf-mirror.com/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg"
audio_url = "instructions.m4a" # A recording of "describe this image"
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": image_url},
{"type": "text", "text": "Answer in French."},
{"type": "audio", "audio": audio_url},
]
}
]
# Cette image montre un personnage anthropomorphe ressemblant à un lapin, vêtu d'un manteau bleu et d'un pantalon beige, se tenant sur un chemin de terre dans un paysage rural idyllique ...
本文中的音频推理代码片段没有遵循这一约定,因为它们是在此指导方针确认之前编写的。我们保留它们最初编写的样子,以确保结果表格仍然可复现。对于你自己的代码,请优先使用上面的顺序。
目标检测与指向
GUI 检测
我们在不同规模上测试 Gemma 4 的 GUI 元素检测和指向能力,使用以下图像和文本提示:“What's the bounding box for the "view recipe" element in the image?”
对于这个提示,模型会原生以 JSON 格式响应检测到的边界框——无需特定指令或语法约束生成。我们发现坐标参考的是 1000x1000 的图像尺寸,相对于输入维度。
为方便起见,我们在下方可视化输出。我们从返回的 JSON 中解析边界框:json\n[\n {"box_2d": [171, 75, 245, 308], "label": "view recipe element"}\n]\n
| E2B | E4B |
|---|---|
![]() |
![]() |
| 26/A4B | 31B |
![]() |
![]() |
目标检测
我们测试模型检测日常物体,这里我们让它们检测自行车,并比较不同模型的输出。与前一种情况一样,我们从 json 中解析边界框并转换为图像空间坐标。
| E2B | E4B | 26B/A3B | 31B |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
多模态思考与函数调用
我们让 Gemma 4 编写 HTML 代码来重建一个我们用 Gemini 3 制作的页面。你可以在下方找到实现这一点的代码,我们启用思考并让每个模型最多生成 4000 个新 token,以确保万无一失。
| Gemini 生成的网站(参考) | Gemini 复现的图像 |
|---|---|
![]() |
![]() |
推理代码
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "https://hf-mirror.com/datasets/merve/vlm_test_images/resolve/main/landing_page.png",
},
{"type": "text", "text": "Write HTML code for this page."},
],
}
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
enable_thinking=True,
).to(model.device)
output = model.generate(**inputs, max_new_tokens=4000)
input_len = inputs.input_ids.shape[-1]
generated_text_ids = output[0][input_len:]
generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)
result = processor.parse_response(generated_text)
print(result["content"])
| E2B | E4B |
|---|---|
![]() |
![]() |
| 31B | 26/A4B |
|---|---|
![]() |
![]() |
视频理解
较小的 Gemma 4 模型可以接收带音频的视频,而较大的模型可以接收不带音频的视频。虽然这些模型并未专门针对视频进行后训练,但它们能够理解带音频和不带音频的视频。该模型在音频方面尤为擅长
推理代码
messages = [
{
"role": "user",
"content": [
{"type": "video", "url": "https://hf-mirror.com/datasets/merve/vlm_test_images/resolve/main/concert.mp4"},
{"type": "text", "text": "What is happening in the video? What is the song about?"},
],
},
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
load_audio_from_video=True, # disable this for larger models
).to(model.device)
output = model.generate(**inputs, max_new_tokens=200)
input_len = inputs.input_ids.shape[-1]
generated_text_ids = output[0][input_len:]
generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)
print(result["content"])
| 模型 | 输出 |
|---|---|
| E2B(对音频产生了幻觉) | 根据提供的视频,以下是分析:这个视频中发生了什么? 视频记录了一场现场音乐表演,很可能是在一个大型户外音乐节或演唱会上。 * 场景: 场景是一个搭建在户外的大型舞台,从大量的灯光设备、大型音箱以及前景中可见的观众可以看出这一点。 * 表演者: 舞台上有几位音乐人。焦点似乎是一位身穿蓝色衬衫和白色裤子、正在积极表演的主唱/吉他手,他正在弹奏一把原声或电吉他。背景中还可以看到其他音乐人,包括鼓手和贝斯手。 * 氛围: 氛围充满活力且富有戏剧性,以明亮的舞台灯光、强烈的蓝色和白色聚光灯以及大量的舞台烟雾为特征,增添了演唱会的气氛。 * 观众: 前景中充满了观众的后背,表明他们离舞台很近,正投入地观看表演。 这首歌是关于什么的? 视频下方提供的歌词是: > “我不在乎街头 > 对于我所珍视的 > 也许是时候抗议了 |
| E4B ✅ | 视频记录了一支乐队在灯光璀璨、烟雾缭绕的舞台上进行的现场表演,周围环绕着观众。乐队为人群表演并演唱。这首歌似乎讲述了现代生活的挣扎与幻灭,特别是那种被困住的感觉,以及在混乱而令人不堪重负的世界中寻找自身位置的困难。歌词提到了“混凝土街道”、“破碎的承诺”、“当日的风暴”以及在社会压力中寻找自我的困难等主题。 |
| 26/A4B(无音频)✅ | 这个视频展示了一场在夜晚户外演唱会或音乐节上的现场音乐表演。一位身穿蓝色衬衫和白色裤子的男性独唱艺人是画面的中心焦点。他正在一个灯光璀璨的大型舞台上弹奏原声吉他,并对着麦克风演唱。表演由一支乐队伴奏,背景中以及大屏幕上可以看到鼓手和其他音乐人。舞台上充满了富有氛围感的蓝色灯光、烟雾和明亮的聚光灯。视频捕捉了不同的视角,包括从人群中仰望舞台的镜头,以及投射在大型屏幕上的表演者特写。前景中可以看到人群正在观看演出。其中一块屏幕上还显示了“Estrella Damm”品牌名称。 |
| 31B(无音频)✅ | 一位音乐人正在演唱会期间在舞台上表演,弹奏原声吉他并对着麦克风演唱。他身穿蓝色衬衫和白色裤子。舞台上弥漫着富有氛围感的烟雾,并被明亮的蓝色和白色灯光照亮。舞台上还可以看到其他乐队成员,包括一名鼓手和一名键盘手。视频从观众的视角展示了这位音乐人,有些镜头聚焦于他,另一些则展示了舞台侧面的巨大屏幕,屏幕上播放着表演者和观众的特写。 |
图像描述
我们在图像描述任务上测试了所有模型。所有检查点的表现都非常出色,能够准确捕捉复杂场景中的细微差别。 以下是使用的图像,提示词为“为这张图像写一段详细的描述。”。
推理代码
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://hf-mirror.com/datasets/merve/vlm_test_images/resolve/main/bird.png"},
{"type": "text", "text": "Write single detailed caption for this image."},
],
},
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
).to(model.device)
output = model.generate(**inputs, max_new_tokens=512)
input_len = inputs.input_ids.shape[-1]
generated_text_ids = output[0][input_len:]
generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)
result = processor.parse_response(generated_text)
print(result["content"])
| 模型 | 输出 |
|---|---|
| E2B ✅ | 中景镜头捕捉到一只饱经风霜的海鸥栖息在石质基座上,所在之处似乎是一个熙熙攘攘的欧洲广场,画面右侧是一座宏伟的古典风格建筑,带有华丽的立柱和建筑细节。背景中,一座低矮的浅色建筑横贯中景,两侧有一些绿色植物,还能隐约看到其他建筑,包括一座赤陶屋顶的建筑。前景中可以看到现代公交站或候车亭的一部分,带有指示路线的标牌,整个场景沐浴在明亮日光下,天空苍白。 |
| E4B ✅ | 一只孤零零的海鸥栖息在熙熙攘攘的欧洲广场上一座灰色石质基座顶部,画面右侧是一座宏伟的古典历史建筑,与背景中更现代的矮层建筑形成对比,天空明亮而朦胧。 |
| 26B/A4B ✅ | 全景镜头显示一只白棕色海鸥栖息在意大利威尼斯的灰色柱子上。海鸥面朝左侧,喙指向画面边缘。它身后是一座浅灰色两层建筑,有几扇深色矩形窗户。海鸥右侧是一座巨大的白色建筑,带有立柱和精美的雕刻。天空是清澈的浅蓝色。光线明亮而均匀,表明是白天。 |
| 31B ✅ | 高角度中景镜头显示一只白灰色海鸥栖息在意大利威尼斯的灰色混凝土柱上。海鸥面朝左侧,身体略微转向镜头。它白色的头部、颈部和胸部与灰色的翅膀和背部形成对比。海鸥的橙色喙微微张开。柱子是浅灰色混凝土圆柱,表面有风化纹理。背景中有几座建筑。左侧是一座长而低矮的白色建筑,有一排小矩形窗户。中央是一丛绿树。右侧是一座红色建筑,带瓦屋顶和几扇小矩形窗户。更右边是一座巨大华丽的白色石质建筑,带有数根立柱和雕塑。天空是淡蓝色,光线明亮清晰。左下角有一辆黄色公交车,上面用黑色字母印着“Ferrovia”。背景中有几个人在行走,但他们很小且失焦。 |
音频问答
这些模型经过训练,可以回答有关音频中语音的问题。音乐和非语音声音不属于训练数据的一部分。
推理代码
messages = [
{
"role": "user",
"content": [
{"type": "audio", "url": "https://hf-mirror.com/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"},
{"type": "text", "text": "Can you describe this audio in detail?"},
],
},
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
).to(model.device)
output = model.generate(
**inputs,
max_new_tokens=1000,
do_sample=False,
)
print(processor.decode(output[0], skip_special_tokens=True))
| 模型 | 输出 |
|---|---|
| E2B | 这段音频是个人反思。说话者正在谈论他们向全国发表的最后告别演讲,演讲是在芝加哥发表的。他们感谢与美国人民的对话,并指出尽管没有面对面见过他们,甚至没有向他们打过招呼,但在客厅、学校、农场、工厂车间、餐馆和军事哨所等各种场合中的这些互动一直支撑着他们。 |
| E4B | 这段音频是一段演讲节选,演讲者在芝加哥向全国发表告别演说。演讲者回顾了自己的执政时光,对在各种场合与美国人进行的对话表示感谢,这些场合包括客厅、学校、农场、工厂、餐馆和遥远的军事前哨。语气沉思而充满感激,强调了这些互动在其政治旅程中的重要性。 |
如果你想做转录,这里有一个示例:
推理代码
messages = [
{
"role": "user",
"content": [
{"type": "audio", "url": "https://hf-mirror.com/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"},
{"type": "text", "text": "Transcribe the audio?"},
],
},
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
).to(model.device)
output = model.generate(
**inputs,
max_new_tokens=1000,
do_sample=False,
)
print(processor.decode(output[0], skip_special_tokens=True))
| 模型 | 输出 |
|---|---|
| E2B | 本周我前往芝加哥,遵循我前面各位总统的传统,向全国发表我的最后告别演说。这是一个说谢谢的机会。无论我们是否意见一致,还是几乎从未达成共识,我与你们美国人民的对话,在客厅和学校里,在农场和工厂车间里,在餐馆和遥远的军事前哨里,所有这些对话正是让我保持诚实的原因 |
| E4B | 本周我前往芝加哥,遵循我前面各位总统的传统,向全国发表我的最后告别演说。这是一个说谢谢的机会。无论我们是否意见一致,还是几乎从未达成共识,我与你们美国人民的对话,在客厅和学校里,在农场和工厂车间里,在餐馆和遥远的军事前哨里,所有这些对话正是让我保持诚实的原因。 |
多模态函数调用
我们通过要求获取图像中所示地点的天气来测试模型。
推理代码
import re
WEATHER_TOOL = {
"type": "function",
"function": {
"name": "get_weather",
"description": "Gets the current weather for a specific location.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "The city name"},
},
"required": ["city"],
},
},
}
tools = [WEATHER_TOOL]
messages = [
{"role": "user", "content": [
{"type": "text", "text": "What is the city in this image? Check the weather there right now."},
{"type": "image", "image": "https://hf-mirror.com/datasets/merve/vlm_test_images/resolve/main/thailand.jpg"},
]},
]
inputs = processor.apply_chat_template(
messages,
tools=[WEATHER_TOOL],
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
enable_thinking=True,
).to(model.device)
output = model.generate(**inputs, max_new_tokens=1000)
input_len = inputs.input_ids.shape[-1]
generated_text_ids = output[0][input_len:]
generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)
result = processor.parse_response(generated_text)
print(result["content"])
| 模型 | 输出 |
|---|---|
| E2B | 分析请求: 用户提供了一张图像并提出了两个问题:\n * “这张图像中的城市是哪里?” * “查一下那里现在的天气。”\n\n2. 分析图像: 图像显示了一座巨大、华丽、高耸的建筑,具有寺庙建筑的特征,可能位于东南亚(从风格来看)。它似乎是一个著名的地标。 3. 识别地标/地点(内部知识/视觉线索): 该建筑与泰国曼谷等地常见的佛塔/窣堵坡非常相似(例如郑王庙或类似建筑)。\n\n4. 确定城市: 根据视觉证据,该地点极有可能是泰国曼谷。\n\n5. 检查可用工具: 可用的工具是get_weather(city: STRING)。 6. **制定计划:**\n * 第1步:从图像中识别城市(曼谷)。\n * 第2步:使用get_weather工具并传入识别出的城市。\n\n7. 构建工具调用: get_weather(city="Bangkok")\n\n8. 生成响应: 模型应首先说明识别出的城市,然后调用工具获取天气。(自我纠正:如果需要外部信息,模型必须以正确的格式调用工具。)call:get_weather{city:Bangkok} |
| E4B | '1. 分析请求: 用户提供了一张图片并提出了两个问题:
a. 识别图片中的城市。
b. 查询该城市当前的天气。
2. 分析图片: 图片展示了一个非常独特、华丽的塔/尖顶结构,具有泰国建筑的特征(具体来说,是 chedi 或 prang)。
3. 确定城市识别(内部知识/视觉识别): 基于建筑风格,该结构强烈类似于泰国著名的寺庙,如曼谷的 Wat Arun。
4. 评估工具可用性: 我有一个可用的工具:get_weather(city: STRING)。此工具需要城市名称作为输入。
5. **制定计划:**
a. 我需要城市名称来使用 get_weather 工具。
b. 我必须先从图片中识别出城市。
c. 由于我的内部知识表明是曼谷,我将基于此假设继续,但我必须承认,仅凭图片我无法 确定性地 证明位置。
6. 执行步骤 1(城市识别): 根据建筑的视觉证据,假设城市是曼谷。
7. 执行步骤 2(工具调用生成): 使用 get_weather 工具,以 "Bangkok" 作为 city 参数。
8. 构建响应: 以 JSON 格式生成适当的工具调用。', 'answer': '<|tool_call>call:get_weather{city:<|"|>Bangkok<|"|>}<tool_call|>' |
| 31B | 用户想知道图片中的城市以及那里的当前天气。 1. 分析图片: 图片展示了华丽的、尖顶状结构(prangs),具有泰国寺庙建筑的特征。具体来说,这些看起来像泰国曼谷 Wat Phra Kaew(玉佛寺)或 Wat Pho 的 prangs。这种风格非常具有曼谷皇家寺庙建筑群的特色。 2. 识别城市: 基于建筑风格,城市是曼谷。 3. 查找天气: 我需要调用 get_weather 工具,参数为 city="Bangkok"。call:get_weather{city:Bangkok} |
| 26/A4B | 图片展示了几座高大、华丽的塔(prangs),典型的泰国佛教寺庙建筑。具体来说,这些看起来像泰国曼谷大皇宫或 Wat Phra Kaew 内的结构。风格无疑是泰式的。我将通过查看具体的塔来确认这一点。这些非常具有标志性。
2. 确认位置: 图片展示了曼谷大皇宫建筑群的元素。
3. 获取天气信息: 一旦城市被识别为曼谷,我将使用 get_weather 工具,参数为 city='Bangkok'。call:get_weather{city:Bangkok} |
随处部署
Gemma 4 从第一天起就支持许多开源推理引擎,非常适合工具调用和代理!我们还发布了 ONNX 检查点,可以在许多硬件后端上运行,支持边缘设备或浏览器中的用例!
transformers
Gemma 4 从一开始就提供一流的 transformers 支持 🤗。这种集成允许将模型与其他库(如 bitsandbytes、PEFT 和 TRL)一起使用。请确保安装最新版本的 transformers。
pip install -U transformers
使用小型 Gemma 4 模型进行推理的最简单方法是通过 any-to-any 管道。您可以按如下方式初始化它。
from transformers import pipeline
pipe = pipeline("any-to-any", model="google/gemma-4-e2b-it")
然后,您可以按如下方式传入图像和文本。
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "https://hf-mirror.com/datasets/merve/vlm_test_images/resolve/main/thailand.jpg",
},
{"type": "text", "text": "Do you have travel advice going to here?"},
],
}
]
output = pipe(messages, max_new_tokens=100, return_full_text=False)
output[0]["generated_text"]
# Based on the image, which appears to show a magnificent, ornate **Buddhist temple or pagoda**, likely in Southeast Asia (such as Thailand, Myanmar, or Cambodia), here is some general travel advice..
在使用视频进行推理时,您可以使用 load_audio_from_video 参数包含音轨。
messages = [
{
"role": "user",
"content": [
{
"type": "video",
"image": "https://hf-mirror.com/datasets/merve/vlm_test_images/resolve/main/rockets.mp4",
},
{"type": "text", "text": "What is happening in this video?"},
],
}
]
pipe(messages, load_audio_from_video=True)
再往下深入一层,你可以使用 AutoModelForMultimodalLM 类加载 Gemma 4,这在微调时尤其有用。内置的聊天模板会负责正确地格式化输入,请务必使用它,以免在手动构建提示词时出现难以察觉的错误。
推理代码
from transformers import AutoModelForMultimodalLM, AutoProcessor
model = AutoModelForMultimodalLM.from_pretrained("google/gemma-4-E2B-it", device_map="auto")
processor = AutoProcessor.from_pretrained("google/gemma-4-E2B-it")
messages = [
{
"role": "user",
"content": [
{
"type": "video",
"image": "https://hf-mirror.com/datasets/merve/vlm_test_images/resolve/main/rockets.mp4",
},
{"type": "text", "text": "What is happening in this video?"},
],
}
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt"
).to(model.device)
generated_ids = model.generate(**inputs, max_new_tokens=128)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
Llama.cpp
Gemma 4 模型从一开始就在 llama.cpp 中支持图像+文本!这让你可以在所有喜爱的本地应用中使用 Gemma 4:llama-cpp server、lmstudio、Jan,以及像 Pi 这样的编码代理,并跨多种后端(如 Metal 和 CUDA)。
你可以按如下方式安装 llama-cpp。
curl -LsSf https://llama.app/install.sh | sh
然后你可以启动一个与 OpenAI API 兼容的服务器。将命令末尾的量化方案替换为你想要的精度。
llama serve -hf ggml-org/gemma-4-E2B-it-GGUF
查看此链接了解更多关于将 llama.cpp 与不同编码代理和本地应用结合的选项。在此合集中找到所有 GGUF 检查点。
接入你的本地代理
我们努力确保新模型能在本地与 openclaw、hermes、pi 和 open code 等代理配合使用。这一切都归功于 llama.cpp!运行以下命令即可立即试用 Gemma 4。
首先,启动你的本地服务器:
llama serve -hf ggml-org/gemma-4-26b-a4b-it-GGUF:Q4_K_M
对于 hermes:
hermes model
对于 openclaw:
openclaw onboard
对于 pi,定义一个 ~/.pi/agent/models.json:
{
"providers": {
"llama-cpp": {
"baseUrl": "http://localhost:8080/v1",
"api": "openai-completions",
"apiKey": "none",
"models": [
{
"id": "ggml-org-gemma-4-26b-4b-gguf"
}
]
}
}
}
对于 open code,定义一个 ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"llama.cpp": {
"npm": "@ai-sdk/openai-compatible",
"name": "llama server (local)",
"options": {
"baseURL": "http://127.0.0.1:8080/v1"
},
"models": {
"gemma-4-26b-4b-it": {
"name": "Gemma 4 (local)",
"limit": {
"context": 128000,
"output": 8192
}
}
}
}
}
}
transformers.js
transformers.js 让 Gemma 4 可以直接在浏览器中运行。你可以查看模型卡片,在此处详细了解纯文本、图像与文本、音频与文本推理。我们还发布了一个演示,让你在此处测试该模型。
MLX
使用开源的 mlx-vlm 库可以获得 Gemma 4 的完整多模态支持。以下是如何让模型描述一张图像:
pip install -U mlx-vlm
mlx_vlm.generate \
--model google/gemma-4-E4B-it \
--image https://hf-mirror.com/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg \
--prompt "Describe this image in detail"
mlx-vlm 支持 TurboQuant,它在提供与未压缩基线相同精度的同时,将活跃内存使用减少约 4 倍,并且端到端运行快得多。这使得在 Apple Silicon 上进行长上下文推理变得切实可行,而无需牺牲质量。像这样使用它:
mlx_vlm.generate \
--model "mlx-community/gemma-4-26b-a4b-it-4bit" \
--prompt "Your prompt here" \
--kv-bits 3.5 \
--kv-quant-scheme turboquant
关于音频示例和更多细节,请查看MLX 合集。
Mistral.rs
mistral.rs 是一个 Rust 原生推理引擎,从第一天起就支持 Gemma 4 的所有模态(文本、图像、视频、音频),并内置工具调用和代理功能。安装 mistral.rs:
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/EricLBuehler/mistral.rs/master/install.sh | sh # Linux/macOS
irm https://raw.githubusercontent.com/EricLBuehler/mistral.rs/master/install.ps1 | iex # Windows
然后你可以启动一个与 OpenAI 兼容的 HTTP 服务器:
mistralrs serve mistralrs-community/gemma-4-E4B-it-UQFF --from-uqff 8
或者,使用交互模式:
mistralrs run -m google/gemma-4-E4B-it --isq 8 --image image.png -i "Describe this image in detail."
mistralrs run -m google/gemma-4-E4B-it --isq 8 --audio audio.mp3 -i "Transcribe this fully."
多令牌预测草稿模型
Google 发布了适用于 Gemma 4 系列的多令牌预测(MTP)草稿模型:小型助手模型,通过推测解码加速推理。草稿模型一次提出多个未来令牌,目标模型在单次前向传播中验证它们。你获得与目标模型相同的输出,只是更快——没有质量损失,推理行为也没有改变。根据硬件、批大小和工作负载,报告的端到端加速最高可达约 3 倍。
助手模型适用于所有四种 Gemma 4 规模(E2B、E4B、26B A4B、31B)。它们与目标模型共享 KV 缓存以避免重新计算上下文,较小的边缘变体还额外使用嵌入聚类技巧来保持设备上的内存和计算开销较低。
在 Gemma 4 集合和 mlx-community 集合中查找检查点。
DiffusionGemma:通过扩散进行文本生成
除了自回归的 Gemma 4 系列之外,Google DeepMind 还发布了 DiffusionGemma,这是一个多模态模型,它使用离散扩散来生成文本,而不是逐词元自回归。它构建在相同的 26B A4B 混合专家(Mixture-of-Experts)基础上(总计 25.2B / 激活 3.8B 参数,128 个专家中激活 8 个,外加 1 个共享专家),接受文本和图像输入,生成文本,并支持高达 256K 上下文——所有这些都在相同的 Apache 2.0 许可下。
标准因果语言模型一次只发出一个词元,而 DiffusionGemma 并行地对整块词元进行去噪。其架构是编码器-解码器:自回归编码器预填充提示并构建 KV 缓存,而解码器对一块 256 个词元的“画布”应用双向注意力。在多画布采样过程中,模型使用扩散采样器迭代地对整块画布进行去噪;一旦一块画布最终确定,它就会被编码并追加到 KV 缓存中,然后开始下一块画布。这种块自回归方法提高了生成速度。
其最突出的优势是吞吐量:并行去噪每次前向传递大约生成 15–20 个词元,在低批量大小下(H100,FP8),每用户生成速度超过 1100 词元/秒。推理计算也是自适应的——更简单的提示和像代码这样的结构化任务需要更少的去噪步骤,因此每秒词元数会随任务复杂度而变化。它保留了更广泛的 Gemma 4 工具集:思考模式、函数调用、长上下文、原生系统提示,以及在可变宽高比和分辨率下的图像理解(OCR、文档解析、目标检测、指向)。
基准测试显示了速度与评估指标之间预期中的权衡——DiffusionGemma 在大多数任务上落后于自回归的 26B A4B(例如 MMLU Pro 77.6% 对 82.6%,AIME 2026 69.1% 对 88.3%,GPQA Diamond 73.2% 对 82.3%),以换取其巨大的速度优势,同时在少数任务上略胜一筹(HLE 无工具 11.0% 对 8.7%)。
上手体验看起来就像 Gemma 4 的其余部分一样,通过专用的扩散类:
from transformers import DiffusionGemmaForBlockDiffusion, AutoProcessor
MODEL_ID = "google/diffusiongemma-26B-A4B-it"
processor = AutoProcessor.from_pretrained(MODEL_ID)
model = DiffusionGemmaForBlockDiffusion.from_pretrained(
MODEL_ID,
dtype="auto",
device_map="auto",
)
message = [{"role": "user", "content": "Why is the sky blue?"}]
input_ids = processor.apply_chat_template(
message,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt",
).to(model.device)
output = model.generate(**input_ids, max_new_tokens=512)
text = processor.decode(output[0], skip_special_tokens=False)
为了获得最佳结果,Google 推荐使用熵约束(Entropy-Bounded,EB)采样器并配合自适应停止(最多 48 个去噪步骤,温度从 0.8 → 0.4 衰减,以及用于词元选择的 0.1 熵界限)。与 Gemma 4 一样,请将图像内容放在提示中文本的前面,并使用 <|think|> 控制词元切换推理。
面向所有人的微调
Gemma 4 模型非常适合在你最喜欢的工具和平台中、以任意预算进行微调。
使用 TRL 微调
Gemma 4 完全支持使用 TRL 进行微调。为庆祝这一点,TRL 已升级,支持在与环境交互时进行多模态工具响应,这意味着模型现在可以在训练期间从工具接收图像,而不仅仅是文本。
为了展示这一点,我们构建了一个示例训练脚本,让 Gemma 4 在 CARLA 模拟器中学习驾驶。模型通过摄像头观察道路,决定该怎么做,并从结果中学习。训练之后,它能稳定地变道以避让行人。同样的方法适用于任何需要模型观察并行动的任务:机器人技术、网页浏览或其他交互式环境。
开始使用:
# pip install git+https://github.com/huggingface/trl.git
python examples/grpo_carla/carla_vlm_gemma.py \
--env-urls https://sergiopaniego-carla-env.hf.space \
https://sergiopaniego-carla-env-2.hf.space \
--model google/gemma-4-E2B-it
在此处找到示例 here。
在 Vertex AI 上使用 TRL 进行微调
此外,我们还准备了一个示例,展示如何在 Vertex AI 上使用 TRL 通过 SFT 微调 Gemma 4,以展示如何扩展函数调用能力,同时冻结视觉和音频塔。示例包括如何构建带有最新 Transformers、TRL 等并支持 CUDA 的自定义 Docker 容器并部署到 Google Cloud,以及如何通过 Vertex AI Serverless Training Jobs 运行它。
# pip install google-cloud-aiplatform --upgrade --quiet
from google.cloud import aiplatform
aiplatform.init(
project="<PROJECT_ID>",
location="<LOCATION>",
staging_bucket="<BUCKET_URI>",
)
job = aiplatform.CustomContainerTrainingJob(
display_name="gemma-4-fine-tuning",
container_uri="<CONTAINER_URI>",
command=["python", "/gcs/gemma-4-fine-tuning/train.py"],
)
job = job.submit(
replica_count=1,
machine_type="a3-highgpu-1g",
accelerator_type="NVIDIA_H100_80GB",
accelerator_count=1,
base_output_dir="<BUCKET_URI>/output-dir",
environment_variables={
"MODEL_ID": "google/gemma-4-E2B-it",
"HF_TOKEN": <HF_TOKEN>,
},
boot_disk_size_gb=500,
)
你可以在“HF Mirror on Google Cloud”文档中找到完整示例:https://hf.co/docs/google-cloud/examples/vertex-ai-notebooks-fine-tune-gemma-4。
使用 Unsloth Studio 进行微调
如果你想在 UI 中微调并运行 Gemma 4 模型,可以试试 Unsloth Studio。它可以在本地或 Google Colab 上运行。首先,安装并启动应用:
# install unsloth studio on MacOS, Linux, WSL
curl -fsSL https://unsloth.ai/install.sh | sh
# install unsloth studio on Windows
irm https://unsloth.ai/install.ps1 | iex
# launch unsloth studio
unsloth studio -H 0.0.0.0 -p 8888
# Search for for a Gemma 4 model like google/gemma-4-E2B-it
然后从 hub 中选择任意 Gemma 4 模型。
试试 Gemma 4
我们已推出演示,供你试用不同的 Gemma 4 模型。我们提供了基于 transformers 实现的 E4B、12B Unified、26B/A4B MoE 和 31B dense 模型演示。还有一个使用 transformers.js 的 WebGPU 演示 🚀
基准测试结果
Gemma 4 模型在从推理和编码到视觉和长上下文任务的各种基准测试中展现出卓越的性能。下图展示了模型性能与规模的对比,Gemma 4 模型构成了令人印象深刻的帕累托前沿:
来源:Google(blog.google)
以下是指令微调模型的详细基准测试结果:
| 基准测试 | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 12B Unified | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B(无思考) |
|---|---|---|---|---|---|---|
| 推理与知识 | ||||||
| MMLU Pro | 85.2% | 82.6% | 77.2% | 69.4% | 60.0% | 67.6% |
| AIME 2026 无工具 | 89.2% | 88.3% | 77.5% | 42.5% | 37.5% | 20.8% |
| GPQA Diamond | 84.3% | 82.3% | 78.8% | 58.6% | 43.4% | 42.4% |
| Tau2(3 次平均) | 76.9% | 68.2% | 69.0% | 42.2% | 24.5% | 16.2% |
| BigBench Extra Hard | 74.4% | 64.8% | 53.0% | 33.1% | 21.9% | 19.3% |
| MMMLU | 88.4% | 86.3% | 83.4% | 76.6% | 67.4% | 70.7% |
| 编码 | ||||||
| LiveCodeBench v6 | 80.0% | 77.1% | 72.0% | 52.0% | 44.0% | 29.1% |
| Codeforces ELO | 2150 | 1718 | 1659 | 940 | 633 | 110 |
| HLE 无工具 | 19.5% | 8.7% | 5.2% | - | - | - |
| HLE 带搜索 | 26.5% | 17.2% | - | - | - | - |
| 视觉 | ||||||
| MMMU Pro | 76.9% | 73.8% | 69.1% | 52.6% | 44.2% | 49.7% |
| OmniDocBench 1.5(编辑距离) | 0.131 | 0.149 | 0.164 | 0.181 | 0.290 | 0.365 |
| MATH-Vision | 85.6% | 82.4% | 79.7% | 59.5% | 52.4% | 46.0% |
| MedXPertQA MM | 61.3% | 58.1% | 48.7% | 28.7% | 23.5% | - |
| 音频 | ||||||
| CoVoST | - | - | 38.5* | 35.54 | 33.47 | - |
| FLEURS(越低越好) | - | - | 0.069* | 0.08 | 0.09 | - |
| 长上下文 | ||||||
| MRCR v2 8 needle 128k(平均) | 66.4% | 44.1% | 43.4% | 25.4% | 19.1% | 13.5% |
*不包括中文。
致谢
这项工作离不开 Google 在模型产物上的大量贡献,也离不开其为将模型贡献给 transformers 以实现标准化所付出的巨大努力。开源生态系统如今更加完整,拥有了一个能力强大、许可自由的开源模型。 Gemma 4 的 transformers 集成由 Cyril、Raushan、Eustache、Arthur、Lysandre 负责。我们感谢 Joshua 完成 transformers.js 集成和演示,Eric 完成 mistral.rs 集成,Son 完成 Llama.cpp,Prince 完成 MLX,Quentin、Albert 和 Kashif 完成 TRL,Adarsh 完成 SGLang transformers 后端,以及 Toshihiro 构建了多个演示。
来源:Hugging Face Blog · hf-mirror.com
















