模型简介
模型特点
模型能力
使用案例
🚀 IDEFICS
IDEFICS模型名称如何发音?观看Youtube教程
IDEFICS(Image-aware Decoder Enhanced à la Flamingo with Interleaved Cross-attentionS)是对Flamingo的开源复刻版本,Flamingo是Deepmind开发的闭源视觉语言模型。与GPT - 4类似,这个多模态模型可以接受任意的图像和文本输入序列,并生成文本输出。IDEFICS完全基于公开可用的数据和模型构建。
该模型可以回答关于图像的问题、描述视觉内容、根据多张图像创作故事,或者在没有视觉输入的情况下单纯作为语言模型使用。
在各种图像 - 文本基准测试中,包括视觉问答(开放式和多项选择)、图像描述和图像分类,使用上下文少样本学习进行评估时,IDEFICS的表现与原始闭源模型相当。它有两个版本:一个是800亿参数的大版本,另一个是90亿参数的版本。
我们还在有监督微调数据集和指令微调数据集的混合数据集上对基础模型进行了微调,这不仅提升了下游任务的性能,还让模型在对话场景中更易用:idefics - 80b - instruct和idefics - 9b - instruct。由于这些微调后的模型性能更优,我们建议优先使用它们。
了解我们在训练IDEFICS时遇到的一些技术挑战,请点击此处。
试用演示!
🚀 快速开始
基础模型
import torch
from transformers import IdeficsForVisionText2Text, AutoProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
checkpoint = "HuggingFaceM4/idefics-9b"
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",
"In this picture from Asterix and Obelix, we can see"
],
]
# --批量模式
inputs = processor(prompts, return_tensors="pt").to(device)
# --单样本模式
# inputs = processor(prompts[0], return_tensors="pt").to(device)
# 生成参数
bad_words_ids = processor.tokenizer(["<image>", "<fake_token_around_image>"], add_special_tokens=False).input_ids
generated_ids = model.generate(**inputs, 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")
指令模型
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 = [
[
"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:",
],
]
# --批量模式
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")
文本生成推理
from text_generation import Client
API_TOKEN = "<YOUR_API_TOKEN>"
API_URL = "https://api-inference.huggingface.co/models/HuggingFaceM4/idefics-80b-instruct"
DECODING_STRATEGY = "Greedy"
QUERY = "User: What is in this image?<end_of_utterance>\nAssistant:"
client = Client(
base_url=API_URL,
headers={"x-use-cache": "0", "Authorization": f"Bearer {API_TOKEN}"},
)
generation_args = {
"max_new_tokens": 256,
"repetition_penalty": 1.0,
"stop_sequences": ["<end_of_utterance>", "\nUser:"],
}
if DECODING_STRATEGY == "Greedy":
generation_args["do_sample"] = False
elif DECODING_STRATEGY == "Top P Sampling":
generation_args["temperature"] = 1.
generation_args["do_sample"] = True
generation_args["top_p"] = 0.95
generated_text = client.generate(prompt=QUERY, **generation_args)
print(generated_text)
✨ 主要特性
- 多模态处理:能够接受任意的图像和文本输入序列,并生成文本输出,可用于图像问答、内容描述、故事创作等任务。
- 开源复刻:是对闭源视觉语言模型Flamingo的开源复刻,基于公开数据和模型构建。
- 少样本学习能力:在各种图像 - 文本基准测试中,使用上下文少样本学习进行评估时,表现与原始闭源模型相当。
- 多版本可选:有800亿参数和90亿参数两个版本,还提供了经过指令微调的版本,提升了下游任务性能和对话易用性。
📦 安装指南
文档未提供具体安装步骤,可参考相关资源进行安装和使用。
💻 使用示例
基础用法
import torch
from transformers import IdeficsForVisionText2Text, AutoProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
checkpoint = "HuggingFaceM4/idefics-9b"
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",
"In this picture from Asterix and Obelix, we can see"
],
]
# --批量模式
inputs = processor(prompts, return_tensors="pt").to(device)
# --单样本模式
# inputs = processor(prompts[0], return_tensors="pt").to(device)
# 生成参数
bad_words_ids = processor.tokenizer(["<image>", "<fake_token_around_image>"], add_special_tokens=False).input_ids
generated_ids = model.generate(**inputs, 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")
高级用法
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 = [
[
"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:",
],
]
# --批量模式
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")
📚 详细文档
模型详情
IDEFICS是一个大型多模态英文模型,它接受交错的图像和文本序列作为输入,并生成文本输出。该模型展现出强大的上下文少样本学习能力,与闭源模型表现相当,这使得IDEFICS成为在自定义数据上微调多模态模型的可靠起点。
IDEFICS基于两个单模态的开源预训练模型构建,以连接图像和文本两种模态。新初始化的Transformer块形式的参数弥合了视觉编码器和语言模型之间的差距。该模型在图像 - 文本对和非结构化多模态网页文档的混合数据上进行训练。
IDEFICS - instruct是在有监督微调数据集和指令微调数据集上进一步训练IDEFICS得到的模型。这显著提高了下游任务的性能(使idefics - 9b - instruct在90亿参数规模下成为一个非常强大的模型),同时让模型更适合进行对话。
用途
- 推理任务:可用于多模态(图像 + 文本)任务的推理,输入由文本查询/指令和一张或多张图像组成,但不支持图像生成。
- 微调:可以在自定义数据上对基础模型进行微调,以满足特定用例的需求。需要注意的是,经过指令微调的模型在遵循用户指令方面表现更好,因此在开箱即用的情况下应优先使用。
训练详情
IDEFICS
训练过程紧密遵循Flamingo的训练步骤。通过初始化新的Transformer块,将两个开源预训练模型(laion/CLIP - ViT - H - 14 - laion2B - s32B - b79K和huggyllama/llama - 65b)结合起来。在训练新初始化的参数时,预训练的主干模型保持冻结。
训练数据混合了公开可用的英文数据:
数据源 | 数据类型 | 源数据中的标记数量 | 源数据中的图像数量 | 训练轮数 | 标记数量的有效比例 |
---|---|---|---|---|---|
OBELICS | 非结构化多模态网页文档 | 1149亿 | 3.53亿 | 1 | 73.85% |
Wikipedia | 非结构化多模态网页文档 | 319.2亿 | 3900万 | 3 | 6.15% |
LAION | 图像 - 文本对 | 299亿 | 112亿 | 1 | 17.18% |
PMD | 图像 - 文本对 | 16亿 | 7000万 | 3 | 2.82% |
IDEFICS - instruct
从基础的IDEFICS模型开始,通过解冻所有参数(视觉编码器、语言模型、交叉注意力)对模型进行微调。微调数据混合了以下英文数据集:
数据源 | 数据描述 | 唯一样本数量 | 采样比例 |
---|---|---|---|
M3IT | 带提示的图像 - 文本学术数据集 | 150万 | 7.7% |
LRV - Instruction | 图像/问题/答案三元组 | 15.5万 | 1.7% |
LLaVA - Instruction | 基于图像的问答对话 | 15.8万 | 5.9% |
LLaVAR - Instruction | 基于包含文本图像的问答对话 | 1.55万 | 6.3% |
SVIT | 图像/问题/答案三元组 | 320万 | 11.4% |
General Scene Difference + Spot - the - Diff | 描述相关或相似图像差异的文本对 | 15.8万 | 2.1% |
UltraChat | 多轮纯文本对话 | 150万 | 29.1% |
评估
IDEFICS
由于没有在视频 - 文本数据集上训练IDEFICS(与Flamingo不同),因此未在视频基准测试上进行评估。将该模型与原始的Flamingo和另一个开源复刻版本OpenFlamingo进行了比较。
在VQAv2、TextVQA、OKVQA、VizWiz、Visual Dialogue、Coco、Flickr30k和HatefulMemes的验证集上进行了检查点选择。为IDEFICS - 9B选择了第65000步的检查点,为IDEFICS选择了第37500步的检查点。使用上下文少样本学习对模型进行评估,其中提示实例从支持集中随机选择,不使用任何形式的集成。遵循Flamingo的方法,为了报告开放式0样本结果,使用了一个包含下游任务两个示例的提示,但移除了相应的图像,在不提供任务额外完整样本的情况下向模型暗示预期格式。唯一的例外是WinoGround,在预测样本前不添加任何示例。除非另有说明,否则使用开放式VQA准确率评估视觉问答变体。
IDEFICS instruct
与基础的IDEFICS模型类似,进行了检查点选择以停止训练。由于M3IT的训练集中包含了一些我们正在评估的基准测试,因此使用MMBench作为保留的验证基准进行检查点选择。为IDEFICS - 80b - instruct选择了第3000步的检查点,为IDEFICS - 9b - instruct选择了第8000步的检查点。
技术规格
硬件
IDEFICS模型在AWS SageMaker集群上进行训练,该集群配备8x80GB A100 GPU节点和EFA网络。
- IDEFICS - 80B在64个节点(512个GPU)上训练约28天。
- IDEFICS - 80b - instruct在48个节点(384个GPU)上对基础模型进行了约3天的微调。
软件
训练软件基于HuggingFace Transformers + Accelerate构建,使用DeepSpeed ZeRO - 3进行训练,使用WebDataset进行数据加载。
环境影响
区分了IDEFICS创建的三个阶段,并分别报告了每个阶段的碳排放:
- 初步实验:碳排放16714千克CO2eq。
- IDEFICS - 9b预训练:碳排放5160千克CO2eq。
- IDEFICS - 9b - instruct微调:碳排放1032千克CO2eq。
- IDEFICS - 80b预训练:碳排放39498千克CO2eq。
- IDEFICS - 80b - instruct微调:碳排放3174千克CO2eq。
整个IDEFICS项目的总碳足迹估计为65.57吨CO2eq,根据美国环境保护署的数据,这大约相当于一辆普通汽油动力汽车行驶168092英里或8.3个家庭一年的能源使用量。
偏差、风险和局限性
偏差和局限性
作为语言模型的衍生模型,IDEFICS可能会生成包含令人不安和有害刻板印象的文本,涉及受保护特征、身份特征以及敏感、社会和职业群体。此外,IDEFICS可能会生成事实错误的文本,不应依赖它来生成事实准确的信息。
偏差评估
主要对模型的指令微调变体(90亿和800亿参数版本)进行了偏差评估,进行了两种主要形式的偏差评估:[红队测试](https://huggingface.co/blog/red - teaming)和跨性别和种族轴对模型生成结果的系统评估。
其他局限性
- 医疗诊断问题:模型在被要求进行医疗诊断时可能会提供相关结果,但我们强烈建议用户在没有适当调整和评估的情况下,不要将模型用于医疗应用。
- 不适当内容:尽管对训练数据进行了过滤,但仍发现一小部分内容不适合所有受众,包括色情内容和暴力枪击报告,这些内容在OBELICS数据部分较为普遍,因此模型可能会生成类似的文本。
滥用和超出适用范围的使用
超出适用范围的使用
在高风险场景中使用该模型超出了其适用范围。该模型并非为关键决策或对个人生计或福祉有重大影响的用途而设计。模型输出的内容看似事实准确,但可能并不正确。超出适用范围的使用包括:
- 用于评估或评分个人,如就业、教育或信用评估。
- 用于关键自动决策、生成事实内容、创建可靠摘要或生成必须准确的预测。
滥用
故意使用该模型进行伤害、侵犯人权或其他恶意活动属于对该模型的滥用,包括:
- 垃圾邮件生成。
- 虚假信息和影响操作。
- 诋毁和诽谤。
- 骚扰和虐待。
- 欺骗。
- 未经同意的模仿和假冒。
- 未经同意的监视。
🔧 技术细节
模型架构
IDEFICS基于两个单模态的开源预训练模型构建,通过新初始化的Transformer块连接视觉编码器和语言模型。在训练过程中,预训练的主干模型保持冻结,只训练新初始化的参数。
训练数据处理
- 多模态网页文档:将对应于文本段落和图像顺序的序列输入模型。
- 图像 - 文本对:将图像与其描述组合成训练序列。图像通过视觉编码器进行编码,视觉隐藏状态通过Transformer Perceiver块进行池化,然后通过交叉注意力块融合到文本序列中。
训练优化
- 层归一化:遵循Dehghani等人(2023)的方法,对Perceiver和交叉注意力块的投影查询和键应用层归一化,提高了训练稳定性。
- 训练目标:标准的下一个标记预测。
超参数和训练参数
IDEFICS
参数 | IDEFICS - 80b | IDEFICS - 9b | |
---|---|---|---|
Perceiver Resampler | 层数 | 6 | 6 |
潜在数量 | 64 | 64 | |
头数 | 16 | 16 | |
重采样器头维度 | 96 | 96 | |
模型 | 语言模型主干 | Llama - 65b | Llama - 7b |
视觉模型主干 | laion/CLIP - ViT - H - 14 - laion2B - s32B - b79K | laion/CLIP - ViT - H - 14 - laion2B - s32B - b79K | |
跨层间隔 | 4 | 4 | |
训练 | 序列长度 | 1024 | 1024 |
有效批量大小(标记数量) | 367万 | 131万 | |
最大训练步数 | 20万 | 20万 | |
权重衰减 | 0.1 | 0.1 | |
优化器 | Adam(0.9, 0.999) | Adam(0.9, 0.999) | |
梯度裁剪 | 1.0 | 1.0 | |
Z - loss权重 | 1e - 3 | 1e - 3 | |
学习率 | 初始最大值 | 5e - 5 | 1e - 5 |
初始最终值 | 3e - 5 | 6e - 6 | |
衰减调度 | 线性 | 线性 | |
线性热身步数 | 2000 | 2000 | |
大规模优化 | 梯度检查点 | 是 | 是 |
精度 | 混合精度bf16 | 混合精度bf16 | |
ZeRO优化 | 阶段3 | 阶段3 |
IDEFICS - instruct
参数 | IDEFICS - 80b - instruct | IDEFICS - 9b - instruct | |
---|---|---|---|
训练 | 序列长度 | 2048 | 2048 |
有效批量大小(标记数量) | 61.3万 | 20.5万 | |
最大训练步数 | 2.2万 | 2.2万 | |
权重衰减 | 0.1 | 0.1 | |
优化器 | Adam(0.9, 0.999) | Adam(0.9, 0.999) | |
梯度裁剪 | 1.0 | 1.0 | |
Z - loss权重 | 0. | 0. | |
学习率 | 初始最大值 | 3e - 6 | 1e - 5 |
初始最终值 | 3.6e - 7 | 1.2e - 6 | |
衰减调度 | 线性 | 线性 | |
线性热身步数 | 1000 | 1000 | |
大规模优化 | 梯度检查点 | 是 | 是 |
精度 | 混合精度bf16 | 混合精度bf16 | |
ZeRO优化 | 阶段3 | 阶段3 |
📄 许可证
该模型基于两个预训练模型构建:laion/CLIP - ViT - H - 14 - laion2B - s32B - b79K和huggyllama/llama - 65b。第一个模型根据MIT许可证发布,而第二个模型根据特定的非商业许可证发布,专注于研究目的。因此,用户应通过直接申请Meta的表单来遵守该许可证。
连接两个预训练模型的新初始化参数是我们训练得到的,这些参数不基于构成复合模型的两个基础冻结模型。我们根据MIT许可证发布这些额外训练的权重。
📖 引用
@misc{laurencon2023obelics,
title={OBELICS: An Open Web-Scale Filtered Dataset of Interleaved Image-Text Documents},
author={Hugo Laurençon and Lucile Saulnier and Léo Tronchon and Stas Bekman and Amanpreet Singh and Anton Lozhkov and Thomas Wang and Siddharth Karamcheti and Alexander M. Rush and Douwe Kiela and Matthieu Cord and Victor Sanh},
year={2023},
eprint={2306.16527},
archivePrefix={arXiv},
primaryClass={cs.IR}
}
👥 模型构建者、卡片作者和贡献者
核心团队(*)在Hugging Face的这些贡献者的多方面支持下开展工作:
Stas Bekman*, Léo Tronchon*, Hugo Laurençon*, Lucile Saulnier*, Amanpreet Singh*, Anton Lozhkov, Thomas Wang, Siddharth Karamcheti, Daniel Van Strien, Giada Pistilli, Yacine Jernite, Sasha Luccioni, Ezi Ozoani, Younes Belkada, Sylvain Gugger, Amy E. Roberts, Lysandre Debut, Arthur Zucker, Nicolas Patry, Lewis Tunstall, Zach Mueller, Sourab Mangrulkar, Chunte Lee, Yuvraj Sharma, Dawood Khan, Abubakar Abid, Ali Abid, Freddy Boulton, Omar Sanseviero, Carlos Muñoz Ferrandis, Guillaume Salou, Guillaume Legendre, Quentin Lhoest, Douwe Kiela, Alexander M. Rush, Matthieu Cord, Julien Chaumond, Thomas Wolf, Victor Sanh*
📞 模型卡片联系
请在社区标签下开启讨论!








