4M: Massively Multimodal Masked Modeling
4M:大规模多模态掩码建模
用于训练任意到任意多模态基础模型的框架。
可扩展。开源。跨越数十种模态和任务。
EPFL - Apple
以下为官方实现和预训练模型:
4M:大规模多模态掩码建模,NeurIPS 2023(精选论文)
David Mizrahi(个人主页)*, Roman Bachmann(个人主页)*, Oğuzhan Fatih Kar(个人主页),Teresa Yeo(个人主页),Mingfei Gao(个人主页),Afshin Dehghan(个人主页),Amir Zamir(个人主页)
4M-21:面向数十种任务和模态的任意到任意视觉模型,NeurIPS 2024
Roman Bachmann(个人主页)*, Oğuzhan Fatih Kar(个人主页)*, David Mizrahi(个人主页)*, Ali Garjani(个人主页),Mingfei Gao(个人主页),David Griffiths(个人主页),Jiaming Hu(个人主页),Afshin Dehghan(个人主页),Amir Zamir(个人主页)

4M 是一个用于训练 "任意到任意" 基础模型的框架,通过标记化和掩码技术扩展到众多不同的模态。使用 4M 训练的模型能够执行广泛的视觉任务,能够很好地迁移到未见过的任务和模态,并且是灵活且可引导的多模态生成模型。我们发布了 "4M:大规模多模态掩码建模"(以下简称 4M-7)以及 "4M-21:面向数十种任务和模态的任意到任意视觉模型"(以下简称 4M-21)的代码和模型。
目录
使用说明
安装
- 克隆这个仓库并导航到根目录:
git clone https://github.com/apple/ml-4m
cd ml-4m
- 创建一个新的 conda 环境,然后安装该软件包及其依赖项:
conda create -n fourm python=3.9 -y
conda activate fourm
pip install --upgrade pip # enable PEP 660 support
pip install -e .
- 在 Python shell 中执行以下代码,以验证 PyTorch 中是否提供了 CUDA 支持:
# Run in Python shell
import torch
print(torch.cuda.is_available()) # Should return True
如果CUDA不可用,请按照官方安装指南重新安装PyTorch。同理,如果您希望安装xFormers(可选,用于更快的分词器),请遵循其README以确保CUDA版本正确。
- (可选)将新的conda环境作为内核暴露给Jupyter笔记本:
pip install ipykernel
python -m ipykernel install --user --name fourm --display-name "4M (fourm)"
开始使用
我们提供了一个演示包装器,以帮助您快速开始使用4M模型,进行RGB转全模态或者{标题,边界框}转全模态的生成任务。 例如,要从给定的RGB输入生成所有模态,可以调用:
from fourm.demo_4M_sampler import Demo4MSampler, img_from_url
sampler = Demo4MSampler(fm='EPFL-VILAB/4M-21_XL').cuda()
img = img_from_url('https://storage.googleapis.com/four_m_site/images/demo_rgb.png') # 1x3x224x224 ImageNet-standardized PyTorch Tensor
preds = sampler({'rgb@224': img.cuda()}, seed=None)
sampler.plot_modalities(preds, save_path=None)
您应该期望看到如下所示的输出:

