文章目录
- 一、多模态大模型常见设计模式和工作原理
- 二、InternVL2的设计模式
- 三、LMDeploy部署
- 四、XTuner微调实践
一、多模态大模型常见设计模式和工作原理
多模态大模型通常指的是可以处理多种形式的数据(如文本、图像、音频等),并在这些不同模态之间进行交互的模型。这类模型的设计旨在充分利用不同类型数据的互补性,以提升整体系统的性能和效果。
常见设计模式
独立编码器与共享解码器:此模式中,每种模态的数据通过独立的编码器进行处理,但共享一个解码器。这意味着,不同模态的数据被单独编码,但解码时共享一个模型。这种设计模式能够较好地处理不同模态数据之间的差异性。
联合编码器与独立解码器:在此模式中,不同模态的数据被联合编码,但每个模态有独立的解码器。联合编码可以学习到不同模态数据之间的关联性,而独立的解码器则能更好地针对特定模态的任务进行优化。
跨模态转换:此模式旨在通过跨模态转换层将一种模态的数据转换为另一种模态,以促进不同模态之间的信息交流。例如,可以将文本转换为图像特征,或将图像转换为文本描述。
注意力机制:在多模态模型中,注意力机制被广泛用于提升模型在不同模态数据之间的交互能力。通过注意力机制,模型可以动态地关注不同模态数据中的重要信息,从而提升整体性能。
工作原理
多模态大模型的工作原理主要依赖于其能够同时处理和融合多种形式的数据的能力。以图像和文本为例,模型首先对图像和文本分别进行编码,得到各自的特征表示。接着,通过某种交互机制(如注意力机制),模型能够学习到图像和文本之间的关联性,从而进行跨模态的信息融合。
在解码阶段,模型可以根据任务需求,选择相应的解码器来生成最终的结果。例如,在图像描述生成任务中,模型需要将图像特征解码为文本描述;而在视觉问答任务中,模型需要将图像和文本特征结合起来,生成对问题的回答。
多模态大模型的设计和工作原理展现了其在处理复杂、多样化的数据类型和任务上的巨大潜力,为人工智能的发展开辟了新的道路。
二、InternVL2的设计模式
InternVL2是由上海人工智能实验室研发的一款通用视觉语言模型,旨在通过将视觉和语言两种模态进行融合,实现对图像和文本的联合理解与生成。其设计模式和模型架构具有以下特点:
设计模式
联合编码器与独立解码器:类似于多模态大模型的设计,InternVL2也采用了联合编码器与独立解码器的结构。不同之处在于,它特别注重图像和文本之间的双向交互,通过双向编码器来捕捉两种模态之间的互补信息。
注意力机制:在处理图像和文本的交互时,InternVL2利用注意力机制来动态地关注不同模态中的关键信息。这不仅提升了模型对图像和文本的理解能力,还增强了其在生成任务中的表现。
跨模态转换:为了进一步促进图像和文本之间的信息交流,InternVL2设计了跨模态转换层。这一层可以将图像特征转换为文本特征,或将文本特征转换为图像特征,从而实现更深入的模态融合。
模型架构
InternVL2的模型架构主要由以下几个部分组成:
图像编码器:负责将输入的图像转换为高维特征表示。这通常通过卷积神经网络(CNN)实现,以捕捉图像的空间结构和纹理信息。
文本编码器:负责将输入的文本转换为高维特征表示。这通常通过循环神经网络(RNN)或变压器(Transformer)实现,以捕捉文本的语义信息。
联合编码器:将图像编码器和文本编码器的输出进行联合编码,以捕捉两种模态之间的互补信息。这一部分通常采用注意力机制来实现。
跨模态转换层:将图像特征和文本特征进行相互转换,以增强不同模态之间的信息交流。
解码器:根据任务需求,选择相应的解码器来生成最终的结果。例如,在图像描述生成任务中,解码器将联合编码器的输出转换为文本描述;在视觉问答任务中,解码器将联合编码器的输出转换为对问题的回答。
训练流程
InternVL2的训练流程主要包括以下几个步骤:
数据准备:收集并预处理图像和文本数据。这包括图像的缩放、归一化,以及文本的分词、编码等。
模型初始化:根据预定义的模型架构,初始化模型的参数。
联合训练:将图像和文本数据同时输入模型,进行联合训练。在训练过程中,模型通过最小化损失函数来学习如何更好地融合两种模态的信息。
交叉验证:通过交叉验证等技术,评估模型的性能并进行调优。
微调:根据特定任务的需求,对模型进行微调,以进一步提升其在该任务上的表现。
InternVL2的设计模式、模型架构和训练流程展示了其在视觉语言理解与生成任务上的强大能力,为人工智能在图像和文本处理方面的应用提供了新的可能性。
三、LMDeploy部署
conda create -n lmdeploy python=3.10 -y
conda activate lmdeploy
pip install lmdeploy gradio==4.44.1 timm==1.0.9
git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial
启动demo:
python demo.py
会看到如下界面:
点击Start Chat即可开始聊天,下方食物快捷栏可以快速输入图片,输入示例可以快速输入文字。输入完毕后,按enter键即可发送。
如果出现报错:
raise RuntimeError('Current event loop is different from'
RuntimeError: Current event loop is different from the one bound to loop task!
注释报错的engine.py的126,127行,添加
self._create_event_loop_task()后,即可解决上面报错。
四、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
根据书生浦语XTuner 微调个人小助手的文章
原始internvl的微调配置文件在路径./finetune/xtuner/xtuner/configs/internvl/v2下,假设上面克隆的仓库在/root/InternVL2-Tutorial,复制配置文件到目标目录下:
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_food.py
数据集下载
我们采用的是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}
}
通过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
cd huggingface/FoodieQA
unzip FoodieQA.zip
由于原始数据集格式不符合微调需要格式,需要处理方可使用,在InternVL2-Tutorial下,运行:
cd InternVL2-Tutorial
python process_food.py
即可把数据处理为XTuner所需格式。注意查看input_path和output_path变量与自己下载路径的区别。
运行命令,开始微调:
xtuner train /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2
出现报错
raise FileNotFoundError(f'Cannot find {args.config}')
FileNotFoundError: Cannot find internvl_v2_internlm2_2b_lora_finetune_food
需要指定配置文件的完整路径:
xtuner train /root/finetune/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2
完成微调查看默认路径work_dirs文件夹:
微调后,把模型checkpoint的格式转化为便于测试的格式:
注意替换自己的文件路径
python finetune/xtuner/xtuner/configs/internvl/v1_5/convert_to_official.py finetune/xtuner/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 = “/root/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10”
cd /root/InternVL2-Tutorial
conda activate lmdeploy
python demo.py
微调前的锅包肉和肠粉的识别
微调后的识别: