首页 > 其他分享 >书生大模型实战营L2G4000 - InternVL 部署微调实践

书生大模型实战营L2G4000 - InternVL 部署微调实践

时间:2025-01-12 22:31:17浏览次数:3  
标签:模态 训练 模型 微调 L2G4000 书生 xtuner InternVL 数据

1. 多模态大模型的工作原理和设计模式

1.1 工作原理

多模态大模型的工作原理基于深度学习技术,旨在通过处理和融合多种模态数据(如文本、图像、音频、视频等)来实现更全面的理解和生成能力。以下是其工作原理的核心要点:

1. 数据预处理与编码

  • 数据预处理:不同模态的数据需要特定的预处理步骤。例如,文本经过分词和嵌入表示,图像通过归一化或特征提取,音频则可能涉及信号处理。
  • 模态编码器:每种模态都有专用的编码器,将原始数据转换为高维特征表示(嵌入)。例如:
    • 文本编码器使用Transformer架构(如BERT或GPT)。
    • 图像编码器采用卷积神经网络(CNN)或视觉Transformer(ViT)。

2. 特征融合

多模态模型的关键在于融合不同模态的特征表示,以便在统一的表示空间中进行处理。常见的融合机制包括:

  • 早期融合:在输入阶段直接将多模态数据合并。
  • 中期融合:在特征提取阶段通过注意力机制或其他方法将各模态特征结合。

3. 跨模态表示学习

跨模态学习旨在对齐不同模态的数据,使其能够在共享的向量空间中进行交互。这种对齐通常通过以下方式实现:

  • 联合表示:将所有模态映射到统一的向量空间。

4. 解码与生成

解码器根据任务需求生成输出,例如文本描述、图像生成或语音合成。解码过程可能涉及跨模态注意力机制,以确保生成内容与输入数据的一致性

5. 自监督学习与优化

多模态大模型通常使用自监督学习进行预训练,从海量无标注数据中提取通用知识。训练过程中,模型通过损失函数(如对比学习损失)优化参数,以提升跨模态理解和生成能力

1.2 主要设计模式

1. 模态编码器 (Modality Encoders)

  • 功能:将不同模态的数据(如图像、文本、音频)编码为特征向量或嵌入表示。
  • 实现方式
    • 图像编码器:通常采用卷积神经网络(CNN)或视觉Transformer(ViT)。
    • 文本编码器:基于Transformer架构,如BERT或GPT。
    • 音频编码器:使用Wav2Vec2或HuBERT等模型

2. 模态融合机制 (Feature Fusion Mechanisms)

  • 功能:整合不同模态的特征以形成统一的表示。
  • 融合策略
    • 早期融合 (Early Fusion):在输入阶段直接合并原始数据。
    • 中期融合 (Intermediate Fusion):在特征提取阶段进行融合,通常通过注意力机制或自注意力机制实现

3. 跨模态表示学习 (Cross-modal Representation Learning)

  • 功能:将不同模态的数据映射到共享的向量空间,以便进行跨模态对齐和比较。
  • 实现方式
    • 使用跨注意力机制(Cross-Attention)在内部层实现深度融合

4. 解码器与任务适配 (Decoders and Task-Specific Adaptation)

  • 功能:根据任务需求生成输出,例如文本生成、图像生成或多模态问答。
  • 实现方式
    • 自回归解码器用于统一建模多粒度任务,如视觉定位、分割和描述。

5. 自监督与指令微调 (Self-Supervised Learning & Instruction Fine-tuning)

  • 功能:通过自监督学习预训练模型,并通过指令微调提升特定任务性能。
  • 步骤
    • 独立预训练视觉和语言模型。
    • 对齐训练,通过连接器模块(如Q-Former)实现视觉与语言模态的协同工作。
    • 指令微调,结合多任务数据优化模型性能

2. InternVL2

2.1 设计模式

1. 渐进式扩展策略 (Progressive Scaling Strategy)

  • 核心思想:采用阶段性训练策略,从小规模模型和粗粒度数据开始,逐步扩展到更大规模的语言模型和精细化的数据。
  • 优点
    • 降低训练成本,适合有限资源条件。
    • 实现视觉编码器与大型语言模型的高效对齐。
  • 应用:通过逐步扩展模型规模(如从 1B 到 108B 参数)和数据质量,提升模型性能。

