多模态大语言模型——《动手学大模型》实践教程第六章

embedded/2024/11/26 11:30:40/

目录

  • 1 前言
  • 2 多模态大语言模型
  • 3 实践代码
    • 3.1 理论知识预备
    • 3.2 上手实践通用多模态大语言模型
      • 3.2.1 面向通用统一的“任意到任意模态”多模态大语言模型:NExT-GPT
      • 3.2.2 代码框架浏览
      • 3.2.3 安装环境
      • 3.2.4 系统推理上手
        • 3.2.4.1 加载预训练的NExT-GPT模型checkpoint
        • 3.2.4.2 Gradio Demo部署
        • 3.2.4.3 测试示例实践
      • 3.2.5 系统训练过程
        • 3.2.5.1 数据准备
        • 3.2.5.2 嵌入向量准备
        • 3.2.5.3 三阶段式训练

1 前言

从一些大模型相关的论文里学了一些理论知识,但是还是欠缺实践经验,本系列博文是在学习上交大张倬胜老师的开源项目的基础上写的相关总结,旨在提升自己的大模型实践能力。开源项目地址:dive-into-llms。
备注:本项目大部分资源都需要科学上网才能获取。

免责声明
本系列博文所有技巧仅供参考,不保证百分百正确。若有任何问题,欢迎联系博主。
本系列博文所涉及的资源均来自互联网,如侵犯了您的版权请联系我删除,谢谢。

2 多模态大语言模型

不得不感叹,大模型的研究真是迅速啊,遍地开花。

Awesome-Multimodal-Large-Language-Models

1
2
3
4
5
6
7

8
9
10
12
13
14
15
16
17
18
19
20

3 实践代码

该部分介绍多模态大语言模型的常见架构以及构建方法

语言模型的出现让大家看到,高阶的智能在语言模态上得到了充分的体现。作为能够更充分模拟真实世界的多模态大语言模型,其如何实现更强大的多模态理解和生成能力?多模态大语言模型是否能够帮助实现AGI?

大模型智能体迈向了未来操作系统之旅。然而,大模型在开放智能体场景中能意识到风险威胁吗?

目标:

  1. 熟悉多模态大语言模型的类型
  2. 掌握多模态大语言模型的通用技术框架
  3. 掌握多模态大语言模型的搭建、训练和推理

3.1 理论知识预备

3.1.1 了解多模态大语言模型的类型

  • 现有多模态大语言模型的功能、模态支持分类

在构建多模态大语言模型(MLLM)之前,本领域的研究者们都达成了一个共识、一个关键前提:由于规模定律和新兴现象,当前基于语言的LLM已经具有了强大的语义理解能力,这意味着语言已经成为承载智能的关键模态,所以语言智能被认为是多模态智能的枢纽。因此,几乎所有的MLLM都是建立在基于语言的LLM之上的,我这LLM作为核心决策模块,类似于大脑或中央处理器。换句话说,通过添加额外的外部非文本模态模块或编码器,LLM被赋予了多模态感知/操作能力。

我们将现有的MLLM根据其模态支持、功能支持情况,划分为不同的类型。

overview

  • 更多相关综述
    • A Survey on Multimodal Large Language Models, https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models, 2023
    • MM-LLMs: Recent Advances in MultiModal Large Language Models, 2023

3.1.2 了解多模态大语言模型的通用技术框架

  • 架构一:LLM as Task Scheduler

目前社区存在两种常见的MLLM架构。
第一种是“LLM作为离散调度器/控制器”的架构。如下图所示,LLM的角色是接收文本信号并向下游模块发出文本命令。系统内部的所有消息传递都是通过LLM输出的纯文本命令作为媒介进行的。不同的功能模块之间不存在交互。

arc1

  • 架构二:LLM as Joint Part of System

第二种架构,编码器-LLM-解码器框架。
这也是目前最流行的架构。其中LLM的角色是感知多模态信息,并在一个编码器-LLM-解码器的结构中自行做出响应和操作。因此,这个架构跟第一章架构的关键区别在于:LLM作为系统的关键联合部分,直接从外部接收多模态信息,并以更顺畅的方式委派指令给解码器/生成器。在编码器-LLM-解码器框架中,如下图所示,编码器处理来自多个模态的编码信号,LLM充当核心决策者,而解码器管理多模态输出。
arc2

3.2 上手实践通用多模态大语言模型

实践“任意模态到任意模态”的通用多模态大语言模型的构建过程

3.2.1 面向通用统一的“任意到任意模态”多模态大语言模型:NExT-GPT

