欢迎 Gemma 3:Google 全新的多模态、多语言、长上下文开放 LLM

发布日期:2025 年 3 月 12 日
在 GitHub 上更新

TL;DR

今天,Google 发布了 Gemma 3,这是其 Gemma 模型系列的最新迭代。这些模型的参数范围从 1B 到 27B,上下文窗口长达 128k 词元,可接受图像和文本输入,并支持 140 多种语言。

立即试用 Gemma 3 👉🏻 Gemma 3 Space

Gemma 2 Gemma 3
尺寸变体
  • 2B
  • 9B
  • 27B
  • 1B
  • 4B
  • 12B
  • 27B
  • 上下文窗口长度 8k
  • 32k (1B)
  • 128k (4B, 12B, 27B)
  • 多模态(图像和文本)
  • ❌ (1B)
  • ✅ (4B, 12B, 27B)
  • 多语言支持 英语 (1B) +140 种语言 (4B, 12B, 27B)

    所有模型都在 Hub 上,并与 Hugging Face 生态系统紧密集成。

    同时发布了预训练模型和指令微调模型。Gemma-3-4B-IT 在基准测试中超越了 Gemma-2-27B IT,而 Gemma-3-27B-IT 则超越了 Gemini 1.5-Pro。.

    pareto graph
    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> 具有双向注意力(整个方框都被点亮),而文本词元则具有因果注意力。它还展示了注意力机制如何与滑动窗口算法协同工作。

    attention visualization
    注意力可视化(有无滑动)(来源: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 一样)下工作时实现的。

    chat bot arena
    Gemma 3 27B IT 模型在 Chatbot Arena 中的评估 (2025 年 3 月 8 日)

    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 常常接近——有时甚至更好——证明了其作为可访问、高性能选项的价值。

    performance of it models
    IT 模型的性能

    使用 🤗 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"])
    
    图像 candies on hand
    提示 糖果上是什么动物?
    生成 让我们来分析图片中的糖果!糖果上的动物是乌龟。您可以清楚地看到乌龟的壳、头部和腿印在糖果表面。

    您可以将图片与文本交错排列。为此,只需在您希望插入图片的位置截断输入文本,然后像以下方式插入一个图片块。

    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 集成带来了两个新的模型类:

    1. Gemma3ForConditionalGeneration:适用于 4B、12B 和 27B 视觉语言模型。
    2. 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)
    
    图像 receipt of wifi
    提示 密码是什么?
    生成 根据图片,密码是 aaeu

    对于纯 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
    
    图像 airplane
    提示 车上的代码是什么?
    生成 根据图片显示,该飞行器是一架塞斯纳 172 Skyhawk。机尾上的注册代码是 D-EOJU

    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-itgemma-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 移植方面的帮助。

    社区

    我会等 Fireship 的视频。

    ·

    没有 fireship 视频

    好棒!

    期待它在 Ollama 上可用!

    ·

    Ollama 已经可用

    终于,这是我期待已久的 Google 诗意回归。

    听起来很棒 😘

    此评论已被隐藏

    无法从这里创建 sagemaker 端点。

    我不知道为什么,但在我的 macos 上我无法运行它……
    ```
    python -m mlx_vlm.generate --model mlx-community/gemma-3-4b-it-4bit --max-tokens 100 --temperature 0.0 --prompt "Describe this image." --image https://farm8.staticflickr.com/7212/6896667434_2605d9e181_z.jpg
    未找到 PyTorch、TensorFlow >= 2.0 或 Flax。模型将不可用,只能使用分词器、配置和文件/数据工具。
    未找到 PyTorch、TensorFlow >= 2.0 或 Flax。模型将不可用,只能使用分词器、配置和文件/数据工具。
    正在获取 9 个文件:100%|████████████████████████████████████████████████████| 9/9 [00:00<00:00, 90742.15it/s]

    文件:['https://farm8.staticflickr.com/7212/6896667434_2605d9e181_z.jpg']

    提示:描述此图像。
    追溯(最近一次调用在最后)
    文件 "",第 198 行,在 _run_module_as_main 中
    文件 "",第 88 行,在 _run_code 中
    文件 "/Users/xxxxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/mlx_vlm/generate.py",第 156 行,在
    主函数()
    文件 "/Users/xxxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/mlx_vlm/generate.py",第 141 行,在 main 中
    输出 = 生成(
    ^^^^^^^^^
    文件 "/Users/xxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/mlx_vlm/utils.py",第 1117 行,在 generate 中
    对于 stream_generate(model, processor, prompt, image, **kwargs) 中的响应
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    文件 "/Users/xxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/mlx_vlm/utils.py",第 1018 行,在 stream_generate 中
    输入 = 准备_输入(
    ^^^^^^^^^^^^^^^
    文件 "/Users/xxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/mlx_vlm/utils.py",第 814 行,在 prepare_inputs 中
    输入 = 处理器(
    ^^^^^^^^^^
    文件 "/Users/xxxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/transformers/tokenization_utils_base.py",第 2877 行,在 call
    编码 = self._call_one(text=text, text_pair=text_pair, **all_kwargs)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    文件 "/Users/xxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/transformers/tokenization_utils_base.py",第 2987 行,在 _call_one 中
    返回 self.encode_plus(
    ^^^^^^^^^^^^^^^^^
    文件 "/Users/xxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/transformers/tokenization_utils_base.py",第 3063 行,在 encode_plus 中
    返回 self._encode_plus(
    ^^^^^^^^^^^^^^^^^^
    文件 "/Users/xxxx/Projects/mlx/venv-3.12/lib/python3.12/site-packages/transformers/tokenization_utils_fast.py",第 613 行,在 _encode_plus 中
    batched_output = self._batch_encode_plus(
    ^^^^^^^^^^^^^^^^^^^^^^^^
    TypeError: PreTrainedTokenizerFast._batch_encode_plus() 收到意外的关键字参数 'images'
    ```

    ·

    嗯,追溯信息本身就很清楚了,不是吗?

    是否有可用的微调笔记本?

    有没有用于使用 Gemma 3 微调图像-文本对或图像-对话的示例笔记本?

    ·

    看看 unsloth,他们已经集成了它

    文章作者

    如何使用 Gemma 3 和 langchain,并通过传递 image_url 作为输入获取图像描述?有人能帮帮我吗!

    感谢这篇文章!我在这里有一个关于 Gemma 的完整教程:https://youtu.be/_IzgKu0xnmg?si=BMnYf_E5V5wrGuZC 😉

    我在这里记录了我对 Gemma 3 模型的探索:https://entron.github.io/posts/Try-Gemma3-using-Hugging-Face-Part-1/ 分享出来,希望能帮助到其他人。

    我们创建了一份完整的《使用 SFT(单图或多图数据集)微调多模态模型》
    指南,其中使用了 Gemma 3,如果您有兴趣,可以查看!

    这是我用过(用于研究)的最强大的开源 LLM。非常感谢!!

    一堆垃圾。无法识别哪些是字母,哪些是数字。无法计算字符。无法重新评估响应的准确性。无法记住之前纠正过的错误。这是我很久以来见过的最差的 LLM。

    注册登录以发表评论