书生大模型实战营12-InternVL 多模态模型部署微调

news/2025/2/22 11:09:01

文章目录

  • L2——进阶岛
    • InternVL 部署微调实践
      • 0.开发机创建与使用
      • 1.环境配置
        • 1.1.训练环境配置
        • 1.2.推理环境配置
      • 2.LMDeploy部署
        • 2.1.LMDeploy基本用法介绍
        • 2.2.网页应用部署体验
        • 2.3 出错解决
          • 2.3.1 问题1
          • 2.3.2 问题2
      • 3.XTuner微调实践
        • 3.1.准备基本配置文件
        • 3.2.配置文件参数解读
        • 3.3.数据集下载
          • 3.3.a.通过huggingface下载
          • 3.3.b.利用share目录下处理好的数据集
        • 3.4.开始微调
      • 4.与AI美食家玩耍
      • 5 模型上传

L2——进阶岛

InternVL 部署微调实践

0.开发机创建与使用

需要的开发机为
镜像:Cuda12.2-conda
资源配置:50% A100 * 1

1.环境配置

1.1.训练环境配置

新建虚拟环境并进入:

conda create --name xtuner-env python=3.10 -y
conda activate 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 tokenizers==0.15.2 peft==0.13.2 datasets==3.1.0 accelerate==1.2.0 huggingface-hub==0.26.5 
1.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"为推理使用环境名。

2.LMDeploy部署

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)

lmdeploy推理的核心代码如上注释所述。

2.2.网页应用部署体验

我们可以使用UI界面先体验与InternVL对话:

拉取本教程的github仓库https://github.com/Control-derek/InternVL2-Tutorial.git:

cd ~
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

出现以下内容时,表示服务启动成功
在这里插入图片描述

服务启动后,在本地使用powershell配置端口映射后,输入url,会看到如下界面:
在这里插入图片描述

点击Start Chat即可开始聊天,下方食物快捷栏可以快速输入图片,输入示例可以快速输入文字。输入完毕后,按enter键即可发送。

2.3 出错解决
2.3.1 问题1

如果在对话时发生错误
在这里插入图片描述
需要找到文件

/root/.conda/envs/lmdeploy/lib/python3.10/site-packages/lmdeploy/vl/engine.py

注释掉文件中126、127行,在下边128行添加 self._create_event_loop_task() 后重新运行demo.py,即可解决上面报错。
在这里插入图片描述

2.3.2 问题2

如果为以下报错
在这里插入图片描述
则表示 transformer 版本存在兼容性问题,需要对其进行重新安装。

conda activate lmdeploy
pip install transformers==4.39.0

3.XTuner微调实践

3.1.准备基本配置文件

执行以下命令,先进入工作目录并激活训练环境:

cd /root
git clone https://github.com/InternLM/xtuner.git
cd /root/xtuner
conda activate xtuner-env  # 或者是你自命名的训练环境

原始internvl的微调配置文件在路径./xtuner/configs/internvl/v2下,假设上面克隆的仓库在/root/InternVL2-Tutorial,复制配置文件到xtuner目录下:

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.2.配置文件参数解读

打开配置文件 /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即无限制

LoRA相关参数:

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

在这里插入图片描述
如果想断点重训,可以在最下面传入参数:
在这里插入图片描述
把这里的load_from传入你想要载入的checkpoint,并设置resume=True即可断点重续。

3.3.数据集下载

我们采用的是FoodieQA数据集,这篇文章中了2024EMNLP的主会,其引用信息如下:

@article{li2024foodieqa,
title={FoodieQA: A Multimodal Dataset for Fine-Grained Understanding of Chinese Food Culture},
author={Li, Wenyan and Zhang, Xinyu and Li, Jiaang and Peng, Qiwei and Tang, Raphael and Zhou, Li and Zhang, Weijia and Hu, Guimin and Yuan, Yifei and S{\o}gaard, Anders and others},
journal={arXiv preprint arXiv:2406.11030},
year={2024}
}

FoodieQA 是一个专门为研究中国各地美食文化而设计的数据集。它包含了大量关于食物的图片和问题,帮助多模态大模型更好地理解不同地区的饮食习惯和文化特色。这个数据集的推出,让我们能够更深入地探索和理解食物背后的文化意义。
可以通过3.3.a.和3.3.b.两种方式获取数据集,根据获取方式的不同,可能需要修改配置文件中的data_root变量为你数据集的路径:
在这里插入图片描述

3.3.a.通过huggingface下载

去huggingface下载此数据集:https://huggingface.co/datasets/lyan62/FoodieQA。该数据集为了防止网络爬虫污染测评效果,需要向提交申请后下载使用。
在这里插入图片描述
申请后,需要等待作者同意才能正常下载,否则下载时会遇到如下错误
在这里插入图片描述

当作者同意后,即可在命令行登录huggingface后直接在服务器上下载:

huggingface-cli login

输入huggingface的具有read权限的token即可成功登录。
在这里插入图片描述
使用命令行下载数据集:

huggingface-cli download --repo-type dataset --resume-download lyan62/FoodieQA --local-dir /root/huggingface/FoodieQA --local-dir-use-symlinks False

如果觉得上述过程麻烦,也可以用浏览器下载后,再上传服务器即可。

由于原始数据集格式不符合微调需要格式,需要处理方可使用,在InternVL2-Tutorial下,运行:

cd /root/InternVL2-Tutorial
python process_food.py

即可把数据处理为XTuner所需格式。注意查看input_path和output_path变量与自己下载路径的区别。

3.3.b.利用share目录下处理好的数据集

由于该数据集既要登录huggingface的方法,又需要申请,下完还需要自己处理,因此可以直接使用开发机的 /root/share/datasets/FoodieQA 路径下的数据集。

3.4.开始微调

运行命令,开始微调:

conda activate xtuner-env
xtuner train internvl_v2_internlm2_2b_lora_finetune_food --deepspeed deepspeed_zero2

看到有日志输出,即为启动成功:
在这里插入图片描述
如果报错:keyerror或者Filenotfound之类的,
在这里插入图片描述
可能是XTuner没识别到新写的配置文件,需要指定配置文件的完整路径:

xtuner train /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2

把/root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py换成自己配置文件的路径即可。

此过程耗时较长,大概需要两个小时,看到如下结果,即为完成。
在这里插入图片描述

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

cd /root
conda activate xtuner-env
python xtuner/xtuner/configs/internvl/v1_5/convert_to_official.py 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/

如果提示文件找不到,需要去到对应的目录下确认文件所在位置。
如果修改了超参数,iter_xxx.pth需要修改为对应的想要转的checkpoint。 ./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10/ 为转换后的模型checkpoint保存的路径。

执行完成后如下
在这里插入图片描述

4.与AI美食家玩耍

cd /root/InternVL2-Tutorial

修改 demo.py 文件中MODEL_PATH为刚刚转换后保存的模型路径:
在这里插入图片描述

就像在第2节中做的那样,启动网页应用:

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

服务启动后界面如下
在这里插入图片描述

部分case展示:
在这里插入图片描述

5 模型上传

在 磨搭上创建模型后,进入执行机将模型仓库克隆下来。

cd ~
git clone https://www.modelscope.cn/xianzaijiweilai/InternVL_test.git

在这里插入图片描述
由于模型文件较大,需要安装 git-lfs 以便将大文件上传到git。

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install git-lfs
rsync -avz /root/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10/ /root/InternVL_test/

将之前微调好的模型文件复制到目录中。
在这里插入图片描述
进入到模型文件目录,上传git

cd /root/InternVL_test/
git add .
git lfs track "model.safetensors"
git add .gitattributes
git commit -m "add:InternVL_test"
git push

模型文件较大,上传时需要等待一段时间。
在这里插入图片描述
上传完成后,可在磨搭社区查看到模型文件
在这里插入图片描述


http://www.niftyadmin.cn/n/5862162.html

相关文章

Spring MVC 对象转换器:初级开发者入门指南

Spring MVC 对象转换器:初级开发者入门指南 为什么需要对象转换器? 在 Web 应用中,我们经常需要处理不同类型的对象。例如:前端数据到后端对象 :用户通过表单提交的数据通常是HttpServletRequest 对象,我们…

SIM盾构建安全底座的可行性分析

一、背景 1.1安全需求现状 在数字化时代,信息安全面临着日益严峻的挑战。各类网络攻击手段层出不穷,如数据泄露、恶意软件攻击、网络诈骗等,给个人、企业和社会带来了巨大的损失。为了保障信息系统的安全性,需要构建一个可靠的安…

JavaScript系列(80)--WebAssembly 基础入门

WebAssembly 基础入门 🚀 WebAssembly(简称Wasm)是一种低级的类汇编语言,它具有紧凑的二进制格式,能够以接近原生的性能在现代Web浏览器中运行。让我们深入了解这项革命性的技术。 WebAssembly 概述 🌟 &…

亚马逊爬虫还有哪些注意事项?

在使用爬虫获取亚马逊商品信息时,除了技术实现外,还需要注意诸多细节,以确保爬虫的稳定运行并避免法律风险。以下是基于最新搜索结果的注意事项总结: 1. 遵守法律法规和亚马逊政策 在爬取亚马逊数据时,必须严格遵守相…

在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键

在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键,主要涉及到两个方面:确保 F1 键作为标准功能键工作 和 在 Snipaste 中设置 F1 为快捷键。 因为 Mac 默认情况下,F1-F12 键通常用作控制屏幕亮度、音量等系统功能的快捷键…

golang内存泄漏

golang也用了好几年了,趁着有空 整理归纳下,以后忘了好看下 一般认为 Go 10次内存泄漏,8次goroutine泄漏,1次是真正内存泄漏,还有1次是cgo导致的内存泄漏 1:环境 go1.20 win10 2:goroutine泄漏 单个Goroutine占用内存&…

go 并发 gorouting chan channel select Mutex sync.One

goroutine // head&#xff1a; 前缀 index&#xff1a;是一个int的指针 func print(head string, index *int) {for i : 0; i < 5; i {// 指针对应的int *indexfmt.Println(*index, head, i)// 暂停1stime.Sleep(1 * time.Second)} }/* Go 允许使用 go 语句开启一个新的运…

Unity教程(二十一)技能系统 基础部分

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…