我们介绍 xGen-MM(BLIP-3),这是一个开发大型多模态模型(LMM)的框架(b)。我们的框架在 BLIP-2 (a) 的基础上进行了改进:(1) 增加了训练数据的丰富性、规模和多样性;(2) 用更具可扩展性的视觉标记采样器取代了 Q-Former 层;(3) 通过在每个训练阶段将训练目标统一为单一损失来简化训练过程。由此产生的 LMM 套件可以执行各种视觉语言任务,并在各种基准测试中取得具有竞争力的性能。
介绍
BLIP-3 是开发大型多模态模型(LMM)的框架。xGen-MM 是 xGen-MultiModal 的缩写,是 Salesforce xGen 计划在基础人工智能模型方面的扩展。我们的模型经过了一系列任务的严格评估,包括单图像和多图像基准。我们的预训练基础模型表现出了强大的上下文学习能力,而经过指令调整的模型在具有类似模型大小的开源 LMM 中表现出了极具竞争力的性能。此外,我们还引入了带有 DPO 的安全调整模型,旨在减少幻觉等有害行为并提高安全性。我们开源了我们的模型、策划的大规模数据集和微调代码库,以促进 LMM 研究的进一步发展。
xGen-MM 是 Salesforce AI Research 开发的一系列最新基础大型多模态模型(LMM)。该系列以 BLIP 系列的成功设计为基础,进行了根本性的改进,以确保建立更稳健、更卓越的基础。这些模型已在高质量图像标题数据集和交错图像文本数据上进行了大规模训练。
在 V1.5 (08/2024) 版本中,我们推出了一系列 XGen-MM 模型,包括
-
🤗 xGen-MM-instruct-interleave(我们的主要指令模型):
xgen-mm-phi3-mini-instruct-interleave-r-v1.5
- 该模型在单图像和多图像基准测试中的总分均高于 xGen-MM-instruct。
-
🤗 xGen-MM-base:
xgen-mm-phi3-mini-base-r-v1.5
-
🤗 xGen-MM-instruct:
xgen-mm-phi3-mini-instruct-singleimg-r-v1.5
-
🤗 xGen-MM-instruct-dpo:
xgen-mm-phi3-mini-instruct-dpo-r-v1.5
这些模型已在高质量图像标题数据集和交错图像文本数据上进行了大规模训练。XGen-MM 突出了以下几个特点、 -
预训练的基础模型
xgen-mm-phi3-mini-base-r-v1
在 5b 参数下达到了最先进的性能,并展示了强大的上下文学习能力。 -
指令微调模型
xgen-mm-phi3-mini-instruct-r-v1
在 5b 参数下的性能在开源和闭源 VLM 中均处于一流水平。 -
xgen-mm-phi3-mini-instruct-r-v1
支持灵活的高分辨率图像编码和高效的视觉标记采样。
除模型外,我们的团队还发布了一系列用于多模态预训练的数据集,包括
- 🍃 MINT-1T:将开源多模态数据扩展 10 倍:拥有一万亿代币的多模态数据集
- 🤗 BLIP3-OCR-200M(即将推出):具有密集 OCR 注释的数据集。
- 🤗 BLIP3-GROUNDING-50M(即将推出):用于增强图像语义概念基础能力的数据集。
- BLIP3-KALE(敬请期待):大规模高质量标题数据集。
更多详情,请查看我们的技术报告、微调代码和项目页面(即将推出)。
数据
基础模型在上述混合数据源上进行了预训练,共包含约 1,000 亿个图像文本标记。
Dataset Type | Dataset(s) Used |
---|---|
Pretrain | caption data: (datacomp, cc12m, cc3m, SBU, vg) && interleaved data: obelics |
Instruction Tuning | LLaVA-Instruct-150K, ShareGPT4V captions, a mixture of academic VQA data including OCR/Document/Chart-focused tasks, publicly available text-only instruction data |
Model | Shot | COCO (val) | NoCaps (val) | TextCaps (val) | OKVQA (val) | TextVQA (val) | VizWiz (testdev) | VQAv2 (testdev) |
---|---|---|---|---|---|---|---|---|
Flamingo-3B | 4 | 85.0 | - | - | 43.3 | 32.7 | 34 | 53.2 |
8 | 90.6 | - | - | 44.6 | 32.4 | 38.4 | 55.4 | |
MM1-3B | 0 | 73.5 | 55.6 | 63.3 | 26.1 | 29.4 | 15.6 | 46.2 |
4 | 112.3 | 99.7 | 84.1 | 48.6 | 45.3 | 38.0 | 57.9 | |
8 | 114.6 | 104.7 | 88.8 | 48.4 | 44.6 | 46.4 | 63.6 | |
xgen-mm-phi3-mini-base-r-v1 (Ours) | 0 | 81.7 | 80.2 | 60.7 | 26.5 | 36.0 | 21.2 | 48.1 |
4 | 110.5 | 101.7 | 84.6 | 49.2 | 46.1 | 38.4 | 63.9 | |
8 | 112.1 | 104.4 | 87.7 | 49.1 | 46.4 | 44.3 | 63.8 |
如何使用
rom transformers import AutoModelForVision2Seq, AutoTokenizer, AutoImageProcessor, StoppingCriteria
import torch
import requests
from PIL import Image
# define the prompt template
def apply_prompt_template(prompt):
s = (
'<|system|>\nA chat between a curious user and an artificial intelligence assistant. '
"The assistant gives helpful, detailed, and polite answers to the user's questions.<|end|>\n"
f'<|user|>\n<image>\n{prompt}<|end|>\n<|assistant|>\n'
)
return s
class EosListStoppingCriteria(StoppingCriteria):
def __init__(self, eos_sequence = [32007]):
self.eos_sequence = eos_sequence
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
last_ids = input_ids[:,-len(self.eos_sequence):].tolist()
return self.eos_sequence in last_ids
# load models
model_name_or_path = "Salesforce/xgen-mm-phi3-mini-instruct-r-v1"
model = AutoModelForVision2Seq.from_pretrained(model_name_or_path, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True, use_fast=False, legacy=False)
image_processor = AutoImageProcessor.from_pretrained(model_name_or_path, trust_remote_code=True)
tokenizer = model.update_special_tokens(tokenizer)
# craft a test sample
img_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/demo.jpg'
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert('RGB')
query = "how many dogs are in the picture?"
model = model.cuda()
inputs = image_processor([raw_image], return_tensors="pt", image_aspect_ratio='anyres')
prompt = apply_prompt_template(query)
language_inputs = tokenizer([prompt], return_tensors="pt")
inputs.update(language_inputs)
inputs = {name: tensor.cuda() for name, tensor in inputs.items()}
generated_text = model.generate(**inputs, image_size=[raw_image.size],
pad_token_id=tokenizer.pad_token_id,
do_sample=False, max_new_tokens=768, top_p=None, num_beams=1,
stopping_criteria = [EosListStoppingCriteria()],
)
prediction = tokenizer.decode(generated_text[0], skip_special_tokens=True).split("<|end|>")[0]
print("==> prediction: ", prediction)
# output: ==> prediction: There is one dog in the picture.
请查看我们的推理笔记本,了解使用我们模型的示例代码。
可重复性:
我们的 SFT 评估基于 VLMEvalKit,其中我们修正了一些与官方基准(如 LLM judge API)不一致的地方。在开发过程中,我们注意到输入图像的原始分辨率在某些情况下会明显影响模型输出。
偏差、风险、局限性和道德考量
主要数据来源于互联网,包括网页、图片库网站和研究界发布的数据集。由于已知的 CSAM 问题,我们排除了某些数据,如 LAION。模型可能会受到原始数据源的影响,以及 LLM 和商业 API 的影响。我们强烈建议用户在应用于下游应用之前对安全性和公平性进行评估。
故障排除
如果您遗漏了任何软件包,请考虑以下几点
pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu121
pip install open_clip_torch==2.24.0
pip install einops
pip install einops-exts
pip install transformers==4.41.1