XTuner 多模态数据集(VLM)训练全流程指南:从 LLaVA 数据准备到对话与评测
大模型模型微调【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址https://gitcode.com/GitHub_Trending/xt/xtuner点击查看免费下载导读本文基于 XTuner 仓库中的多模态训练文档系统讲解如何利用 XTuner 完成 LLaVA 图文模型的微调从开源 LLaVA 数据集与自定义多模态数据集的准备到「预训练 指令跟随微调」两步训练、PTH 模型转换与 LoRA 合并再到xtuner chat图文对话与 MMBench 评测。以仓库内置的xtuner/llava-internlm2-7b配置为例读完本文你将掌握一套完整可复现的 VLM 训练、转换、对话与评测链路并理解底层数据管线LLaVADataset、llava_map_fn、图像 token 编码与模型结构LLaVAModel投影层与 LoRA的实现原理。一、多模态训练整体路线XTuner 支持 LLaVA 格式数据集的多模态图文预训练与微调。多模态图文训练一般分为两步预训练pretrain冻结 LLM 与视觉编码器CLIP-ViT仅训练连接视觉与语言特征的投影层MLP Projector让模型学会将图像特征对齐到文本语义空间指令跟随微调finetune载入预训练得到的.pth权重作为初始化使用图文对话数据微调使模型具备多轮图文问答能力。对应到仓库中的配置xtuner/configs/llava/README_zh-CN.md./${LLM}_${ViT}/下是与 LLaVA-InternLM 训练设置对齐的配置即使用 LoRA / QLoRA./official/下是与 LLaVA-v1.5 官方训练设置对齐的配置。以llava-internlm2-7b为例预训练配置与指令跟随微调配置分别位于预训练xtuner/configs/llava/internlm2_chat_7b_clip_vit_large_p14_336/pretrain/llava_internlm2_chat_7b_clip_vit_large_p14_336_e1_gpu8_pretrain.py指令跟随微调QLoRAxtuner/configs/llava/internlm2_chat_7b_clip_vit_large_p14_336/finetune/llava_internlm2_chat_7b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune.py关于各模型在各评测集上的结果仓库内置的 xtuner/configs/llava/README_zh-CN.md 提供了 MMBench、MME、SEEDBench_IMG、MMVet、MMMU、MathVista、HallusionBench 等多项评测数据可直接参考。二、数据准备LLaVA 开源数据集多模态训练的第一步是准备数据。本节从「LLaVA 开源数据集准备」和「自定义数据集准备」两部分展开。2.1 数据文件结构下载并整理后的数据应具备如下目录结构这也是所有内置配置文件默认假设的路径data_root ./data/llava_data/./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-Pretrain用于第一阶段预训练558K 图文对训练投影层LLaVA-Instruct-150K的llava_v1_5_mix665k.json与llava_images目录下的多来源图片用于第二阶段指令跟随微调。该结构在 docs/zh_cn/user_guides/dataset_prepare.md 中有完整对应说明。2.2 预训练数据下载LLaVA-Pretrain# Make sure you have git-lfs installed (https://git-lfs.com) git lfs install git clone https://huggingface.co/datasets/liuhaotian/LLaVA-Pretrain --depth12.3 指令微调数据下载文本数据LLaVA-Instruct-150K# Make sure you have git-lfs installed (https://git-lfs.com) git lfs install git clone https://huggingface.co/datasets/liuhaotian/LLaVA-Instruct-150K --depth1图像数据对应llava_images下的五个子目录数据集用途目录下载COCOcoco/train2017下载train2017.zip并解压GQAgqa/images下载 GQAimages.zipTextVQAtextvqa/train_images下载train_val_images.zipVisualGenomevg/VG_100K、vg/VG_100K_2下载 part1、part2 两个压缩包OCR-VQAocr_vqa/images使用官方 download script 下载⚠️ 特别注意 OCR-VQA 图片命名OCR-VQA 所下载的图片命名需要利用如下脚本进行处理以确保所有图片后缀为.jpg#!/bin/bash ocr_vqa_pathyour-directory-path find $target_dir -type f | while read file; do extension${file##*.} if [ $extension ! jpg ] then cp -- $file ${file%.*}.jpg fi done2.4 自定义数据集准备如果用户期望使用自定义数据集进行图文训练可以参照 LLaVA 开源数据集格式进行准备JSON 格式如下[ { image: xxx/xxx, conversations: [ { from: human, value: image\nHello! Whats this? }, { from: gpt, value: This is a dog! }, { from: human, value: Is it cute? }, { from: gpt, value: Yes. } ] }, ... ]针对自定义数据目前有一些约束image字段表示图片路径且仅能有一张图片conversations字段第 0 条的value需要包括image以确保图片被正确嵌入到首轮输入中。源码层面的印证image是仓库定义的图片占位 tokenDEFAULT_IMAGE_TOKEN其 token 索引为IMAGE_TOKEN_INDEX -200见 xtuner/utils/constants.py。在数据管线中xtuner/dataset/map_fns/dataset_map_fns/llava_map_fn.py 的llava_map_fn会将 human 轮次中的image从消息中间提到开头并规范化为image\n...的格式再切分为{input, output}单轮对话结构同时跳过数据集开头可能出现的from gpt轮次xtuner/dataset/utils.py 的encode_fn在编码含image的输入时按DEFAULT_IMAGE_TOKEN切分文本并在切分位置插入IMAGE_TOKEN_INDEX随后对输入部分打上IGNORE_INDEX -100标签不计算损失仅对output部分计算 loss——这正是「只学回答、不学提问」的多模态 SFT 标签策略同样的约束也体现在仅含图片 token 的llava_image_only_map_fn用于图文预训练阶段输入仅含image。扩展到 InternVL 系列数据集除 LLaVA 外XTuner 还内置了InternVL_V1_5_Datasetxtuner/dataset/internvl_dataset.py用于 InternVL 系列 VLM 的多模态训练。其配置支持data_paths与image_folders以列表形式传入多份数据图片目录可为None表示该数据源无图片例如 xtuner/configs/internvl/v1_5/internvl_v1_5_internlm2_26b_finetune.pyllava_dataset dict( typeInternVL_V1_5_Dataset, model_pathpath, data_pathsdata_path, # 可为 [a.json,b.jsonl,c.json] image_foldersimage_folder, # 可为 [a, None, c] templateprompt_template, max_lengthmax_length)InternVL_V1_5_Dataset支持根据min_dynamic_patch/max_dynamic_patch对图像做动态切分dynamic preprocess并按downsample_ratio计算 patch token 数max_length默认放宽到 4096。三、训练预训练与指令跟随微调多模态图文训练一般分为两步预训练pretrain、指令跟随微调finetune。下面以llava-internlm2-7b为例给出完整命令用户可以对其中的模型路径、数据路径进行自定义修改。3.1 预训练Pretrain$ NPROC_PER_NODE8 xtuner train llava_internlm2_chat_7b_clip_vit_large_p14_336_e1_gpu8_pretrain --deepspeed deepspeed_zero2训练得到的模型将默认保存在./work_dirs/用户可以通过命令xtuner train --work-dir ${SAVE_PATH}指定保存路径。预训练配置要点预训练配置文件模型llm_name_or_path internlm/internlm2-chat-7bvisual_encoder_name_or_path openai/clip-vit-large-patch14-336冻结策略freeze_llmTrue、freeze_visual_encoderTrue即 LLM 与 CLIP-ViT 全程冻结只有投影层projector参与训练LLM 采用 4bit QLoRA 量化加载BitsAndBytesConfigload_in_4bitTrue、bnb_4bit_quant_typenf4、bnb_4bit_use_double_quantTrue显著降低显存占用数据data_path ./data/llava_data/LLaVA-Pretrain/blip_laion_cc_sbu_558k.jsonimage_folder ./data/llava_data/LLaVA-Pretrain/images序列长度max_length int(2048 - (336 / 14)**2) 1472CLIP 336×336 输入在 14×14 patch 下产生 24×24576 个视觉 token从 2048 中扣除后即为文本侧可用长度优化AdamWlr 1e-3betas (0.9, 0.999)weight_decay 0max_norm 1梯度裁剪warmup_ratio 0.03LinearLR 预热后接 CosineAnnealingLR训练batch_size 32per_device、max_epochs 1、dataloader_num_workers 4保存与评测save_steps 500、save_total_limit 2custom_hooks中的EvaluateChatHook每 500 步用evaluation_images一张示例图片与evaluation_inputs中英文提示词自动进行一轮对话生成并打印日志。3.2 指令跟随微调Finetune指令跟随微调时需要载入预训练阶段所得到的.pth模型以提供良好的初始化。这一通过在配置文件中的pretrained_pth指定默认指向./work_dirs/llava_internlm2_chat_7b_clip_vit_large_p14_336_e1_gpu8_pretrain/iter_2181.pth用户可以自行修改。$ NPROC_PER_NODE8 xtuner train llava_internlm2_chat_7b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune --deepspeed deepspeed_zero2QLoRA 微调配置要点微调配置文件数据data_path ./data/llava_data/LLaVA-Instruct-150K/llava_v1_5_mix665k.jsonimage_folder ./data/llava_data/llava_imagesLoRA 注入LLM 侧llm_lorar512、lora_alpha256、lora_dropout0.05视觉编码器侧visual_encoder_lorar64、lora_alpha16target_modules未指定时由find_all_linear_names自动识别见 xtuner/model/llava.py冻结策略freeze_llmTrue、freeze_visual_encoderTrue冻结基座权重、仅训练 LoRA 适配器优化lr 2e-4batch_size 16其余优化器设置与预训练一致图像预处理pad_image_to_squareTrue即调用 xtuner/dataset/utils.py 的expand2square将图片按 RGB 均值色填充为正方形后再送入 CLIPImageProcessor采样器使用LengthGroupedSamplerlength_propertymodality_length按「模态长度」分桶采样。该属性由LLaVADataset.modality_length提供——有图的样本记正长度、无图的样本记负长度从而实现图文样本按长度分组、减少 padding 浪费。此外仓库还提供了全参数微调配置 llava_internlm2_chat_7b_clip_vit_large_p14_336_e1_gpu8_finetune.pyfreeze_llmFalse、LLM 以 fp32 加载、lr2e-5、batch_size8、accumulative_counts2以及llava_internlm2_chat_7b_clip_vit_large_p14_336_e1_gpu8_finetune.py之外的多种 LLM ViT 组合vicuna、internlm、internlm2-20b 等见 xtuner/configs/llava。3.3 数据管线源码解读LLaVADataset理解LLaVADatasetxtuner/dataset/llava.py有助于把握上述配置参数的底层影响文本与图像分离处理构造时先读取data_path支持.json与.jsonl经process_hf_dataset完成 tokenize、dataset_map_fnllava_map_fn与template_map_fntemplate_map_fn_factory按PROMPT_TEMPLATE.internlm2_chat套上|im_start|对话模板见 xtuner/dataset/map_fns/template_map_fn.py处理得到text_data真正的图片在__getitem__时才按image_folder image_file在线读取并预处理为pixel_valuesmodality_length属性返回每个样本的文本长度无图样本取负值供LengthGroupedSampler使用无图样本的兜底若某样本没有image字段则填充一张与image_processor.crop_size等尺寸的全零pixel_values保证 batch 结构一致离线处理文本数据当offline_processed_text_folder被指定时与data_path同时存在时优先加载离线数据直接从本地加载已 tokenize 好的 HF Dataset跳过在线处理这是大数据量场景下提速的关键详见下文 4.4 节。四、模型转换与合并4.1 PTH 转 HuggingFacepth_to_hf模型训练后会自动保存成 PTH 模型例如iter_5198.pth但 PTH 并不是通用的 HuggingFace 格式需要利用xtuner convert pth_to_hf将其转换为 HuggingFace 模型以便后续对话、评测与部署使用。具体命令为$ xtuner convert pth_to_hf $FINETUNE_CFG $PTH_PATH $SAVE_PATH $ # 例如xtuner convert pth_to_hf llava_internlm2_chat_7b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune ./iter_5198.pth ./iter_5198_hf转换器源码位于 xtuner/tools/model_converters/pth_to_hf.py其要点包括通过--cfg-options支持命令行覆盖配置默认输出 LLM 为 fp16可加--fp32保存为 fp32并支持--max-shard-size默认 2GB分片与--safe-serialization对LLaVAModel会清空pretrained_pth后按配置重建模型再逐参数装载权重并调用model.to_hf(...)落盘LLaVAModel.to_hfxtuner/model/llava.py根据训练范式输出不同目录结构默认save_formatxtuner若使用 LoRA则输出llm_adapter/、visual_encoder_adapter/与projector/若为全参数微调则输出完整 LLM 权重、visual_encoder/与projector/同时保存 tokenizer 与 image_processor也可选择save_formathuggingface或official将状态字典按映射关系重组为LlavaForConditionalGeneration/ 官方 LLaVA 结构含图像 token 的 embedding 扩容处理。使用默认的微调范式时转换后的文件结构与仓库文档描述的xtuner/llava-internlm2-7b发布结构一致LLM/LLM-adapter visual_encoder/visual_encoder-adapter projector。4.2 LoRA / QLoRA 模型合并可选如果您使用了 LoRA / QLoRA 微调则模型转换后将得到 adapter 参数而并不包含原 LLM 参数。如果您期望获得合并后的模型权重那么可以利用xtuner convert merge$ xtuner convert merge $LLM $LLM_ADAPTER $SAVE_PATH $ xtuner convert merge $CLIP $CLIP_ADAPTER $SAVE_PATH --is-clip其中第一条合并 LLM 与其 LoRA adapter第二条用--is-clip标记合并 CLIP-ViT 与其 LoRA adapter。合并工具xtuner/tools/model_converters/merge.py内部通过PeftModel.from_pretrained加载 adapter 并调用merge_and_unload()完成权重合并之后save_pretrained落盘同时保存 tokenizer / image_processor默认设备为cuda可用--device cpu/auto调整。4.3 离线处理数据集的加速技巧可选当训练数据量非常大时每次训练都先在线处理数据会极为耗时。XTuner 提供了离线处理 LLaVA 数据的流程详见 docs/zh_cn/user_guides/llava_offline.md用xtuner list-cfg -p llava查看 LLaVA 相关配置用xtuner copy-cfg ${CONFIG_NAME} .导出配置运行python xtuner/tools/process_untokenized_llava_data.py ${CONFIG_PATH} --save-folder /folder/to/save/processed/dataset离线处理文本数据修改导出的配置把llava_dataset中的data_path/tokenizer替换为offline_processed_text_folder/folder/to/save/processed/dataset直接使用修改后的配置训练。LLaVADataset会优先加载offline_processed_text_folder多次训练无需重复 tokenize。五、对话测试用户可以利用xtuner chat实现与微调后的多模态图文模型对话。假设模型转换阶段获得的模型路径为./iter_5198_hf则可以利用下列命令实现对话$ xtuner chat internlm/internlm2-chat-7b \ $ --visual-encoder openai/clip-vit-large-patch14-336 \ $ --llava ./iter_5198_hf \ $ --prompt-template internlm2_chat \ $ --image $IMAGE_PATH参数与运行机制见 xtuner/tools/chat.py第一个参数为 LLM 路径或 HuggingFace Hub ID。如果训练阶段 LLM 使用的是 LoRA / QLoRA 微调则此参数请传入基础 LLM如internlm/internlm2-chat-7b如果使用的是全参数微调则此参数请传入转换xtuner convert pth_to_hf所得到的模型权重如./iter_5198_hf--visual-encoder指定 CLIP 视觉编码器若--llava目录内已包含visual_encoder/子目录则无需再传工具会自动检测目录结构--llava模型转换阶段获得的权重目录工具会按需加载其中的projector/、llm_adapter/、visual_encoder_adapter/--prompt-template internlm2_chat与训练时的PROMPT_TEMPLATE保持一致工具会据此套用对话模板并自动注入停止词--image指定本地图片路径或 URL工具内部经expand2squareCLIPImageProcessor预处理后由 visual_encoder 提取特征、projector 投影最终通过prepare_inputs_labels_for_multimodal将视觉 token 拼入input_ids后执行生成其它可选参数--torch-dtype默认 fp16、--bits4/8 位量化加载 LLM、--max-new-tokens默认 2048、--temperature默认 0.1、--top-k默认 40、--top-p默认 0.75等。六、评测6.1 VLMEvalKitXTuner 的 LLaVA 模型可以利用 VLMEvalKit 进行评测可参考其 Quickstart 快速上手按该工具链的标准流程准备数据集与配置文件即可。6.2 XTuner 内置 MMBench 评测为了方便使用XTuner 内也集成了 MMBench 评测。您可以通过下列命令下载 MMBench 评测数据集$ wget https://opencompass.openxlab.space/utils/VLMEval/MMBench_DEV_EN.tsv $ wget https://opencompass.openxlab.space/utils/VLMEval/MMBench_TEST_EN.tsv $ wget https://opencompass.openxlab.space/utils/VLMEval/MMBench_DEV_CN.tsv $ wget https://opencompass.openxlab.space/utils/VLMEval/MMBench_TEST_CN.tsv $ wget https://opencompass.openxlab.space/utils/VLMEval/CCBench.tsv之后您可以利用下列命令实现评测$ xtuner mmbench internlm/internlm2-chat-7b \ $ --visual-encoder openai/clip-vit-large-patch14-336 \ $ --llava ./iter_5198_hf \ $ --prompt-template internlm2_chat \ $ --data-path $DATA_PATH \ $ --work-dir $RESULT_PATH要点说明见 xtuner/tools/mmbench.py第一个参数为 LLM 路径或 HuggingFace Hub ID规则与xtuner chat相同LoRA/QLoRA 传基础 LLM全参微调传转换后的权重$DATA_PATH指上一步骤所下载的某一个 tsv 文件如MMBench_DEV_EN.tsv工具内部用MMBenchDataset解析 tsv若首行含answer列则判定为dev集否则为test集推理时对每个样本拼接「题目 选项」并提示模型直接回答选项字母生成采用do_sampleFalse评测结果保存到--work-dir下的mmbench_result.xlsx与mmbench_result.json评测完成后若为开发集则会直接打印结果按 Average 及 CP / FP-S / FP-C / LR / RR / AR 等能力维度分类给出准确率表格若为测试集则需将mmbench_result.xlsx提交至 MMBench 官方完成评测以取得精度结果。七、FAQ7.1 如何更换 LLM修改 LLM 的方式与训练单模态的大语言模型类似修改配置文件中的llm_name_or_path参数至您期望使用的 LLM例如internlm/internlm2-chat-20b等修改配置文件中的prompt_template参数与您所选择的 LLM 保持对齐具体选择可参考对话模板文档。更换 LLM 后需注意其 tokenizer 与对话模板与数据管线的兼容性模板注入由 xtuner/dataset/map_fns/template_map_fn.py 完成。7.2 ValueError:bos_token_idhas to be defined when noinput_idsare provided.这是由于老版本transformers的 LLMgenerate接口在接受inputs_embeds输入时必须传入有效的bos_token_id对应 transformers 的修复 PR #29772。更新transformers即可解决$ pip install -U transformers八、关键文件索引多模态训练文档docs/zh_cn/training/multi_modal_dataset.rstLLaVA 数据准备docs/zh_cn/user_guides/dataset_prepare.md、离线处理docs/zh_cn/user_guides/llava_offline.md配置示例xtuner/configs/llava/internlm2_chat_7b_clip_vit_large_p14_336/pretrain 与 xtuner/configs/llava/internlm2_chat_7b_clip_vit_large_p14_336/finetune数据集实现xtuner/dataset/llava.py、xtuner/dataset/map_fns/dataset_map_fns/llava_map_fn.py、xtuner/dataset/internvl_dataset.py模型实现xtuner/model/llava.py工具链xtuner/tools/chat.py、xtuner/tools/mmbench.py、xtuner/tools/model_converters/pth_to_hf.py、xtuner/tools/model_converters/merge.pyLLaVA 全流程说明与评测结果xtuner/configs/llava/README_zh-CN.md赞分享大模型模型微调【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址https://gitcode.com/GitHub_Trending/xt/xtuner点击查看免费下载相关推荐XTuner 多模态VLM数据集训练实战从 LLaVA 数据准备到对话评测的全流程指南XTuner 多模态VLM数据集训练实战从 LLaVA 数据准备到对话评测的全流程指南 本文以 XTuner 内置的 xtuner/llava inter大模型模型微调XTuner 数据集准备完全指南从 HuggingFace 到 LLaVA 与 RefCOCO 的多模态数据管线XTuner 数据集准备完全指南从 HuggingFace 到 LLaVA 与 RefCOCO 的多模态数据管线 XTuner 作为面向超大规模 MoE 模型大模型模型微调XTuner 自定义预训练数据集实战从数据准备到增量预训练全流程指南XTuner 自定义预训练数据集实战从数据准备到增量预训练全流程指南 XTuner 支持使用自定义数据集对基座大语言模型进行增量预训练Incremental大模型模型微调上一篇beets 查询语言完全指南从关键词匹配到日期区间与正则的高级库检索下一篇从安装失败到完美签名xManager JKS密钥管理实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考