换个框架,LLaVA-7B 竟能媲美 13B?
The following article is from InternLM Author XTuner
在当今的人工智能浪潮中,多模态大模型已经成为无法忽视的趋势,它通过结合不同类型的信息源(例如文本、图像、语音等)来增强模型的理解和表达能力。2023 年,我们在图文领域看到了众多优秀的工作,例如 LLaVA 和 MiniGPT 等等。而本文,我们将从另一个角度来看待这一领域:训练框架。
本文将详细介绍由上海人工智能实验室设计开发的大模型微调框架 XTuner,其在同等训练数据的前提下,训得 LLaVA 模型精度显著优于现有其他框架,7B 模型媲美 13B。同时,借助 XTuner 中对 LLaVA 训练的多层优化,训练代价进一步降低,7B 模型仅需 8*48GB + 10 小时,即可完成所有训练流程!
https://github.com/InternLM/xtuner
(文末点击阅读原文可直达)
XTuner 训练 LLaVA 有何优势?
LLM QLoRA / ViT LoRA 配置
LLaVA (XTuner) 架构示意图
XTuner 团队对 LLaVA 的架构配置进行了充分的实验,发现了几个有趣的结论:
1. 在预训练阶段,对 LLM 应用量化 (Quantization) 技巧,精度无降低
量化技巧可以将 LLM 从 16 比特压缩至 4 比特,有效降低模型训练阶段的显存占用(4倍);同时研究团队发现这一压缩操作对精度无显著负面影响!
2. 在微调阶段,对 LLM 应用 QLoRA (4 比特量化 + Lora) 技巧,精度小幅提升
全量参数微调需要庞大的计算资源,XTuner 团队发现,选择轻量化微调方案 QLoRA,对 LLM 执行 4 比特量化(且冻结)的同时插入一定的可训练 LoRA,不仅能够显著降低训练资源,又能小幅提升精度,事半功倍!
3. 在微调阶段,对 ViT 应用 LoRA 技巧,精度显著提升
XTuner 团队发现,在 ViT 训练中引入 LoRA 微调而非完全冻结并不会导致图像特征提取的退化,相反,所引入的这一部分可学习参数有效增强了对图像特征的提取能力和与文本域的对齐能力,进而可以有效提升了多模态模型的整体精度。
优化数据样本采样器 Sampler
在官方 LLaVA 训练框架中,研究者们发现将图文数据和纯文本数据分开训练有助于训练加速,这主要是由于不同模态的样本长度往往存在较大的差异,分开训练可以尽可能减少填充,进而加速了训练。
Sampler 采样示意图
XTuner 框架在此基础上,引入了基于模态和长度分组的策略,取代官方 LLaVA 框架中仅基于模态分组的策略。
具体而言,如果仅使用基于模态分组的策略,在同一模态内的数据样本仍为随机采样(如上图左侧),这导致仍会出现样本长度差异极大的情况,进而使得必须对较短的样本进行填充操作,以匹配批次中最长的样本,产生大量不必要的计算;XTuner 则优化了数据样本采样器 Sampler,对样本进行基于模态和长度分组的策略(如上图右侧),确保每个批次中的样本具有相似的长度,这可以最大程度减少因变长序列带来的计算资源浪费,从而有效优化训练过程!
更先进的模型管理、数据管理
XTuner 内包含了对众多模型和对话模板的管理,包括但不限于 InternLM、Llama、Qwen、Baichuan、ChatGLM、Mixtral、Vicuna 等等,用户可以直接修改 LLaVA 多模态模型的 LLM 主干,快速在多个 LLM 上验证相关 idea!
XTuner 内也包含了对众多数据集的管理,包括但不限于多模态数据 LLaVA、ShareGPT4V,纯文本数据集 Alpaca、OpenAssistant 等等,用户可以方便地结合多个数据集,构造自己的数据配方!
同时,XTuner 支持几乎所有主流 GPU,无论你是拥有一张游戏显卡,还是上百张集群显卡,XTuner 均能提供优秀的使用体验!
借助 XTuner 快速上手 LLaVA 多模态大模型
XTuner 已完全支持 LLaVA 多模态大模型的训练、对话、评测全流程,并已开源 LLaVA-v1.5-7B-XTuner、LLaVA-v1.5-13B-XTuner、LLaVA-InternLM-7B 三个优秀的模型。
本章节将以 LLaVA-InternLM-7B 为例,进行详细介绍。
环境准备
创建虚拟环境
conda create --name xtuner-env python=3.10 -y
conda activate xtuner-env
XTuner 安装
# 方案一,PyPI安装(推荐)
pip install -U 'xtuner[deepspeed]'
# 方案二,源码安装
git clone https://github.com/InternLM/xtuner.git
cd xtuner
pip install -e '.[deepspeed]'
数据准备
LLaVA 开源数据整体结构如下,相关准备流程可以参考 XTuner 文档。
https://github.com/InternLM/xtuner/tree/main/docs/zh_cn/user_guides/dataset_prepare.md#llava-dataset
./data/llava_data
├── LLaVA-Pretrain
│ ├── blip_laion_cc_sbu_558k.json
│ ├── blip_laion_cc_sbu_558k_meta.json
│ └── images
├── LLaVA-Instruct-150K
│ └── llava_v1_5_mix665k.json
└── llava_images
├── coco
│ └── train2017
├── gqa
│ └── images
├── ocr_vqa
│ └── images
├── textvqa
│ └── train_images
└── vg
├── VG_100K
└── VG_100K_2
训练流程
LLaVA-InternLM 训练一共分为两步:对齐模块预训练、指令跟随微调(本指南以 8 卡训练为例,实际使用时如遇到显卡数量不足、显存不足等情况可以适当调低 batchsize 来降低显存开销)。
对齐模块预训练(默认保存在 ./work_dirs/)
NPROC_PER_NODE=8 xtuner train llava_internlm_chat_7b_clip_vit_large_p14_336_e1_gpu8_pretrain --deepspeed deepspeed_zero2
指令跟随微调(默认保存在 ./work_dirs/)
NPROC_PER_NODE=8 xtuner train llava_internlm_chat_7b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune --deepspeed deepspeed_zero2
对话测试
LLaVA-InternLM-7B 模型在 HuggingFace 和 ModelScope 都可以下载,您可以利用下列命令实现图文问答!
xtuner chat internlm/internlm-chat-7b \
--visual-encoder openai/clip-vit-large-patch14-336 \
--llava xtuner/llava-internlm-7b \
--prompt-template internlm_chat \
--image $IMAGE_PATH
评测
XTuner 的 LLaVA 架构已支持在 VLMEvalKit 中进行评测,现已支持 MMBench、CCBench、MME、SEEdBench、MMVet、OCRVQA、TextVQA 等数据集的评测。
https://github.com/open-compass/VLMEvalKit
同时,为方便使用,XTuner 内也集成了 MMBench 评测。
https://github.com/open-compass/mmbench
您可以利用下列命令实现 MMBench 相关评测!
xtuner mmbench internlm/internlm-chat-7b \
--visual-encoder openai/clip-vit-large-patch14-336 \
--llava xtuner/llava-internlm-7b \
--prompt-template internlm_chat \
--data-path $MMBENCH_DATA_PATH \
--work-dir $RESULT_PATH
评测完成后,若为开发集则会直接打印出结果;若为测试集,则需将 mmbench_result.xlsx 提交至 MMBench 官方完成评测取得精度结果!
相关链接
访问模型
HuggingFace:
https://huggingface.co/xtuner
ModelScope:
https://modelscope.cn/organization/xtuner
XTuner:
https://github.com/InternLM/xtuner
VLMEvalKit:
https://github.com/open-compass/VLMEvalKit
2023-12-27
2023-12-25