开源项目 | 多模态大模型:Show-o 统一多模态理解和生成

〔更多精彩AI内容,尽在 「魔方AI空间」 公众号,引领AIGC科技时代〕

本文作者:猫先生

AIGCmagic社区知识库(免费访问)

原文地址:开源项目 | 多模态大模型:Show-o 统一多模态理解和生成

简介:

一种新的统一模型,即 Show-o,能够通过混合自回归和扩散建模同时处理多模态理解和生成任务。

  • 创新性地在单个transformer中结合了自回归和(离散)扩散建模,分别处理文本和图像。

  • 作为统一模型Show-o在多模态理解和生成基准测试中表现出与个别基线模型相当甚至更好的性能。

  • Show-o天然支持各种下游应用,如基于文本的修复和外推,无需任何微调。此外,它还展示了混合模态生成的潜力。

  • 探索了不同类型表示(离散或连续)对多模态理解性能的影响,为未来统一模型的设计提供了系统性的见解。

项目主页:https://showlab.github.io/Show-o/

体验地址:https://huggingface.co/spaces/showlab/Show-o

引 言

“一个人能做的很少;我们一起可以做很多事情。” ——海伦·凯勒

在过去的几年里,多模态智能的两个关键支柱:理解和生成(如图 1 所示)取得了重大进展。对于多模态理解,像 LLaVA 这样的多模态大语言模型 (MLLMs) 在视觉问答 (VQA) 等视觉语言任务中表现出卓越的能力。

对于视觉生成的另一个支柱,去噪扩散概率模型(DDPM)已经彻底改变了传统的生成范式,在文本到图像 / 视频生成方面实现了前所未有的性能。

图 1:仅理解、仅生成和统一(理解和生成)模型之间的特征比较。“Vision” 和 “Language” 表示来自特定输入模式的表示。在这种情况下,“Diffusion” 代表连续和离散的 diffusion。

研究问题:这篇文章要解决的问题是如何用一个单一的Transformer模型同时处理多模态理解和生成任务。现有的方法通常将理解和生成任务分开处理,使用不同的模型来分别处理视觉和文本数据。

研究难点:如何将自回归和扩散建模这两种不同的技术集成到一个单一的Transformer网络中;如何处理离散文本标记和连续图像表示之间的显著差异;如何在单一模型中有效地训练这两种不同的建模技术。

相关工作:该问题的研究相关工作有:多模态大语言模型(MLLMs)在视觉问答等任务中的出色表现;去噪扩散概率模型(DDPMs)在文本到图像生成任务中的突破;以及最近的一些尝试将这些领域专家模型组合成一个统一系统的探索性工作。

方法概述


图 2:Show-o 概述。输入数据(无论其模态如何)都会被标记化,然后提示到格式化的输入序列中。Show-o 通过全神贯注在(离散)去噪扩散建模中用因果注意力和图像词元 自回归 地处理文本词元,然后生成所需的输出。具体来说,Show-o 能够处理图像描述、视觉问答、文本到图像生成、文本引导修复/外推和混合模态生成。

具体来说:

输入输出空间的定义:首先,将文本和图像数据转换为离散标记。文本数据使用预训练的LLM进行标记化,图像数据则通过训练一个无查询的量化器将其编码为16x16的离散标记。

架构设计:Show-o继承了现有LLM的架构,并在每个注意力层前添加了一个QK-Norm操作。为了适应离散图像标记,扩展了嵌入层的规模,并引入了一个新的可学习嵌入层用于离散图像标记。

统一提示策略:设计了一种统一的提示策略,将不同类型的输入数据格式化为结构化的输入序列。对于图像-文本对,使用预定义的任务标记来指示输入序列的学习任务。

注意力机制提出了一种全注意力机制,能够根据输入序列的格式自适应地混合和处理文本标记和图像标记。这种机制在处理文本时采用因果注意力,在处理图像时采用全注意力。

训练目标:为了同时进行自回归和扩散建模,采用了两个学习目标:下一个标记预测(NTP)和遮蔽标记预测(MTP)。NTP通过标准的语言建模目标最大化文本标记的概率,MTP则通过最大化从遮蔽标记和前提文本标记重构原始图像标记的概率来训练模型。

实验

数据集:使用了三种类型的数据来训练Show-o:纯文本数据(RefinedWeb),带类名的图像数据(ImageNet-1K),以及图像-文本对数据(CC12M、SA1B、LAION-aesthetics-12M)。

评估细节:在多模态理解基准(POPE、MME、Flickr30k、VQAv2、GQA、MMMU)上评估Show-o的多模态理解能力。在生成任务中,使用Fréchet Inception Distance(FID)在MSCOCO数据集上评估生成质量,使用GenEval基准评估文本到图像生成的能力。

实现细节:初始阶段,使用RefinedWeb、35M图像-文本对和ImageNet-1K进行联合训练,分别进行语言建模、图像字幕生成和类条件图像生成。随后,使用35M图像-文本对进行文本到图像生成的训练。最后,使用高质量的图像-文本对进行微调。

效果演示

多模态理解:在POPE、MME、Flickr30k和VQAv2基准上,Show-o的表现与基线模型LLaVA-v1.5-Phi-1.5相当,甚至在某些基准上表现更好。与仅理解模型(如InstructBLIP、Qwen-VL-Chat、mPLUG-Owl2)相比,Show-o在大多数基准上表现竞争甚至更好。

生成能力:在MSCOCO 30K数据集上,Show-o的零样本FID为9.24,优于许多生成模型,且参数数量仅为1.3B。在GenEval基准上,Show-o在所有六个指标上的表现均优于类似大小的模型(如LDM),显示出其生成能力的优越性。

文本引导的图像修复和外推:Show-o能够在不需要微调的情况下自然地支持基于文本的图像修复和外推任务,展示了其在下游应用中的优势。

混合模态生成:在GenHowTo数据集上,Show-o能够根据文本描述和视频关键帧生成一致的混合模态内容,展示了其在长视频生成中的潜力。

项目部署:

安装基础环境

pip3 install -r requirements.txt

登录 wandb 账户

wandb login <your wandb keys>

模型推理

推理演示,在 wandb 上可以查看结果

多模态理解推理演示:

python3 inference_mmu.py config=configs/showo_demo_w_clip_vit.yaml \
mmu_image_root=./mmu_validation question='Please describe this image in detail. *** Do you think the image is unusual or not?'

文本到图像生成的推理演示

python3 inference_t2i.py config=configs/showo_demo.yaml \
batch_size=1 validation_prompts_file=validation_prompts/showoprompts.txt \
guidance_scale=1.75 generation_timesteps=18 \
mode='t2i'

文本引导修复推理演示

python3 inference_t2i.py config=configs/showo_demo.yaml \
batch_size=1 \
guidance_scale=1.75 generation_timesteps=16 \
mode='inpainting' prompt='A blue sports car with sleek curves and tinted windows, parked on a bustling city street.' \
image_path=./inpainting_validation/bus.jpg inpainting_mask_path=./inpainting_validation/bus_mask.webp

文本引导外推推理演示

python3 inference_t2i.py config=configs/showo_demo.yaml \
batch_size=1 \
guidance_scale=1.75 generation_timesteps=16 \
mode='extrapolation' extra_direction='left *** left *** left *** right *** right *** right' offset=0 prompt='a serene natural landscape featuring a clear, blue lake surrounded by lush green trees. *** a serene natural landscape featuring a clear, blue lake surrounded by lush green trees. *** a serene natural landscape featuring a clear, blue lake surrounded by lush green trees. *** a serene natural landscape featuring a clear, blue lake surrounded by lush green trees. *** a serene natural landscape featuring a clear, blue lake surrounded by lush green trees. *** a serene natural landscape featuring a clear, blue lake surrounded by lush green trees.' \
image_path=./inpainting_validation/alpine_lake.jpg

