作者:Kartikay Khandelwal, Ankita De

我们在此宣布 TorchMultimodal Beta 发布,这是一个 PyTorch 领域库,用于大规模训练目前最先进的多任务多模态模型。该库提供可组合的构建模块(模块、变换、损失函数)以加速模型开发,包含已发表研究中的最先进模型架构(FLAVA、MDETR、Omnivore),以及用于训练和评估的脚本,还有用于探索这些模型的 Notebook。该库正在积极开发中,我们很乐意听取您的反馈!您可以在此处找到更多关于如何入门的详情。

为什么选择 TorchMultimodal?

人们对能够理解多种输入类型(文本、图像、视频和音频信号),并可选择利用这种理解来生成不同形式输出(句子、图片、视频)的 AI 模型越来越感兴趣。FAIR 的近期工作,例如 FLAVAOmnivoredata2vec 表明,用于理解的多模态模型与单模态模型相比具有竞争力,并且在某些情况下正在建立新的最先进水平。生成模型,例如 Make-a-videoMake-a-scene,正在重新定义现代 AI 系统能做什么。

随着对多模态 AI 的兴趣日益增长,研究人员正在寻找工具和库,以便快速实验新想法,并基于该领域的最新研究成果进行构建。虽然 PyTorch 生态系统拥有丰富的库和框架资源,但这些组件如何相互操作,或者如何将它们组合在一起构建最先进的多模态模型,并不总是显而易见的。

TorchMultimodal 通过提供以下功能解决了这个问题:

  • 可组合且易于使用的构建模块,研究人员可以利用它们在自己的工作流程中加速模型开发和实验。这些模块被设计为模块化,并且可以轻松扩展以处理新的模态。

  • 用于训练和评估最新研究模型的端到端示例。这些示例可以作为正在进行/未来研究的起点,也可以作为使用高级功能(如集成 FSDP 和激活检查点来扩展模型和批量大小)的范例。

介绍 TorchMultimodal

TorchMultimodal 是一个 PyTorch 领域库,用于大规模训练多任务多模态模型。在该仓库中,我们提供:

  • 构建模块。一组模块化和可组合的构建模块,如模型、融合层、损失函数、数据集和实用工具。一些示例包括:

    • 带温度的对比损失。常用于训练 CLIP 和 FLAVA 等模型。我们还包含 ALBEF 等模型中使用的变体,如 ImageTextContrastiveLoss

    • 码本层,它通过在嵌入空间中进行最近邻查找来压缩高维数据,是 VQVAE 的重要组成部分(在仓库中作为一个模型提供)。

    • 移位窗口注意力,它是基于窗口的多头自注意力,是 Swin 3D Transformers 等编码器的重要组成部分。

    • CLIP 组件。一个由 OpenAI 发表的流行模型,已被证明在学习文本和图像表示方面非常有效。

    • 多模态 GPT。这是一个抽象层,当与生成工具结合时,可扩展 OpenAI 的 GPT 架构以实现多模态生成。

    • 多头注意力。基于注意力的模型的关键组件,支持快速自回归解码。

  • 示例。一组示例,展示了如何将这些构建模块与 PyTorch 生态系统中的组件和通用基础架构(Lightning、TorchMetrics)结合使用,以复现文献中发表的最先进模型。我们目前提供五个示例,包括:

    • FLAVA [论文]。这篇被 CVPR 接受的论文的官方代码,包括一个 FLAVA 微调教程。

    • MDETR [论文]。与 NYU 作者合作提供的示例,旨在缓解 PyTorch 生态系统中的互操作性痛点,包括一个使用 MDETR 进行短语定位和视觉问答的 Notebook

    • Omnivore [论文]。TorchMultimodal 中第一个处理视频和 3D 数据的模型示例,包括一个用于探索模型的 Notebook

    • MUGEN [论文]。自回归生成检索的基础工作,包括使用从 OpenAI coinrun 丰富而来的大规模合成数据集进行文本-视频生成和检索的演示。

    • ALBEF [论文] 该模型的代码,包括一个使用此模型进行视觉问答的 Notebook

以下代码片段展示了几个与 CLIP 相关的 TorchMultimodal 组件的使用示例:


# instantiate clip transform
clip_transform = CLIPTransform()

# pass the transform to your dataset. Here we use coco captions
dataset = CocoCaptions(root= ..., annFile=..., transforms=clip_transform)
dataloader = DataLoader(dataset, batch_size=16)

# instantiate model. Here we use clip with vit-L as the image encoder
model= clip_vit_l14()

# define loss and other things needed for training
clip_loss = ContrastiveLossWithTemperature()
optim = torch.optim.AdamW(model.parameters(), lr = 1e-5)
epochs = 1

# write your train loop
for _ in range(epochs):
	for batch_idx, batch in enumerate(dataloader):
		image, text = batch
		image_embeddings, text_embeddings = model(image, text)
		loss = contrastive_loss_with_temperature(image_embeddings, text_embeddings)
		loss.backward()
		optimizer.step()

除了代码之外,我们还发布了一个用于微调多模态基础模型的教程,以及一篇博客文章(附带代码示例),介绍了如何使用 PyTorch 分布式技术(FSDP 和激活检查点)来扩展此类模型。我们希望这些示例和教程有助于阐明 PyTorch 生态系统中提供的许多高级功能。

下一步计划?

虽然这是一次令人兴奋的发布,但还有更多内容将推出。该库正在开发中,我们正在努力添加扩散模型领域的一些令人兴奋的进展,以及展示研究中常见趋势的示例。在您探索和使用该库时,我们很乐意听取您的任何反馈!您可以在此处找到更多关于如何入门的详情。

团队

TorchMultimodal 的主要贡献者和开发者包括 Ankita De, Evan Smothers, Kartikay Khandelwal, Lan Gong, Laurence Rouesnel, Nahiyan Malik, Rafi Ayub 和 Yosua Michael Maranatha。