未来的MLLM研究一定是朝着越来越通用的generalist方向发展,所以会包含尽可能多的模态、功能。NExT-GPT是这个领域的目前最为开创性的一项工作之一,其首次引入了“任意到任意模态”MLLM的概念。这种架构实现了强大的功能,为未来的多模态大语言模型的研究方向奠定了基础。

u1

本次课程关于多模态大语言模型的代码实践部分,将会以NExT-GPT的代码为目标,进行深入浅出的分析和实践。

NExT-GPT Project

NExT-GPT GitHub 代码库

3.2.2 代码框架浏览

├── figures
├── data
│   ├── T-X_pair_data  
│   │   ├── audiocap                      # text-autio pairs data
│   │   │   ├── audios                    # audio files
│   │   │   └── audiocap.json             # the audio captions
│   │   ├── cc3m                          # text-image paris data
│   │   │   ├── images                    # image files
│   │   │   └── cc3m.json                 # the image captions
│   │   └── webvid                        # text-video pairs data
│   │   │   ├── videos                    # video files
│   │   │   └── webvid.json               # the video captions
│   ├── IT_data                           # instruction data
│   │   ├── T+X-T_data                    # text+[image/audio/video] to text instruction data
│   │   │   ├── alpaca                    # textual instruction data
│   │   │   ├── llava                     # visual instruction data
│   │   ├── T-T+X                         # synthesized text to text+[image/audio/video] instruction data
│   │   └── MosIT                         # Modality-switching Instruction Tuning instruction data
├── code
│   ├── config
│   │   ├── base.yaml                     # the model configuration 
│   │   ├── stage_1.yaml                  # enc-side alignment training configuration
│   │   ├── stage_2.yaml                  # dec-side alignment training configuration
│   │   └── stage_3.yaml                  # instruction-tuning configuration
│   ├── dsconfig
│   │   ├── stage_1.json                  # deepspeed configuration for enc-side alignment training
│   │   ├── stage_2.json                  # deepspeed configuration for dec-side alignment training
│   │   └── stage_3.json                  # deepspeed configuration for instruction-tuning training
│   ├── datast
│   │   ├── base_dataset.py
│   │   ├── catalog.py                    # the catalog information of the dataset
│   │   ├── cc3m_datast.py                # process and load text-image pair dataset
│   │   ├── audiocap_datast.py            # process and load text-audio pair dataset
│   │   ├── webvid_dataset.py             # process and load text-video pair dataset
│   │   ├── T+X-T_instruction_dataset.py  # process and load text+x-to-text instruction dataset
│   │   ├── T-T+X_instruction_dataset.py  # process and load text-to-text+x instruction dataset
│   │   └── concat_dataset.py             # process and load multiple dataset
│   ├── model                     
│   │   ├── ImageBind                     # the code from ImageBind Model
│   │   ├── common
│   │   ├── anyToImageVideoAudio.py       # the main model file
│   │   ├── agent.py
│   │   ├── modeling_llama.py
│   │   ├── custom_ad.py                  # the audio diffusion 
│   │   ├── custom_sd.py                  # the image diffusion
│   │   ├── custom_vd.py                  # the video diffusion
│   │   ├── layers.py                     # the output projection layers
│   │   └── ...  
│   ├── scripts
│   │   ├── train.sh                      # training NExT-GPT script
│   │   └── app.sh                        # deploying demo script
│   ├── header.py
│   ├── process_embeddings.py             # precompute the captions embeddings
│   ├── train.py                          # training
│   ├── inference.py                      # inference
│   ├── demo_app.py                       # deploy Gradio demonstration 
│   └── ...
├── ckpt                           
│   ├── delta_ckpt                        # tunable NExT-GPT params
│   │   ├── nextgpt         
│   │   │   ├── 7b_tiva_v0                # the directory to save the log file
│   │   │   │   ├── log                   # the logs
│   └── ...       
│   ├── pretrained_ckpt                   # frozen params of pretrained modules
│   │   ├── imagebind_ckpt
│   │   │   ├──huge                       # version
│   │   │   │   └──imagebind_huge.pth
│   │   ├── vicuna_ckpt
│   │   │   ├── 7b_v0                     # version
│   │   │   │   ├── config.json
│   │   │   │   ├── pytorch_model-00001-of-00002.bin
│   │   │   │   ├── tokenizer.model
│   │   │   │   └── ...
├── LICENCE.md
├── README.md
└── requirements.txt

3.2.3 安装环境

请先克隆仓库并安装所需的环境,可以通过运行以下命令来完成环境的安装:

conda env create -n nextgpt python=3.8conda activate nextgpt# CUDA 11.6
conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidiagit clone https://github.com/NExT-GPT/NExT-GPT.git
cd NExT-GPTpip install -r requirements.txt