训练模型

准备训练数据并更改 configs/xx.yaml 中的数据路径

训练过程基于 accelerate。请确保配置accelerate以进行分布式训练。在下面提供了在单个 GPU 或多个 GPU 上进行(分布式)训练的配置示例。

├── accelerate_configs/ 
|   ├── multi_nodes (6x8 GPUs)
|   |   ├—— ...
|   ├── 1_gpu.yaml
|   └── 8_gpu_deepspeed_zero2.yaml
第 1 阶段 - 在 ImageNet-1K 数据集上进行预训练

configs/showo_pretraining_stage1.yaml 中将数据路径更改为 ImageNet-1K。请注意,我们使用内部包来处理 RefinedWeb 数据集,必须在 training/train.py 中手动注释与语言建模相关的代码部分,或者编写新的 dataloder

accelerate launch --config_file path/to/your/accelerate_config --main_process_port=8888 training/train.py config=configs/showo_pretraining_stage1.yaml

训练后,checkpoint文件夹的结构如下:

├── show-o-training-stage1/ 
|   ├── ...
|   ├── checkpoint-500000
|   └── config.yaml

只需为阶段 2 创建一个新的输出文件夹(在 yaml 配置中编辑),将阶段 1 的最新checkpoint复制到此文件夹,并将其重命名为 checkpoint-0。它将自动恢复以进行下一阶段的训练。

├── show-o-training-stage2/ 
|   └── checkpoint-0
第 2 阶段 - 对 Image-Text 数据集进行预训练。

默认数据加载器基于 WebDataset。更改configs/showo_pretraining_stage2.yaml 中的数据路径。

accelerate launch --config_file path/to/your/accelerate_config --main_process_port=8888 training/train.py config=configs/showo_pretraining_stage2.yaml
第 3 阶段 - 对高质量 Image-Text 数据集进行预训练。

更改数据 configs/showo_pretraining_stage3.yaml 路径。

accelerate launch --config_file path/to/your/accelerate_config --main_process_port=8888 training/train.py config=configs/showo_pretraining_stage3.yaml

对 LLaVA 数据集 (llava-pretrain) 进行指令优化。更改llava/llava_data_vq_unified.py中的数据路径。

accelerate launch --config_file path/to/your/accelerate_config --main_process_port=8888 training/train.py config=configs/showo_instruction_tuning_1.yaml

LLaVA 数据集上的指令优化 (llava-tuning)。更改llava/llava_data_vq_unified.py中的数据路径。

accelerate launch --config_file path/to/your/accelerate_config --main_process_port=8888 training/train.py config=configs/showo_instruction_tuning_2.yaml

使用 CLIP-ViT 对 LLaVA 数据集 (llava-pretrain) 进行指令调整。更改 llava/llava_pretrain_data.py 中的数据路径。

accelerate launch --config_file path/to/your/accelerate_config --main_process_port=8888 training/train_w_clip_vit.py config=configs/showo_instruction_tuning_1_w_clip_vit.yaml

使用 CLIP-ViT 对 LLaVA 数据集(llava-tuning)进行指令调整。更改 llava/llava_instuct_data.py 中的数据路径。

accelerate launch --config_file path/to/your/accelerate_config --main_process_port=8888 training/train_w_clip_vit.py config=configs/showo_instruction_tuning_2_w_clip_vit.yaml

提炼关键问题:

问题1:Show-o 模型如何在单一Transformer中融合自回归和扩散建模?

Show-o 模型通过创新地将自回归和离散扩散建模融合到一个单一的Transformer中实现了这一目标。具体来说,文本数据被表示为离散 token 并使用自回归方式进行建模,类似于大语言模型(LLMs)。而图像数据则被表示为离散token,并通过离散去噪扩散过程进行建模。

为了实现这种融合,Show-o 模型引入了一个全注意力机制(Omni-Attention),该机制能够根据输入序列的格式自适应地混合和处理文本和图像令牌。在处理文本时,采用因果注意力;在处理图像时,采用全注意力。这种设计使得Show-o 模型能够灵活地处理不同的模态和数据类型

