多模态大语言模型 MLLM 部署微调实践
1 MLLM
1.1 什么是 MLLM
多模态大语言模型(MultimodalLargeLanguageModel)是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术,能够理解和生成多种模态的数据,从而在各种复杂的应用场景中表现出强大的能力。
常见 MLLM:国内 Qwen-VL、InterVL;国外GPT-4o、LLaVa……
多模态研究的重点:不同模态特征空间的对齐。
对齐是多模态学习中的一个关键步骤,它涉及到如何在不同的数据模态之间发现和建立对应关系。具体来说,不同模态的数据可能包含相互补充的信息,对齐就是将这些信息关联起来,使得可以从一个模态转移到另一个模态。这一过程中,特征空间的对齐是核心环节。
对齐是多模态融合的前提和基础。只有在对齐的基础上,才能有效地将不同模态的数据融合在一起,进行统一的分析和决策
实际应用案例:
- 图像描述生成:通过对齐图像和文本的特征空间,可以生成与图像内容相符的文本描述。
- 视频字幕生成:将视频中的声音和画面进行时间对齐和语义对齐,可以生成与视频内容同步的字幕。
- 跨模态检索:通过对齐不同模态的特征空间,可以实现跨模态的检索功能,如根据文本描述检索相关图像或视频。
常见的多模态架构:
1.2 Q-Former
参考 BLIP-2。BLIP-2 预训练主要分成2步:基于ViT,进行视觉和语言的表征学习;基于LLM模型,学习从图像生成文本。
1.2.1 视觉和语言表征学习
为了视觉和语言表征学习,设计了Q-Former,在视觉和语言模型之间架了一道桥,将时间特征和语言特征连接接。
为了进行表征学习,设计了3个任务:
1.图文匹配(ITM:Image-Text Matching)
这是一个分类任务,判断图像和文本描述是一对,是为1,否则为0。
分类需要正负样本,采样策略为在一个batch内寻找负样本,对于一个batch的每一个文本,根据计算的相似性权重,从当前batch选取一个(除自身外)作为负样本,相似性越高选取的概率越大
2.图文对比学习(ITC:Image-text Contrastive)
该部分和clip相同,图像和文本分别经过bert进行encoder,得到对应的特征,然后分别经过一个线性层,最后进行一致性loss计算
3.根据图像生成文本(ITG:Image-text Generation)
transfomer在decoder时,需要对token进行mask。text tokens解码是,输入【DEC】作为解码标记,然后逐token进行解码,还未解码的token先被mask住,此时的token可以看到query的信息(图文对比学习中的query embedding和图像交互得到的key和value值,Q-Former左半部分)和之前解码过的text token,但query看不到text tokens的信息。
即解码时文本可以看到图像信息和解码过的文本信息,但是图像看不到文本,解码时看着文本和图像一起进行解码,这样模型预测的文本可以从图像中学习到信息。
1.3 LLaVA
参考 Visual Instruction Tuning。
按照数据的不同,LLaVA会分开处理:
- 文本:因为是大语言模型,文本按正常方法,给大模型处理即可
- 图片:使用CLIP-ViT转化为向量,再通过一个线性层Projection转换到大模型的理解空间,然后输入到大模型
模型的组成:
- 视觉编码器(Vision Encoder):LLaVa 架构的视觉部分是预训练的 CLIP 视觉编码器,具体来说是 ViT-L/14 变体。该组件通过 Transformer 层处理输入图像 (Xv) 以提取特征 (Zv),使模型能够有效地理解视觉信息
- 大语言模型 (Vicuna):LLaVa 的语言能力依赖于 Vicuna,它是大型语言模型 (LLM) 的一种。Vicuna 根据输入语言指令 (Xq) 理解并生成语言响应 (Xa),补充视觉编码器的功能
- 线性投影(Projection):此组件充当视觉特征 (Zv) 和语言模型的嵌入空间之间的桥梁。它将视觉特征转换为视觉标记 (Hv),并将其与语言模型的词嵌入空间对齐,以促进多模态对话
1.3.1 LLaVA-1.5-HD
参考论文Improved Baselines with Visual Instruction Tuning
LLaVA-1.5 在 LLaVA 的基础上改进:
- 使用 CLIP-ViT-L-336px 视觉编码器替换原先的 CLIP-ViT-L/14
- 将原先的一层线性层替换为 MLP 层(两层线性层)
此外,为了支持更高的图像分辨率(可以提升模型的性能)且不影响 LLaVA-1.5 的推理效率,在 LLaVA-1.5 的基础上提出了 LLaVA-1.5-HD,它采用了创新的AnyRes策略,可以接受各种高分辨率的图像作为输入。具体步骤如下:
- 首先高分辨率图像被智能分割成多个小块(Patch),以便单独处理每个块。例如,CLIP-ViT-L/14型号的视觉编码器能够处理的最大分辨率为224x224像素。
- 同时,将高分辨率图像调整至视觉编码器能够处理的尺寸,并利用编码器对其进行编码。
将上面两步的结果拼接在一起作为视觉特征,输入到LLM。
1.3.2 LLaVA-NeXT
参考 LLaVA-NeXT
LLaVA-NeXT 是 LLaVA-1.5-HD的升级版,采用了动态的分辨率策略,预设了多种长宽比
与LLaVA-1.5相比,LLaVA-NeXT有以下几点改进:
-
将输入图像分辨率增加到4倍以上的像素。这使它能够掌握更多的视觉细节。它支持三种宽高比,高达672x672, 336x1344, 1344x336分辨率。
-
更好的视觉推理和OCR能力,改进的视觉指令调优数据混合。
-
为更多场景提供更好的可视化对话,涵盖不同的应用程序。更好的世界知识和逻辑推理能力。
-
使用SGLang进行高效部署和推理。
Q-Former与LLaVA对比
-
收敛速度:Q-Former的参数量较大(例如BLIP-2中的100M参数),导致其
在训练过程中收敛速度较慢。相比之下,MLP作为connector的模型(如
LLaVA-1.5)在相同设置下能够更快地收敛,并且取得更好的性能。 -
性能收益:在数据量和计算资源充足的情况下,Q-Former并没有展现出
明显的性能提升。即使通过增加数据量和计算资源,Q-Former的性能提升也并
不显著,无法超越简单的MLP方案。 -
baseline setting:LLaVA-1.5通过改进训l练数据,在较少的数据量和计
算资源下取得了优异的性能,成为了一个强有力的baseline。相比之下,BLIP2
的后续工作InstructBLIP在模型结构上的改进并未带来显著的性能提升,且无法
推广至多轮对话。 -
模型结构的简洁性:LLaVA系列采用了最简洁的模型结构,而后续从模型结构上
进行改进的工作并未取得明显的效果。这表明,在当前的技术和数据条件下,简
洁的模型结构可能更为有效。
2 MLLM: InterVL
参考:InterVL、InterVL2
书生·万象多模态大模型(InternVL 2.0)。关键评测指标比肩国际顶尖商用闭源模型,支持图像、视频、文本、语音、三维、医疗多种模态支持百种下游任务,性能媲美任务专用模型。
InterVL2的模型结构包括视觉(vision)模块和语言模型(LLM)模块。其中,视觉模块是一个微调过的ViT模型,而语言模型模块则是一个InternLM的模型。
2.1 架构设计
InterVL采用LLaVA式架构设计(ViT-MLP-LLM):
- 基座大模型:InternLM2.5
- 视觉编码器:InternViT
- 对齐模块:MLP
2.1.1 视觉编码器 InternViT
InternViT-6B-448px-V1.2
- 倒数第四层特征最有用,砍掉后三层,共45层
- 分辨率从224扩展到448
- 与LLM联合训练时,在captioning和OCR数据集上训练,获取高分辨率和OCR能力
2.1.2 Pixel shuffle
- Why:448 * 448的图,patch大小为14 * 14,得到32 * 32=1024个patch,即视觉插入1024个token。这些信息有较大余消耗较多的计算资源,对长的多模态上下文拓展不利。
- What:Pixelshuffle技术来自超分那边,是把不同通道的特征拿出来,拼到一个通道上,从(N,C×r²,H,W)转化为(N,C,H×r,W×r)。r是上采样因子。
- How:这里把采样因子设为0.5,就可以把(4096 * 0.5 * 0.5,32, 32)的图像特征转化为(4096,32 * 0.5,32 * 0.5),下采样到256个token了。
2.1.3 Dynamic High-Resolution
动态分辨率的设计,使得模型可以处理各种分辨率的情景。
2.1.4 Multitask output
- 利用VisionLLMv2的技术,初始化了一些任务特化embedding(图像生成、分割、检测),添加了一些任务路由token
- 训练下游任务特化embedding,生成路由token时,把任务embedding拼在路由embedding后面,送给LLM拿到hidden_state
- 把hidden_state送给路由到的解码器中,生成图像/bounding box/masks
2.2 训练
- 第一阶段:训练MLP,用高质量预训练数据(各种视觉任务)
- 第二阶段:视觉指令微调,ViT+MLP+LLM联合训练,用高质量视觉-文本指令任务
3 InternVL 部署微调实践
3.1 训练环境配置
新建虚拟环境并进入:
conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env
"xtuner-env"为训练环境名,可以根据个人喜好设置,在本教程中后续提到训练环境均指"xtuner-env"环境。
安装与deepspeed集成的xtuner和相关包:
pip install xtuner==0.1.23 timm==1.0.9
pip install 'xtuner[deepspeed]'
pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu121
pip install transformers==4.39.0 peft==0.13.2
训练环境既为安装成功。
配置推理所需环境:
conda create -n lmdeploy python=3.10 -y
conda activate lmdeploy
pip install lmdeploy==0.6.1 gradio==4.44.1 timm==1.0.9
"lmdeploy"为推理使用环境名。
3.2 LMDeploy部署
3.2.1 LMDeploy基本用法介绍
我们主要通过pipeline.chat 接口来构造多轮对话管线,核心代码为:
## 1.导入相关依赖包
from lmdeploy import pipeline, TurbomindEngineConfig, GenerationConfig
from lmdeploy.vl import load_image## 2.使用你的模型初始化推理管线
model_path = "your_model_path"
pipe = pipeline(model_path,backend_config=TurbomindEngineConfig(session_len=8192))## 3.读取图片(此处使用PIL读取也行)
image = load_image('your_image_path')## 4.配置推理参数
gen_config = GenerationConfig(top_p=0.8, temperature=0.8)
## 5.利用 pipeline.chat 接口 进行对话,需传入生成参数
sess = pipe.chat(('describe this image', image), gen_config=gen_config)
print(sess.response.text)
## 6.之后的对话轮次需要传入之前的session,以告知模型历史上下文
sess = pipe.chat('What is the woman doing?', session=sess, gen_config=gen_config)
print(sess.response.text)
3.2.2 网页应用部署体验
我们可以使用UI界面先体验与InternVL对话:
拉取本教程的github仓库https://github.com/Control-derek/InternVL2-Tutorial.git:
git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial
demo.py文件中,MODEL_PATH处传入InternVL2-2B的路径,如果使用的是InternStudio的开发机则无需修改,否则改为模型路径。
上述命令请在vscode下运行,因为vscode自带端口转发,可以把部署在服务器上的网页服务转发到本地。
启动后,CTRL+鼠标左键点进这个链接或者复制链接到浏览器。
会看到如下界面:
点击Start Chat即可开始聊天,下方食物快捷栏可以快速输入图片,输入示例可以快速输入文字。输入完毕后,按enter键即可发送。
3.3 XTuner微调实践
3.3.1 配置文件
cd /root/xtuner
conda activate xtuner-env # 或者是你自命名的训练环境
原始internvl的微调配置文件在路径./xtuner/configs/internvl/v2下,假设上面克隆的仓库在/root/InternVL2-Tutorial,复制配置文件到目标目录下:
cp /root/InternVL2-Tutorial/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py
3.3.2 数据集下载
huggingface下载此数据集:FoodieQA。该数据集为了防止网络爬虫污染测评效果,需要向提交申请后下载使用。
由于原始数据集格式不符合微调需要格式,需要处理方可使用,在InternVL2-Tutorial下,运行:
python process_food.py
即可把数据处理为XTuner所需格式。注意查看input_path和output_path变量与自己下载路径的区别。
3.3.3 开始微调
运行命令,开始微调:
xtuner train /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2 --work-dir ./work_dirs/
看到有日志输出,即为启动成功:
微调后,把模型checkpoint的格式转化为便于测试的格式:
python xtuner/configs/internvl/v1_5/convert_to_official.py xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py ./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/iter_640.pth ./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10/
如果修改了超参数,iter_xxx.pth需要修改为对应的想要转的checkpoint。
./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10/
为转换后的模型checkpoint保存的路径。
3.3.4 使用微调后的模型
修改MODEL_PATH为刚刚转换后保存的模型路径:
cd /root/InternVL2-Tutorial
conda activate lmdeploy
python demo.py
微调前模型对锅包肉的识别:
微调后模型对锅包肉的识别:
相关文章:

多模态大语言模型 MLLM 部署微调实践
1 MLLM 1.1 什么是 MLLM 多模态大语言模型(MultimodalLargeLanguageModel)是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术,能够理解和生成多种模…...

LNMP和Discuz论坛
文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…...

Cadence学习笔记 2 PCB封装绘制
基于Cadence 17.4,四层板4路HDMI电路 更多Cadence学习笔记:Cadence学习笔记 1 原理图库绘制 目录 2、PCB封装绘制 2、PCB封装绘制 封装尺寸如下。 用Allegro做PCB封装前,要先做焊盘(Allegro 比AD、PADS多一个步骤:绘制…...

网络安全——防火墙
基本概念 防火墙是一个系统,通过过滤传输数据达到防止未经授权的网络传输侵入私有网络,阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障,因为网上总有黑客和恶意攻击入侵私有网络来破坏,防火…...

【CSS in Depth 2 精译_074】第 12 章 CSS 排版与间距概述 + 12.1 间距设置(下):行内元素的间距设置
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 ✔️ 12.2 Web 字体12.3 谷歌字体 文章目…...

短视频矩阵抖音SEO源码OEM独立部署
短视频优化矩阵源码涉及对抖音平台上的视频内容进行筛选与排序,目的是增强其在搜索引擎中的可见度,以便更多用户能够浏览到这些视频。而抖音SEO优化系统则是通过构建一个分析框架,来解析抖音上的用户数据、视频信息及标签等元素,并…...

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
文章目录 应用快速部署NginxRedisMySQLTomcat 制作镜像镜像原理基于已有容器创建使用 Dockerfile 创建镜像指令说明构建应用创建 Dockerfile 文件创建镜像 应用快速部署 Nginx docker run -d -p 80:80 nginx使用浏览器访问虚拟机地址 Redis docker pull redis docker run --…...

在ensp中ACL路由控制实验
一、实验目的 掌握ACL路由控制管理 二、实验要求 要求: 配置路由策略,左右两边不公开区域对方不可达,其他区域可以互相ping通 设备: 1、三台路由器 2、四台交换机 3、四台电脑 4、四台服务器 使用ensp搭建实验环境,如图所…...
μC/OS-Ⅱ源码学习(3)---事件模型
快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) 本文开始,进入事件源码的学习。 事件模型 在一个多任务系统里,各个任务在系统的统筹下相继执行,由于执行速度极快&a…...

