open_flamingo
首个开源 Flamingo 复现:通过跨注意力融合视觉编码器与语言模型,实现少样本视觉问答与图像描述
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
首个开源 Flamingo 复现:通过跨注意力融合视觉编码器与语言模型,实现少样本视觉问答与图像描述
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你给 AI 看一张猫咪的照片,然后问它这只猫在做什么——这种同时理解图片和文字的能力,在 2023 年之前几乎是闭源大公司的专属。OpenFlamingo 的出现打破了这个局面。它是 DeepMind 闭源论文 Flamingo 的首个开源复现,让任何有 GPU 的开发者都能训练自己的视觉语言模型。
图 1:OpenFlamingo 架构图 — 将视觉编码器与语言模型通过跨注意力层连接。来源:DeepMind Flamingo 论文
2022 年 4 月,DeepMind 发布 Flamingo 论文,提出一种少样本学习的视觉语言模型——只需几张示例图片,模型就能学会 captioning、VQA 等各类视觉任务,而不需要额外微调。这种 in-context learning(上下文学习)能力让研究者们非常兴奋,但 DeepMind 只发了论文,代码闭源。
华盛顿大学、斯坦福大学、AI2 等机构的研究人员组成的团队决定自己动手。2023 年 3 月,LAION 社区发布了第一个 OpenFlamingo 版本;2023 年 8 月推出 v2,模型规模扩展到 3B、4B、9B 三个版本,训练数据来自 LAION-5B 的子集和 Multimodal C4 数据集。整个项目完全开源,MIT 许可证。
OpenFlamingo 的核心思路很优雅:用现成的视觉编码器 + 语言模型,中间插入几层跨注意力层来对齐两种模态。
这种架构的优势是模块化——换一个新的视觉编码器或语言模型,无需大改代码。训练时只微调跨注意力层,视觉编码器和语言模型保持冻结,训练成本大大降低。
Flamingo 的杀手锏是 in-context learning。传统 VQA 模型需要针对每个任务做监督微调,而 Flamingo 通过在输入中插入少量示例(图片+问题+答案),模型就能推断出新任务该怎么做。
在 COCO 数据集上,OpenFlamingo-9B 仅用 4 张示例图片做 captioning,CIDEr 分数达到 89.0,接近全监督模型水平。在 VQAv2 上,4-shot 准确率 54.8%。这些数字在 2023 年初是开源模型的 SOTA。
OpenFlamingo 使用 WebDataset 格式处理大规模训练数据(LAION 图像碎片 + Multimodal C4 文本),采用 torchrun 分布式训练,支持多节点多 GPU。训练脚本依赖 WandB 做实验追踪,用 braceexpand 处理大规模文件通配符。代码中专门做了 strict=False 的 checkpoint 加载,兼容 HuggingFace 格式的预训练权重。
| 组件 | 技术选择 | 说明 |
|---|---|---|
| 深度学习框架 | PyTorch 2.0.1 | 核心训练推理 |
| 视觉编码器 | OpenCLIP (ViT-L/14) | 冻结预训练 |
| 语言模型 | MPT, RedPajama, LLaMA, OPT 等 | 可插拔 |
| 数据格式 | WebDataset (.tar 分片) | 大规模训练 |
| 实验追踪 | Weights & Biases | 训练可视化 |
| 模型托管 | HuggingFace Hub | 预训练权重下载 |
代码库结构清晰:
open_flamingo/
src/ # 核心模型实现(Flamingo 层)
train/ # 训练脚本 + Slurm 示例
eval/ # 评测脚本(COCO Caption, VQAv2, OKVQA 等)
scripts/ # run_train.py, run_eval.sh
安装(pip,一行搞定):
pip install open-flamingo
pip install open-flamingo[eval] # 评测依赖
pip install open-flamingo[training] # 训练依赖
加载预训练模型(3B 版本):
from open_flamingo import create_model_and_transforms
model, image_processor, tokenizer = create_model_and_transforms(
clip_vision_encoder_path="ViT-L-14",
clip_vision_encoder_pretrained="openai",
lang_encoder_path="anas-awadalla/mpt-1b-redpajama-200b",
cross_attn_every_n_layers=1,
)
推理(少样本 captioning):
vision_x = [image_processor(img).unsqueeze(0) for img in images]
vision_x = torch.cat(vision_x, dim=0).unsqueeze(1).unsqueeze(0)
lang_x = tokenizer(["<image>An image of two cats.<|endofchunk|>...<image>An image of"])
generated_text = model.generate(
vision_x=vision_x,
lang_x=lang_x["input_ids"],
max_new_tokens=20,
)
print(tokenizer.decode(generated_text[0]))
1. 推理效率问题:OpenFlamingo 9B 模型推理速度较慢,因为每次生成 token 都需完整前向传播,无 KV Cache 优化。在消费级 GPU(RTX 3090/4090)上体验不佳。
2. 预训练权重获取门槛:LAION 托管的 .pt 预训练权重需要单独下载,大模型文件体积大(3B 模型约 6GB),下载速度依赖网络。
3. 缺乏中文支持:训练数据以英文为主,在中文视觉问答场景下效果明显弱于中文专门训练的模型(如 CogVLM)。
4. 文档和测试覆盖:评测和训练脚本示例较完善,但推理端的使用文档相对薄弱,新手需要参考 GitHub Issues 和 LAION 博客补充信息。
OpenFlamingo 的核心贡献不在于刷 SOTA,而在于降低了视觉语言模型研究的门槛。在它之前,复现 Flamingo 效果需要大量工程投入;有了 OpenFlamingo,研究者可以快速迭代跨注意力层设计、训练策略、数据配比等方向。
它也推动了后续一系列开源多模态模型的发展——OpenFlamingo 的模块化架构影响了 LLaVA、InstructBLIP 等项目的设计思路。从这个角度看,它是开源多模态生态的一个重要节点。
目前项目已发布 v2,在 3B/4B/9B 三个规模上均有 checkpoint 可用,GitHub 4103 星,是 LAION 社区最受欢迎的仓库之一。