我们很高兴发布 IDEFICS(Image-aware Decoder Enhanced à la Flamingo with Interleaved Cross-attentionS),这是一个开放获取的视觉语言模型。IDEFICS基于Flamingo开发的最新视觉语言模型,Flamingo最初由DeepMind开发,尚未公开发布。与GPT-4类似,该模型接受任意的图像和文本输入序列,并输出文本结果。IDEFICS仅基于公开可用的数据和模型(LLaMA v1和OpenCLIP)构建,并提供两个变种——基础版本和指导版本。每个变种在90亿和800亿参数规模上都可用。
开发先进的AI模型应该更加透明。我们的目标是通过IDEFICS的复现和提供AI社区与Flamingo等大型专有模型相匹配的系统来推动透明度。因此,我们采取了重要的步骤,为这些AI系统带来透明度:我们仅使用公开可用的数据,我们提供了探索训练数据集的工具,我们分享了构建此类工件的技术教训和错误,并在发布之前通过对抗性提示评估了模型的有害性。我们希望IDEFICS能够为多模态AI系统的更加开放的研究提供坚实的基础,与OpenFlamingo等模型一起,后者是Flamingo在90亿参数规模下的另一个开放复现。
在Hub上尝试演示和模型!

什么是IDEFICS?
IDEFICS是一个拥有800亿参数的多模态模型,它接受图像和文本序列作为输入,并生成连贯的文本作为输出。它可以回答关于图像的问题,描述视觉内容,创建基于多个图像的故事等。
IDEFICS是Flamingo的开放复现版本,在各种图像-文本理解基准测试中与原始闭源模型在性能上可比。它有两个变种——800亿参数和90亿参数。

我们还提供了针对对话使用案例进行调优的版本idefics-80B-instruct和idefics-9B-instruct。
训练数据
IDEFICS是在一系列公开可用的数据集上进行训练的:维基百科、公共多模态数据集和LAION,以及我们创建的一个新的包含1150亿标记的数据集,称为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)
# 我们将任意文本字符串和图像序列输入模型。图像可以是 URL 或 PIL 图像。
prompts = [
[
"用户:这张图片里有什么?",
"https://upload.wikimedia.org/wikipedia/commons/8/86/Id%C3%A9fix.JPG",
"<end_of_utterance>",
"\n助手:这张图片描绘了阿斯特利克斯和奥贝利克斯中的奥贝利克斯的狗 Idefix。Idefix 正在地面上奔跑。<end_of_utterance>",
"\n用户:",
"https://static.wikia.nocookie.net/asterix/images/2/25/R22b.gif/revision/latest?cb=20110815073052",
"那个是谁?<end_of_utterance>",
"\n助手:",
],
]
# --批量模式
inputs = processor(prompts, add_end_of_utterance_token=False, return_tensors="pt").to(device)
# --单个样本模式
# inputs = processor(prompts[0], return_tensors="pt").to(device)
# 生成参数
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")