Gemma 4支持多模态理解并优化了边缘设备部署,使开发者可在终端运行前沿AI能力。这是多模态开源模型的重要进展。
这些模型真的很强劲:具有 Apache 2 许可证的真正开放模型、在排序前沿竞技场评分中保持高质量、支持音频的多模态、以及可在任何地方使用的各种尺寸,包括设备端部署。Gemma 4 建立在之前版本的进步基础上,并将它们结合在一起。在我们对预发布检查点的测试中,我们对它们的能力印象深刻,以至于我们很难找到好的微调示例,因为它们开箱即用时已经表现得非常好。
我们与 Google 和社区合作,在各处提供这些模型:transformers、llama.cpp、MLX、WebGPU、Rust;应有尽有。这篇博文将向你展示如何使用你最喜欢的工具来构建,所以让我们知道你的想法!
Per-Layer Embeddings (PLE)
Shared KV Cache
transformers
Llama.cpp
插入你的本地 Agent
transformers.js
MLX
微调与 TRL
TRL 在 Vertex AI 上的微调
Unsloth Studio 微调
类似于 Gemma-3n,Gemma 4 支持图像、文本和音频输入,并生成文本响应。文本解码器基于 Gemma 模型,支持长上下文窗口。图像编码器与 Gemma 3 中的相似,但有两个关键改进:可变宽高比,以及可配置的图像 Token 输入数量,以找到速度、内存和质量之间的平衡点。所有模型都支持图像(或视频)和文本输入,而小型变体(E2B、E4B)和 12B 统一模型也支持音频。
Gemma 4 有五种尺寸,均包括基础版本和指令微调版本:
Gemma 4 利用了之前 Gemma 版本和其他开放模型中使用的多个架构组件,并排除了复杂或不确定的特性,如 Altup。这个组合是一种设计混合,具有高度的库和设备兼容性,能够有效支持长上下文和 Agent 用例,同时非常适合量化。
如上面的基准所示,这个特性组合(结合训练数据和方法)使得 31B 密集模型在 LMArena 评分(仅文本)上达到约 1452,而 26B MoE 则以仅 4B 活跃参数达到 1441 🤯。如我们将看到的那样,多模态操作的效果与文本生成相当,至少在非正式和主观测试中是如此。
这些是 Gemma 4 中的主要架构特性:
交替的本地滑动窗口和全局完整上下文注意力层。较小的密集模型使用 512 Token 的滑动窗口,而较大的模型使用 1024 Token。
双 RoPE 配置:滑动层使用标准 RoPE,全局层使用修剪的 RoPE,以支持更长的上下文。
Per-Layer Embeddings (PLE):第二个嵌入表,为每个解码层提供一个小的残差信号。
Shared KV Cache:模型的最后 N 层重用早期层的键值状态,消除冗余的 KV 投影。
Vision encoder(除 12B 外):使用学习的 2D 位置和多维 RoPE。保留原始宽高比,可以将图像编码为几种不同的 Token 预算(70、140、280、560、1120)。
Audio encoder(E2B、E4B):USM 风格的 conformer,与 Gemma-3n 中的相同。
统一无编码器多模态(仅 12B):12B 统一变体去掉了单独的 Vision 和 Audio 编码器,直接将原始图像补丁和音频波形投影到 LLM 的嵌入空间。参见 Unified Multimodal (12B)。
较小 Gemma 4 模型中最具特色的功能之一是 Per-Layer Embeddings (PLE),它之前在 Gemma-3n 中引入过。在标准 transformer 中,每个 Token 在输入时获得一个单一的嵌入向量,相同的初始表示是整个残差流在各个层中构建的基础,这强制嵌入在前期就要加载模型可能需要的所有内容。PLE 在主残差流旁边添加了一个并行的、低维度的条件通道。对于每个 Token,它通过组合两个信号为每一层产生一个小的专用向量:一个 Token 身份组件(来自嵌入查找)和一个上下文感知组件(来自主嵌入的学习投影)。然后,每个解码层使用其对应的向量通过注意力和前馈后的轻量级残差块来调制隐藏状态。这给每一层提供了自己的通道,仅在变得相关时接收 Token 特定的信息,而不是要求所有内容都打包到单个前期嵌入中。因为 PLE 维度远小于主隐藏大小,这以适度的参数成本添加了有意义的按层专门化。对于多模态输入(图像、音频、视频),PLE 在软 Token 合并到嵌入序列之前计算——因为 PLE 依赖于一旦多模态特性替换占位符就会丢失的 Token ID。多模态位置使用填充 Token ID,有效地接收中性的按层信号。
Shared KV Cache 是一个效率优化,在推理过程中减少计算和内存。模型的最后 num_kv_shared_layers 层不计算自己的键和值投影。相反,它们重用来自同一注意力类型(滑动或完整)的最后一个非共享层的 K 和 V 张量。
实际上,这对质量的影响最小,同时在长上下文生成和设备端使用方面效率更高(就内存和计算而言)。
Gemma 4 12B 统一模型没有单独的 Vision 或 Audio 编码器。相反,原始图像补丁和音频波形通过轻量级线性层直接投影到 LLM 的嵌入空间中,所有模态流入单个仅解码器 Transformer。这减少了多模态延迟,并允许整个模型在一次传递中进行微调。检查点大小使其便于在消费者硬件上部署。
我们在测试中看到 Gemma 4 开箱即支持全面的多模态能力。我们不知道训练混合是什么,但我们在使用它进行 OCR、语音转文本、目标检测或指向等任务时取得了成功。它还支持仅文本和多模态函数调用、推理、代码完成和纠正。
在这里,我们展示了跨不同模型尺寸的几个推理示例。你可以用这个 notebook 方便地运行它们。我们鼓励你尝试演示并在这个博客下方分享它们!
Gemma 4 用特定的约定进行了训练,以交错输入模态:
图像内容在你的提示中排在文本之前。
音频内容在你的提示中排在文本之后。
具体来说,这是一个正确的片段,为聊天模板准备输入:
image_url = "https://huggingface.co/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 ...
这篇文章中的音频推理片段不遵循这个约定,因为它们是在此指导被确认之前编写的。我们保持它们原本的样子,以便结果表保持可重现。对于你自己的代码,优先使用上面的顺序。
我们用以下图像和文本提示在不同尺寸上测试 Gemma 4 的 GUI 元素检测和指向:"图像中'view recipe'元素的边界框是什么?"
使用这个提示,模型原生以 JSON 格式响应,检测到的边界框——无需特定的指令或语法约束生成。我们发现坐标指的是 1000x1000 的图像大小,相对于输入维度。
我们在下面为你的便利可视化了输出。我们从返回的 JSON 中解析边界框:json\n[\n {"box_2d": [171, 75, 245, 308], "label": "view recipe element"}\n]\n
我们在测试模型以检测日常物体,这里我们要求它们检测自行车并比较不同的模型输出。与前面的情况一样,我们从 JSON 中解析边界框并转换为图像空间坐标。
我们要求 Gemma 4 编写 HTML 代码来重新构建一个我们用 Gemini 3 制作的页面。下面你可以找到执行此操作的代码,我们启用思考并要求每个模型生成最多 4000 个新 Token,以确保万无一失。
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "https://huggingface.co/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"])
较小的 Gemma 4 模型可以接收带音频的视频,而较大的模型可以接收不带音频的视频。虽然这些模型并未明确针对视频进行后期训练,但它们可以理解带或不带音频的视频。该模型在音频方面特别强大
messages = [
{
"role": "user",
"content": [
{"type": "video", "url": "https://huggingface.co/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"])
我们已在字幕上测试了所有模型。所有检查点表现都非常好,准确捕捉了复杂场景中的细微差别。这是我们使用的图像,提示是"为此图像写一个详细的单个字幕。"。
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://huggingface.co/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"])
这些模型被训练来回答关于音频中语音的问题。音乐和非语音声音不是训练数据的一部分。
messages = [
{
"role": "user",
"content": [
{"type": "audio", "url": "https://huggingface.co/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))
如果你想进行转录,这是一个示例:
messages = [
{
"role": "user",
"content": [
{"type": "audio", "url": "https://huggingface.co/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))
我们通过要求获取图像中显示的地点的天气来测试模型。
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://huggingface.co/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"])
Gemma 4 为许多开源推理引擎提供了第一天支持,是工具调用和 Agent 的理想选择!我们还发布了可在许多硬件后端上运行的 ONNX 检查点,允许在边缘设备或浏览器中的用例!
Gemma 4 从一开始就具有一流的 transformers 支持 🤗。此集成允许将模型与其他库(如 bitsandbytes、PEFT 和 TRL)一起使用。确保安装最新版本的 transformers。
pip install -U transformers
使用小型 Gemma 4 模型进行推理的最简单方法是通过任意对任意管道。你可以按如下方式初始化它。
from transformers import pipeline
pipe = pipeline("any-to-any", model="google/gemma-4-e2b-it")
然后你可以传入图像和文本如下。
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "https://huggingface.co/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://huggingface.co/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://huggingface.co/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)
Gemma 4 模型在 llama.cpp 中开箱即支持图像和文本!这解锁了在你所有最喜欢的本地应用程序中使用 Gemma 4:llama-cpp 服务器、lmstudio、Jan 以及编码 Agent(如 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 与不同编码 Agent 和本地应用程序结合的选项。在此集合中找到所有 GGUF 检查点。
我们致力于确保新模型在本地与 openclaw、hermes、pi 和 open code 等 Agent 一起工作。这一切都要感谢 llama.cpp!运行以下命令立即尝试 Gemma 4。
首先,启动你的本地服务器:
llama serve -hf ggml-org/gemma-4-26b-a4b-it-GGUF:Q4_K_M
hermes model
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 使得在浏览器中直接运行 Gemma 4 成为可能。你可以查看模型卡以详细了解仅文本、图像和文本、音频和文本推理。我们还为你发布了一个演示来测试模型。
使用开源 mlx-vlm 库可以获得 Gemma 4 的完整多模态支持。以下是如何要求模型描述图像的方法:
pip install -U mlx-vlm
mlx_vlm.generate \
--model google/gemma-4-E4B-it \
--image https://huggingface.co/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 是一个 Rust 原生推理引擎,对所有模态(文本、图像、视频、音频)的 Gemma 4 提供第一天支持,并内置工具调用和 Agent 功能。安装 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 家族发布了多 Token 预测(MTP)drafters:可以通过推测解码加速推理的小型助手模型。Drafter 一次提议多个未来 Token,目标模型在单个前向传递中验证它们。你获得与目标模型相同的输出,只是速度更快——没有质量损失,没有推理行为的改变。报告的端到端加速达到 ~3 倍,取决于硬件、批量大小和工作负载。
Assistant 可用于所有四个 Gemma 4 尺寸(E2B、E4B、26B A4B、31B)。它们与目标模型共享 KV 缓存以避免重新计算上下文,较小的边缘变体还额外使用嵌入器聚类技巧来保持设备端的内存和计算较低。
在 Gemma 4 集合和 mlx-community 集合中找到检查点。
除了自回归 Gemma 4 家族外,Google DeepMind 正在发布 DiffusionGemma,一个使用离散扩散而不是逐 Token 自回归生成文本的多模态模型。它建立在相同的 26B A4B 混合专家基础上(25.2B 总计 / 3.8B 活跃参数,128 个中有 8 个活跃专家加 1 个共享),接受文本和图像输入,生成文本,并支持最多 256K 上下文——全部在相同的 Apache 2.0 许可证下。
在标准因果 LM 一次发出一个 Token 的地方,DiffusionGemma 并行去噪整个 Token 块。架构是编码器-解码器:自回归编码器预填充提示并构建 KV 缓存,而解码器在 256 Token 的"画布"上应用双向注意力。在多画布采样期间,模型通过扩散采样器迭代地去噪完整画布;一旦画布最终确定,它就被编码并附加到 KV 缓存,然后