问题2:Show-o 模型在多模态理解任务中的表现如何?与现有的其他模型相比有何优势?

在多模态理解任务中,Show-o 模型的表现与基线模型LLaVA-v1.5-Phi-1.5相当,甚至在某些基准上表现更好。与仅理解模型(如InstructBLIP、Qwen-VL-Chat、mPLUG-Owl2)相比,Show-o模型在大多数基准上表现竞争甚至更好。例如,在POPE、MME、Flickr30k和VQAv2基准上,Show-o模型展示了出色的多模态理解能力。

此外,Show-o模型还展示出在处理复杂任务和罕见情况下的潜力,进一步证明了其在多模态理解方面的优势。

问题3:Show-o 模型在图像生成任务中的表现如何?与其他生成模型相比有何改进?

在图像生成任务中,Show-o 模型在MSCOCO 30K数据集上的零样本FID为9.24,优于许多生成模型,如GLIDE和DALL·E 2。与类似的生成模型(如LDM、SDv1.5、PixArt、Imagen、RAPHAEL)相比,Show-o模型在生成质量和多样性方面表现出色。例如,在GenEval基准上,Show-o模型在所有六个维度上的表现均优于类似大小的模型(如LDM),并且在某些方面甚至超过了更大的模型(如SDXL和SD3)。此外,Show-o模型在生成图像时所需的采样步骤较少,大约是其他自回归模型的四分之一,进一步展示了其在生成效率和效果方面的优势。

参考文献:

SHOW-O: ONE SINGLE TRANSFORMER TO UNIFY MULTIMODAL UNDERSTANDING AND GENERATION

技术交流

加入「AIGCmagic社区」群聊,一起交流讨论,涉及 AI视频、AI绘画、Sora技术拆解、数字人、多模态、大模型、传统深度学习、自动驾驶等多个不同方向,可私信或添加微信号:【m_aigc2022】,备注不同方向邀请入群!!

### Dify 中集成外部知识库的方法 要在 Dify 平台中连接并引用外部知识库,可以通过配置 API 或者使用内置的知识管理工具来实现。以下是关于如何在 Dify 中集成外部知识库的具体说明: #### 配置外部知识库的接入方式 Dify 提供了灵活的方式来连接外部数据源,主要通过其支持的标准接口完成对接[^1]。可以利用 RESTful API 或 GraphQL 接口将外部数据库中的结构化或非结构化数据引入到平台。 对于文档类资源,还可以上传 PDF、Word 文件或者 HTML 页面等内容至内部存储区域作为本地知识库的一部分。如果希望直接调用远程服务器上的资料,则需设置相应的访问权限以及认证机制(如 OAuth2.0),确保信息安全的同时允许系统读取所需信息。 #### 使用官方指南进行操作 为了更方便开发者管理员理解整个流程,官方提供了详细的指导手册《Connect External Knowledge Base》。该文档描述了从初步规划到最后部署上线各阶段需要注意的地方,并附带实际案例分析帮助用户更好地掌握技巧要点。 另外值得注意的是,在执行具体步骤前应该确认目标环境已满足最低软硬件需求规格表里列举的各项条件;同时也要考虑到后期维护成本技术难度等因素的影响。 ```python import requests url = "https://your-dify-instance.com/api/v1/knowledge_bases" headers = {"Authorization": "Bearer YOUR_ACCESS_TOKEN"} payload = { 'name': 'External KB Example', 'source_type': 'api', 'config': {'endpoint_url': 'http://example.com/data'} } response = requests.post(url, headers=headers, json=payload) if response.status_code == 201: print("Knowledge base created successfully.") else: print(f"Failed to create knowledge base: {response.text}") ``` 上述脚本展示了创建一个新的基于API的数据源实例的过程。它发送 POST 请求给指定端点地址,并携带必要的参数定义新对象属性值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值