文章目录
InternVL 部署微调实践
多模态大模型简介
多模态大语言模型(Multimodal Large Language Model)是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术,能够理解和生成多种模态的数据,从而在各种复杂的应用场景中表现出强大的能力。
常见的MLLM:InternVL、GPT-4o、Qwen-VL、LLaVA
多模态研究的重点是不同模态特征空间的对齐
BLIP2
Q-Former
类似传统多模态,三个loss:
- ITM loss: 图文匹配
- LM loss: Predict Next Token
- ITC loss: 对比学习
架构设计: - 共享Self Attention模态交融
- 专家FFN:处理差异化模态信息
MiniGPT-4
LLaVa
LLaVA-1.5-HD
直接resize可能丢失细节信息
LLaVA-NeXT
动态分辨率:336*[(2,2),(1,2),(2,1),(1,3),(3,1),(1,4),(4,1)]
更强的分辨率
为什么用Q-Former的变少了
-
收敛速度慢:Q-Former的参数量较大(例如BLIP-2中的100M参数),导致其在训练过程中收敛速度较慢。相比之下,MLP作为connector的模型(如LLaVA-1.5)在相同设置下能够更快地收敛,并且取得更好的性能。
-
性能收益不明显:在数据量和计算资源充足的情况下,Q-Former并没有展现出明显的性能提升。即使通过增加数据量和计算资源,Q-Former的性能提升也并不显著,无法超越简单的MLP方案。
-
更强的baseline setting:LLaVA-1.5通过改进训练数据,在较少的数据量和计算资源下取得了优异的性能,成为了一个强有力的baseline。相比之下,BLIP2的后续工作InstructBLIP在模型结构上的改进并未带来显著的性能提升,且无法推广至多轮对话。
-
模型结构的简洁性:LLaVA系列采用了最简洁的模型结构,而后续从模型结构上进行改进的工作并未取得明显的效果。这表明,在当前的技术和数据条件下,简洁的模型结构可能更为有效。
InternVL2简介
LLaVA式架构设计(ViT-MLP-LLM):
- InternLM2-20B
- InternViT-6B
- MLP
InternViT
Intern ViT-6B-448px-V1.2
- 倒数第四层特征最有用,砍掉后三层,共45层
- 分辨率从224扩展到448
- 与LLM联合训练时,在captioning和OCR数据集上训练, 获取高分辨率和OCR能力
Intern ViT-6B-448px-V1.5 - 动态分辨率,最多12个tile
- 更高质量的数据
Pixel Shuffle
- Why:448*448的图,patch大小为14*14,得到32*32=1024个patch,即视觉插入1024个token。这些信息有较大冗余,消耗较多的计算资源,对长的多模态上下文拓展不利。
- What:Pixel shuffle技术来自超分那边,是把不同通道的特征拿出来,拼到一个通道上,从 ( N , C × r 2 , H , W ) (N,C×r^2,H,W) (N,C×r2,H,W)转化为 ( N , C , H × r , W × r ) (N,C,H\times r,W\times r) (N,C,H×r,W×r)。r是上采样因子。
- How:这里把采样因子设为0.5,就可以把(4096*0.5*0.5,32,32)的图像特征转化为(4096,32*0.5,32*0.5),下采样到256个token了。
Dynamic High-Resolution
- Pre-defined Aspect Ratios:考虑到计算资源,设置最多12个tile,就有35种长宽比的排列组合(m*n,m,n≤12;12+6+4+3+2+2+6)。
- Match and split:选择最接近的长宽比,resize过去,切片成448*448的tiles。
- Thumbnail:某些任务需要全局信息,为了更好的感知全局信息,把原图resize到448*448,一块喂给LLM
Multitask output
- 利用VisionLLMv2的技术,初始化了一些任务特化embedding(图像生成、分割、检测), 添加了一些任务路由token
- 训练下游任务特化embedding,生成路由token时,把任务embedding拼在路由embedding后面,送给LLM拿到hidden_state
- 把hidden_state送给路由到的解码器中,生成图像/bounding box/masks
训练
- 第一阶段:训MLP,用高质量预训练数据(各种视觉任务)
- 第二阶段:ViT+MLP+LLM联合训练,用高质量视觉-文本指令任务
示例
InternVL部署 - LMDeploy
训练环境
conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env
安装与deepspeed集成的xtuner和相关包:
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
推理环境
conda create -n lmdeploy python=3.10 -y
conda activate lmdeploy
pip install lmdeploy gradio==4.44.1 timm==1.0.9
"lmdeploy"为推理使用环境名。
网页应用部署
git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial
启动demo
conda activate lmdeploy
python demo.py
对话:
模型把新疆菜错认成宫保鸡丁。
下面进行微调
InternVL微调
XTuner微调实践
cp /root/InternVL2-Tutorial/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py /root/finetune/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_foo
d.py
数据集下载
https://huggingface.co/datasets/lyan62/FoodieQA
shell
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
利用share目录下处理好的数据集
由于该数据集即需要登录huggingface的方法,又需要申请,下完还需要自己处理,因此我把处理后的文件放在开发机的/root/share/datasets/FoodieQA
路径下了。
开始微调:
xtuner train internvl_v2_internlm2_2b_lora_finetune_food --deepspeed deepspeed_zero2
微调后,把模型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/
修改demo.py的MODEL_PATH
MODEL_PATH = "/root/fintune/xtuner/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10"
微调前
微调后:询问同样问题
识别正确!
参考资料
Tutorial/docs/L2/InternVL at camp4 · InternLM/Tutorial
Tutorial/docs/L2/InternVL/task.md at camp4 · InternLM/Tutorial
多模态大模型发展简述及其微调部署实践(InternVL2为例)_哔哩哔哩_bilibili