模型简介
模型特点
模型能力
使用案例
language: zh tags:
- 多模态
- 文本
- 图像
- 图像转文本 license: 其他 datasets:
- HuggingFaceM4/OBELICS
- 维基百科
- facebook/pmd
- laion/laion2B-en pipeline_tag: 文本生成 inference: false
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 时遇到的技术挑战这里。
试试演示!
模型详情
- 开发者: Hugging Face
- 模型类型: 多模态模型(图像+文本)
- 语言(NLP): 英语
- 许可证: 参见许可证部分
- 父模型: laion/CLIP-ViT-H-14-laion2B-s32B-b79K 和 huggyllama/llama-65b
- 更多信息资源:
IDEFICS 是一个大型多模态英语模型,接受交错的图像和文本序列作为输入,并生成文本输出。该模型表现出强大的上下文少样本学习能力,与闭源模型相当。这使得 IDEFICS 成为在自定义数据上微调多模态模型的强大起点。
IDEFICS 建立在两个单模态开源预训练模型之上,以连接这两种模态。新初始化的参数以 Transformer 块的形式填补了视觉编码器和语言模型之间的空白。该模型在图像-文本对和非结构化的多模态网页文档的混合数据上进行训练。
IDEFICS-instruct 是通过在监督微调和指令微调数据集上进一步训练 IDEFICS 获得的模型。这显著提高了下游性能(使 idefics-9b-instruct 在其 90亿规模下成为一个非常强大的模型),同时使模型更适合对话。
用途
该模型可用于执行多模态(图像+文本)任务的推理,其中输入由文本查询/指令以及一个或多个图像组成。该模型不支持图像生成。
可以在自定义数据上对基础模型进行微调以适应特定用例。我们注意到,指令微调模型在遵循用户指令方面表现明显更好,因此在开箱即用时应该优先选择。
以下截图是与指令模型交互的示例:
如何开始使用模型
这些资源展示了如何使用 IDEFICS 进行推理(包括 4 位量化推理)以及如何微调模型。特别是,这个Colab 笔记本展示了如何使用 LoRA 和 4 位量化在单个 Google Colab GPU 上微调 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",
"在这张《阿斯泰利克斯历险记》的图片中,我们可以看到"
],
]
# --批处理模式
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")
为了快速测试您的软件而不等待巨大的模型下载/加载,您可以使用 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)
# 我们向模型输入任意序列的文本字符串和图像。图像可以是 URL 或 PIL 图像。
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)
# --单样本模式
# 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")
文本生成推理
托管的推理 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 中提出的训练程序。我们结合了两个开源预训练模型 (laion/CLIP-ViT-H-14-laion2B-s32B-b79K 和 huggyllama/llama-65b),通过初始化新的 Transformer 块。预训练的主干被冻结,而我们训练新初始化的参数。
该模型在以下公开可用的英语数据混合上进行训练:
数据源 | 数据类型 | 源中的令牌数量 | 源中的图像数量 | 训练轮次 | 令牌数的有效比例 |
---|---|---|---|---|---|
OBELICS | 非结构化多模态网页文档 | 1149亿 | 3.53亿 | 1 | 73.85% |
维基百科 | 非结构化多模态网页文档 | 31.92亿 | 3900万 | 3 | 6.15% |
LAION | 图像-文本对 | 299亿 | 11.20亿 | 1 | 17.18% |
PMD | 图像-文本对 | 16亿 | 7000万 | 3 | 2.82% |
OBELICS 是一个开放、大规模且经过筛选的交错图像-文本网页文档集合,包含 1.41 亿文档、1150 亿文本令牌和 3.53 亿图像。数据集内容的交互








