当前位置: 首页 > news >正文

InternVL 多模态模型部署微调实践

写在前面(什么是InternVL)

InternVL 是一种用于多模态任务的深度学习模型,旨在处理和理解多种类型的数据输入,如图像和文本。它结合了视觉和语言模型,能够执行复杂的跨模态任务,比如图文匹配、图像描述生成等。通过整合视觉特征和语言信息,InternVL 可以在多模态领域取得更好的表现

InternVL 模型总览

对于InternVL这个模型来说,它vision模块就是一个微调过的ViT,llm模块是一个InternLM的模型。对于视觉模块来说,它的特殊之处在Dynamic High Resolution。

Dynamic High Resolution

InternVL独特的预处理模块:动态高分辨率,是为了让ViT模型能够尽可能获取到更细节的图像信息,提高视觉特征的表达能力。对于输入的图片,首先resize成448的倍数,然后按照预定义的尺寸比例从图片上crop对应的区域。细节如图所示。

cd /root
mkdir -p model# cp 模型cp -r /root/share/new_models/OpenGVLab/InternVL2-2B /root/model/

Pixel Shuffle

Pixel Shuffle在超分任务中是一个常见的操作,PyTorch中有官方实现,即nn.PixelShuffle(upscale_factor) 该类的作用就是将一个tensor中的元素值进行重排列,假设tensor维度为[B, C, H, W], PixelShuffle操作不仅可以改变tensor的通道数,也会改变特征图的大小。

InternVL 部署微调实践

我们选定的任务是让InternVL-2B生成文生图提示词,这个任务需要VLM对图片有格式化的描述并输出。

让我们来一起完成一个用VLM模型进行冷笑话生成,让你的模型说出很逗的冷笑话吧。在这里,我们微调InterenVL使用xtuner。部署InternVL使用lmdeploy。

准备InternVL模型

我们使用InternVL2-2B模型。该模型已在share文件夹下挂载好,现在让我们把移动出来。

准备环境

这里我们来手动配置下xtuner。

  • 配置虚拟环境
conda create --name xtuner python=3.10 -y# 激活虚拟环境(注意:后续的所有操作都需要在这个虚拟环境中进行)
conda activate xtuner# 安装一些必要的库
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y
# 安装其他依赖
apt install libaio-dev
pip install transformers==4.39.3
pip install streamlit==1.36.0
  • 安装xtuner
    # 创建一个目录,用来存放源代码
    mkdir -p /root/InternLM/codecd /root/InternLM/codegit clone -b v0.1.23  https://github.com/InternLM/XTuner

    进入XTuner目录

cd /root/InternLM/code/XTuner
pip install -e '.[deepspeed]'
pip install lmdeploy==0.5.3
  • 安装验证
    xtuner version##命令xtuner help

    如果验证版本时为0.1.21或低于0.1.23版本,使用下面的命令进行更新

pip install --upgrade xtuner

确认一下你的版本号和我们一致哦~

准备微调数据集

我们这里使用huggingface上的zhongshsh/CLoT-Oogiri-GO据集,特别鸣谢~。

