读 Gemma 3 二分

devtools/2025/3/17 15:41:06/

Gemma_3__1">读 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…”

关键关系总结

类型生成方式容量限制作用
文本tokenSentencePiece分词器128K(4B/12B/27B)/32K(1B)语言理解与生成
图像tokenSigLIP视觉编码器(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,与输入无关。

快速上手指南

一、环境准备
  1. 安装适配Gemma Transformers库
pip install git+https://github.com/huggingface/transformers@v4.49.0-Gemma-3

二、使用pipeline API进行推理
  1. 初始化模型与处理器
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
)
  1. 构造多模态输入
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?"}  # 文本提问]}
]
  1. 执行推理
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部署(单/多卡通用)
  1. 安装加速库
pip install accelerate
  1. 加载模型与处理器
from modelscope import AutoProcessor, Gemma3ForConditionalGeneration
from PIL import Image
import torchmodel_id = "LLM-Research/gemma-3-12b-it"# 自动分配设备(支持多GPU)
model = Gemma3ForConditionalGeneration.from_pretrained(model_id, device_map="auto"
).eval()processor = AutoProcessor.from_pretrained(model_id)
  1. 多模态输入处理
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)
  1. 执行生成
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.

从本地读取文件进行推理

from transformers import AutoProcessor, Gemma3ForConditionalGeneration
from PIL import Image
import torch# 本地图像文件的路径
local_image_path = "/home/dev/000008.jpg"model_path = "/home/user/.cache/modelscope/hub/models/LLM-Research/gemma/"model = Gemma3ForConditionalGeneration.from_pretrained(model_path, device_map="auto"
).eval()processor = AutoProcessor.from_pretrained(model_path)# 打开本地图像文件并转换为 PIL 图像对象
try:image = Image.open(local_image_path)
except FileNotFoundError:print(f"未找到图像文件: {local_image_path}")exit(1)messages = [{"role": "system","content": [{"type": "text", "text": "你是一个非常有用的人工智能助手。"}]},{"role": "user","content": [{"type": "image", "image": image},{"type": "text", "text": "请详细描述这张图像。"}]}
]inputs = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=True,return_dict=True, return_tensors="pt"
).to(model.device, dtype=torch.bfloat16)input_len = inputs["input_ids"].shape[-1]with torch.inference_mode():generation = model.generate(**inputs, max_new_tokens=1024, do_sample=False)generation = generation[0][input_len:]decoded = processor.decode(generation, skip_special_tokens=True)
print(decoded)

http://www.ppmy.cn/devtools/167860.html

相关文章

Linux驱动开发实战(四):设备树点RGB灯

Linux驱动开发实战&#xff08;四&#xff09;&#xff1a;设备树点RGB灯 文章目录 Linux驱动开发实战&#xff08;四&#xff09;&#xff1a;设备树点RGB灯前言一、驱动实现1.1 驱动设计思路1.2 关键数据结构1.3 字符设备操作函数1.4 平台驱动探测函数1.5 匹配表和平台驱动结…

贪心算法--

1.柠檬水找零 link:860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法&#xff0c; 优先花出大面额bill&#xff0c; 尽可能保护小面额billint five 0, ten 0;// 不…

路由器和网关支持边缘计算

路由器和网关可以支持边缘计算&#xff0c;但它们的功能和性能可能有所不同&#xff0c;具体取决于设备的设计和用途。以下是路由器和网关在边缘计算中的作用及其支持方式&#xff1a; 路由器在边缘计算中的作用 网络连接与数据传输 路由器主要负责在网络中传输数据包&#xff…

Cisdem Video Converter for Mac v8.4.1 视频格式转换 支持M、Intel芯片

应用介绍 Cisdem Video Converter 将您的视频和音频文件转换为任何格式&#xff0c;以便在一系列设备上即时播放&#xff0c;支持所有编码格式&#xff0c;包括 H.265/HEVC、H.264、Xvid、VP8、VP9 等&#xff0c;并导出视频在最新的 4K UHD 中。它在不牺牲质量的情况下提供了…

4、linux c 进程

【三】进程 1. 进程与程序的区别 程序&#xff1a;存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09;&#xff0c;是静态的。 进程&#xff1a;执行一个程序所分配的资源的总称&#xff0c;是动态的。 2. 进程的组成部分 BSS段&#xff08;bss&#xff09;&…

记一次一波三折的众测SRC经历

视频教程和更多福利在我主页简介或专栏里 &#xff08;不懂都可以来问我 专栏找我哦&#xff09; 目录&#xff1a; 前言 波折一&#xff1a;RCE漏洞利用失败 波折二&#xff1a;SQL时间盲注 波折三&#xff1a;寻找管理后台 总结 前言 先谈个人SRC心得体会吧&#xff0c;我虽…

Java集合 - ArrayList

ArrayList 是 Java 集合框架中最常用的动态数组实现类&#xff0c;位于 java.util 包中。它基于数组实现&#xff0c;支持动态扩容和随机访问。 1. 特点 动态数组&#xff1a;ArrayList 的底层是一个数组&#xff0c;可以根据需要动态扩展容量。 有序&#xff1a;元素按照插入…

DAY34 贪心算法Ⅲ

134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 这种环路问题要记一下。 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum0;int totalSum0;int start0;for(int i0;i<gas.size();i){curSumga…