OFA

GitHub
2.6k 249 中等 1 次阅读 1周前Apache-2.0其他语言模型开发框架图像
AI 解读 由 AI 自动生成,仅供参考

OFA 是一个强大的多模态预训练模型,旨在通过统一的“序列到序列”学习框架,打破视觉与语言之间的壁垒。它不仅能处理图像描述、视觉问答、图文定位等跨模态任务,还能胜任文本分类、生成以及图像分类等传统单模态任务,甚至支持文生图和中英文 OCR 识别。

过去,开发者往往需要为不同任务训练独立的模型,导致资源浪费且维护复杂。OFA 的出现解决了这一痛点,它将多种架构、任务和模态整合进同一个模型中,用户只需微调或调整提示词(Prompt),即可让模型适应各种下游应用。其核心亮点在于“统一性”:一套权重即可通吃多种场景,且在多项国际基准测试(如 MSCOCO 图像描述)中取得了领先成绩。此外,OFA 原生支持中英文双语,并提供了详细的预训练与微调指南及现成的模型检查点。

这款工具非常适合人工智能研究人员、算法工程师以及希望快速构建多模态应用的开发者使用。无论是需要探索前沿多模态技术的学术团队,还是寻求高效解决方案的企业开发组,都能利用 OFA 简化工作流程,降低研发门槛。项目社区活跃,同时兼容 Hugging Face Transformers 生态,方便大家直接上手体验。

使用场景

某电商平台的智能运营团队需要快速构建一套能同时处理商品图片描述生成、视觉问答客服以及多语言文本分类的综合系统。

没有 OFA 时

  • 模型堆砌严重:团队需分别训练和维护图像描述(Image Captioning)、视觉问答(VQA)和文本分类三个独立模型,导致显存占用高且部署架构复杂。
  • 数据孤岛效应:不同任务的数据格式不统一,无法利用跨模态数据(如图文对)进行联合预训练,限制了模型在少样本场景下的泛化能力。
  • 开发迭代缓慢:每新增一个任务(如视觉定位),都需要重新设计网络结构并从头训练,研发周期长达数周。
  • 多语言支持困难:原有英文模型难以直接迁移到中文场景,需额外收集大量中文标注数据并单独训练中文版模型。

使用 OFA 后

  • 统一架构部署:利用 OFA 的序列到序列(Sequence-to-Sequence)框架,将图像描述、VQA 和分类任务整合进同一个预训练模型,显著降低推理成本和运维复杂度。
  • 跨模态知识共享:通过统一的预训练机制,模型自动学习图文之间的深层关联,即使在特定任务标注数据较少时,也能凭借跨模态知识保持高精度。
  • 敏捷任务扩展:新增视觉定位或文生图任务时,只需调整提示词(Prompt)或进行轻量级微调,无需改动核心架构,新功能上线时间缩短至几天。
  • 原生中英双语支持:直接调用 OFA 内置的中英文双语能力,无需重复训练即可无缝切换语言场景,大幅提升了全球化业务的响应速度。

OFA 通过“一个模型解决所有任务”的统一范式,彻底打破了模态与任务的壁垒,让多模态 AI 应用的开发从繁琐的“造轮子”转变为高效的“搭积木”。

运行环境要求

GPU

未说明

内存

未说明

依赖
notesREADME 中未明确列出具体的运行环境配置(如操作系统、GPU 型号、显存大小、Python 版本及具体依赖库版本)。该项目基于 Fairseq 框架,支持 Hugging Face Transformers 推理,提供从 Tiny 到 Huge 多种参数量级的模型(33M-930M),不同模型规模对硬件资源需求差异较大。建议参考项目提供的 Colab 笔记本或 transformers.md 文档获取更详细的运行指南。
python未说明
fairseq
torch
transformers
OFA hero image

快速开始




ModelScope  |  检查点  |  Colab  |  演示  |  论文   |  博客



OFA 是一个统一的序列到序列预训练模型(支持 英语中文),它能够统一多种模态(即跨模态、视觉、语言)和任务(支持 微调提示调优):图像字幕生成(在 MSCOCO 排行榜 上排名第一)、VQA(链接)、视觉定位、文本到图像生成、文本分类、文本生成、图像分类等。我们提供了关于预训练和微调的 分步 指导说明,以及相应的检查点(请查看官方检查点 [EN|CN] 或 Hugging Face 检查点)。

我们诚挚地欢迎各位为我们的项目贡献力量。欢迎您随时与我们联系或提交问题/拉取请求!

在线演示

