InternVL 部署微调 - 第四期书生大模型实战营实验记录(进阶岛-第4关)

483 阅读9分钟

我目前正在参加“书生大模型实战营”。这是一个旨在帮助学员掌握大模型开发和应用的实战课程。

为了更好地记录完成过程,我根据官方提供的教程文档提取了核心步骤,并去掉了详细的背景知识介绍和说明,这样后续作为一个手册查找起来会更加直观。

但建议大家在实际学习过程中还是多看看原文,因为原文档确实非常的详细和完整,方便了解每一步的具体原因和背后的原理,这样有助于更牢固地掌握知识,提高实战能力。

进阶岛-第4关

本地环境:Win11。

原文:github.com/InternLM/Tu…

完成任务步骤记录

多模态大模型

目标:理解多模态大模型及InternVL相关理论。

完成所需时间:30分钟,搜索学习。

步骤

设计模式及工作原理

1. 统一嵌入-解码器架构(Unified Embedding Decoder Architecture)

统一嵌入-解码器架构是将图像、文本等不同模态的数据转换为统一的嵌入向量,然后通过一个解码器模型进行处理。这种方法的优点在于能够将不同模态的数据在相同的表示空间中进行融合,从而实现跨模态的信息共享和处理。例如,Fuyu-8b模型直接对图像patch进行处理,避免了独立的图像编码器。

2. 跨模态注意力架构(Cross-Modality Attention Architecture)

跨模态注意力架构在多头注意力层中通过跨注意力机制将不同模态的信息进行融合。与统一嵌入-解码器架构不同,跨模态注意力架构在注意力层中直接处理不同模态的输入,从而实现更紧密的信息融合。例如,Flamingo模型通过在文本序列中插入特殊标记来表示图像或视频内容,并通过交叉注意力机制将视觉信息注入到模型中。

3. 基于多模态对齐数据训练多模态大模型

这种方法直接利用多模态的对齐数据来训练多模态大模型。其核心理念是分别构建多个单模态编码器,得到各自的特征向量,然后基于类Transformer对各个模态的特征进行交互和融合,实现在多模态的语义空间对齐。例如,VideoBERT、CLIP、CoCa、CoDi等模型都是基于这种思路实现的。

4. 以LLM为底座模型,训练跨模态编码器

这种方法以预训练好的LLM为底座模型,冻结LLM的大部分参数来训练跨模态编码器。这种方法既能够有效地利用LLM强大的自然语言理解和推理能力,又能完成复杂的多模态任务。例如,LLaVA模型使用Vicuna模型作为文本编码器,使用CLIP模型作为图像编码器,并通过训练跨模态编码器来实现文本和图像特征的语义对齐。

5. 弱到强搜索(Weak-to-Strong Search)

这种方法将大模型的对齐过程转变为推理阶段的一种贪婪搜索方式。通过微调一个小模型,然后在大模型解码过程中,引导大模型去最大化微调前后小模型的输出对数概率差,从而实现类似于微调大模型的效果。这种方法具有计算高效的优点,能够避免直接对大型模型进行推理。

6. 原生多模态模型

原生多模态模型从设计阶段就用于处理多种模态的数据,如文本、图像、音频、视频等。这些模型在训练过程中共享特征和学习策略,有助于捕获跨模态特征间的复杂关系。例如,Gemini模型专为多模态应用而设计,能够同时处理文本和图像输入。

7. 多个单模型拼接

这种方法将不同的单模态模型拼接起来,使得模型具备多模态能力。例如,Qwen-VL模型由Qwen-7B语言模型和Openclip ViT-bigG视觉模型组成,通过这种方式实现图像和文本的多模态输入。

InternVL2设计模式

1. 联合编码器与独立解码器

InternVL2采用了联合编码器与独立解码器的设计模式。在这种模式中,图像和文本数据分别通过独立的编码器进行处理,但它们的输出被联合编码器整合在一起,以捕捉两种模态之间的互补信息。联合编码器通常采用注意力机制,以动态地关注不同模态中的关键信息,从而提升模型对图像和文本的理解能力。

2. 注意力机制

在处理图像和文本的交互时,InternVL2利用注意力机制来动态地关注不同模态中的关键信息。注意力机制使得模型能够根据任务需求,灵活地分配对不同模态的关注度,从而增强了模型在生成任务中的表现。这种机制允许模型在处理复杂任务时,更加高效地提取和利用相关信息。

3. 跨模态转换层