2. 多模态输入支持 (Multimodal Input)

  • 支持类型:文本、图像、视频、医疗数据等多种模态。
  • 处理方式
    • 图像输入被分割成 448×448 像素的 tiles,每个 tile 表示为 256 个视觉 token。
    • 视频输入支持多帧处理(如每段视频提取 16 帧)。
    • 文本输入通过标准 Transformer 编码器处理。

3. 多任务输出能力 (Multitask Output)

  • 输出形式:支持文本生成、图像分析、边界框标注、蒙版生成等多种任务。
  • 实现方式
    • 使用 VisionLLMv2 模块连接多个下游任务解码器,实现广泛的视觉语言任务适配。
    • 输出结果可以涵盖从自然语言描述到复杂视觉标注。

4. ViT-MLP-LLM 架构

  • 核心架构:结合视觉 Transformer (ViT)、多层感知机 (MLP) 投影器和大型语言模型 (LLM)。
  • 优化点
    • 使用动态分辨率策略,将高分辨率图像分割为小块以减少视觉 token 数量。
    • 增量预训练视觉编码器(如 InternViT-6B 或 InternViT-300M),并与预训练的大型语言模型(如 InternLM2.5 和 Qwen2.5)集成。

5. 数据质量与扩展

  • 数据集质量经过严格筛选,避免重复样本和异常样本以提升训练效果。
  • 支持长文本、多图像、多视频输入,通过大容量上下文窗口(8k tokens)处理复杂任务。

6. 自监督学习与指令微调

  • 自监督学习:在预训练阶段使用无标签数据,通过对比学习等方法提取通用特征。
  • 指令微调:针对具体任务进行优化,使模型能够理解并执行用户指令。

2.2 模型架构

模型架构组成

1. 视觉部分 (Vision Part)

  • 视觉编码器:使用 InternViT(Intern Vision Transformer),支持不同规模(如 InternViT-6B 或 InternViT-300M)。

  • 动态分辨率策略
    • 输入图像被划分为 448×448 像素的图块(tiles)。
    • 每个图块表示为 256 个视觉 token,通过像素 unshuffle 操作减少视觉 token 数量至原始的四分之一。
    • 支持单图像、多图像和视频输入,视频帧也被调整为 448×448 像素进行处理。

2. 特征对齐模块 (MLP Projector)

  • 多层感知机 (MLP):一个随机初始化的两层 MLP,用于将视觉特征映射到语言模型可以处理的特征空间。
  • 作用:连接视觉编码器与大型语言模型,实现模态间特征对齐。

3. 语言部分 (Language Part)

  • 大型语言模型 (LLM)
    • 集成预训练的大型语言模型,如 InternLM 2.5 和 Qwen 2.5。
    • 支持从小规模(如 1B 参数)到超大规模(如 108B 参数)的多种模型配置。
  • 上下文窗口:支持长文本输入,具有高达 8k tokens 的上下文窗口,适合处理复杂和多模态输入。

2.3 训练流程

InternVL2 的训练流程采用了分阶段的策略,结合动态高分辨率训练和渐进式扩展方法,以高效地提升视觉与语言模态的对齐能力和多模态任务性能。以下是其主要训练流程的概述:

训练流程分阶段

InternVL2 的训练流程主要分为三个阶段,每个阶段都有特定目标和优化策略:

1. 阶段 1:MLP 预热 (MLP Warmup)

  • 目标:在视觉编码器(InternViT)和大型语言模型(LLM)之间建立初步的跨模态对齐。
  • 细节
    • 冻结视觉编码器和语言模型,仅训练 MLP 投影器(连接视觉特征与语言模型输入空间的桥梁)。
    • 使用动态高分辨率训练策略,即将图像划分为高分辨率 tiles(如 448×448 像素),生成视觉 token。
    • 应用 Next Token Prediction (NTP) 损失,优化跨模态对齐。
  • 优势
    • 提升训练稳定性,确保后续阶段多模态任务的基础性能。
    • 在较高学习率下快速收敛,使 MLP 投影器适应语言模型。

