基础任务
- 理解多模态大模型的常见设计模式,可以大概讲出多模态大模型的工作原理。
- 了解InternVL2的设计模式,可以大概描述InternVL2的模型架构和训练流程。
- 了解LMDeploy部署多模态大模型的核心代码,并运行提供的gradio代码,在UI界面体验与InternVL2的对话。
- 了解XTuner,并利用给定数据集微调InternVL2-2B后,再次启动UI界面,体验模型美食鉴赏能力的变化。
- 将训练好的模型上传到 Hugging Face 或 ModelScope 上,模型名称包含 InternVL 关键词)
一、多模态大模型模型(MLLM)
1.多模态大语言模型是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术,能够理解和生成多种模态的数据,从而在各种复杂的应用场景中表现出强大的能力。
2.多模态研究的重点是不同模态特征空间的对齐。
3.多模态大模型的训练:
3.1第一阶段:训练MLP,用高质量预训练数据(各种视觉任务)
3.2第二阶段:ViT+MLP+LLM联合训练,用高质量视觉-文本指令任务
二、InternVL2
2.1设计模式
nternVL2采用了LLaVA式的架构,即ViT-MLP-LLM架构。这种架构融合了视觉Transformer(ViT)、多层感知机(MLP)和大型语言模型(LLM),使得模型能够同时处理视觉和文本信息。
2.2模型架构
-
视觉模型:负责处理图片信息,识别和理解图片中的内容。它通常基于先进的卷积神经网络(CNN)或Transformer架构,能够提取图像的特征并进行有效的表示。在InternVL2中,视觉模型的具体实现为InternViT,其参数量扩展到了6B,相比原来的ViT有了显著的提升。
-
语言模型:负责处理文本信息,理解人类的语言。它可能是一个大型的预训练语言模型,如基于Transformer的架构,能够捕捉文本中的语义和上下文信息。在InternVL2中,语言模型与视觉模型通过特定的对齐和融合策略紧密地结合在一起,形成了一个真正的多模态模型。
2.3训练流程
-
预训练:首先,视觉模型和语言模型分别进行预训练。视觉模型通过识别大量的图片来学习如何识别物体,语言模型通过理解大量的文本来学习如何理解语言。
-
对齐训练:在预训练之后,模型会进行对齐训练。这一步骤确保视觉模型和语言模型在处理相同或相似的任务时表现一致。例如,当视觉模型识别出一张图片中的某个物体时,语言模型能够给出相应的描述。
-
生成学习:在对齐训练之后,模型会进行生成学习。这一步骤让模型能够根据已有的信息生成新的内容。例如,当视觉模型识别出一张图片时,语言模型能够生成描述这张图片的文字。
三、LMDeploy部署多模态大模型
使用本地的vscode通过“SSH链接”中的信息通过SSH链接进行开发,因为vscode自带端口转发,可以把部署在服务器上的网页服务转发到本地。
3.1核心代码:
主要通过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)
3.2网页应用部署
3.2.1配置环境
conda create -n lmdeploy python=3.10 -y
conda activate lmdeploy
pip install lmdeploy gradio==4.44.1 timm==1.0.9
3.2.2拉取github仓库
git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial
3.2.3启动demo
conda activate lmdeploy
python demo.py
启动后,CTRL+鼠标左键点进这个链接或者复制链接到浏览器

即可看到如下界面:


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



3.2.4bug解决
如果输入多张图,或者开多轮对话时报错:

可以参考github的issueInternLM/lmdeploy#2101:

屏蔽报错的engine.py的126,127行,添加self._create_event_loop_task()后,即可解决上面报错。

四、XTuner微调实践
4.1配置环境
conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env
pip install -U 'xtuner[deepspeed]' timm==1.0.9
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
4.2准备配置文件
在InternStudio开发机的/root/xtuner路径下,即为开机自带的xtuner,先进入工作目录并激活训练环境:
cd root/xtuner
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
4.3配置文件参数解读
在第一部分的设置中,有如下参数:
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_dropoutdropout 概率,以防止过拟合。
如果想断点重训,可以在最下面传入参数:

把这里的load_from传入你想要载入的checkpoint,并设置resume=True即可断点重续。
4.4下载数据集
我们采用的是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 是一个专门为研究中国各地美食文化而设计的数据集。它包含了大量关于食物的图片和问题,帮助多模态大模型更好地理解不同地区的饮食习惯和文化特色。这个数据集的推出,让我们能够更深入地探索和理解食物背后的文化意义。
4.4.1.通过huggingface下载
由于申请的与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变量与自己下载路径的区别。
4.4.2利用share目录下处理好的数据集
处理后的文件放在开发机的/root/share/datasets/FoodieQA路径下.
4.5开始微调
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保存的路径。
五、与AI美食家玩耍
修改MODEL_PATH为刚刚转换后保存的模型路径:

启动网页应用
cd /root/InternVL2-Tutorial
conda activate lmdeploy
python demo.py
微调前:并没有识别出图片中是什么菜以及该菜品属于哪个菜系

微调后:准确识别出该菜品是大盘鸡,属于新疆菜。

微调前:并没有识别出图片中是什么菜以及该菜品属于哪个菜系

微调后:准确的识别出该菜品是米皮,属于西北菜。

六、部署到ModelScope


279

被折叠的 条评论
为什么被折叠?