3.2.4 系统推理上手

3.2.4.1 加载预训练的NExT-GPT模型checkpoint
  • 步骤1:加载冻结参数。NExT-GPT 是基于以下现有模型或模块进行训练的, 请按照以下说明准备checkpoint。

    • ImageBind 是统一的图像/视频/音频编码器。可以从此处下载预训练检查点,版本为huge。然后,将imagebind_huge.pth文件放置在[./ckpt/pretrained_ckpt/imagebind_ckpt/huge]。
    • Vicuna:首先按照[这里]的说明准备LLaMA。然后将预训练模型放置在[./ckpt/pretrained_ckpt/vicuna_ckpt/]。
    • Image Diffusion 用于生成图像。NExT-GPT 使用版本为v1-5的Stable Diffusion。(代码里将会自动下载)
    • Audio Diffusion 用于生成音频内容。NExT-GPT 使用版本为l-full的AudioLDM。(代码里将会自动下载)
    • Video Diffusion 用于视频生成。我们使用版本为v2_576w的ZeroScope。(代码里将会自动下载)
  • 步骤2:加载可调参数

将NExT-GPT系统放置在[./ckpt/delta_ckpt/nextgpt/7b_tiva_v0]。可以选择 1) 使用自己训练的参数,或者 2) 从Huggingface下载预训练好的checkpoint。

3.2.4.2 Gradio Demo部署

完成检查点加载后,您可以通过以下方式在本地运行演示:

cd ./code
bash scripts/app.sh

指定关键参数如下:

  • --nextgpt_ckpt_path:预训练NExT-GPT参数的路径。
3.2.4.3 测试示例实践

目前的版本能够支持文字、图像、视频、声音四种模态下任意组合的输入,并任务组合模态的输出。
并且支持多轮上下文交互。

请各位自行运行测试效果。

  • Case-1:输入T+I,输出T+A

c1

  • Case-2:输入T+V,输出T+A

c2

  • Case-3:输入T+I,输出T+I+V
    c3

  • Case-4:输入T,输出T+I+V+A

c4

3.2.5 系统训练过程

3.2.5.1 数据准备

请下载以下用于模型训练的数据集:

A) T-X对数据

  • 文本-图像 对的 CC3M 数据,请按照此说明操作[here]。然后将数据放置在[./data/T-X_pair_data/cc3m]。
  • 文本-视频 对的 WebVid 数据,参考[instruction]。文件应保存在[./data/T-X_pair_data/webvid]。
  • 文本-音频 对的 AudioCap 数据,参考[instruction]。将数据保存在[./data/T-X_pair_data/audiocap]。

B) 指令微调数据

  • T+X-T

    • 视觉指令数据 (from LLaVA),从此处下载,并将其放置在[./data/IT_data/T+X-T_data/llava]。
    • 文本指令数据 (from Alpaca),从此处下载,并将其放置在[./data/IT_data/T+X-T_data/alpaca/]。
    • 视频指令数据 (from VideoChat),从此处下载,并将其放置在[./data/IT_data/T+X-T_data/videochat/]。

    注意:下载数据集后,请运行 preprocess_dataset.py 对数据集进行预处理,使其格式统一。

  • T-X+T (T2M)

    • T-X+T 指令数据集(T2M)保存在[./data/IT_data/T-T+X_data]。
  • MosIT

    • 从这里获得下载数据的说明。最终将其放置在[./data/IT_data/MosIT_data/]。
3.2.5.2 嵌入向量准备

在NExT-GPT的解码端的对齐训练中,我们最小化Signal Token和captions的表征之间的距离。为了保证系统的高效率,节省时间和内存成本,我们使用各个扩散模型中的文本编码器预计算图像、音频和视频标题的文本嵌入。

在进行NExT-GPT的训练之前,请运行以下命令,生成的 embedding 文件将保存在[./data/embed]。

cd ./code/
python process_embeddings.py ../data/T-X_pair_data/cc3m/cc3m.json image ../data/embed/ runwayml/stable-diffusion-v1-5

参数说明:

  • args[1]: 标题文件路径;
  • args[2]: 模态,可以是 imagevideoaudio
  • args[3]: 嵌入向量文件保存路径;
  • args[4]: 相应的预训练扩散模型名称。
3.2.5.3 三阶段式训练

首先参考基础配置文件[./code/config/base.yaml],了解整个模块的基本系统设置。

然后运行以下脚本开始NExT-GPT的训练:

cd ./code
bash scripts/train.sh

指定命令如下:

deepspeed --include localhost:0 --master_addr 127.0.0.1 --master_port 28459 train.py \--model nextgpt \--stage 1\--save_path  ../ckpt/delta_ckpt/nextgpt/7b_tiva_v0/\--log_path ../ckpt/delta_ckpt/nextgpt/7b_tiva_v0/log/

其中关键参数:

  • --include: localhost:0 表示深度速度中的 GPT cuda 编号 0
  • --stage: 训练阶段。
  • --save_path: 存储训练后的 delta 权重的目录。此目录将自动创建。
  • --log_path: 存储日志文件的目录。

NExT-GPT的整个训练分为3个步骤:

  • 步骤1:编码端LLM为中心的多模态对齐。该阶段训练输入投影层,同时冻结ImageBind、LLM和输出投影层。

    只需运行上述的train.sh脚本,并设置:--stage 1

    还请参考运行配置文件[./code/config/stage_1.yaml]和deepspeed配置文件[./code/dsconfig/stage_1.yaml]以获取更多逐步配置信息。

    请注意,在此步骤中使用的数据集包含在dataset_name_list中,并且数据集名称必须与[./code/dataset/catalog.py]中的定义精确匹配。

  • 步骤2:解码端指令跟随对齐。该阶段训练输出投影层,同时冻结ImageBind、LLM和输入投影层。

    只需运行上述的train.sh脚本,并设置:--stage 2

    还请参考运行配置文件[./code/config/stage_2.yaml]和deepspeed配置文件[./code/dsconfig/stage_2.yaml]以获取更多逐步配置信息。

  • 步骤3:指令调整。该阶段对指令数据集进行以下调整:1) 通过LoRA调整LLM,2) 调整输入投影层和3) 调整输出投影层

    只需运行上述的train.sh脚本,并设置:--stage 3

    还请参考运行配置文件[./code/config/stage_3.yaml]和deepspeed配置文件[./code/dsconfig/stage_3.yaml]以获取更多逐步配置信息。


http://www.ppmy.cn/embedded/140607.html

相关文章

Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持

作者:来自 Elastic Saikat Sarkar 使用 Elasticsearch 向量数据库构建搜索 AI 体验时如何使用 IBM watsonx™ Slate 文本嵌入。 Elastic 很高兴地宣布,通过集成 IBM watsonx™ Slate 嵌入模型,我们的开放推理 API 功能得以扩展,这…

MySql:库和表的操作

✨✨作者主页:嶔某✨✨ ✨✨所属专栏:MySql✨✨ 库的操作 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLA…

GCN分类预测 | 基于图卷积神经网络GCN多特征分类预测(多输入单输出) Matlab代码

基于图卷积神经网络GCN多特征分类预测(多输入单输出) Matlab代码 目录 基于图卷积神经网络GCN多特征分类预测(多输入单输出) Matlab代码分类效果基本描述程序设计参考资料 分类效果 基本描述 基于图卷积神经网络GCN多特征分类预测(多输入单输出) Matlab代码 图卷积神经网络可以…

优选算法:长度最小的子数组(滑动窗口)

题目详情:. - 力扣(LeetCode) 一. 题目解析 题意为:给一个数组,找其中元素相加>目标值的最小子数组(子数组是连续的) 二. 算法分析 首先我们第一次看到这个题,第一想法肯定是暴…

Unity3D 截图

使用 Unity3D 自带的截图接口,制作截图工具。 截图 有时候我们想对 Unity 的窗口进行截图,如果直接使用一些截图工具,很难截取到一张完整分辨率的图片(例如,我们想要截取一张 1920 * 1080 的图片)。 其实…

Spring 框架七大模块(Java EE 学习笔记03)

​ ​核心容器模块(Core Container) 核心容器模块在Spring的功能体系中起着支撑性作用,是其他模块的基石。核心容器层主要由Beans模块、Core模块、Contex模块和SpEL模块组成。 (1)Beans模块。它提供了BeanFactory类&…

微信小程序点击跳转打电话功能

wx.makePhoneCall 属性类型默认值必填说明phoneNumberstring是需要拨打的电话号码successfunction否接口调用成功的回调函数failfunction否接口调用失败的回调函数completefunction否接口调用结束的回调函数&#xff08;调用成功、失败都会执行&#xff09; <view class&q…

【C++11】尽显锋芒

(续) 一、可变参数模板 C11支持可变参数模板&#xff0c;也就是说支持可变数量参数的函数模板和类模板&#xff0c;可变数目的参数被称 为参数包&#xff0c;存在两种参数包&#xff1a;模板参数包&#xff0c;表示零或多个模板参数&#xff1b;函数参数包&#xff1a;表示零…