InternVL 多模态模型部署微调实践 | 书生大模型

文章目录

    • 多模态大模型简介
      • 基本介绍
      • 例子
      • 常见设计模式
        • BLIP 2
          • Q-Former 模块细节
          • 应用案例:MiniGPT - 4
          • Q-Former 的缺点
        • LLaVA
          • LLaVA - 1.5 - HD
          • LLaVA - Next
    • InternVL2 介绍
      • 架构设计
        • Intern Vit
        • Pixel Shuffle
        • Dynamic High - Resolution
        • Multitask output
      • 训练方法
    • 环境配置
      • 基本配置
      • 训练环境配置
      • 推理环境配置
    • LMDeploy 部署
      • LMDeploy 基本用法介绍
      • 网页应用部署体验
      • 进行端口映射
      • 测试
      • 多轮对话出现 BUG 解决
    • XTuner 微调多模态大模型实践
      • 准备基本配置文件
      • 配置文件参数解读
      • 数据集准备
      • 模型微调
    • 模型测试
    • 参考文献

多模态大模型简介

基本介绍

多模态大模型是指能处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大模型

常见的 MLLM

  • InternVL
  • GPT-4o
  • Qwen-VL
  • LLaVA

例子

在这里插入图片描述

常见设计模式

多模态大模型的核心:不同模态特征空间的对齐

  • 不同模态的数据通常采用不同模块进行编码,因而得到的特征向量的表征空间不同
  • 对于不同模态、相同语义的数据,在特征空间的表示可能不同,需要一些语义设计来弥补这个 gap【需要对齐不同模态的特征空间
BLIP 2

在这里插入图片描述

Q-Former 模块细节

  • Learned Queries 的作用:通过 Cross Attention,将图片中的关键信息提取出来
  • 通过 Self Attention 模块实现图像和文本两种模态的参数共享,起到模态融合的作用
  • FFN 层不共享参数,处理模块的差异化信息

Q-Former 需要计算三个 loss

  • ITM loss:图文匹配 loss。图像侧需要看到完整的文本,文本侧需要看到完整的图像【全部都是 unmasked】。
  • LM loss:基于图像文本生成的 loss
  • ITC loss:图文对比学习 loss

三个 loss 对应的任务不同,也需要不同的 Attention Mask:
在这里插入图片描述

  • ITM loss:图像侧需要看到完整的文本,文本侧需要看到完整的图像【全部都是 unmasked】。
  • LM loss:因为要做文本生成,图像侧不需要看到文本,而文本 - 文本应该是一个下三角矩阵。
  • ITC loss:图像和文本各自编码,只需要考虑 图像-图像 和 文本-文本即可
应用案例:MiniGPT - 4

在这里插入图片描述

Q-Former 的缺点
  1. 收敛速度慢:Q-Former 的参数量较大。相比之下,MLP 作为 connector 的模型(如 LLaVA - 1.5)在相同设置下能够更快地收敛,并且取得更好的性能
  2. 性能收益不明显:Q-Former 的性能提升并不显著,无法超越简单的 MLP 方案
  3. LLaVA 系列的模型结构更为简洁
LLaVA

在这里插入图片描述

  • 核心思想:通过一个简单的线性层把图像特征(经过图像编码器提取的特征)投影到文本空间
LLaVA - 1.5 - HD

要解决的问题:训练好的图像编码器,分辨率一般都是固定的。对于分辨率不同的图像数据,通常是将对图像进行 reshape,但这样会丢失细粒度的信息

在这里插入图片描述

  • 将图像切片成图像编码器可以处理的分辨率,保留细粒度信息
  • 同时将 reshape 后的图像数据也丢入图像编码器,提供整体信息
LLaVA - Next

是 LLaVA - 1.5 - HD 的升级版:

  • 动态分辨率
  • 更强的训练数据

InternVL2 介绍

架构设计

InternLV2 采用了 LLaVA 式架构:
在这里插入图片描述

  • 基座模型选用 InternLM2 - Chat - 20B
  • 视觉编码器选用 InternVit - 6B
  • 对齐模块选用 MLP projector
Intern Vit

在这里插入图片描述

  • 视觉编码器有 6B 的参数
  • 训练过程中,视觉编码器直接和 LLM 的文本编码器进行对齐【将传统图文对比学习的 text encoder(这部分后续会被丢弃) 替换成了 LLM 的 encoder】
Pixel Shuffle

把不同通道的特征拼到一个通道上,对信息进行压缩:

在这里插入图片描述

Dynamic High - Resolution

采用动态分辨率,使得模型可以处理各种分辨率的情况:

在这里插入图片描述

Multitask output

在这里插入图片描述

训练方法

在这里插入图片描述

环境配置

基本配置

至少需要 40 GB 的显存才能完成后续的部署和微调

训练环境配置

# 新建虚拟环境
conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env

# 安装与deepspeed集成的xtuner和相关包
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

推理环境配置

