
internVL的本地部署微调实践——L2G4
成功部署和微调了Video-LLM模型。首先,配置了训练和推理环境,安装了必要的依赖包。接着,使用LMDeploy进行模型部署,并通过网页应用体验了与InternVL的对话功能。在微调阶段,使用了FoodieQA数据集,通过XTuner工具对InternVL模型进行了LoRA微调,解决了模型在识别特定食物时的错误。微调后,模型在识别肠粉和锅包肉等食物时的准确性显著提升。
internVL的本地部署微调实践——L2G4
1.环境配置
1.1.训练环境配置
新建虚拟环境并进入:
conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env
"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:
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
上述命令请在vscode下运行,因为vscode自带端口转发,可以把部署在服务器上的网页服务转发到本地。
我这里有个报错:
TypeError: Base.set() got an unexpected keyword argument ‘button_shadow’
报错分析:
从错误信息来看,问题出在 demo.py 文件的第 37 行,具体是在 CustomTheme 类的初始化过程中,调用 super().set() 时传递了一个不被接受的参数 button_shadow。这个错误可能是由于 CustomTheme 类的父类(Base 类)的 set 方法不支持 button_shadow 参数。
解决:定位到错误行,将这一行的参数,注释掉
检查 CustomTheme 类的父类:
首先,确认 CustomTheme 类的父类(Base 类)的 set 方法是否支持 button_shadow 参数。如果不支持,你需要移除这个参数或者使用父类支持的其他参数。
修改 CustomTheme 类的初始化代码:
如果 button_shadow 是 CustomTheme 类特有的参数,你可能需要在 CustomTheme 类中自定义处理这个参数,而不是直接传递给父类的 set 方法。
启动后,CTRL+鼠标左键点进这个链接或者复制链接到浏览器
会看到如下界面:
点击Start Chat即可开始聊天,下方食物快捷栏可以快速输入图片,输入示例可以快速输入文字。输入完毕后,按enter键即可发送。
2.3.可能遇到棘手bug的解决
如果输入多张图,或者开多轮对话时报错:
可以参考github的issuehttps://github.com/InternLM/lmdeploy/issues/2101:
屏蔽报错的engine.py的126,127行,添加self._create_event_loop_task()
后,即可解决上面报错。
3.XTuner微调实践
3.1.准备基本配置文件
在InternStudio开发机的/root/xtuner
路径下,即为开机自带的xtuner,先进入工作目录并激活训练环境:
cd /root/xtuner
conda activate xtuner-env # 或者是你自命名的训练环境
如果没有该路径,可以从GitHub上克隆一个:
cd /root
git clone https://github.com/InternLM/xtuner.git
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
3.2.配置文件参数解读
在第一部分的设置中,有如下参数:
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, beta2weight_decay
: 权重衰减,防止训练过拟合用max_norm
: 梯度裁剪时的梯度最大值warmup_ratio
: 预热比例,前多少的数据训练时,学习率将会逐步增加。save_steps
: 多少步存一次checkpointsave_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.2.a.
和3.2.b.
两种方式获取数据集,根据获取方式的不同,可能需要修改配置文件中的data_root
变量为你数据集的路径:

3.3.a.通过huggingface下载
有能力的同学,建议去huggingface下载此数据集:https://huggingface.co/datasets/lyan62/FoodieQA。该数据集为了防止网络爬虫污染测评效果,需要向提交申请后下载使用。
由于申请的与huggingface账号绑定,需要在命令行登录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
下,运行:
python process_food.py
即可把数据处理为XTuner所需格式。注意查看input_path
和output_path
变量与自己下载路径的区别。
3.3.b.利用share目录下处理好的数据集
由于该数据集即需要登录huggingface的方法,又需要申请,下完还需要自己处理,因此我把处理后的文件放在开发机的/root/share/datasets/FoodieQA
路径下了。
3.4.开始微调🐱🏍
运行命令,开始微调:
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的格式转化为便于测试的格式:
python xtuner/configs/internvl/v1_5/convert_to_official.py 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.使用刚刚的微调的:视觉-语言大模型🎉
修改MODEL_PATH为刚刚转换后保存的模型路径:
就像在第2节中做的那样,启动网页应用:
cd /root/InternVL2-Tutorial
conda activate lmdeploy
python demo.py
部分case展示:
微调前,把肠粉错认成饺子,微调后,正确识别:

微调前,不认识“锅包又”,微调后,可以正确识别:

将训练好的模型上传到 Hugging Face 或 ModelScope 上
使用 huggingface_hub
库
-
在本地准备好模型文件
- 确保您的模型文件已经微调完成,并且包含以下文件:
pytorch_model.bin
或tf_model.h5
(模型权重文件)config.json
(模型配置文件)tokenizer.json
或tokenizer_config.json
(分词器文件,如果有)- 其他相关文件(如
special_tokens_map.json
、vocab.txt
等)。
- 确保您的模型文件已经微调完成,并且包含以下文件:
-
编写上传脚本
创建一个 Python 脚本(如upload_to_hf.py
),内容如下:from huggingface_hub import HfApi # 设置 Hugging Face 的访问令牌 api = HfApi() token = "111111" # 替换为您的 Token # 设置模型仓库路径 repo_id = "ricky7372/internvl-xtuner" # 例如:myusername/my-finetuned-model local_dir = "/root/finetune/work_dirs/assistTuner/merged" # 替换为您的模型本地路径 # 上传模型文件夹到 Hugging Face api.upload_folder( folder_path=local_dir, repo_id=repo_id, token=token, ) print("模型上传成功!")
-
运行脚本
在终端中运行脚本:
python upload_to_hf.py
更多推荐
所有评论(0)