@misc{zhong2023clot,title={Let's Think Outside the Box: Exploring Leap-of-Thought in Large Language Models with Creative Humor Generation},author={Zhong, Shanshan and Huang, Zhongzhan and Gao, Shanghua and Wen, Weushao and Lin, Liang and Zitnik, Marinka and Zhou, Pan},journal={arXiv preprint arXiv:2312.02439},year={2023}
}

数据集我们从官网下载下来并进行去重,只保留中文数据等操作。并制作成XTuner需要的形式。并已在share里,我们一起从share里挪出数据集。

## 首先让我们安装一下需要的包
pip install datasets matplotlib Pillow timm## 让我们把数据集挪出来
cp -r /root/share/new_models/datasets/CLoT_cn_2000 /root/InternLM/datasets/

让我们打开数据集的一张图看看,我们选择jsonl里的第一条数据对应的图片。首先我们先把这张图片挪动到InternLM文件夹下面。

cp InternLM/datasets/CLoT_cn_2000/ex_images/007aPnLRgy1hb39z0im50j30ci0el0wm.jpg InternLM/

哈哈,是两只猫在掐架。那我给到的冷笑话回复是什么呢?

InternVL 推理部署攻略

我们用LMDeploy来推理这张图片~看看它能不能成功解释出梗图呢?

使用pipeline进行推理
touch /root/InternLM/code/test_lmdeploy.py
cd /root/InternLM/code/

之后我们使用lmdeploy自带的pipeline工具进行开箱即用的推理流程,首先我们新建一个文件。

然后把以下代码拷贝进test_lmdeploy.py中。

from lmdeploy import pipeline
from lmdeploy.vl import load_imagepipe = pipeline('/root/model/InternVL2-2B')image = load_image('/root/InternLM/007aPnLRgy1hb39z0im50j30ci0el0wm.jpg')
response = pipe(('请你根据这张图片,讲一个脑洞大开的梗', image))
print(response.text)

运行执行推理结果。

python3 test_lmdeploy.py
推理后

推理出来有什么文字是纯随机的,并不一定和展示结果完全一致哦~

推理后我们发现直接使用2b模型不能很好的讲出梗,现在我们要对这个2b模型进行微调。

InternVL 微调攻略

准备数据集

数据集格式为:

# 为了高效训练,请确保数据格式为:
{"id": "000000033471","image": ["coco/train2017/000000033471.jpg"], # 如果是纯文本,则该字段为 None 或者不存在"conversations": [{"from": "human","value": "<image>\nWhat are the colors of the bus in the image?"},{"from": "gpt","value": "The bus in the image is white and red."}]}

这里我们也为大家准备好了可以直接进行微调的数据集。数据集就是咱们刚才复制进InternLM/datasets的数据。

配置微调参数

让我们一起修改XTuner下 InternVL的config,文件在: /root/InternLM/code/XTuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_qlora_finetune.py

  • 需要修改的部分

最基础修改一下模型地址和数据地址即可。

开始训练

这里使用之前搞好的configs进行训练。咱们要调整一下batch size,并且使用qlora。要不半卡不够用的 QAQ。

cd XTunerNPROC_PER_NODE=1 xtuner train /root/InternLM/code/XTuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_qlora_finetune.py  --work-dir /root/InternLM/work_dir/internvl_ft_run_8_filter  --deepspeed deepspeed_zero1

---------------------
合并权重&&模型转换

用官方脚本进行权重合并

如果这里你执行的epoch不是6,是小一些的数字。你可能会发现internvl_ft_run_8_filter下没有iter_3000.pth, 那你需要把iter_3000.pth切换成你internvl_ft_run_8_filter目录下的pth即可。

cd XTuner
# transfer weights
python3 xtuner/configs/internvl/v1_5/convert_to_official.py xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_qlora_finetune.py /root/InternLM/work_dir/internvl_ft_run_8_filter/iter_3000.pth /root/InternLM/InternVL2-2B/

最后我们的模型在:/root/InternLM/convert_model/,文件格式:

.
|-- added_tokens.json
|-- config.json
|-- configuration_intern_vit.py
|-- configuration_internlm2.py
|-- configuration_internvl_chat.py
|-- conversation.py
|-- generation_config.json
|-- model.safetensors
|-- modeling_intern_vit.py
|-- modeling_internlm2.py
|-- modeling_internvl_chat.py
|-- special_tokens_map.json
|-- tokenization_internlm2.py
|-- tokenizer.model
`-- tokenizer_config.json

微调后效果对比

现在我们微调好啦,让我们再来试试这张图片吧!

我们把下面的代码替换进test_lmdeploy.py中,然后跑一下效果。

from lmdeploy import pipeline
from lmdeploy.vl import load_imagepipe = pipeline('/root/InternLM/InternVL2-2B')image = load_image('/root/InternLM/007aPnLRgy1hb39z0im50j30ci0el0wm.jpg')
response = pipe(('请你根据这张图片,讲一个脑洞大开的梗', image))
print(response.text)
cd /root/InternLM/codepython3 test_lmdeploy.py

效果还不错吧~哈哈哈。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 骁龙CPU简介
  • Java-数据结构-时间和空间复杂度 (ಥ_ಥ)
  • 耦合和内聚
  • MySQL——多表操作(四)(2)带 EXISTS 关键字的子查询
  • 大数据分析与挖掘技术实训室解决方案
  • 【杂谈】新能源和智能车
  • 如何使用 Go 语言开发微服务
  • 3.4.1 爬取王者荣耀英雄皮肤实战
  • 如何禁止电脑访问网站
  • 音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息
  • 微信小程序客户端与服务端进行WebSocket通信
  • 关于欧洲玩家的几个事实
  • Redis高级----五种数据结构及其底层实现
  • 探针卡组成说明
  • nginx 如何部署前端vue项目详细操作
  • [Vue CLI 3] 配置解析之 css.extract
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • AngularJS指令开发(1)——参数详解
  • canvas 五子棋游戏
  • ES6系列(二)变量的解构赋值
  • If…else
  • Laravel 中的一个后期静态绑定
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 阿里云应用高可用服务公测发布
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 简单实现一个textarea自适应高度
  • 排序算法之--选择排序
  • 如何设计一个微型分布式架构?
  • 如何选择开源的机器学习框架?
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 算法之不定期更新(一)(2018-04-12)
  • 小李飞刀:SQL题目刷起来!
  • elasticsearch-head插件安装
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #AngularJS#$sce.trustAsResourceUrl
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (ZT)一个美国文科博士的YardLife
  • (离散数学)逻辑连接词
  • (三)Honghu Cloud云架构一定时调度平台
  • (转)scrum常见工具列表
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core 2.1路线图
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET中的十进制浮点类型,徐汇区网站设计
  • ??javascript里的变量问题
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