conda create -n lmdeploy python=3.10 -y
conda activate lmdeploy
pip install lmdeploy gradio==4.44.1 timm==1.0.9

LMDeploy 部署

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)

网页应用部署体验

git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial

demo.py文件中,MODEL_PATH处传入 InternVL2-2B 的路径,如果使用的是 InternStudio 的开发机则无需修改,否则改为模型路径

在这里插入图片描述

启动 demo:

conda activate lmdeploy
python demo.py

进行端口映射

StrictHostKeyChecking=no 记得加上,不然会因为 https 的原因导致网页元素无法完全加载

ssh -p 36100 root@ssh.intern-ai.org.cn -CNg -L 1096:127.0.0.1:1096 -o StrictHostKeyChecking=no

测试

在这里插入图片描述

  • 先点击 Start Chat,Agent 才能初始化,然后才可以传图片和文字,让 Agent 回答对应问题。

多轮对话出现 BUG 解决

如果输入多张图,或者开多轮对话时报错:
在这里插入图片描述
可以参考github的issue InternLM/lmdeploy#2101:

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

在这里插入图片描述

XTuner 微调多模态大模型实践

准备基本配置文件

在 InternStudio 开发机的 /root/xtuner 路径下,即为开机自带的 xtuner,先进入工作目录并激活训练环境:

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

配置文件参数解读

在这里插入图片描述

  • path: 需要微调的模型路径,在InternStudio环境下,无需修改。
  • data_root: 数据集所在路径。
  • data_path: 训练数据文件路径。
  • image_folder: 训练图像根路径。
  • prompt_temple: 配置模型训练时使用的聊天模板、系统提示等。使用与模型对应的即可,此处无需修改。
  • max_length: 训练数据每一条最大token数。
  • batch_size: 训练批次大小,可以根据显存大小调整。
  • accumulative_counts: 梯度累积的步数,用于模拟较大的batch_size,在显存有限
  • 情况下,提高训练稳定性。
  • dataloader_num_workers: 指定数据集加载时子进程的个数。
  • max_epochs:训练轮次。
  • optim_type:优化器类型。
  • lr: 学习率
  • betas: Adam优化器的beta1, beta2
  • weight_decay: 权重衰减,防止训练过拟合用
  • max_norm: 梯度裁剪时的梯度最大值
  • warmup_ratio: 预热比例,前多少的数据训练时,学习率将会逐步增加。
  • save_steps: 多少步存一次checkpoint
  • save_total_limit: 最多保存几个checkpoint,设为-1即无限制

在这里插入图片描述

  • r: 低秩矩阵的秩,决定了低秩矩阵的维度。
  • lora_alpha 缩放因子,用于调整低秩矩阵的权重。
  • lora_dropout dropout 概率,以防止过拟合。

如果想断点重训,可以在最下面传入参数:

在这里插入图片描述
把这里的 load_from 传入你想要载入的 checkpoint,并设置 resume = True 即可断点重续。

总结:核心参数

  • 模型路径:path = '/root/share/new_models/OpenGVLab/InternVL2-2B'
  • 数据路径:data_root = '/root/share/datasets/FoodieQA/'
  • 多少步存一次 checkpoint:save_steps = 64
  • 最多保存几个 checkpoint,设为 -1 即无限制:save_total_limit = -1

数据集准备

如果是使用 InternStudio 开发机,数据文件放在 /root/share/datasets/FoodieQA 路径下

模型微调

xtuner train /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2 --work-dir ./work_dirs/food_finetune

模型测试

修改 MODEL_PATH 为刚刚转换后保存的模型路径:

在这里插入图片描述

cd /root/InternVL2-Tutorial
conda activate lmdeploy
python demo.py

参考文献

  • https://www.bilibili.com/video/BV1nESCYWEnN/?vd_source=92ae20b037ffc8aceaab1e118f74a5cc
  • https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/InternVL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaScript交互补充(元素的三大系列)

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等 获得元素距离带有定位祖先元素的位置获得元素自身的大小(宽度高度)注意:返回的数值都不…

AI大模型(二):AI编程实践

一、软件安装 1. 安装 Visual Studio Code VSCode官方下载:Visual Studio Code - Code Editing. Redefined 根据自己的电脑系统选择相应的版本下载 安装完成! 2. 安装Tongyi Lingma 打开VSCode,点击左侧菜单栏【extensions】,…

linux c 语言回调函数学习

动机 最近在看 IO多路复用,包括 select() poll () epoll() 的原理以及libevent, 对里面提及的回调机制 比较头大,特写此文用例记录学习笔记。 什么是回调函数 网上看到的最多的一句话便是:回调函数 就是 函数指针的一种用法&am…

Python 正则表达式的一些介绍和使用方法说明(数字、字母和数字、电子邮件地址、网址、电话号码(简单)、IPv4 )

