IDEFICS 简介:尖端视觉语言模型的开放复现
我们很高兴发布 IDEFICS (Image-aware Decoder Enhanced à la Flamingo with Interleaved Cross-attentionS),这是一个开放获取的视觉语言模型。IDEFICS 基于 Flamingo,这是 DeepMind 最初开发的尖端视觉语言模型,但尚未公开发布。与 GPT-4 类似,该模型接受任意序列的图像和文本输入并生成文本输出。IDEFICS 完全基于公开可用的数据和模型(LLaMA v1 和 OpenCLIP)构建,并提供两种变体——基础版本和指令版本。每个变体都有 90 亿和 800 亿参数两种大小。
尖端 AI 模型的发展应该更加透明。我们开发 IDEFICS 的目标是复现并为 AI 社区提供与 Flamingo 等大型专有模型能力相匹配的系统。因此,我们采取了重要措施,为这些 AI 系统的透明度做出贡献:我们只使用了公开可用的数据,我们提供了探索训练数据集的工具,我们分享了构建此类工件的技术经验和错误,并在发布前通过对抗性提示评估了模型的危害性。我们希望 IDEFICS 能为多模态 AI 系统领域的更多开放研究奠定坚实基础,与 OpenFlamingo 等模型并驾齐驱——OpenFlamingo 是 Flamingo 在 90 亿参数规模上的另一个开放复现。
什么是 IDEFICS?
IDEFICS 是一个拥有 800 亿参数的多模态模型,接受图像和文本序列作为输入,并生成连贯的文本作为输出。它可以回答有关图像的问题,描述视觉内容,创建基于多张图像的故事等。
IDEFICS 是 Flamingo 的开放式复现,在各种图像-文本理解基准测试中,其性能与原始闭源模型相当。它有两种变体——800 亿参数和 90 亿参数。
我们还提供微调版本 idefics-80B-instruct 和 idefics-9B-instruct,适用于对话用例。
训练数据
IDEFICS 在混合的公开可用数据集上进行训练:维基百科、公共多模态数据集和 LAION,以及我们创建的一个新的 115B token 数据集,名为 OBELICS。OBELICS 包含从网络抓取的 1.41 亿个交错图像-文本文档和 3.53 亿张图像。
我们提供了 OBELICS 的交互式可视化,可以使用 Nomic AI 探索数据集内容。
有关 IDEFICS 架构、训练方法和评估的详细信息,以及数据集信息,请参阅模型卡片和我们的研究论文。此外,我们还记录了模型训练的技术见解和经验,为 IDEFICS 的开发提供了宝贵的视角。
伦理评估
在项目开始时,通过一系列讨论,我们制定了一份伦理章程,以指导项目期间的决策。该章程规定了包括自我批判、透明和公平在内的价值观,我们在处理项目和发布模型时力求遵循这些价值观。
作为发布过程的一部分,我们通过对抗性提示模型(一种称为红队测试的过程),用可能引发我们不希望模型做出的响应的图像和文本,对模型的潜在偏差进行了内部评估。
请通过演示试用 IDEFICS,查看相应的模型卡片和数据集卡片,并通过社区选项卡向我们提供您的反馈!我们致力于改进这些模型,并使大型多模态 AI 模型可供机器学习社区使用。
许可证
该模型建立在两个预训练模型之上:laion/CLIP-ViT-H-14-laion2B-s32B-b79K 和 huggyllama/llama-65b。第一个以 MIT 许可证发布,而第二个以专注于研究目的的特定非商业许可证发布。因此,用户应通过直接向 Meta 的表格申请来遵守该许可证。
这两个预训练模型通过我们训练的新初始参数相互连接。这些参数不基于构成复合模型的任何两个基础冻结模型。我们以 MIT 许可证发布我们训练的附加权重。
IDEFICS 入门
IDEFICS 模型可在 Hugging Face Hub 上获取,并受最新版 transformers
支持。以下是尝试它的代码示例
import torch
from transformers import IdeficsForVisionText2Text, AutoProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
checkpoint = "HuggingFaceM4/idefics-9b-instruct"
model = IdeficsForVisionText2Text.from_pretrained(checkpoint, torch_dtype=torch.bfloat16).to(device)
processor = AutoProcessor.from_pretrained(checkpoint)
# We feed to the model an arbitrary sequence of text strings and images. Images can be either URLs or PIL Images.
prompts = [
[
"User: What is in this image?",
"https://upload.wikimedia.org/wikipedia/commons/8/86/Id%C3%A9fix.JPG",
"<end_of_utterance>",
"\nAssistant: This picture depicts Idefix, the dog of Obelix in Asterix and Obelix. Idefix is running on the ground.<end_of_utterance>",
"\nUser:",
"https://static.wikia.nocookie.net/asterix/images/2/25/R22b.gif/revision/latest?cb=20110815073052",
"And who is that?<end_of_utterance>",
"\nAssistant:",
],
]
# --batched mode
inputs = processor(prompts, add_end_of_utterance_token=False, return_tensors="pt").to(device)
# --single sample mode
# inputs = processor(prompts[0], return_tensors="pt").to(device)
# Generation args
exit_condition = processor.tokenizer("<end_of_utterance>", add_special_tokens=False).input_ids
bad_words_ids = processor.tokenizer(["<image>", "<fake_token_around_image>"], add_special_tokens=False).input_ids
generated_ids = model.generate(**inputs, eos_token_id=exit_condition, bad_words_ids=bad_words_ids, max_length=100)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
for i, t in enumerate(generated_text):
print(f"{i}:\n{t}\n")