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

书生浦语实训营-InternVL 多模态模型部署微调实践

1.什么是InternVL

InternVL 是一种用于多模态任务的深度学习模型,旨在处理和理解多种类型的数据输入,如图像和文本。它结合了视觉和语言模型,能够执行复杂的跨模态任务,比如图文匹配、图像描述生成等。

2.InternVL模型介绍

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

ViT(Vision Transformer)是一种基于Transformer架构的图像分类模型

3.Dynamic High Resolution

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

4.Pixel Shuffle

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

5.InternVL 部署微调实践

**目标:**让InternVL-2B生成文生图提示词

过程:

  1. 准备InternVL模型
cd /root
mkdir -p modelcp 模型cp -r /root/share/new_models/OpenGVLab/InternVL2-2B /root/model/
  1. 配置虚拟环境
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
  1. 配置完torchvision等依赖后,还需要安装Xtuner
# 创建一个目录,用来存放源代码
mkdir -p /root/InternLM/codecd /root/InternLM/codegit clone -b v0.1.23  https://github.com/InternLM/XTuner
  1. 安装Xtuner的依赖
cd /root/InternLM/code/XTuner
pip install -e '.[deepspeed]'
  1. 安装LMDeploy,帮助部署项目
pip install lmdeploy==0.5.3
xtuner version
xtuner help
  1. 准备微调数据集
    数据集我们从官网下载下来并进行去重,只保留中文数据等操作。并制作成XTuner需要的形式。并已在share里,我们一起从share里挪出数据集。
## 首先让我们安装一下需要的包【timm(PyTorch Image Models)是一个基于PyTorch的图像模型库,提供了许多流行的图像分类模型的预训练权重,包括ResNet等。Pillow是对图像进行增强】
pip install datasets matplotlib Pillow timm## 让我们把已经准备好的数据集挪出来
cp -r /root/share/new_models/datasets/CLoT_cn_2000 /root/InternLM/datasets/
  1. 推理图片得到内容
    之后我们使用lmdeploy自带的pipeline工具进行开箱即用的推理流程,首先我们新建一个文件:
touch /root/InternLM/code/test_lmdeploy.py
cd /root/InternLM/code/
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)

在这里插入图片描述

  1. 微调InternVL2B
    配置参数:
#######################################################################
#                          PART 1  Settings                           #
#######################################################################
# Model
# 模型地址
path = '/root/model/InternVL2-2B'# Data
# 数据地址
data_root = '/root/data/'
# data_path = data_root + 'LLaVA-Instruct-150K/llava_v1_5_mix665k.json'
data_path = '/root/data/screenshot_od/layout_ocr_multi.json'
image_folder = data_root + 'screenshot_od/images'
prompt_template = PROMPT_TEMPLATE.internlm2_chat
# 模型最大输出长度
max_length = 8192# Scheduler & Optimizer
#每张卡上的batch size大小
batch_size = 8  # per_device
# 梯度累积大小
accumulative_counts = 2
# dataloader数量
dataloader_num_workers = 4
# epoch大小
max_epochs = 1
# 优化器类型
optim_type = AdamW
# official 1024 -> 4e-5
lr = 1e-6
betas = (0.9, 0.999)
weight_decay = 0.05
max_norm = 1  # grad clip
warmup_ratio = 0.03# Save
save_steps = 1000
save_total_limit = 1  # Maximum checkpoints to keep (-1 means unlimited)

开始训练:
batchSize=4,在半卡A100 80G上完成微调

NPROC_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

在这里插入图片描述

  1. 然后进行权重合并
python3 xtuner/configs/internvl/v1_5/convert_to_official.py xtuner/configs/internvl/v2/internvl_v2_internlm2_5_8b_qlora_finetune.py /root/InternLM/work_dir/internvl_ft_run_8_filter/iter_6000.pth /root/InternLM/InternVL2-2B/

6.微调后的效果

from lmdeploy import pipeline
from lmdeploy.vl import load_image#pipe = pipeline('/root/model/InternVL2-2B')
pipe = pipeline('/root/InternLM/InternVL2-2B')image = load_image('/root/InternLM/256321723775630_.pic.jpg')
for i in range(20):response = pipe(('请你根据这张图片,讲一个脑洞大开的梗', image))print(response.text)
[WARNING] gemm_config.in is not found; using default GEMM algo
被穿了外套
被粘住了无法逃脱的猫猫
被子和被子同时醒来
“哥哥,你别闹了!我刚刚只是迷路而已!”
被强行拉去体验打蚊子大赛
被粘住了,别过来!
被猫爪抓伤了
已经不是第一次了,果然还是不行啊!
....

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • Unity(2022.3.41LTS) - 脚本
  • react + ts + material-ui V5版本的table封装
  • 本地部署aniportrait
  • 【unity实战】使用新版输入系统Input System+Rigidbody实现第三人称人物控制器
  • 【2024 CCF编程能力等级认证(GESP)Python 】一级大纲
  • 【图像去噪】论文精读:Multi-level Wavelet-CNN for Image Restoration(MWCNN)
  • 在Supabase创建用户登录并获取token的操作实践
  • 图像尺寸测量仪的精度概念解析
  • 掌握SQL数据分割技巧:垂直与水平分割全解析
  • 学习关系型数据库:在Ubuntu和FreeBSD下安装firebird
  • elementui图标偶尔乱码问题
  • PyCharm 自定义字体大小
  • 提升农业信息化水平,C# ASP.NET Vue果树生长信息管理系统带来全新管理体验
  • Windows 7 Windows Server 2008 R2 简体中文版下载 (updated Aug 2024)
  • JavaScript-如何实现克隆(clone)函数
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • css系列之关于字体的事
  • Druid 在有赞的实践
  • HTTP那些事
  • Iterator 和 for...of 循环
  • Mysql优化
  • Python实现BT种子转化为磁力链接【实战】
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 复习Javascript专题(四):js中的深浅拷贝
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 浏览器缓存机制分析
  • 前端js -- this指向总结。
  • 使用Swoole加速Laravel(正式环境中)
  • 事件委托的小应用
  • 我感觉这是史上最牛的防sql注入方法类
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # Kafka_深入探秘者(2):kafka 生产者
  • #{}和${}的区别是什么 -- java面试
  • #stm32驱动外设模块总结w5500模块
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (java)关于Thread的挂起和恢复
  • (WSI分类)WSI分类文献小综述 2024
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (六)Hibernate的二级缓存
  • (十八)Flink CEP 详解
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据