2. 阶段 1.5:ViT 增量学习 (ViT Incremental Learning, 可选)

  • 目标:增强视觉编码器处理罕见领域(如多语言 OCR、数学图表)的能力。
  • 细节
    • 开放视觉编码器和 MLP 投影器进行联合训练。
    • 使用与阶段 1 相同的数据和损失函数(NTP Loss)。
    • 增强视觉编码器对稀有数据领域的泛化能力。
  • 可选性
    • 如果没有新增领域或任务需求,此阶段可以跳过,直接进入下一阶段。

3. 阶段 2:全模型指令微调 (Full Model Instruction Tuning)

  • 目标:在高质量多模态指令数据集上微调整个模型,优化其多模态理解与生成能力。
  • 细节
    • 解冻整个模型,包括视觉编码器、MLP 投影器和语言模型。
    • 使用严格的数据质量控制,避免噪声数据导致性能下降(例如生成重复或错误输出)。
    • 数据集覆盖多种任务,包括图像描述、视觉问答、OCR、科学问题求解等。
  • 结果
    • 提升模型在复杂多模态任务上的表现,同时保持生成内容的准确性和一致性。

3. LMDeploy部署

LMDeploy 是一个用于大型语言模型(LLM)和视觉语言模型(VLM)部署的高效工具包,支持模型量化、推理优化以及多种形式的服务部署。

3.1 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)

lmdeploy推理的核心代码如上注释所述。

3.2 网页应用部署体验

我们可以使用UI界面先体验与InternVL对话:

拉取本教程的github仓库GitHub - Control-derek/InternVL2-Tutorial

git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial

demo.py文件中,MODEL_PATH处传入InternVL2-2B的路径,如果使用的是InternStudio的开发机则无需修改,否则改为模型路径。

启动demo:

conda activate lmdeploy
python demo.py

上述命令请在vscode下运行,因为vscode自带端口转发,可以把部署在服务器上的网页服务转发到本地。

启动后,CTRL+鼠标左键点进这个链接或者复制链接到浏览器

会看到如下界面:

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

展开对话:

4. XTuner微调实践

4.1 准备基本配置文件

在InternStudio开发机的/root/xtuner路径下,即为开机自带的xtuner,先进入工作目录并激活训练环境:

cd /root/xtuner
conda activate xtuner-env  # 或者是你自命名的训练环境

如果没有该路径,可以从GitHub上克隆一个:

cd /root
git clone https://github.com/InternLM/xtuner.git
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.2 配置文件参数解读

在第一部分的设置中,有如下参数:

  • 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, beta2
  • weight_decay: 权重衰减,防止训练过拟合用
  • max_norm: 梯度裁剪时的梯度最大值
  • warmup_ratio: 预热比例,前多少的数据训练时,学习率将会逐步增加。
  • save_steps: 多少步存一次checkpoint
  • save_total_limit: 最多保存几个checkpoint,设为-1即无限制

LoRA相关参数:

  • r: 低秩矩阵的秩,决定了低秩矩阵的维度。
  • lora_alpha 缩放因子,用于调整低秩矩阵的权重。
  • lora_dropout dropout 概率,以防止过拟合。

如果想断点重训,可以在最下面传入参数:

把这里的load_from传入你想要载入的checkpoint,并设置resume=True即可断点重续。

4.3 数据集下载

我们采用的是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 是一个专门为研究中国各地美食文化而设计的数据集。它包含了大量关于食物的图片和问题,帮助多模态大模型更好地理解不同地区的饮食习惯和文化特色。这个数据集的推出,让我们能够更深入地探索和理解食物背后的文化意义。

可以通过3.2.a.3.2.b.两种方式获取数据集,根据获取方式的不同,可能需要修改配置文件中的data_root变量为你数据集的路径:

通过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

如果觉得上述过程麻烦,可以用浏览器下载后,再上传服务器即可

标签:模态,训练,模型,微调,L2G4000,书生,xtuner,InternVL,数据
From: https://blog.csdn.net/Ameliorating/article/details/145042100

