四期书生大模型实战营(【进阶岛】- 第4关 | InternVL 多模态模型部署微调实践(差点倒在了UI使用上)

一,多模态大模型简介

1, 什么是多模态大模型

多模态大语言模型(Multimodal Large Lanquage Model)是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术能够理解和生成多种模态的数据,从而在各种复杂的应用场景中表现出强大的能力。

2, 常见的多模态融合方式

Q-former
BLIP2

类似传统多模态模型
在这里插入图片描述
三个loss:

  • ITM loss:图文匹配
  • LM loss: Predict Next Token
  • ITC loss:对比学习

架构设计:

  • 共享Self Attention: 模态交融
  • 专家FFN:处理差异化模态信息
MiniGPT

在这里插入图片描述

MLP

LLaVA

只用了一个简单的MLP来实现Q-former的效果。

LLaVA-NeXT
  • 动态分辨率:336x[(2,2),(1,2),(2,1),(1,3),(3,1),(1,4),(4,1)]
  • 更强的训练数据

为什么MLP更加常用

收敛速度慢:Q-Former的参数量较大(例如BLIP-2中的100M参数)导致其在训练过程中收敛速度较慢。相比之下,MLP作为connector的模型(如LLaVA-1.5)在相同设置下能够更快地收敛,并且取得更好的性能。
性能收益不明显:在数据量和计算资源充足的情况下,Q-Former并没有展现出明显的性能提升。即使通过增加数据量和计算资源,Q-Former的性能提升也并不显著,无法超越简单的MLP方案。

更强的baseline setting:LLaVA-1.5通过改进训练数据,在较少的数据量和计算资源下取得了优异的性能,成为了一个强有力的baseline。相比之下,BLIP2的后续工作InstructBLlP在模型结构上的改进并未带来显著的性能提升,且无法推广至多轮对话。

模型结构的简洁性:LLaVA系列采用了最简洁的模型结构,而后续从模型结构上进行改进的工作并未取得明显的效果。这表明,在当前的技术和数据条件下,简洁的模型结构可能更为有效。

二,InternVL介绍

在这里插入图片描述
LLaVA式架构设计(ViT-MLP-LLM):

  • InternLM2-20B
  • InternViT-6B
  • MLP
InternViT

在这里插入图片描述
InternViT-6B-448px-V1.2

  • 倒数第四层特征最有用,砍掉后三层,共45层
  • 分辨率从224扩展到448
  • 与LLM联合训练时,在captioning和OCR数据集上训练获取高分辨率和OCR能力

InternViT-6B-448px-V1.5

  • 动态分辨率,最多12个tile
  • 更高质量的数据
InternLM2-Chat-20B

在这里插入图片描述

Pixel Shuffle

在这里插入图片描述

  • Why: 448×448的图,patch大小为14×14,得到32×32=1024个patch,即视觉插入1024个token。这些信息有较大冗余消耗较多的计算资源,对长的多模态上下文拓展不利。
  • What: Pixel shufle技术来自超分那边,是把不同通道的特征拿出来,拼到一个通道上,从(N,Cxr2,H,W)转化为(N,C,H xr,W xr)。r是上采样因子。
  • How: 这里把采样因子设为0.5,就可以把(4096×0.5×0.5, 32, 32)的图像特征转化为(4096, 32×0.5, 32×0.5),下采样到256个token了
Dynamic High Resolution

在这里插入图片描述

  • Pre-defined Aspect Ratios:考虑到计算资源,设置最多12个tile。就有35种长宽比的排列组合(m×n, m, n<12, 12+6+4+3+2+2+6).
  • Match and split: 选择最接近的长宽比,resize过去,切片成448×448的tiles。
  • Thumbnail: 某些任务需要全局信息,为了更好的感知全局信息,把原图resize一块喂给LLM到448×448。
Multitask output

在这里插入图片描述

  • 利用VisionLLMv2的技术,初始化了一些任务特化embedding(图像生成、分割、检测)添加了一些任务路由token
  • 训练下游任务特化embedding,生成路由token时,把任务embedding拼在路由embedding后面,送给LLM拿到hidden state
  • 把hidden state送给路由到的解码器中,生成图像/bounding box/masks
训练

在这里插入图片描述

第一阶段:训MLP,用高质量预训练数据(各种视觉任务)
第二阶段:ViT+MLP+LLM联合训练,用高质量视觉-文本指令任务

LMDeploy

在这里插入图片描述- 高效推理:请求吞吐量比 vLM 高出 1.8 倍。

  • 有效量化:4 位推理性能比 FP16 高出 2.4 倍。
  • 轻松分布式服务器:简化多模型服务部署。
  • 交互式推理模式:缓存对话历史,避免重复处理。

三,LMDeploy使用

1.环境配置
conda create -n lmdeploy python=3.10 -y
conda activate lmdeploy
pip install lmdeploy gradio==4.44.1 timm==1.0.9
2.拉取教程文件
git clone https://github.com/Control-derek/InternVL2-Tutorial.git
3.运行demo
cd InternVL2-Tutorial
python demo.py
4.运行结果

在这里插入图片描述
在这里插入图片描述
无法正确识别肠粉!!!

P.S.被UI困住的一生

不要先选择图片和文本,而是先点击Start Chat,然后选择图片文本,并在文本框”Enter“。

5.临时解决多轮对话的bug(这里对多轮对话的定义是,点击完Clear Context后,再次进行上述对话操作时,会遇见bug)在这里插入图片描述

解决方案:

屏蔽报错的engine.py的126,127行,添加self._create_event_loop_task()后,即可解决上面报错。
在这里插入图片描述

四,Xtuner微调实践

1.配置环境

conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env
pip install -U 'xtuner[deepspeed]' timm==1.0.9
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

2.准备配置文件

原始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.准备数据集

利用处理好的FoodieQA数据集,/root/share/datasets/FoodieQA

4.开始微调

xtuner train path/to/internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2

在这里插入图片描述
在这里插入图片描述

5.处理权重

微调后,把模型checkpoint的格式转化为便于测试的格式:

python /root/finetune/xtuner/xtuner/configs/internvl/v1_5/convert_to_official.py /root/finetune/xtuner/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/

在这里插入图片描述

6.再次利用lmdeploy进行使用成功识别广东鸡蛋肠粉

成功识别广东鸡蛋肠粉
没有成功识别山西刀削面
泛化性可能需要提高,可能存在一定的过拟合。把山西的刀削面识别成了广东的咖喱牛腩牛筋面。

五,上传模型至魔塔社区

1.配置环境

pip install modelscope
apt-get install git-lfs

2.获取访问令牌

在这里插入图片描述

3.上传脚本

from modelscope.hub.api import HubApi
from modelscope.hub.constants import Licenses, ModelVisibility

YOUR_ACCESS_TOKEN = 'XXXX' # 请替换为自己的令牌
api = HubApi()
api.login(YOUR_ACCESS_TOKEN)

username = 'liveTowin626'
model_name = 'L2G4000_internlm_InternVL'
model_id=f"{username}/{model_name}"

# 笔者在魔塔社区的网站上,手动创建了模型库
# api.create_model(
#     model_id,
#     visibility=ModelVisibility.PUBLIC,
#     license=Licenses.APACHE_V2,
#     chinese_name="我的测试模型",
# )

api.push_model(
    model_id=model_id, # 如果model_id对应的模型库不存在,将会被自动创建
    model_dir="/root/finetune/xtuner/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10" # 指定本地模型所在目录
)

4.开始上传

在这里插入图片描述

5.魔塔社区

魔塔社区
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值