读 Gemma 3 二分
读 Gemma 3 二分
flyfish
1. 引言
Gemma 3 是 Google DeepMind 开发的轻量级开源多模态模型,参数规模从 10 亿到 270 亿不等。作为 Gemini 家族的新成员,它在 Gemma 2 的基础上引入了视觉理解能力、多语言支持和超长上下文窗口(最高 128K tokens),并通过架构优化降低了长上下文推理的内存消耗。通过知识蒸馏和新型后训练方法,Gemma 3 在数学、对话、指令遵循等任务上表现显著提升,部分模型性能已接近 Gemini-1.5-Pro。所有模型均向社区开源,推动普惠化 AI 创新。
2. 模型架构
2.1 基础架构
Gemma 3 延续了前两代的解码器-only Transformer 架构,采用 Grouped-Query Attention (GQA) 和 QK-norm 技术,替代了 Gemma 2 的 soft-capping 机制,提升了训练稳定性。具体改进包括:
- 局部/全局注意力层交错:采用 5:1 的局部与全局注意力层交替模式(5 层局部 + 1 层全局),局部层使用 1024 tokens 的滑动窗口处理近期上下文,全局层处理长距离依赖,显著减少 KV 缓存内存占用。
- 位置编码扩展:通过调整 RoPE 基频(全局层 1M,局部层 10K)和位置插值技术,将预训练时的 32K 上下文扩展至 128K(1B 模型为 32K)。
2.2 多模态整合
2.2.1 视觉编码器
- SigLIP 视觉编码器:集成 400M 参数的 SigLIP 编码器,将图像统一编码为 256 个软 token。编码器输入为 896×896 分辨率图像,通过平均池化适配不同尺寸图像。
- Pan & Scan 算法:对非正方形或高分辨率图像进行分块处理(每块 896×896),每块生成 256 个 token,确保复杂图像的完整信息提取。
SigLIP是一种基于CLIP框架改进的视觉编码器,由Zhai等人在2023年提出,主要通过使用sigmoid二分类损失替代传统的softmax交叉熵损失来简化训练流程,并支持更大批量的训练。此外,SigLIP还采用了锁定图像编码器权重的方法,仅微调文本编码器以降低计算成本。Gemma 3集成了一个400M参数的SigLIP轻量版本,图像被统一调整为896×896分辨率并通过卷积或Vision Transformer提取特征,然后使用平均池化将这些高维特征压缩为256个软token以确保与文本token维度一致。软token是连续的向量表示,用于将图像信息转换为语言模型可处理的格式,与硬token相比,它们提供了一种动态适应不同图像内容的方式,避免了离散化带来的信息损失。在Gemma 3中,对于896×896分辨率的图像,假设特征图尺寸为224×224,通过4×4平均池化将每个区域压缩为1个token,最终得到3136个特征,进一步压缩为256个软token。当输入图像尺寸变化时,通过动态调整池化窗口大小确保输出token数固定为256。Pan & Scan算法则针对非正方形或超高分辨率图像进行处理,将其分割为多个非重叠的896×896子块,每个子块独立编码为256个软token,这种方法特别适用于复杂图像如文档扫描件和全景图的信息提取,提升了视觉问答准确率。多模态输入整合通过软token将图像信息与文本token统一为序列输入,结合局部/全局注意力机制交互,同时固定数量的软token有助于减少内存波动并降低长上下文推理的成本。
2.2.2 多模态输入处理
- 文本与图像 token 共享上下文窗口:输入容量为 128K tokens(4B/12B/27B 版本)或 32K tokens(1B 版本),单张图像固定为 256 tokens。
2.3 参数规模与硬件适配
- 模型参数:提供 1B、4B、12B、27B 四种参数规模,其中 27B 模型包含 25600M 非嵌入参数。
- 训练基础设施:使用 TPUv5e、TPUv4 等硬件,通过数据分片(Data/Seq./Replica)和 ZeRO-3 优化器状态分片技术实现高效分布式训练。
3. 输入与输出处理
3.1 输入形式
- 文本输入:通过 SentencePiece 分词器转换为 token 序列,支持多语言(如中文、阿拉伯语)。
- 图像输入:通过 SigLIP 编码器转换为 256 个 token,支持 896×896 分辨率,非正方形图像通过 Pan & Scan 算法分块处理。
- 混合输入容量:文本与图像 token 总和受限于上下文窗口(如 128K tokens)。
3.2 输出形式
- 文本响应:最大生成长度为 8192 tokens,IT 模型以
<end_of_turn>
结尾,PT 模型以<eos>
结尾。 - 格式控制:输入需显式添加
[BOS]
和[EOS]
token,多轮对话通过<start_of_turn>
和<end_of_turn>
标记区分用户与模型轮次。
4. 训练方法
4.1 预训练
- 数据与 token 预算:预训练数据包括文本和图像,token 预算较 Gemma 2 增加(如 27B 模型为 14T tokens),并增加多语言数据比例。
- 知识蒸馏:从大型教师模型(如 Gemini 系列)进行蒸馏,采样 256 个 logits/ token,通过交叉熵损失学习教师分布。
- 数据过滤与质量控制:使用 Sachdeva et al. (2024) 的质量重加权方法,减少低质量数据,并过滤敏感信息。
4.2 指令微调 (IT)
- 后训练技术:结合改进的知识蒸馏(Agarwal et al., 2024)和强化学习微调(RLHF),使用 BOND、WARM、WARP 等方法优化奖励函数,提升数学、编码、对话等能力。
- 数据优化:过滤包含个人信息、有毒内容的示例,引入子集鼓励上下文归因和拒绝回答,减少幻觉。
4.3 量化与部署
- 量化感知训练 (QAT):通过 5,000 步微调生成量化版本(int4、FP8),降低内存占用。例如,27B 模型量化后内存从 72.7GB 降至 32.8GB(int4)。
- 硬件适配:支持从手机、笔记本到高端 GPU 的多样化部署,量化模型适配边缘设备。
token
1. 文本token
- 定义:通过SentencePiece分词器将输入文本分割成的子词单元(subword units),用于表示语言模型的核心输入。
- 生成方式:
- 使用Gemini 2.0的SentencePiece分词器,支持多语言(如中文、阿拉伯语等)。
- 采用split digits、保留空格和字节级编码,词汇表大小为262k。
- 作用:
- 作为语言模型的输入,参与上下文理解和生成。
- 支持多语言任务,如翻译、问答等。
- 容量限制:
- 4B/12B/27B模型:上下文窗口最大128K tokens。
- 1B模型:上下文窗口最大32K tokens。
- 文档依据:
- :“Tokenizer. We use the same tokenizer as Gemini 2.0: a SentencePiece tokenizer…”
- :“Gemma 3 models support context length of 128K tokens, with the exception of the 1B model that has 32K.”
2. 图像token
- 定义:通过SigLIP视觉编码器将图像转换为的固定长度(256个)软token序列,用于多模态输入。
- 生成方式:
- 图像通过SigLIP视觉编码器(400M参数)处理为256个软token。
- 输入图像统一调整为896×896分辨率,通过平均池化压缩为256个token。
- 非正方形或高分辨率图像通过Pan & Scan算法分块处理,每块生成256个token。
- 作用:
- 将视觉信息转化为语言模型可处理的序列形式。
- 支持图文联合推理,如视觉问答、图像描述等。
- 容量限制:
- 每张图像固定为256 tokens,与文本token共享上下文窗口。
- 文档依据:
- :“images as a sequence of soft tokens encoded by SigLIP”
- :“condensing the vision embeddings into a fixed size of 256 vectors”
- :“Pan & Scan (P&S) algorithm segments images into non-overlapping crops of equal size…”
3. 量化token
- 定义:通过量化感知训练(QAT)生成的低比特率token表示,用于内存优化和边缘设备部署。
- 生成方式:
- 对预训练模型进行5,000步微调,使用非量化模型的概率分布作为目标。
- 支持三种格式:per-channel int4、per-block int4、switched FP8。
- 作用:
- 减少模型内存占用,例如27B模型量化后内存从72.7GB降至32.8GB(int4)。
- 适配消费级硬件(如手机、笔记本)。
- 文档依据:
- :“Quantization Aware Training (QAT) (Jacob et al., 2018)”
- :“memory footprints (in GB) comparison between raw (bfloat16) and quantized checkpoints”
4. 控制token
- 定义:用于格式控制和对话管理的特殊token,确保模型输入输出的结构化。
- 类型与作用:
[BOS]
:起始token,需显式添加到输入文本开头。[EOS]
:结束token,PT模型生成文本后自动添加。<start_of_turn>
/<end_of_turn>
:标记对话轮次,区分用户与模型输入。
- 文档依据:
- :“text starts with a [BOS] token”
- :“IT models output a <end_of_turn> at the end of the generation”
- :“Formatting for Gemma IT models. Explicitly add the [BOS] token…”
5. 混合输入token
- 定义:文本token与图像token的组合,共同构成模型的输入序列。
- 容量限制:
- 总输入token数 = 文本token数 + 图像token数(每张256) ≤ 上下文窗口容量(128K/32K)。
- 文档依据:
- :“increase in context size to 128K tokens”
- :“Vision encoder takes as input square images…”
关键关系总结
类型 | 生成方式 | 容量限制 | 作用 |
---|---|---|---|
文本token | SentencePiece分词器 | 128K(4B/12B/27B)/32K(1B) | 语言理解与生成 |
图像token | SigLIP视觉编码器(256 tokens/图) | 与文本token共享上下文窗口 | 图像信息编码与多模态交互 |
量化token | 量化感知训练(int4/FP8) | 内存占用减少50%-70% | 部署优化与边缘设备支持 |
控制token | 预定义特殊符号 | 固定长度(如[BOS]占1 token) | 格式控制与对话管理 |
混合输入token | 文本+图像token序列 | 128K/32K tokens | 多模态联合处理 |
输入 token 数:受限于上下文窗口(128K/32K),由文本和图像 token 共同占用。
输出 token 数:独立限制为 8,192 tokens,与输入无关。
快速上手指南
一、环境准备
- 安装适配Gemma Transformers库
pip install git+https://github.com/huggingface/transformers@v4.49.0-Gemma-3
二、使用pipeline API进行推理
- 初始化模型与处理器
from modelscope import pipeline
import torch
# 初始化多模态文本生成pipeline
pipe = pipeline(
"image-text-to-text",
model="LLM-Research/gemma-3-12b-it",
device="cuda",
torch_dtype=torch.bfloat16
)
- 构造多模态输入
messages = [
{
"role": "system",
"content": [{"type": "text", "text": "You are a helpful assistant."}]
},
{
"role": "user",
"content": [
{"type": "image", "url": "https://example.com/image.jpg"}, # 图像URL
{"type": "text", "text": "What animal is on the candy?"} # 文本提问
]
}
]
- 执行推理
output = pipe(text=messages, max_new_tokens=200)
print(output[0][0]["generated_text"][-1]["content"])
示例输出:
Okay, let's take a look!
Based on the image, the animal on the candy is a **turtle**.
You can see the shell shape and the head and legs.
三、多GPU部署(单/多卡通用)
- 安装加速库
pip install accelerate
- 加载模型与处理器
from modelscope import AutoProcessor, Gemma3ForConditionalGeneration
from PIL import Image
import torch
model_id = "LLM-Research/gemma-3-12b-it"
# 自动分配设备(支持多GPU)
model = Gemma3ForConditionalGeneration.from_pretrained(
model_id, device_map="auto"
).eval()
processor = AutoProcessor.from_pretrained(model_id)
- 多模态输入处理
messages = [
{
"role": "system",
"content": [{"type": "text", "text": "You are a helpful assistant."}]
},
{
"role": "user",
"content": [
{"type": "image", "image": "https://example.com/bee.jpg"}, # 直接传入图像
{"type": "text", "text": "Describe this image in detail."}
]
}
]
# 生成模型输入
inputs = processor.apply_chat_template(
messages, add_generation_prompt=True, tokenize=True,
return_dict=True, return_tensors="pt"
).to(model.device, dtype=torch.bfloat16)
- 执行生成
with torch.inference_mode():
generation = model.generate(**inputs, max_new_tokens=100, do_sample=False)
generation = generation[0][inputs["input_ids"].shape[-1]:] # 裁剪输入部分
# 解码输出
decoded = processor.decode(generation, skip_special_tokens=True)
print(decoded)
示例输出:
**Overall Impression:** The image is a close-up shot of a vibrant garden scene,
focusing on a cluster of pink cosmos flowers and a busy bumblebee.
It has a slightly soft, natural feel, likely captured in daylight.