第四期书生大模型实战营 第10关 InternVL 多模态模型部署微调实践
文章目录
- 书生·浦语大模型全链路开源体系-第10关
- 相关资源
- InternVL 多模态模型部署微调实践
- 多模态大模型
- InternVL2
- 使用LMDeploy部署多模态大模型
- LMDeploy基本用法介绍
- 网页应用部署体验
- 使用XTuner在给定数据集微调InternVL2-2B
- 配置文件参数解读
- 数据集下载
- 开始微调
- 与AI美食家玩耍🎉
书生·浦语大模型全链路开源体系-第10关
为了推动大模型在更多行业落地应用,让开发人员更高效地学习大模型的开发与应用,上海人工智能实验室重磅推出书生·浦语大模型实战营,为开发人员提供大模型学习和开发实践的平台。
本文是书生·浦语大模型全链路开源体系-开源开放体系课程的笔记。
相关资源
- InternLM项目地址
https://github.com/InternLM/InternLM
- InternLM2技术报告
https://arxiv.org/pdf/2403.17297.pdf
- 书生·万卷 数据
https://opendatalab.org.cn/
- 课程链接
https://space.bilibili.com/1293512903/channel/collectiondetail?sid=4017857
InternVL 多模态模型部署微调实践
多模态大模型
多模态大模型是指能够处理和理解多种不同数据模态的人工智能模型。多模态大模型基于深度学习技术,旨在处理和融合来自多种不同数据源的信息,如文本、图像、音频、视频等。这类模型通过集成多种模态的信息,能够提供更加丰富和全面的理解与生成能力。
- 模型接收来自不同模态的输入数据,例如文本、图像、音频或视频。
- 每种模态的数据都需要经过预处理,以转换成适合模型输入的格式。例如,文本数据可能被转换为词嵌入,图像数据可能被转换为特征向量。
- 通过模态嵌入层,将不同模态的数据转换为统一的表示形式,使它们能够在同一空间中进行交互。这一步骤确保了不同模态信息的一致性和可比性。
- 转换后的模态嵌入通过某种机制进行融合。融合方式可以是早期融合(在编码器阶段)或晚期融合(在解码器阶段)。早期融合在处理早期阶段就结合不同模态的信息,而晚期融合则在处理后期阶段再进行结合。
- 融合后的表示包含了所有模态的信息,能够用于后续的推理和生成任务。
InternVL2
InternVL2 是由上海人工智能实验室开发的一种视觉-语言模型,旨在理解和生成视觉与文本之间的复杂关系。InternVL2 的架构和训练流程设计旨在提高模型在跨模态任务中的表现能力。
- InternVL2 采用卷积神经网络(CNN)作为视觉编码器,用于提取图像特征。这通常包括一系列卷积层、池化层和归一化层,以捕捉图像的局部特征和全局结构。
- 视觉编码器将输入的图像转换为高维特征向量,这些特征向量将用于与其他模态的信息进行交互。
- 文本编码器用于处理和生成文本信息。
- 文本编码器将输入的文本转换为语义表示,帮助理解文本中的含义和上下文。
- 多模态融合模块将视觉和文本特征结合起来,生成一个综合的表示。
- 解码器根据融合后的表示生成输出。
使用LMDeploy部署多模态大模型
执行命令,创建一个新的虚拟环境,安装必要的库。
conda create -n internlm python=3.10 -y
conda activate internlm
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y
pip install timm==1.0.8 openai==1.40.3 lmdeploy[all]==0.5.3 gradio==4.44.1
pip install datasets==2.19.2
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)
网页应用部署体验
我们可以使用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的开发机则无需修改,否则改为模型路径 /share/new_models/OpenGVLab/InternVL2-2B
。
启动demo:
conda activate internlm
python demo.py
使用XTuner在给定数据集微调InternVL2-2B
复制配置文件到目标目录下:
cp xtuner_config/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, beta2weight_decay
: 权重衰减,防止训练过拟合用max_norm
: 梯度裁剪时的梯度最大值warmup_ratio
: 预热比例,前多少的数据训练时,学习率将会逐步增加。save_steps
: 多少步存一次checkpointsave_total_limit
: 最多保存几个checkpoint,设为-1即无限制
LoRA相关参数:
r
: 低秩矩阵的秩,决定了低秩矩阵的维度。lora_alpha
缩放因子,用于调整低秩矩阵的权重。lora_dropout
dropout 概率,以防止过拟合。
数据集下载
我们采用的是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 是一个专门为研究中国各地美食文化而设计的数据集。它包含了大量关于食物的图片和问题,帮助多模态大模型更好地理解不同地区的饮食习惯和文化特色。这个数据集的推出,让我们能够更深入地探索和理解食物背后的文化意义。
huggingface-cli download --repo-type dataset --resume-download lyan62/FoodieQA --local-dir /root/huggingface/FoodieQA --local-dir-use-symlinks False
开始微调
运行命令,开始微调:
xtuner train internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2
微调后,把模型checkpoint的格式转化为便于测试的格式:
python /root/InternLM/xtuner/xtuner/configs/internvl/v1_5/convert_to_official.py ./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/
与AI美食家玩耍🎉
修改MODEL_PATH为刚刚转换后保存的模型路径:
MODEL_PATH = "./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10"
启动demo:
conda activate internlm
python demo.py
再次进行对话问答,发现它认识宫保鸡丁了~