相关文章

  • 【阿尼亚探索大模型】书生大模型实战营-进阶岛第2关(L2G2000)Lagent 自定义你的 Agent
    任务类型任务内容任务一使用Lagent复现“制作一个属于自己的Agent”任务二使用Lagent复现 “Multi-Agents博客写作系统的搭建”任务三将你的Agent部署到HuggingFace或ModelScope平台基础环境配置依然选择30%A100开发机进行实验。使用conda创建虚拟环境。启动......
  • 自签名SSL证书生成
    1、生成顶级CA的公钥证书和私钥文件##有效期15年(指定RSA2048bits,默认RSA1024bits)opensslreq-newkeyrsa:2048-x509-days5480-keyoutCARoot2048.key-outCARoot2048.crt2、为顶级CA的私钥文件去除保护口令openss1rsa-inCARoot2048.key-outCARoot2048.key3......
  • 书生浦语大模型实战训练营L2G3000 LMDeploy 量化部署实践闯关任务
    LMDeploy量化部署实践闯关任务文章目录LMDeploy量化部署实践闯关任务前言一、任务一W4A16量化+KVcache+KVcache量化二、任务二前言使用结合W4A16量化与kvcache量化的internlm2_5-1_8b-chat模型封装本地API并与大模型进行一次对话。使用Functioncall功能......
  • 书生大模型第四期 | 基础岛 task5 XTuner 微调个人小助手认知任务(包含swanlab可视化
    目录环境配置与数据准备**步骤0.使用conda先构建一个Python-3.10的虚拟环境****步骤1.**安装XTuner验证安装修改提供的数据**步骤0.**创建一个新的文件夹用于存储微调数据**步骤1.**编辑&执行脚本**步骤3.**查看数据训练启动**步骤0.**复制模型**步骤......
  • 书生大模型第四期 | 基础岛 task6 OpenCompass 评测
    目录使用OpenCompass评测浦语API记录环境准备后续运行会碰到的问题:代码准备测评运行任务来源:Tutorial/docs/L1/Evaluation/task.mdatcamp4·InternLM/Tutorial·GitHub使用OpenCompass评测浦语API记录环境准备condacreate-nopencompasspython=3.10......
  • 【书生实战营】- L2G4000 InternVL 多模态模型部署微调实践
    文章目录InternVL部署微调实践多模态大模型简介BLIP2Q-FormerMiniGPT-4LLaVa为什么用Q-Former的变少了InternVL2简介InternViTPixelShuffleDynamicHigh-ResolutionMultitaskoutput训练InternVL部署-LMDeploy训练环境推理环境网页应用部署InternVL微调XTuner微......
  • 第四期书生大模型实战营 基础岛 第5关
    XTuner微调个人小助手认知任务注:微调内容需要使用30%A100才能完成!!!环境配置与数据准备1. 使用conda先构建一个Python-3.10的虚拟环境,并激活ps:若root中存在Tutorial文件夹记得先删除哦,不然之后在“创建一个用于存储微调数据的文件夹”时有出现问题的TAT。cd~#gi......
  • InternVL2识别边界框实践:捕获股票K线图启明之星
    本文作者:谢志军,某互联网金融证券公司,算法工程师https://github.com/OpenGVLab/InternVL写在前面YOLO系列模型实现了对现实世界广泛物体的边界框识别,最新的开源多模态大模型(MLLM)/视觉语言模型(VLM)宣称能够给出特定物体的边界框坐标。笔者测试了一些常规图片并询问MLLM......
  • 书生大模型实战(从入门到进阶)L2-茴香豆:企业级知识库问答工具
    目录茴香豆介绍 茴香豆本地标准版搭建 环境搭建配置服务器:搭建茴香豆虚拟环境:安装茴香豆下载茴香豆 安装茴香豆所需依赖下载模型文件更改配置文件知识库创建测试知识助手命令行运行GradioUI界面测试本文是对书生大模型L2-茴香豆:企业级知识库问答工具部分......
  • L1- 书生大模型全链路开源体系 关卡
    一、总结要点-......