我们通过 Hugging Face Spaces 提供在线演示,方便您与我们的预训练和微调模型进行交互。以下是各个演示的链接:

此外,我们还提供了 Colab 笔记本,帮助您更好地理解操作流程。点击 这里 即可查看!

在 Hugging Face Transformers 中使用

我们支持在 Hugging Face Transformers 中对 OFA 进行推理。更多信息请参阅 READMEColab 笔记本。相关代码已发布在此分支:https://github.com/OFA-Sys/OFA/tree/feature/add_transformers

新闻

  • 2023年5月11日:两篇论文(OFA-OCROFA-prompt)被 ACL 接收。OFA-OCR 的评估脚本和检查点已发布。
  • 2023年1月11日:发布了 MuE(https://arxiv.org/abs/2211.11152),该方法在性能损失很小的情况下显著加速了 OFA。特别感谢第一作者唐圣坤 (@Tangshengku)。更多信息请参阅 feature/MuE 分支及 PR
  • 2022年12月20日:发布了基于 OFA 的中文文本识别模型 OFA-OCR。请查看我们的 论文演示
  • 2022年12月7日:发布了基于 OFA 的 ASR 预训练方法 MMSpeech。请在此处查看我们的论文 这里! 更多详情请参阅 README_mmspeech.md
  • 2022年8月16日:发布了 OFA 的 中文版本。使用 OFA-CN 只需将 bpe_dir=../../utils/BERT_CN_dictbpe=bert 进行切换,并使用我们在 checkpoints_cn.md 中提供的中文检查点即可。目前我们仅提供基础尺寸和大型预训练检查点,以及在 MUGE Caption 和中文版 RefCOCO(-/+/g) 数据集上的微调检查点(即将发布)。
  • 2022年8月5日:发布了 OFA 对 提示调优 的支持。请在此处查看我们的论文 这里! 更多细节请参阅 prompt_tuning.md
  • 2022年7月7日:更新了 OFA 在 Hugging Face transformers 上的支持(修复了 forward 中的 bug,添加了来自 Fairseq 的序列生成器以确保性能等)。请参考文档 transformers.md 和分支 feature/add_transformers
  • 2022年6月17日:发布了 OFA-Huge 的预训练检查点。使用时,在脚本中设置 --arch=ofa_huge 即可。
  • 2022年5月15日:OFA 被 ICML 2022 接收。
更多新闻

  • 2022年4月28日:增加了对 **Hugging Face transformers** 推理的支持。使用方法请参阅文档 [transformers.md](transformers.md) 和我们的 [Hugging Face 模型](https://huggingface.co/OFA-Sys)。
  • 2022年4月16日:在 [checkpoints.md](checkpoints.md) 中发布了轻量级预训练模型 **OFA-Medium**(约 9300 万参数)和 **OFA-Tiny**(约 3300 万参数)。使用时,只需加载相应的检查点,并在脚本中设置 `--arch=ofa_medium` 或 `--arch=ofa_tiny` 即可。
  • 2022年3月23日:新增了 [鼓励损失](https://arxiv.org/pdf/2110.06537.pdf) 功能。详情请参阅 [README_EncouragingLoss.md](README_EncouragingLoss.md)。利用此功能,OFA-Large 最近在 VQA(测试标准准确率:80.67%)和图像分类(测试准确率:85.6%)任务上均取得了更好的成绩。
  • 2022年3月21日:发布了 OFA 预训练的代码。
  • 2022年3月18日:发布了经过微调的 OFA-Base(约 1.8 亿参数)检查点及视觉与语言任务的运行脚本,包括:Caption(146.4 CIDEr)、VQA(测试标准数据集上为 78.07)、SNLI-VE(开发集上为 89.3)、RefCOCO(测试 A 子集上为 90.67)、RefCOCO+(测试 A 子集上为 87.15)和 RefCOCOg(测试 u 子集上为 82.31)
  • 2022年3月11日:发布了用于 Gigaword 任务的微调与推理代码/检查点。
  • 2022年3月8日:在 checkpoints.md 中发布了 OFA-Base 的预训练检查点。使用 OFA-Base 时,只需加载 ofa_base.pt,并将训练脚本中的 --arch=ofa_large 改为 --arch=ofa_base 即可。
  • 2022年3月7日:发布了用于 图像分类 任务的微调与推理代码/检查点,其在 ImageNet-1K 数据集上的准确率为 85.0%,略高于 OFA 论文中报告的结果。
  • 2022年3月4日:发布了用于 文本到图像生成 任务的微调与推理代码/检查点。
  • 2022年3月3日:发布了用于 SNLI-VEGLUE 任务的微调与推理代码/检查点。
  • 2022年2月22日:发布了用于 视觉问答 任务的微调与推理代码/检查点,能够复现 OFA 论文中报告的 VQA 准确率(测试标准数据集上为 80.02%)。请查看我们在 VQA 挑战赛 上的成绩。
  • 2022年2月15日:发布了用于 指代表达理解 任务的微调与推理代码/检查点。
  • 2022年2月10日:发布了用于 图像字幕生成 任务的推理代码及微调检查点,能够复现 COCO Karparthy 测试集上的结果(149.6 CIDEr)。OFA 还在 COCO 图像字幕在线排行榜上排名第一 链接(标记为 M6-Team)。



模型卡片

以下列出了 OFA 各个模型的参数及预训练检查点。关于微调后的检查点,请参阅 checkpoints.md

模型检查点参数骨干网络隐藏层大小中间层大小注意力头数编码器层数解码器层数
OFATiny下载3300 万ResNet502561024444
OFAMedium下载9300 万ResNet1015122048844
OFABase下载1.8 亿ResNet10176830721266
OFALarge下载4.7 亿ResNet15210244096161212
OFAHuge下载9.3 亿ResNet15212805120162412


结果

下面我们展示了 OFA 在跨模态理解和生成任务上的结果。

任务图像字幕生成VQA视觉蕴含指代表达理解
数据集COCOVQA v2SNLI-VERefCOCORefCOCO+RefCOCOg
划分Karpathy 测试集 (CE/CIDEr)test-dev/test-stdval/testval/test-a/test-bval/test-a/test-bval-u/test-u
指标CIDEr准确率准确率准确率
OFATiny119.0 / 128.770.3 / 70.485.3 / 85.280.20 / 84.07 / 75.0068.22 / 75.13 / 57.6672.02 / 69.74
OFAMedium130.4 / 140.375.4 / 75.586.6 / 87.085.34 / 87.68 / 77.9276.09 / 83.04 / 66.2578.76 / 78.58
OFABase138.2 / 146.778.0 / 78.189.3 / 89.288.48 / 90.67 / 83.3081.39 / 87.15 / 74.2982.29 / 82.31
OFALarge142.2 / 150.780.4 / 80.790.3 / 90.290.05 / 92.93 / 85.2685.80 / 89.87 / 79.2285.89 / 86.55
OFAHuge145.3 / 154.982.0 / 82.091.0 / 91.292.04 / 94.03 / 88.4487.86 / 91.70 / 80.7188.07 / 88.78


需求

  • python 3.7.4
  • pytorch 1.8.1
  • torchvision 0.9.1
  • JAVA 1.8(用于 COCO 评估)



安装

git clone https://github.com/OFA-Sys/OFA
pip install -r requirements.txt



数据集和检查点

请参阅 datasets.mdcheckpoints.md

训练与推理

下面我们提供了在不同任务上进行训练和推理的方法。我们在 checkpoints.md 中提供了预训练的 OFA-Large 和 OFA-Base 模型。本节中提到的脚本是为 OFA-Large 准备的。为了复现 OFA-Base 的下游任务结果,我们也在 run_scripts/ 文件夹中提供了相应的微调和推理脚本。

我们建议您的工作目录应按以下方式组织:

OFA/
├── checkpoints/
│   ├── ofa_base.pt
│   ├── ofa_large.pt
│   ├── caption_large_best_clean.pt
│   └── ...
├── criterions/
├── data/
├── dataset/
│   ├── caption_data/
│   ├── gigaword_data/
│   └── ...
├── fairseq/
├── models/
├── run_scripts/
├── tasks/
├── train.py
├── trainer.py
└── utils/

图像处理

为了确保数据处理的效率,我们没有存储小文件大小的图像,而是将其编码为 base64 字符串。 将图像文件转换为 base64 字符串非常简单。运行以下代码:

from PIL import Image
from io import BytesIO
import base64

img = Image.open(file_name) # 文件路径
img_buffer = BytesIO()
img.save(img_buffer, format=img.format)
byte_data = img_buffer.getvalue()
base64_str = base64.b64encode(byte_data) # 字节
base64_str = base64_str.decode("utf-8") # 字符串

预训练

下面我们提供了 OFA 的预训练方法。

1. 准备数据集

要预训练 OFA,您首先需要下载我们提供的数据集(pretrain_data_examples.zip, 是原始预训练数据的一个小子集)。对于您自定义的预训练数据集,请将您的训练样本准备成相同的格式。pretrain_data_examples.zip 包含 4 个 TSV 文件: vision_language_examples.tsv, text_examples.tsv, image_examples.tsvdetection_examples.tsv。这些文件的详细信息如下:

  • vision_language_examples.tsv: 每行包含唯一 ID、图像(base64 字符串)、字幕、问题、答案、真实物体(出现在字幕或问题中的物体)、数据来源名称以及任务类型(字幕、问答或视觉定位)。适用于视觉定位、基于上下文的字幕生成、图文匹配、图像字幕生成和视觉问答等预训练任务。
  • text_examples.tsv: 每行包含唯一 ID 和文本。适用于文本填充任务的预训练。
  • image_examples.tsv: 每行包含唯一 ID、图像(base64 字符串,需调整为 256*256 分辨率)和图像码(通过 VQ-GAN 为图像中心部分生成稀疏码)。适用于图像填充任务的预训练。
  • detection_examples.tsv: 每行包含唯一 ID、图像(base64 字符串)和边界框标注(包含边界框的左上角和右下角坐标、物体 ID 和物体名称,用逗号分隔)。适用于目标检测任务的预训练。
此外,pretrain_data_examples.zip 中的 negative_sample 文件夹包含三个文件 all_captions.txt, object.txttype2ans.json。这些文件中的数据被用作图文匹配(ITM)任务的负样本。

2. 预训练

默认情况下,预训练脚本会尝试恢复已发布的 OFA-Base 或 OFA-Large 预训练检查点,并继续进行预训练。建议采用持续预训练的方式,相比从零开始预训练,效果要好得多。对于持续预训练,请提前下载预训练权重(见 checkpoints.md) 并将其放置在正确的目录 OFA/checkpoints/ 中。否则,预训练将从零开始。

cd run_scripts/pretraining
bash pretrain_ofa_large.sh # 预训练 OFA-Large。对于 OFA-Base,使用 pretrain_ofa_base.sh

如果成功恢复了预训练的 OFA 检查点,您将在日志中看到以下信息:

INFO: Loaded checkpoint ../../checkpoints/ofa_large.pt

图像字幕生成

我们在下文的论文中提供了复现图像字幕生成结果的步骤。

1. 准备数据集与检查点

下载数据(参见 datasets.md) 和模型(参见 checkpoints.md),并将其放置到正确的目录中。数据集压缩包 caption_data.zip 包含 caption_stage1_train.tsv、caption_stage2_train.tsv、caption_val.tsv 和 caption_test.tsv。在 caption_stage1_train.tsv 中,每张图片仅对应 1 条字幕;而在其他 TSV 文件中,每张图片则对应多条字幕(平均每张图片约 5 条)。数据集中的每一行代表一个字幕样本,格式如下:唯一 ID、图片 ID、字幕、预测的物体标签(来自 VinVL,未使用)、图片 Base64 字符串,各字段之间用制表符分隔。

162365  12455   太阳从码头后的树林上落下。天空&&水&&码头&&杆  /9j/4AAQSkZJ....UCP/2Q==
2. 微调

按照以往的标准做法,我们将图像字幕生成的微调过程分为两个阶段。在第一阶段,我们使用交叉熵损失在 4 张配备 32GB 显存的 NVIDIA-V100 GPU 上对 OFA 进行微调(预计在此阶段可在验证集上获得约 139.5 的 CIDEr 分数)。在第二阶段,我们选择第一阶段的最佳检查点,并在 8 张 NVIDIA-V100 GPU 上以 CIDEr 优化目标进行训练。请注意,CIDEr 优化非常不稳定,需要仔细调整超参数。如果在第二阶段的微调过程中遇到训练错误,可以尝试增大批量大小或降低学习率。若仍无效,可以直接设置--freeze-resnet来冻结批归一化的内部状态。

cd run_scripts/caption
nohup sh train_caption_stage1.sh > train_stage1.out &  # 第一阶段,使用交叉熵损失训练
nohup sh train_caption_stage2.sh > train_stage2.out &  # 第二阶段,加载第一阶段的最佳检查点,并以 CIDEr 优化目标训练 
3. 推理

运行以下命令以获取您的结果并评估您的模型。

cd run_scripts/caption ; sh evaluate_caption.sh  # 推理与评估

文本到图像生成

本部分提供了文本到图像生成的微调和推理步骤。详情如下。

1. 准备数据集与检查点

下载数据(参见 datasets.md) 和模型(参见 checkpoints.mdcoco_image_gen.zip 包含 coco_vqgan_train.tsvcoco_vqgan_dev.tsvcoco_vqgan_full_test.tsv。数据集中的每一行代表一个样本,格式如下:唯一 ID、图像编码(由 vqgan 生成,由单个空格分隔的整数列表)、小写形式的字幕,各字段之间用制表符分隔。

1	6674 4336 4532 5334 3251 5461 3615 2469 ...4965 4190 1846	人们正在摆姿势合影。

检查点压缩包 image_gen_large_best.zip 包含 image_gen_large_best.ptvqgan/last.ckptvqgan/model.yamlclip/Vit-B-16.pt

2. 打乱训练数据

(可选,但效果更好):如果磁盘存储空间充足,建议提前为每个 epoch 准备打乱后的训练数据。

cd dataset/image_gen
ln coco_vqgan_train.tsv coco_vqgan_train_1.tsv
for idx in `seq 1 9`;do shuf coco_vqgan_train_${idx}.tsv > coco_vqgan_train_$[${idx}+1].tsv;done # 每个文件用于一个 epoch
3. 微调

按照以往的做法,我们将图像生成的微调过程分为两个阶段。在第一阶段,我们使用交叉熵损失在 4 台 8 张 V100-32G-GPU 的服务器上对 OFA 进行微调(预计在此阶段可在验证集上获得约 32.5+ 的 CLIP 分数)。在第二阶段,我们选择第一阶段的最后一份检查点,并在 4 台 8 张 V100-32G-GPU 的服务器上以 CLIP 分数优化目标进行训练(预计在此阶段可在验证集上获得约 34.0+ 的 CLIP 分数)。在验证过程中,生成的图像将被保存到 _GEN_IMAGE_PATH_

# 在按照 train_image_gen_stage1_distributed.sh 中的指南正确设置分布式和数据配置后,在每个工作节点上运行
cd run_scripts/image_gen
nohup sh train_image_gen_stage1_distributed.sh # 第一阶段,使用交叉熵损失训练
nohup sh train_image_gen_stage2_distributed.sh # 第二阶段,加载第一阶段的最后一份检查点,并以 CLIP 分数优化目标训练 
4. 推理

运行下方命令以生成您的图像。

cd run_scripts/image_gen ; sh evaluate_image_gen.sh  # 推理与评估(FID、IS 和 CLIP 分数)

视觉问答

在这里,我们提供了微调和推理代码,以复现我们论文中报告的 VQAv2 结果(test-std 80.02)。我们相信,基于这个代码库,准确率还有很大的提升空间 :)

1. 准备数据集与检查点

下载数据(参见 datasets.md)和模型(参见 checkpoints.md),并将它们放置在正确的目录中。数据集压缩包 vqa_data.zip 大约 100G,解压后占用约 135G 的磁盘空间,其中包含了训练、验证和测试样本以及其他必要的数据资源。(由于 vqa_data.zip 文件较大,我们还提供了分块的数据文件,以便更方便、更稳定地下载。请参考 issue #68。)按照惯例,VG-QA 样本也被纳入了训练数据。为了适配 OFA 的序列到序列范式,我们将原始 VQA 训练问题中包含多个正确答案的情况转换为多个训练样本。对于原始的 VQA 验证集,我们保留大约 1 万个样本用于验证,并将其他样本用于训练。数据集中的每一行代表一个 VQA 样本,格式如下:question-id、image-id、问题、答案(带置信度)、预测的物体标签(来自 VinVL, 可带来约 +0.1 的准确率提升)、图像 base64 字符串,各字段之间用制表符分隔。

79459   79459   这个人穿短裤吗?  0.6|!+no    house&&short&&...&&sky  /9j/4AAQS...tigZ/9k=

如果需要针对自定义的 VQA 任务进行微调,请参阅 issue #76#105#73 获取更多信息。

2. 打乱训练数据

(可选,但能提高微调准确率):如果磁盘空间充足,我们建议提前为每个 epoch 准备打乱后的训练数据。在我们的实验中,使用打乱数据的方法可以使 VQA 准确率提升约 +0.3

cd dataset/vqa_data
ln vqa_train.tsv vqa_train_1.tsv
for idx in `seq 1 9`;do shuf vqa_train_${idx}.tsv > vqa_train_$[${idx}+1].tsv;done # each file is used for an epoch
3. 微调

在我们的实验中,VQA 微调是在 4 台配备 8 张 A100 GPU 的服务器上进行的(带有 RDMA)。这里提供了微调脚本 train_vqa_distributed.sh,支持多机分布式训练(也支持单机训练)。请参考脚本开头的注释,并根据您的分布式环境正确设置配置。如果您在上一步中已经打乱了训练数据,请按照脚本注释中的指南正确指定训练数据路径。该命令应在每台工作节点上执行。

# 在按照 train_vqa_distributed.sh 中的指南正确设置分布式和数据配置后,在每台工作节点上运行
cd run_scripts/vqa
bash train_vqa_distributed.sh 

在我们的实验中,微调大约耗时 36 小时(共 12 个 epoch)。每个 epoch 结束后都会在验证集上进行评估。微调过程中最佳的验证准确率约为 80.8。日志会保存在 ${log_dir} 中。

(关于验证耗时的更新) 如将在 4. 推理 节中提到的那样,我们准备了两种推理方式:束搜索和全候选推理。默认情况下,微调期间的验证采用全候选推理,这种方式虽然准确率更高,但耗时较长。现在我们在训练脚本中增加了一个名为 --val-inference-type 的新选项,用于切换微调期间的验证推理类型。如果您觉得验证耗时过长,可以参考 PR #79 启用束搜索验证,这样可以显著减少时间消耗,不过相比全候选验证,准确率会下降约 0.5–0.6。

4. 推理

我们提供两种推理方式:束搜索(速度更快,但准确率稍低)和 全候选评估(速度较慢,但准确率最高)。

对于束搜索推理,使用脚本 evaluate_vqa_beam.sh。请参考以下命令。在测试集上的推理大约需要 16 个 GPU 小时。推理完成后,结果 JSON 文件会保存在 shell 脚本中定义的 ${result_path} 目录下。您可以将结果文件 test_predict.json 提交到 EvalAI。使用我们发布的微调检查点,束搜索推理可以获得 80.15 的验证准确率、79.36 的 test-dev 准确率以及 79.48 的 test-std 准确率(比全候选评估低约 0.6)。

cd run_scripts/vqa
bash evaluate_vqa_beam.sh val # 指定 'val' 或 'test'

对于全候选评估,我们建议使用分布式脚本 evaluate_vqa_allcand_distributed.sh。请在运行前参考脚本中的说明设置分布式配置。结果 JSON 文件会保存在 rank-0 服务器的 shell 脚本中定义的 ${result_path} 目录下。全候选评估会计算 VQA 数据集中所有候选答案的得分,从而达到 80.82 的验证准确率、79.87 的 test-dev 准确率以及 80.02 的 test-std 准确率,复现我们论文中报告的结果。然而,对测试集的推理大约需要 1000 个 GPU 小时,速度较慢。

# 在按照 evaluate_vqa_allcand_distributed.sh 中的指南正确设置分布式配置后,在每台工作节点上运行
cd run_scripts/vqa
bash evaluate_vqa_allcand_distributed.sh val # 指定 'val' 或 'test'

视觉定位(指代表达理解)

这里提供了在视觉定位任务上准备数据、训练和评估模型的步骤。

1. 准备数据集与检查点

下载数据(参见 datasets.md) 和模型(参见 checkpoints.md),并将其放置到正确的目录中。我们提供了 RefCOCO(UNC 分割)、RefCOCO+(UNC 分割)和 RefCOCOg(UMD 分割)数据集。更多详情请参阅 RefCOCORefer。请注意,在原始数据集中,每个区域坐标(或边界框)可能对应多个描述性文本。我们将这些文本拆分为多个样本,使得每个样本中的区域坐标仅对应一个文本。处理后的数据集每行代表一个样本,格式如下:uniq-id、image-id、文本、区域坐标(以逗号分隔)以及图像的 Base64 编码字符串,各字段之间用制表符分隔。

79_1    237367  一位身穿白色衬衫的女子手持一杯葡萄酒。  230.79,121.75,423.66,463.06 9j/4AAQ...1pAz/9k=
2. 微调

与原论文不同,我们使用 0.2 的丢弃路径率对 OFA 进行微调,并发现采用该超参数进行训练可以获得更好的效果。我们将在稍后更新论文中报告的结果。

cd run_scripts/refcoco
nohup sh train_refcoco.sh > train_refcoco.out &  # 针对 refcoco 进行微调
nohup sh train_refcocoplus.sh > train_refcocoplus.out &  # 针对 refcoco+ 进行微调
nohup sh train_refcocog.sh > train_refcocog.out &  # 针对 refcocog 进行微调
3. 推理

运行以下命令进行评估。

cd run_scripts/refcoco ; sh evaluate_refcoco.sh  # 针对 refcoco/refcoco+/refcocog 进行推理与评估

视觉蕴含

我们提供了复现视觉蕴含任务结果的步骤,具体如下。

1. 准备数据集与检查点

下载数据(参见 datasets.md) 和模型(参见 checkpoints.md),并将其放置到正确的目录中。处理后的数据集每行代表一个样本,格式如下:uniq-id、image-id、图像 Base64 编码字符串、假设、标题(或文本前提)以及标签,各字段之间用制表符分隔。

252244149.jpg#1r1n  252244149   /9j/4AAQ...MD/2Q==   一位身穿粉金色衣服的男子正在咀嚼一根木制牙签。   地铁上,一位身穿粉色衣服的男子正在咀嚼牙签。   中性 
2. 微调

在我们的实验中,SNLI-VE 的微调是在 8 张配备 32GB 显存的 NVIDIA-V100 GPU 上进行的。在此任务中,我们仅尝试了几组超参数。我们认为,适当的超参数调优可以进一步提升准确率。

cd run_scripts/snli_ve
nohup sh train_snli_ve.sh > train_snli_ve.out &  # 针对 snli_ve 进行微调
3. 推理

运行以下命令以获取结果。

cd run_scripts/snli_ve ; sh evaluate_snli_ve.sh dev  # 指定 'dev' 或 'test'

GLUE

这里提供了在语言理解任务上对我们的模型进行微调和评估的步骤。我们以 GLUE 基准测试为例展示了具体实践。

1. 准备数据集与检查点

下载数据(参见 datasets.md) 和模型(参见 checkpoints.md),并将其放置到正确的目录中。我们提供了来自 GLUE 基准测试的 7 个语言理解数据集,包括 COLA、MNLI、MRPC、QNLI、QQP、RTE 和 SST2。有关这些数据集的更多详细信息,请参阅此 链接

2. 微调

对于每个任务,我们尝试了多组超参数(包括学习率、批量大小、训练轮数)。不同超参数设置下的结果可在 ${log_dir} 中找到。

cd run_scripts/glue
nohup sh train_cola.sh > train_cola.out &  # 针对 cola 进行微调
nohup sh train_mnli.sh > train_mnli.out &  # 针对 mnli 进行微调
nohup sh train_mrpc.sh > train_mrpc.out &  # 针对 mrpc 进行微调
nohup sh train_qnli.sh > train_qnli.out &  # 针对 qnli 进行微调
nohup sh train_qqp.sh > train_qqp.out &  # 针对 qqp 进行微调
nohup sh train_rte.sh > train_rte.out &  # 针对 rte 进行微调
nohup sh train_sst2.sh > train_sst2.out &  # 针对 sst2 进行微调

ImageNet-1K 上的图像分类

我们提供了微调和推理代码,能够复现 85.0 的 ImageNet-1K 准确率,略高于我们在论文中报告的结果。

1. 准备数据集与检查点

下载数据(参见 datasets.md) 和模型(参见 checkpoints.md),并将它们放置到正确的目录中。我们提供的数据源自原始的 ImageNet-1K (ILSVRC2012 训练集与验证集) 数据集,并与其保持相同的数据划分。为了将分类任务转化为序列到序列范式,我们使用 Caffe 提供的 synset 词汇 作为每个图像类别的生成目标。处理后的数据集中,每行代表一个样本,格式如下:图像的 base64 编码字符串、分类标签(从 1 开始计数,与 synset_words.txt 中的顺序一致)以及该标签对应的 synset 词汇,三者之间以制表符分隔。

_9j_4AAQS...fzX__Z  769 橄榄球
2. 打乱训练数据

(可选,但能提升微调准确率):如果磁盘存储空间充足,我们建议提前为每个 epoch 准备好打乱顺序的训练数据。在我们的实验中,采用打乱顺序的方式使 ImageNet-1K 准确率提升了约 +0.2

cd dataset/imagenet_1k_data
ln imagenet_1k_train.tsv imagenet_1k_train_1.tsv
for idx in `seq 1 9`;do shuf imagenet_1k_train_${idx}.tsv > imagenet_1k_train_$[${idx}+1].tsv;done # 每个文件依次用于一个 epoch
3. 微调

在我们的实验中,ImageNet-1K 的微调是在两台配备 8 张 A100 GPU 的服务器上进行的(支持 RDMA)。这里提供微调脚本 train_imagenet_distributed.sh,它支持多机分布式训练(同时也支持单机训练)。请参考脚本开头的注释,并根据您的分布式环境正确设置配置。如果您在上一步中已经对训练数据进行了打乱,请按照脚本注释中的指引正确指定训练数据路径。该命令应在每台工作节点上执行。 为了在微调过程中快速评估,我们默认会从原始验证集划分出 20% 的子集,并在每个 epoch 结束后报告该子集上的准确率。验证子集上的准确率通常与完整验证集上的准确率相差 ±0.1。

# 在按照 train_imagenet_distributed.sh 中的指南正确设置分布式及数据配置后,在每台工作节点上运行
cd run_scripts/image_classify
bash train_imagenet_distributed.sh

在我们的实验中,微调大约耗时 80 小时(共 32 个 epoch)。微调过程中验证子集上的最佳准确率约为 85.0。日志会保存在 ${log_dir} 目录下。

4. 推理

若要获得完整的 ImageNet-1K 验证集上的准确率,请运行以下命令。评估大约需要 10 个 GPU 小时。准确率将在标准输出中显示(预计约为 85.0)。

cd run_scripts/image_classify ; sh evaluate_imagenet.sh  # 对 ImageNet-1K 进行推理与评估

Gigaword

我们提供了复现 Gigaword 数据集上结果的步骤,详情如下。

1. 准备数据集与检查点

下载数据(参见 datasets.md) 和模型(参见 checkpoints.mdUniLM,我们将其整理为 tsv 格式。处理后的数据集中,每行代表一个样本,格式如下:源文本和目标文本之间以制表符分隔。

工厂订单在九月份增长了 #.#%... 美国九月份工厂订单增长了 #.#%
2. 微调

运行以下命令来训练模型。

cd run_scripts/gigaword
nohup sh train_gigaword.sh > train_gigaword.out &  # 为 Gigaword 进行微调
3. 推理

运行以下命令以获取结果(约 36.43 的 rougeL 分数)。

cd run_scripts/gigaword ; sh evaluate_gigaword.sh  # 对 Gigaword 进行推理与评估



图库

下面我们展示了 OFA 在文本到图像生成和开放式 VQA 方面的示例。此外,我们还演示了它在未见过的任务(Grounded QA)以及未见过的领域(来自未知领域的图像视觉定位)中的表现。

文本到图像生成

case1

开放式 VQA

open_vqa

Grounded QA(未见过的任务)

grounded_qa

视觉定位(未见过的领域)

vg

相关代码库



参与方式

欢迎提交 GitHub 问题或拉取请求。我们非常欢迎各位为本项目贡献力量!

如需联系我们,请随时发送邮件至 zheluo.wp@alibaba-inc.comjunyang.ljy@alibaba-inc.com

引用

如果您觉得我们的论文有帮助,请引用它们 :)

@article{wang2022ofa,
  author    = {Peng Wang and
               An Yang and
               Rui Men and
               Junyang Lin and
               Shuai Bai and
               Zhikang Li and
               Jianxin Ma and
               Chang Zhou and
               Jingren Zhou and
               Hongxia Yang},
  title     = {OFA: 通过一个简单的序列到序列学习框架统一架构、任务和模态},
  journal   = {CoRR},
  volume    = {abs/2202.03052},
  year      = {2022}
}



@article{ofa_ocr,
  author       = {Junyang Lin and
                  Xuancheng Ren and
                  Yichang Zhang and
                  Gao Liu and
                  Peng Wang and
                  An Yang and
                  Chang Zhou},
  title        = {将通用多模态预训练模型迁移到文本识别},
  journal      = {CoRR},
  volume       = {abs/2212.09297},
  year         = {2022}
}



@article{ofa_prompt,
  author       = {Hao Yang and
                  Junyang Lin and
                  An Yang and
                  Peng Wang and
                  Chang Zhou and
                  Hongxia Yang},
  title        = {面向生成式多模态预训练模型的提示调优},
  journal      = {CoRR},
  volume       = {abs/2208.02532},
  year         = {2022}
}



@article{mmspeech,
  title={MMSpeech: 面向语音识别的多模态多任务编码器-解码器预训练},
  author={Zhou, Xiaohuan and Wang, Jiaming and Cui, Zeyu and Zhang, Shiliang and Yan, Zhijie and Zhou, Jingren and Zhou, Chang},
  journal={arXiv 预印本 arXiv:2212.00500},
  year={2022}
}

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

159.6k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|1周前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架