## 正则表达式的概念和用途 正则表达式(Regular Expression,简称Regex)是对字符串操作的一种逻辑公式,由一些事先定义好的特定字符以及这些特定字符的组合所构成。这些特定字符及其组合被用来描述在搜索文本时要匹配的一个或多个…

DreamClear:字节跳动开源了高性能图像修复技术,中科院加持,商业免费使用

哇,字节跳动开源了DreamClear项目,采用的是Apache-2.0开源协议,可以商用,并且用户可以自由地使用、复制、修改和分发该软件,甚至可以用于私有项目中。这对于开发者和企业来说是个好消息,因为它们可以利用这…

Flutter:android studio无法运行到模拟机的问题

提示如下错误信息: Entrypoint is not a Dart filenot applicable for the "main.dart" configurat点击运行按钮提示让填写以下信息 或者出现无法选择模拟机的情况 发下下列问题: 无法运行的项目默认根目录地址: 可以正常运行…

FromData格式提交接口时入参被转成JSON格式问题

本地上传文件后通过事件提交文件,一般先通过前端组件生成文本流,在通过接口提交文本流,提交文本流一般使用FormData的入参形式传入,接口请求头也默认"Content-Type": “multipart/form-data”,但是某些场景统…

<AI 学习> 下载 Stable Diffusions via Windows OS

注意: 不能使用 网络路径 不再支持 HTTPS 登录,需要 Token 1. 获得合法的授权 Stability AI License — Stability AI 上面的链接打开,去申请 许可 2. 拥有 HuggingFace 账号 注册:https://huggingface.co/ 3. 配置 Tok…

MySQL缓存使用率超过80%的解决方法

MySQL缓存使用率超过80%的解决方法 一、识别缓存使用率过高的问题1.1 使用SHOW GLOBAL STATUS命令监控1.2 监控其他相关指标二、分析缓存使用率过高的原因2.1 数据量增长2.2 查询模式变化2.3 配置不当三、解决缓存使用率过高的方法3.1 调整Buffer Pool大小3.1.1 计算合理的Buff…

39.安卓逆向-壳-smali语法3(方法)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。 工…

《FreeRTOS任务基础知识以及任务创建相关函数》

目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务(Task)介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…

RHCE的学习(18)

第二章 变量和引用 深入认识变量 在程序设计语言中,变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理解变量的使用方法,才能设计出良好的程序。本节将介绍Shell中变量的相关知识。 什么是变量 顾名思义…

AG32 FPGA部分简单开发

环境 Quartus 13.0(Quartus 不能使用Lite 版本,需要使用Full 版本)AGM SDKSupra(快捷方式在SDK目录下,具体路径为AgRV_pio\packages\tool-agrv_logic\bin) FPGA编程 在AG32芯片中,拥有异构双…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建,它期望这些编译时功能标志通过捆绑器配置全局注入,以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM(ECMAScript模块&#…

Spring——事务

事务 JdbcTemplate 简介 Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便实现对数据库操作 准备工作 ①搭建子模块 搭建子模块&#xff1a;spring-jdbc-tx ②加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependenc…

集合类源码浅析のJDK1.8ConcurrentHashMap(下篇)

文章目录 前言一、分段扩容1、addCount2、transfer3、helpTransfer 二、查询二、删除总结 前言 主要记录ConcurrentHashMap&#xff08;笔记中简称CHM&#xff09;的查询&#xff0c;删除&#xff0c;以及扩容方法的关键源码分析。 一、分段扩容 1、addCount 扩容的逻辑主要在…

H5页面多个视频如何只同时播放一个?

目录 背景1. 首先介绍下 muted 属性2. 监听播放和暂停操作3. 视频播放完毕后返回桌面&#xff0c;再进入H5页面发现视频封面丢失置灰解决思路&#xff1a; 背景 页面模块同时有个四个视频模块&#xff0c;发现可以同时播放四个视频&#xff0c;但是理想的是每次只播放一个。 …

D69【 python 接口自动化学习】- python 基础之数据库

day69 Python 执行 SQL 语句 学习日期&#xff1a;20241115 学习目标&#xff1a; MySQL 数据库&#xfe63;- Python连接redis 学习笔记&#xff1a; redis数据库的用途 使用Python访问redis数据库 使用Python对redis数据库进行读写操作 总结 1. redis是一款高性能的键…

jmeter常用配置元件介绍总结之逻辑控制器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之逻辑控制器 逻辑控制器1.IF控制器2.事务控制器3.循环控制器4.While控制器5.ForEach控制器6.Include控制器7.Runtime控制器8.临界部分控制器9.交替控制器10.仅一次控制器11.简单控制器12.随机控制器13.随机顺序控制器14.吞…

21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)(非强制登录版本完结)>

PS&#xff1a; 开闭原则 定义和背景‌ ‌开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;‌&#xff0c;也称为开放封闭原则&#xff0c;是面向对象设计中的一个基本原则。该原则强调软件中的模块、类或函数应该对扩展开放&#xff0c;对修改封闭。这意味着一个软…