为了进一步促进图像和文本之间的信息交流,InternVL2设计了跨模态转换层。这一层可以将图像特征转换为文本特征,或将文本特征转换为图像特征,从而实现更深入的模态融合。这种设计有助于模型在跨模态任务中表现得更加出色。

InternVL2模型架构

InternVL2.5保留了其前身InternVL 1.5和InternVL 2.0的相同模型架构,遵循“ViT-MLP-LLM”范式。这一范式通过将预训练的视觉编码器(InternViT)与大语言模型(LLM)结合,并通过随机初始化的两层MLP投影器进行连接。

InternVL2训练流程

InternVL2的训练流程包括以下几个步骤:

  • 数据准备:收集并预处理图像和文本数据,包括图像的缩放、归一化,以及文本的分词、编码等。
  • 模型初始化:根据预定义的模型架构,初始化模型的参数。
  • 联合训练:将图像和文本数据同时输入模型,进行联合训练。在训练过程中,模型通过最小化损失函数来学习如何更好地融合两种模态的信息。
  • 交叉验证:通过交叉验证等技术,评估模型的性能并进行调优。
  • 微调:根据特定任务的需求,对模型进行微调,以进一步提升其在该任务上的表现

准备工作

目标:完成环境搭建,并通过SSH链接。

完成所需时间:20分钟,网络有点慢。

步骤

开发机

启动开发机,选择Cuda12.2-conda镜像,并连接上开发机即可。

教程中建议开发机资源配置采用:50% A100 * 1。

我更喜欢VS Code连接开发机,后续截图都以VS Code为准。

基础环境

训练环境

# 如果之前已经有同名env,可以直接复用
conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env
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

推理环境

# 如果之前已经有同名env,可以直接复用
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部署InternVL

目标:了解LMDeploy部署多模态大模型的核心代码,并运行提供的gradio代码,在UI界面体验与InternVL2的对话。

完成所需时间:20分钟。

步骤

运行InternVL2示例

检出InternVL2教程源码。

cd /root/internvl
git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial
conda activate lmdeploy
python demo.py

image.png

效果

采用示例图片和示例输入,效果如下:

image.png

image.png

嗯。。。功能可用,但是识别效果,微调一下再试试吧。

微调InternVL2

目标:了解XTuner,并利用给定数据集微调InternVL2-2B后,再次启动UI界面,体验模型美食鉴赏能力的变化。

完成所需时间:6个小时,如果一次成功的话,大概2个小时,其中完整微调的训练过程大概1个半小时。前期由于想要节省时间,先用部分数据进行微调,但是效果不行,再加上有一遍环境错误重来了下。

步骤

配置文件

拉取xtuner源码。

cd /root
git clone https://github.com/InternLM/xtuner.git
conda activate xtuner-env

复制internvl配置文件。

cp /root/internvl/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

数据集准备

使用share目录下准备好的数据集/root/share/datasets/FoodieQA,不需要调整代码。

开始微调

避免出现文件未找到的异常,直接采用绝对路径。

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

image.png

转换模型checkpoint格式。

python /root/xtuner/xtuner/configs/internvl/v1_5/convert_to_official.py /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py /root/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/iter_640.pth /root/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10/

image.png

效果

修改/root/internvl/InternVL2-Tutorial/demo.py中MODEL_PATH为刚刚转换后保存的模型路径/root/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10

启动demo。

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

最终,终于识别出来了。

image.png

部署到ModelScope

目标:将训练好的模型上传到 Hugging Face 或 ModelScope 上。

完成所需时间:3个小时,上传比较慢,我花了接近10个小时,因为最初git一起上传的,卡着一动不动,没忍住。

步骤

新建模型

登录ModelScope,创建模型。

image.png

填写相关信息。

上传模型文件

安装git lfs:

cd /root
git clone https://www.modelscope.cn/FlyFive/internvl_food.git
apt-get install git-lfs
cd /root/internvl_food
git lfs install

复制模型文件到git文件夹

cp -r /root/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/* /root/internvl_food/

提交文件

建议分批提交,不然卡的着急

git add .  
git commit -m "add"
git push -u origin master

一起上传的话一动不动,有点让人绝望,分批上传的话,共计2个小时左右,中间push大文件时,还可以干点别的。

不要下载到本地后再上传,太慢了,主要是modelscope不支持上传大于100M的文件。

image.png

效果

模型地址:modelscope.cn/models/FlyF…

image.png

image.png