Jmeter进阶篇(30)深入探索 JMeter 监听器
前言 在性能测试领域里,Apache JMeter 是一款经典而强大的工具,而其中的监听器(Listeners)组件更是发挥着不可或缺的关键作用。 监听器就像敏锐的观察者,默默记录测试执行过程中的各种数据,作为系统性能分析的数据依据。 本文将带你全方位走进 JMeter 监听器的奇妙世界,…...
虚幻引擎的工程目录结构
虚幻引擎的工程目录结构如下: .idea/.vs:用于IDE(如IntelliJ IDEA或Visual Studio)的项目配置文件,包含工程设置和解决方案文件。 Binaries:存放编译后的可执行文件和相关的动态链接库(DLL&…...
深度学习中的yield
以下为例: def data_iter(batch_size, features, labels):num_examples len(features)indices list(range(num_examples))# 这些样本是随机读取的,没有特定的顺序random.shuffle(indices)for i in range(0, num_examples, batch_size):batch_indices …...

数据库数据恢复—ORACLE常见故障有哪些?如何恢复数据?
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。 Oracle数据库数据恢复方案: 1、检测存放数据库的服务器/存储设备是否存…...

使用JavaScrip和HTML搭建一个简单的博客网站系统
搭建一个简单的博客网站系统,我们需要创建几个基本的页面和功能:登录、注册、文章发布等。这里我们先实现一个基础版本,包括用户登录、注册以及文章发布的功能。由于这是一个简化版的示例,我们将所有逻辑集成在一个HTML文件中&…...

算法-字符串-76.最小覆盖子串
一、题目 二、思路解析 1.思路: 滑动窗口!!! 2.常用方法: 无 3.核心逻辑: 1.特殊情况:s或t是否为空字符串 if(snull||tnull)return ""; 2.声明一个字符数组——用于记录对应字符出现…...

Python爬虫之Selenium的应用
【1】Selenium基础介绍 1.什么是selenium? (1)Selenium是一个用于Web应用程序测试的工具。 (2)Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。 (3)支持通过各种driv…...

粉丝生产力与开源 AI 智能名片 2+1 链动模式商城小程序的融合创新与价值拓展
摘要:本文聚焦于粉丝生产力在当代文化与商业语境中的独特作用,并深入探讨其与开源 AI 智能名片 21 链动模式商城小程序的有机结合。通过剖析粉丝生产力的多元表现形式、内在驱动机制以及开源 AI 智能名片 21 链动模式商城小程序的功能特性与商业潜力&…...

红黑树(Red-Black Tree)
一、概念 红黑树(Red Black Tree)是一种自平衡的二叉搜索树,通过添加颜色信息来确保在进行插入和删除操作时,树的高度保持在对数级别,从而保证了查找、插入和删除操作的时间复杂度为 O(log n)。这种树可以很好地解决普…...

Cocos 资源加载(以Json为例)
resources 通常我们会把项目中需要动态加载的资源放在 resources 目录下,配合 resources.load 等接口动态加载。你只要传入相对 resources 的路径即可,并且路径的结尾处 不能 包含文件扩展名。 resources.load("Inf", JsonAsset, (error, ass…...

解决 IntelliJ IDEA 启动错误:插件冲突处理
引言 在使用 IntelliJ IDEA 进行开发时,我们可能会遇到各种启动错误。本文将详细介绍一种常见的错误:插件冲突,并提供解决方案。 错误背景 最近,有用户在启动 IntelliJ IDEA 时遇到了一个错误,提示信息为:…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...