Google 发布 PaliGemma 2 视觉语言模型,新增 10B 和 28B 版本
Welcome PaliGemma 2 – New vision language models by Google
Google 发布新一代视觉语言模型 PaliGemma 2,沿用 SigLIP 图像编码器并将文本解码器升级为 Gemma 2,提供 3B、10B、28B 三种规模,均支持 224x224、448x448、896x896 三种输入分辨率,而上一代 PaliGemma 只有 3B 版本。
Google 发布 PaliGemma 2 视觉语言模型,相比前代只提供 3B,补上了 10B、28B 与三种输入分辨率,可用于判断自己的微调选型空间。
我们很高兴迎来 Google 全新的视觉语言模型 PaliGemma 2,这是 PaliGemma 的新一代版本。与其前身一样,PaliGemma 2 在视觉部分使用同样强大的 SigLIP,但在文本解码器部分升级到了最新的 Gemma 2。
PaliGemma 2 带来了新的预训练(pt)模型,参数量分别为 3B、10B 和 28B。它们全都支持多种输入分辨率:224x224、448x448 和 896x896。这些组合为不同用例提供了极大的灵活性,因此从业者可以在质量与效率之间选择自己所需的平衡。相比之下,此前的 PaliGemma 仅提供 3B 版本。
预训练模型旨在便于针对下游任务进行微调。初代 PaliGemma 已被社区广泛用于多种用途。随着新增变体带来更高的灵活性,再加上更优的预训练质量,我们迫不及待想看到社区这次能做出什么。
例如,Google 还发布了在 DOCCI 数据集上微调的一些变体,展示了多样且稳健的标题生成能力,生成的标题长、细致且富有层次。微调后的 DOCCI 模型提供 3B 和 10B 变体,并支持 448x448 的输入分辨率。
本次发布包括所有开放模型仓库、transformers 集成、微调脚本,以及一个我们自行微调的模型演示,用于在 VQAv2 数据集上进行视觉问答。
目录
PaliGemma 2 简介
PaliGemma 2 是 Google 于 5 月发布的 PaliGemma 视觉语言模型的新一代版本。PaliGemma 2 将强大的 SigLIP 图像编码器与 Gemma 2 语言模型连接起来。
新模型基于 Gemma 2 2B、9B 和 27B 语言模型,从而对应形成 3B、10B 和 28B 的 PaliGemma 2 变体,其命名考虑了(紧凑的)图像编码器带来的额外参数。如上所述,它们支持三种不同分辨率,为下游任务的微调提供了极大的灵活性。
PaliGemma 2 在 Gemma 许可下分发,允许再分发、商业使用、微调以及创建模型衍生品。
本次发布包含以下 bfloat16 精度检查点:
9 个预训练模型:3B、10B 和 28B,分辨率分别为
224x224、448x448和896x896。2 个在 DOCCI 上微调的模型:两个在 DOCCI 数据集(图像-文本标题对)上微调的模型,支持 3B 和 10B PaliGemma 2 变体,输入分辨率为
448x448。
模型能力
正如此前 PaliGemma 发布时所展示的,预训练(pt)模型非常适合针对下游任务进一步微调。
pt 模型在以下数据混合上进行了预训练。预训练数据集的多样性使得在相似领域的下游任务上,仅需相对较少的样本即可完成微调。
WebLI:从公开网络构建的网页规模多语言图像-文本数据集。使用多种 WebLI 切分来获取多功能的模型能力,例如视觉语义理解、对象定位、情境化文本理解和多语言能力。
CC3M-35L:从网页中精选的英语图像-alt_text 对(Sharma 等,2018)。为了标注该数据集,作者使用 Google Cloud Translation API 将其翻译成另外 34 种语言。
带有问答验证的视觉问题生成(VQ2A):一个改进的问答数据集。该数据集使用 Google Cloud Translation API 翻译成相同的另外 34 种语言。
OpenImages:检测和对象感知问答(Piergiovanni 等,2022)通过在 OpenImages 数据集上手工制定的规则生成。
WIT:从 Wikipedia 收集的图像和文本(Srinivasan 等,2021)。
PaliGemma 2 团队在多种视觉-语言理解任务上对 PT 模型进行了内部微调,并在模型卡片和技术报告中提供了这些微调模型的基准测试结果。
在 DOCCI 数据集上微调的 PaliGemma 2 可以完成广泛的图像描述任务,包括文本渲染、捕捉空间关系以及在描述中包含世界知识。
你可以在下面找到 DOCCI 微调的 PaliGemma 2 检查点的性能,并与其他模型进行比较(摘自技术报告中的表 6)。
| #par | #char | #sent | NES↓ | |
|---|---|---|---|---|
| MiniGPT-4 | 7B | 484 | 5.6 | 52.3 |
| mPLUG-Owl2 | 8B | 459 | 4.4 | 48.4 |
| InstructBLIP | 7B | 510 | 4.0 | 42.6 |
| LLaVA-1.5 | 7B | 395 | 4.2 | 40.6 |
| VILA | 7B | 871 | 8.6 | 28.6 |
| PaliGemma | 3B | 535 | 8.9 | 34.3 |
| PaLI-5B | 5B | 1065 | 11.3 | 32.9 |
| PaliGemma 2 | 3B | 529 | 7.7 | 28.4 |
| PaliGemma 2 | 10B | 521 | 7.5 | 20.3 |
- #char:生成的描述中的平均字符数。
- #sent:平均句子数。
- NES:非蕴含句子(越低越好),用于衡量事实不准确性。
下面你可以找到 DOCCI 检查点的一些模型输出,展示了该模型的多功能性。
| 输入图像 | 描述 |
|---|---|
![]() |
一张折线图显示了微调后 ImageNet 模型的 top-1 准确率。图中显示了四条线,颜色分别为蓝色、橙色、绿色和黑色。蓝色线是四条线中最低的,它 |
![]() |
一张白色纸张的特写视图,上面有黑色文字。纸张中间弯曲。纸上的文字是打字机字体。纸张顶部有“Ashley Hotel West Coast”字样。其下方是“WiFi Internet Service”。其下方是“Username: fqpp”。其下方是“Password: aaeu |
![]() |
一面白墙上绘有大卫·鲍伊的 Ziggy Stardust 造型壁画。壁画是并排的三张脸,每张脸都有红色头发,眼睛上画着蓝色闪电。这些脸有蓝色眼影、粉色腮红和红色嘴唇。中间的脸上面有一个黑色方形窗户,上面有白色文字,蓝色写着“JAM”。一辆银色汽车 |
![]() |
一张白色大理石台面的俯视图,上面有四个咖啡杯。左边有两个灰色的,左下角的一个是白色的。右边的一个是灰色的。右上角有一个放在木架上的金属线水果篮,里面有橙子。左边有一个装有水的透明玻璃水壶,以及部分 |
![]() |
一本白色封面的书特写,书底部有一条蓝色条纹。书的上半部分是白色的。白色部分印有黑色文字。文字内容为 "Visual Concept Learning from User-tagged Web Video"。黑色文字下方是一个白色方框,里面包含五张小图片。最左侧的图片是一个站在草地中的人。其右侧的图片是一片蓝色海洋 |
演示
出于演示目的,我们 HF Mirror 团队在 VQAv2 数据集的一小部分上对 PaliGemma 2 3B(448x448 分辨率)进行了微调。我们使用了 LoRA 微调和 PEFT,具体将在后文的微调部分中说明。下方的演示展示了最终结果。欢迎查看该 Space 中的代码以了解其工作原理,或将其克隆以适配你自己的微调。
如何使用 Transformers
你可以使用 🤗 transformers 在 PaliGemma 2 模型上运行推理,使用 PaliGemmaForConditionalGeneration 和 AutoProcessor API。请确保安装 transformers 4.47 或更高版本:
pip install --upgrade transformers
之后,你可以按如下方式运行推理。一如既往,请确保遵循训练模型时所使用的提示格式,以适配你所使用的任务:
from transformers import AutoProcessor, PaliGemmaForConditionalGeneration
from PIL import Image
import requests
model_id = "google/paligemma2-10b-ft-docci-448"
model = PaliGemmaForConditionalGeneration.from_pretrained(model_id)
model = model.to("cuda")
processor = AutoProcessor.from_pretrained(model_id)
prompt = "<image>caption en"
image_file = "https://hf-mirror.com/datasets/huggingface/documentation-images/resolve/main/cats.png"
raw_image = Image.open(requests.get(image_file, stream=True).raw).convert("RGB")
inputs = processor(prompt, raw_image, return_tensors="pt").to("cuda")
output = model.generate(**inputs, max_new_tokens=200)
input_len = inputs["input_ids"].shape[-1]
print(processor.decode(output[0][input_len:], skip_special_tokens=True))
# A medium shot of two cats laying on a pile of brown fishing nets. The cat in the foreground is a gray tabby cat with white on its chest and paws. The cat is laying on its side with its head facing the bottom right corner of the image. The cat in the background is laying on its side with its head facing the top left corner of the image. The cat's body is curled up, its head is slightly turned to the right, and its front paws are tucked underneath its body. There is a teal rope hanging from the fishing net in the top right corner of the image.
你也可以使用 transformers 的 bitsandbytes 集成来加载量化模型。以下示例使用 4-bit nf4:
from transformers import BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
model = PaligemmaForConditionalGeneration.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map={"":0}
)
我们通过在 textvqa 数据集上评估一个 3B 微调检查点,使用 224x224 输入图像,快速测试了量化情况下的性能下降。以下是我们在验证集 5,000 条数据上得到的结果:
bfloat16,无量化:60.04% 准确率。8-bit:59.78%。4-bit,使用上述代码片段中的配置:58.72%。
这些数字非常令人鼓舞!当然,量化对更大的检查点最有意义,我们建议你始终在你将使用的领域和任务上衡量结果。
微调
如果你之前微调过 PaliGemma,那么微调 PaliGemma 2 的 API 是相同的,你可以直接使用你的代码。我们提供了一个微调脚本和一个 notebook,供你微调模型、冻结模型的部分参数,或应用 LoRA、QLoRA 等内存高效的微调技术。
为了演示目的,我们在 VQAv2 验证集的一半上对一个 PaliGemma 2 模型进行了 LoRA 微调。这在 3 张 80GB VRAM 的 A100 上花费了半小时。模型可在此处找到,这是一个展示它的 Gradio 演示。
结论
新的 PaliGemma 2 版本比上一个版本更令人兴奋,各种尺寸满足每个人的需求,并且预训练模型更强大。我们期待看到社区将会构建什么!
我们感谢 Google 团队发布了这个出色且开放的模型系列。非常感谢 Pablo Montalvo 将模型集成到 transformers,以及 Lysandre、Raushan、Arthur、Yieh-Dar 和团队其他成员迅速完成审查、测试和合并。
资源
来源:Hugging Face Blog · hf-mirror.com





