1.简介
目前,多模态任务由扩散模型主导(例如,stable diffusion)和组合方法(例如,CLIP与LLM组合)。这些先进的模型因其卓越的能力而受到重视,它们能够高效地处理和理解包括图像、文本和视频在内的多种数据类型,并据此生成精确而相关的输出。但是这些模型往往需要多个专门模型来分别负责理解与生成任务。这激发了一个研究问题:一个单一的Transformer可以处理多模态理解和生成?
近日,北京智源人工智能研究院正式发布原生多模态世界模型Emu3。Emu3只基于下一个token预测,无需扩散模型或组合式方法,把图像、文本和视频编码为一个离散空间,在多模态混合序列上从头开始联合训练一个Transformer。Emu 3在生成和感知任务方面都优于几个成熟的特定于任务的模型,超越了SDXL和LLaVA-1.6等旗舰模型。除此之外,Emu 3还能够通过预测视频序列中的下一个令牌来生成高保真度视频。
该模型实现了视频、图像、文本三种模态的统一理解与生成,成功验证了基于下一个token预测的多模态技术范式,释放其在大规模训练和推理上的潜力。
接下来,本篇博客将为您详细解读这一未来的发展趋势,因为设备限制,本文只对代码做大概的介绍,也欢迎大家在评论区交流。
论文:https://arxiv.org/pdf/2409.18869
项目页面:Emu3
github代码:https://github.com/baaivision/Emu3
hf权重仓库:BAAI (Beijing Academy of Artificial Intelligence)
2.论文
Data
Emu3是在语言、图像和视频数据的混合上从头开始训练的。
语言数据:Aquila是一个由中文和英文数据组成的高质量语料库。
图像数据:作者策划了一个大规模的图像-文本数据集,其中包括开源的Web数据、人工智能生成的数据和高质量的内部数据。然后进行了过滤,过滤过程如下:
- 应用分辨率滤波器,丢弃分辨率低于512 × 512像素的样本。
- 我们使用LAION-AI aesthetic predictor评估每张图像的美学质量,排除评分低于5.5的图像,以确保整体美学质量。
- 对于没有通过美学过滤器的图像,我们采用文本检测和颜色过滤来保留非单色图像和拥有少量文本的图像,从而提高开放世界图像的过滤召回率。
- 此外,我们还准备了用于图像理解的补充数据。通过DenseFusion中的数据处理管道作者从各种开源Web数据中提取了数百万张代表性图像,这些图像涵盖了广泛的类别,包括图表、表格、文本丰富的内容等。
视频数据:作者收集的视频涵盖了广泛的类别,如风景,动物,植物,游戏和动作。
预处理,包括以下四个阶段:
- 作者使用PySceneDect 4将视频分割成场景,使用ContentDetector和ThresholdDetector分别识别内容变化和淡入/淡出事件。
- 使用PaddleOCR 3执行文本检测,并删除文本覆盖范围过大的片段。为了降低计算成本,作者以2 FPS的速度对视频帧进行采样,并将短边调整为256。
- 使用PaddleOCR 3执行文本检测,并删除文本覆盖范围过大的片段。为了降低计算成本,作者以2 FPS的速度对视频帧进行采样,并将短边调整为256。
- 最后,作者使用LAION-AI aesthetic predictor评估了每个片段的美学质量。我们对三个帧进行采样,并为每个剪辑获得三个得分,并且丢弃最低得分小于5的剪辑。
视频添加字幕:作者使用基于图像字幕器训练的视频字幕器来为过滤后的视频剪辑添加字幕。
- 训练数据最初用GPT-4V标记。对于每个视频剪辑,作者采样八帧,并为GPT-4V创建详细的提示,以描述这些帧中的内容和运动。有些标注的数据需要手工修改。
- 然后,作者在这个标记的数据上微调图像captioner,以开发视频captioner。
- 对于大规模部署,作者使用vLLM加速字幕。短于20秒的片段使用12个均匀采样的帧来加标题,而较长的片段被分成10-20秒的子片段,每个子片段独立地加标题。
Vision Tokenizer
作者基于SBER-MoVQGAN 5训练视觉标记器,其codebook的尺寸为32768的,它可以将4 × 512 × 512的视频片段或512 × 512的图像编码为4096个离散token。也就是说,这个tokenizer在时间维度上实现了4×压缩,在空间维度上实现了8×8压缩,适用于任何时间和空间分辨率。
结构
Emu3的结构和show-o很像,建议可以先去看一下show-o的那篇博客:
Show-o:统一多模态理解和生成的强大模型(包含代码论文详解)-优快云博客
本质上,二者都是讲图片或者文本转化为离散token,然后合并后输入到大模型里 ,大模型输出结果再通过tokenizer转化为图片或者文本,二者使用的tokenizer都是vq-vae的架构,区别仅仅在于具体的模型不一样,如show-o使用的是magvit,而emu3使用的是SBER-MoVQGAN 5。
训练
prompt
生成的训练数据的prompt结构如下:
[BOS] {caption text} [SOV] {meta text} [SOT] {vision tokens} [EOV] [EOS]
- [BOS]和[EOS]是文本标记器中的原始特殊标记,
- [SOV]标记视觉输入的开始,而[EOV]指示视觉输入的结束。
- [SOT]标记视觉标记的开始,
- 另外,[EOL]和[EOF]被插入到视觉表征中以分别表示行中断和帧中断。就是图像会转换为[64,64]的离散token表,然后每一行会加入eol表示中断
- “Meta文本”包含有关图像分辨率的信息,对于视频,它包括分辨率、帧速率和持续时间,所有这些都以纯文本格式显示。作者还将数据集中的“标题文本”字段移动到[EOV]标记之后,
损失函数
仅需要使用标准的交叉熵损失来训练下一令牌预测任务。为了防止视觉表征支配学习过程,我们对与视觉表征相关联的损失应用0.5的权重。
并行
Emu 3模型在预训练期间利用广泛的上下文长度来处理视频数据。为了便于训练,作者采用了张量并行(TP)、上下文并行(CP)和数据并行(DP)的组合。同时,将文本-图像数据打包成最大上下文长度,充分利用计算资源,同时保证打包过程中完整图像不被分割。
预训练
预培训过程分两个阶段进行。
- 在第一阶段中,不使用视频数据训练,仅使用文本和图像数据,上下文长度5120
- 在第二阶段中,引入视频数据,并且采用131072的上下文长度。
Post-training
Vision Generation
Quality Fine-Tuning:为提高生成结果的质量。我们使用高质量的数据进行质量微调
- 对于QFT中的图像数据,我们选择了不同的高质量来源,并根据三种常见偏好评分的平均值进行了筛选:HPSv2.1、MPS和LAION美学评分。
- 在QFT过程中,我们将训练数据的分辨率从512像素提高到720像素,以提高生成质量。
- 对于视频数据,我们从高质量的源中采样,并应用严格的分辨率和光流滤波器以确保质量。
- 此外,在训练结束时,我们使用退火策略以线性衰减学习率至零
Direct Preference Optimization(DPO):可以理解为强化学习
数据集构建:
- 使用质量微调模型对每个用户收集的提示(p)执行8-10次推断,创建初始数据池(x)
- 每个提示都由三个投票人进行评估,重点是视觉吸引力和提示对齐。
- 基于得分,选择得分最高的样本,并且拒绝得分最低的样本,以形成三个一组(pi,xchosen i,xrejected i),并提示进一步训练。
emu 3-DPO通过最小化DPO损失和next-token预测交叉熵损失,以微调QFT模型。
Vision-Language Understanding
用于视觉语言理解的模型经历了两个阶段的后训练过程
- 图像到文本的训练
- 将图像理解数据与纯语言数据相结合
- 与视觉标记相关的损失被忽略,仅使用纯文本预测的损失。
- 每张图像的大小调整为约512 × 512的分辨率,同时保留原始纵横比。
- 指令调整
- 从数据集中抽取一个问答对子集,以增强视觉指令跟随能力。
- 低于512 × 512或高于1024 × 1024的图像将被调整为分辨率下限或上限,同时保持相应的纵横比,而其他图像则保持其原始分辨率。
3.代码
前言:emu3模型实在是太大了,生成部分还能勉强debug完前半段,理解部分连主体代码都debug不了,不建议资源不足的小伙伴尝试。
环境配置
pip install -r requirements.txt
我这里直接使用之前配置大模型的环境,可以直接运行!
权重下载(gen和chat权重分别为40g左右,慎重考虑):
emu3-gen:BAAI/Emu3-Gen at main
emu3-chat:BAAI/Emu3-Chat · HF Mirror
tokenizer:BAAI/Emu3-VisionTokenizer · HF Mirror
emu-stage1:BAAI/Emu3-Stage1 · HF Mirror
生成
如何在3090上debug
需要注意的是,模型实在是太大了,这导致我的3090也无法完整跑完,我对代码稍作修改,使其能够debug完前半部分流程,到最后的decoder还是会报错,我建议显卡资源吃紧的朋友果断放弃。
这里的代码应该还是有问题的,如果读者有解决办法,欢迎评论区或私信交流。
# -*- coding: utf-8 -*-
from PIL import Image
from transformers import AutoTokenizer, AutoModel, AutoImageProcessor, AutoModelForCausalLM
from transformers.generation.configuration_utils import GenerationConfig
from transformers.generation import LogitsProcessorList, PrefixConstrainedLogitsProcessor, UnbatchedClassifierFreeGuidanceLogitsProcessor
import torch
import gc # 加入这个库
from emu3.mllm.processing_emu3 import Emu3Processor
# model path
EMU_H