语言:英语
标签:
- 多模态
- 文本
- 图像
- 图像转文本
许可证:其他
数据集:
- HuggingFaceM4/OBELICS
- 维基百科
- facebook/pmd
- laion/laion2B-en
管道标签:文本生成
推理:不支持
IDEFICS
如何发音模型名称?观看YouTube教程
IDEFICS(Image-aware Decoder Enhanced à la Flamingo with Interleaved Cross-attentionS)是Deepmind开发的闭源视觉语言模型Flamingo的开源复现版本。与GPT-4类似,这一多模态模型接受任意序列的图像和文本输入,并生成文本输出。IDEFICS完全基于公开可用的数据和模型构建。
该模型能够回答关于图像的问题、描述视觉内容、基于多张图像创作故事,或仅作为纯语言模型运行而无需视觉输入。
IDEFICS在多种图像-文本基准测试中与原版闭源模型表现相当,包括视觉问答(开放式和多项选择)、图像描述以及通过上下文少样本学习评估的图像分类。它提供两种版本:拥有800亿参数的大模型和90亿参数的小模型。
我们还对基础模型进行了监督与指令微调数据集的混合微调,这提升了模型在下游任务中的表现,同时使其更适用于对话场景:idefics-80b-instruct 和 idefics-9b-instruct。由于这些版本性能更优,我们建议优先使用它们。
了解更多关于训练IDEFICS时遇到的技术挑战请点击此处。
试试演示!
模型详情
IDEFICS是一个大型多模态英语模型,接受交错的图像和文本序列作为输入,并生成文本输出。该模型展现出强大的上下文少样本学习能力,与闭源模型表现相当。这使IDEFICS成为基于自定义数据微调多模态模型的坚实基础。
IDEFICS基于两个单模态开源预训练模型构建,通过新初始化的Transformer块参数连接两种模态。模型在图像-文本对和非结构化多模态网络文档的混合数据上进行训练。
IDEFICS-instruct是通过在监督微调和指令微调数据集上进一步训练IDEFICS得到的模型。这显著提升了模型在下游任务中的表现(使idefics-9b-instruct成为90亿参数规模中的佼佼者),同时使其更适用于对话场景。
用途
该模型可用于执行多模态(图像+文本)任务的推理,输入由文本查询/指令与一张或多张图像组成。此模型不支持图像生成。
可基于自定义数据对基础模型进行微调以适应特定用例。我们注意到,经过指令微调的模型在遵循用户指令方面表现更佳,因此直接使用时建议优先选择这类模型。
以下截图展示了与指令模型的交互示例:

快速上手
这些资源展示了如何对IDEFICS进行推理(包括4位量化推理)以及如何微调模型。特别是,这个Colab笔记本展示了如何使用单个Google Colab GPU通过LoRA和4位量化微调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)
prompts = [
[
"https://upload.wikimedia.org/wikipedia/commons/8/86/Id%C3%A9fix.JPG",
"在这张《阿斯泰利克斯历险记》的图片中,我们可以看到"
],
]
inputs = processor(prompts, 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")
若需快速测试代码而无需等待大模型下载/加载,可使用HuggingFaceM4/tiny-random-idefics
——该模型未经训练且权重随机,但非常适合快速测试。
使用以下代码快速体验指令模型:
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)
prompts = [
[
"用户:这张图片里有什么?",
"https://upload.wikimedia.org/wikipedia/commons/8/86/Id%C3%A9fix.JPG",
"<end_of_utterance>",
"\n助手:这张图片描绘了《阿斯泰利克斯历险记》中奥贝利克斯的狗伊德菲克斯。伊德菲克斯正在地面上奔跑。<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)
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")
文本生成推理
托管推理API由文本生成推理提供支持。查询模型时,可使用以下代码片段。关键是将图像作为可获取的URL以Markdown语法传递:
from text_generation import Client
API_TOKEN = "<您的API令牌>"
API_URL = "https://api-inference.huggingface.co/models/HuggingFaceM4/idefics-80b-instruct"
DECODING_STRATEGY = "Greedy"
QUERY = "用户:这张图片里有什么?<end_of_utterance>\n助手:"
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>", "\n用户:"],
}
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)
注意:目前我们仅托管指令模型的推理服务。
训练详情
IDEFICS
我们严格遵循Flamingo论文中的训练流程。通过初始化新的Transformer块参数,我们组合了两个开源预训练模型(laion/CLIP-ViT-H-14-laion2B-s32B-b79K和huggyllama/llama-65b)。在训练新参数时,预训练的主干网络保持冻结状态。
模型在以下公开可获取的英语数据混合上进行训练:
数据源 |
数据类型 |
源文本token数 |
源图像数 |
训练轮次 |
token有效占比 |
OBELICS |
非结构化多模态网页文档 |
1149亿 |
3.53亿 |
1 |
73.85% |
维基百科 |
非结构化多模态网页文档 |
31.92亿 |
3900万 |
3 |
6.15% |
LAION |
图像-文本对 |
299亿 |
11.2亿 |
1 |
17.18% |
PMD |
图像-文本对 |
16亿 |
7000万 |
3 |
2.82% |
OBELICS是一个开放