对于执行从标题到全模态生成的操作,您可以替换采样器输入,如下所示:preds = sampler({'caption': 'A lake house with a boat in front [S_1]'})。
关于可用的 4M 模型列表,请见下方的模型库,更多生成操作指南请查看 README_GENERATION.md。
数据
关于如何准备对齐的多模态数据集,请查看 README_DATA.md。
分词
关于如何训练特定模态的分词器,请查看 README_TOKENIZATION.md。
4M 训练
关于如何训练 4M 模型,请查看 README_TRAINING.md。
生成
关于如何使用 4M 模型进行推理/生成,请查看 README_GENERATION.md。我们还提供了一个生成笔记本,其中包含 4M 推理的示例,尤其是执行条件图像生成和常见的视觉任务(例如 RGB 到全模态)。
模型库
我们提供了 4M 和分词器的 checkpoints 作为 safetensors,并通过 Hugging Face Hub 提供了简便的加载方式。
4M 模型
| 模型 | # 模态 | 数据集 | # 参数 | 配置 | 权重 |
|---|---|---|---|---|---|
| 4M-B | 7 | CC12M | 198M | 配置 | Checkpoint / HF Hub |
| 4M-B | 7 | COYO700M | 198M | 配置 | Checkpoint / HF Hub |
| 4M-B | 21 | CC12M+COYO700M+C4 | 198M | 配置 | Checkpoint / HF Hub |
| 4M-L | 7 | CC12M | 705M | 配置 | Checkpoint / HF Hub |
| 4M-L | 7 | COYO700M | 705M | 配置 | Checkpoint / HF Hub |
| 4M-L | 21 | CC12M+COYO700M+C4 | 705M | 配置 | Checkpoint / HF Hub |
| 4M-XL | 7 | CC12M | 2.8B | 配置 | Checkpoint / HF Hub |
| 4M-XL | 7 | COYO700M | 2.8B | 配置 | Checkpoint / HF Hub |
| 4M-XL | 21 | CC12M+COYO700M+C4 | 2.8B | 配置 | Checkpoint / HF Hub |
要从 Hugging Face Hub 加载模型:
from fourm.models.fm import FM
fm7b_cc12m = FM.from_pretrained('EPFL-VILAB/4M-7_B_CC12M')
fm7b_coyo = FM.from_pretrained('EPFL-VILAB/4M-7_B_COYO700M')
fm21b = FM.from_pretrained('EPFL-VILAB/4M-21_B')
fm7l_cc12m = FM.from_pretrained('EPFL-VILAB/4M-7_L_CC12M')
fm7l_coyo = FM.from_pretrained('EPFL-VILAB/4M-7_L_COYO700M')
fm21l = FM.from_pretrained('EPFL-VILAB/4M-21_L')
fm7xl_cc12m = FM.from_pretrained('EPFL-VILAB/4M-7_XL_CC12M')
fm7xl_coyo = FM.from_pretrained('EPFL-VILAB/4M-7_XL_COYO700M')
fm21xl = FM.from_pretrained('EPFL-VILAB/4M-21_XL')
要手动加载检查点,首先从以上链接下载 safetensors 文件,然后调用:
from fourm.utils import load_safetensors
from fourm.models.fm import FM
ckpt, config = load_safetensors('/path/to/checkpoint.safetensors')
fm = FM(config=config)
fm.load_state_dict(ckpt)
4M 文本到图像专业模型
这些模型基于标准的4M-7 CC12M模型初始化,但继续采用一种向文本输入严重倾斜的模态混合进行训练。它们仍然能够执行所有其他任务,但在文本到图像生成方面,相较于未经微调的模型表现更佳。
| 模型名称 | 模态数量 | 数据集 | 参数量 | 配置 | 权重 |
|---|---|---|---|---|---|
| 4M-T2I-B | 7 | CC12M | 198M | 配置 | 检查点 / Hugging Face Hub |
| 4M-T2I-L | 7 | CC12M | 705M | 配置 | 检查点 / Hugging Face Hub |
| 4M-T2I-XL | 7 | CC12M | 2.8B | 配置 | 检查点 / Hugging Face Hub |
从 Hugging Face Hub 加载模型:
from fourm.models.fm import FM
fm7b_t2i_cc12m = FM.from_pretrained('EPFL-VILAB/4M-7-T2I_B_CC12M')
fm7l_t2i_cc12m = FM.from_pretrained('EPFL-VILAB/4M-7-T2I_L_CC12M')
fm7xl_t2i_cc12m = FM.from_pretrained('EPFL-VILAB/4M-7-T2I_XL_CC12M')
手动从检查点加载与上述基础4M模型的方法相同。
4M超分辨率模型
| 模型 | 修改次数 | 数据集 | 参数量 | 配置文件 | 权重 |
|---|---|---|---|---|---|
| 4M-SR-L | 7 | CC12M | 198M | 配置 | 检查点 / Hugging Face Hub |
要从Hugging Face Hub加载模型:
from fourm.models.fm import FM
fm7l_sr_cc12m = FM.from_pretrained('EPFL-VILAB/4M-7-SR_L_CC12M')
手动从检查点加载基础4M模型的方式与上述相同。
分词器
| 模态 | 分辨率 | 词汇量 | 代码本大小 | 扩散解码器 | 权重 |
|---|---|---|---|---|---|
| RGB | 224-448 | 196-784 | 16k | ✓ | 检查点 / HF Hub |
| 深度 | 224-448 | 196-784 | 8k | ✓ | 检查点 / HF Hub |
| 法线 | 224-448 | 196-784 | 8k | ✓ | 检查点 / HF Hub |
| 边缘 (Canny, SAM) | 224-512 | 196-1024 | 8k | ✓ | 检查点 / HF Hub |
| COCO 语义分割 | 224-448 | 196-784 | 4k | ✗ | 检查点 / HF Hub |
| CLIP-B/16 | 224-448 | 196-784 | 8k | ✗ | 检查点 / HF Hub |
| DINOv2-B/14 | 224-448 | 256-1024 | 8k | ✗ | 检查点 / HF Hub |
| DINOv2-B/14 (全局) | 224 | 16 | 8k | ✗ | 检查点 / HF Hub |
| ImageBind-H/14 | 224-448 | 256-1024 | 8k | ✗ | 检查点 / HF Hub |
| ImageBind-H/14 (全局) | 224 | 16 | 8k | ✗ | 检查点 / HF Hub |
| SAM 实例 | - | 64 | 1k | ✗ | 检查点 / HF Hub |
| 3D 人体姿态 | - | 8 | 1k | ✗ | 检查点 / HF Hub |
从 Hugging Face Hub 加载模型的步骤如下:
from fourm.vq.vqvae import VQVAE, DiVAE
# 4M-7 modalities
tok_rgb = DiVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_rgb_16k_224-448')
tok_depth = DiVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_depth_8k_224-448')
tok_normal = DiVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_normal_8k_224-448')
tok_semseg = VQVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_semseg_4k_224-448')
tok_clip = VQVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_CLIP-B16_8k_224-448')
# 4M-21 modalities
tok_edge = DiVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_edge_8k_224-512')
tok_dinov2 = VQVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_DINOv2-B14_8k_224-448')
tok_dinov2_global = VQVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_DINOv2-B14-global_8k_16_224')
tok_imagebind = VQVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_ImageBind-H14_8k_224-448')
tok_imagebind_global = VQVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_ImageBind-H14-global_8k_16_224')
sam_instance = VQVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_sam-instance_1k_64')
human_poses = VQVAE.from_pretrained('EPFL-VILAB/4M_tokenizers_human-poses_1k_8')
要手动加载检查点,首先从上述链接下载 safetensors 文件,然后调用:
from fourm.utils import load_safetensors
from fourm.vq.vqvae import VQVAE, DiVAE
ckpt, config = load_safetensors('/path/to/checkpoint.safetensors')
tok = VQVAE(config=config) # Or DiVAE for models with a diffusion decoder
tok.load_state_dict(ckpt)
许可证
此代码仓库中的代码遵循 Apache 2.0 许可证发布,该许可证内容可在 LICENSE 文件中找到。
此代码仓库中的模型权重遵循示例代码许可证发布,该许可证内容可在 LICENSE_WEIGHTS 文件中找到。
引用
如果您觉得这个代码仓库对您有所帮助,请考虑引用我们的工作成果:
@inproceedings{4m,
title={{4M}: Massively Multimodal Masked Modeling},
author={David Mizrahi and Roman Bachmann and O{\u{g}}uzhan Fatih Kar and Teresa Yeo and Mingfei Gao and Afshin Dehghan and Amir Zamir},
booktitle={Thirty-seventh Conference on Neural Information Processing Systems},
year={2023},
}
@article{4m21,
title={{4M-21}: An Any-to-Any Vision Model for Tens of Tasks and Modalities},
author={Roman Bachmann and O{\u{g}}uzhan Fatih Kar and David Mizrahi and Ali Garjani and Mingfei Gao and David Griffiths and Jiaming Hu and Afshin Dehghan and Amir Zamir},
journal={arXiv 2024},
year={2024},
}
当然,我会根据您的要求进行翻译。请您提供需要翻译的文本,我将为您转换成通俗、专业、优雅且流畅的中文内容,同时保持原始的 Markdown 格式。