资讯动态

XTuner 微调 InternVL 全流程实战:数据准备、LoRA/QLoRA 训练与官方权重转换

发布时间:2026/9/18 20:53:26 来源:尧图企业网站定制
XTuner 微调 InternVL 全流程实战数据准备、LoRA/QLoRA 训练与官方权重转换【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner本指南以 XTuner 仓库内置的 InternVL 训练示例为骨架系统讲解基于 InternVL-2 与 InternVL 1.5 系列多模态大语言模型MLLM的完整微调流程覆盖多源数据多 json/jsonl 与自定义采样准备、全量 / LoRA / QLoRA 三种训练方式的选择、DeepSpeed 策略搭配以及训练产物到官方权重格式的转换与复用。读完本文你将能够从零开始在 8×A100 80G 环境下跑通 InternVL 2B/4B/8B/26B 等模型的微调并把训练结果接入官方评测与对话工具链。InternVL 微调示例在仓库中的位置与整体结构XTuner 将 InternVL 的训练示例集中放置在 xtuner/configs/internvl/ 目录下包含两份说明文档与两套配置文件README.md/README_zh-CN.md全流程说明数据、训练、转换v1_5/InternVL 1.5 系列配置覆盖 InternLM2-2B、InternLM2-26B、Phi-3-4B 三个基座每种基座均提供finetune全量、lora_finetune、qlora_finetune三种配置共 9 个配置文件v2/InternVL-2 系列配置覆盖 InternLM2-2B、InternLM2-26B、InternLM2_5-8B、Phi-3-4B 四个基座同样每种提供全量 / LoRA / QLoRA 三种方案共 12 个配置文件v1_5/convert_to_official.py训练权重转官方格式的脚本。从文件命名可以清晰看出仓库的设计意图同一套数据与训练框架横跨两代 InternVL 架构与多个基座模型用户只需挑选对应配置文件即可快速复现。InternVL 2多模态训练能力与适用模型支持能力概览v2/目录包含 InternVL 2 的完整训练配置支持 2B/4B/8B/26B 四个规模模型的全量、LoRA、QLoRA 单图模式微调训练完成后可使用v1_5/convert_to_official.py将 XTuner 训练得到的权重转换为官方格式从而复用官方提供的全部工具链所有配置默认以 8×A100 80G 显卡为基准设计2B/4B 可使用 DeepSpeed ZERO-18B 模型需 ZERO-226B 模型必须使用 ZERO-3参数未做过度调优可按需自行修改当前数据验证以 LLaVA SFT 数据集为主主要用于流程验证不充分代表最终微调性能建议按自身业务自定义数据。数据准备多 json/jsonl 与自定义采样若直接使用 LLaVA SFT 数据集训练请参考 LLaVA 数据集准备文档 完成下载与目录组织典型结构为./data/llava_data/下放置LLaVA-Instruct-150K/llava_v1_5_mix665k.json与llava_images/图片目录。对于自定义数据支持多种 json 和 jsonl 格式内部数据组织可参考 LLaVA SFT 格式含image、conversations等字段且支持数据采样操作。1多数据文件组合llava_dataset dict( typeInternVL_V1_5_Dataset, model_pathpath, data_paths[a.json,b.jsonl,c.json], image_folders[a,None,c], templateprompt_template, max_lengthmax_length)2自定义采样比例通过repeat_times为每个数据源设置倍率1表示原始数量大于1表示过采样小于1表示按比例随机抽样llava_dataset dict( typeInternVL_V1_5_Dataset, model_pathpath, data_paths[a.json,b.jsonl,c.json], image_folders[a,None,c], repeat_times[2,0.5,3.5], templateprompt_template, max_lengthmax_length)从源码 xtuner/dataset/internvl_dataset.py 可以看出data_paths、image_folders、repeat_times三者长度必须一致、按位置一一对应当repeat_time 1时对数据做random.sample随机抽样当repeat_time 1时按整数倍重复并再随机补齐小数部分从而实现对不平衡数据的灵活控制。训练命令所提供的配置主要用于基于官方权重继续微调。数据准备好后执行NPROC_PER_NODE8 xtuner train internvl_v2_internlm2_5_8b_lora_finetune --deepspeed deepspeed_zero2默认输出保存在./work_dirs/internvl_v2_internlm2_5_8b_lora_finetune/。其中NPROC_PER_NODE8指定单节点 8 卡分布式训练internvl_v2_internlm2_5_8b_lora_finetune是对应配置文件名xtuner train会自动在 xtuner/configs 下检索--deepspeed deepspeed_zero2指定 DeepSpeed 策略DeepSpeed 配置模板位于 xtuner/configs/deepspeed/含 zero1/zero2/zero3 及 offload 变体。模型转换从 pth 到官方权重训练后得到一组权重./work_dirs/internvl_v2_internlm2_5_8b_lora_finetune/iter_xxx.pth。为方便评测与对话可转换为官方权重python xtuner/configs/internvl/v1_5/convert_to_official.py xtuner/configs/internvl/v2/internvl_v2_internlm2_5_8b_lora_finetune.py ./work_dirs/internvl_v2_internlm2_5_8b_lora_finetune/iter_xxx.pth ./work_dirs/internvl_v2_internlm2_5_8b_lora_finetune/convert_model/执行后./work_dirs/internvl_v2_internlm2_5_8b_lora_finetune/convert_model下会生成一组包含配置的完整官方权重可直接使用官方工具链进行评测与对话。InternVL 1.52B/4B/26B 微调要点支持能力概览v1_5/目录包含 InternVL 1.5 的完整训练配置支持 2B/4B/26B 模型的全量、LoRA、QLoRA 微调官方建议综合考虑效率与性能优先选择 4B 模型训练完成后同样可通过v1_5/convert_to_official.py转换为官方格式复用官方工具链配置默认以 8×A100 80G 为基准2B/4B 可用 ZERO-126B 必须 ZERO-3当前以 LLaVA SFT 数据验证流程后续会提供更公平的微调数据集用户可按需自定义数据。数据准备与 InternVL 2 完全一致同样支持多 json/jsonl 组合与repeat_times自定义采样此处不再赘述llava_dataset dict( typeInternVL_V1_5_Dataset, model_pathpath, data_paths[a.json,b.jsonl,c.json], image_folders[a,None,c], templateprompt_template, max_lengthmax_length) llava_dataset dict( typeInternVL_V1_5_Dataset, model_pathpath, data_paths[a.json,b.jsonl,c.json], image_folders[a,None,c], repeat_times[2,0.5,3.5], templateprompt_template, max_lengthmax_length)训练命令NPROC_PER_NODE8 xtuner train internvl_v1_5_phi3_4b_lora_finetune --deepspeed deepspeed_zero1 # NPROC_PER_NODE8 xtuner train internvl_v1_5_internlm2_26b_lora_finetune.py --deepspeed deepspeed_zero3默认输出保存在./work_dirs/internvl_v1_5_phi3_4b_lora_finetune/。从两行命令的对比可以看出不同规模模型的 DeepSpeed 选型差异4B 规模用 zero126B 规模用 zero3。模型转换python xtuner/configs/internvl/v1_5/convert_to_official.py xtuner/configs/internvl/v1_5/internvl_v1_5_phi3_4b_lora_finetune.py ./work_dirs/iter_xxx.pth ./work_dirs/internvl_v1_5_phi3_4b_lora_finetune/internvl_v1_5_phi3_4b/转换后./work_dirs/internvl_v1_5_phi3_4b_lora_finetune/internvl_v1_5_phi3_4b/下即生成包含配置的完整官方权重可用于官方工具链的评测与对话。配置文件的源码级解读以 8B LoRA 为例以 internvl_v2_internlm2_5_8b_lora_finetune.py 为例配置分为五大部分其中几个核心参数与默认值如下部分关键项默认值说明ModelpathOpenGVLab/InternVL2-8B官方权重仓库名或本地路径Modelfreeze_llm/freeze_visual_encoderTrue/TrueLoRA 方案下冻结 LLM 与视觉编码器主干Modelllm_lorar128, lora_alpha256, lora_dropout0.05作用于 LLM 的 LoRA 配置target_modulesNone时自动探测全部线性层Datadata_paths/image_foldersLLaVA mix665k支持多 json/jsonl 与多图片目录Datamax_length8192单样本最大 token 长度超长截断Optimlr/weight_decay1e-6/0.05官方 1024 卡基线为4e-5此处已按 8 卡折算Optimbatch_size/accumulative_counts8/2单卡 batch 8梯度累积 2 次等效 batch 16Savesave_steps/save_total_limit1000/1每 1000 步存一次 checkpoint最多保留 1 份模型部分对应 xtuner/model/internvl.py 中InternVL_V1_5类通过freeze_llm、freeze_visual_encoder控制冻结策略internvl.pyllm_lora/visual_encoder_lora非空时分别对 LLM 与视觉编码器调用get_peft_model注入 LoRAinternvl.py视觉编码器 LoRA 默认以注释形式给出需要时可取消注释r64, lora_alpha16目标模块为attn.qkv、attn.proj、mlp.fc1、mlp.fc2state_dict输出按视觉编码器 LoRA → LLM LoRA → 投影层 mlp1组织internvl.py这正是转换脚本能够分别 merge 各组件 LoRA 的基础。训练数据侧InternVL_V1_5_Datasetxtuner/dataset/internvl_dataset.py实现了动态高分辨率切图dynamic_preprocess根据输入长宽比从候选瓦片比例中挑选最接近的分割方案将图片切为 1 至max_dynamic_patch个 448×448 瓦片并可追加缩略图use_thumbnail对应 InternVL 1.5 提出的动态高分辨率特性internvl_dataset.py图像 token 替换在get_inputid_labels中把对话文本里的image占位符替换为img 若干IMG_CONTEXT/img的图像 token 序列模型前向时再将这些 token 的 embedding 替换为 ViT 提取的视觉特征internvl.py标签构造人类输入部分标记为IGNORE_INDEX不参与 loss模型输出部分参与计算长度分组采样dataloader 配合LengthGroupedSampler按modality_length含图像 token 的预估长度将长度相近的样本分组降低 padding 浪费提升吞吐。全量微调与 QLoRA 的配置差异全量微调如 internvl_v2_internlm2_26b_finetune.pyfreeze_llmFalse不配置任何 LoRA视觉编码器默认冻结可改为False解锁为节省显存26B 全量配置将单卡batch_size降至 1accumulative_counts提至 8保证等效 batch 不变QLoRA如 internvl_v1_5_internlm2_2b_qlora_finetune.py在 LoRA 基础上开启quantization_llmTrue模型加载时对 LLM 应用 4bit NF4 量化源码中 internvl.py 构造BitsAndBytesConfigbnb_4bit_quant_typenf4、bnb_4bit_use_double_quantTruequantization_vit默认False如需量化 ViT 则须同时启用visual_encoder_lora源码对此有assert约束。选择建议2B/4B 小模型可用全量或 LoRA8B 在 8×A100 下建议 ZERO-2 LoRA26B 必须 ZERO-3显存紧张时优先 QLoRA。配置中同时写明了 DeepSpeed 策略与模型规模的匹配关系这也是 README 给出的官方基准。转换脚本的工作原理与注意事项convert_to_official.py 的核心逻辑为用 mmengineConfig.fromfile读取训练配置注入训练好的pretrained_pth并强制关闭 ViT/LLM 量化quantization_vitFalse、quantization_llmFalse保证转换在未量化状态进行在LoadWoInit()上下文中按训练配置重建模型权重随机初始化随后从 pth 加载若使用了visual_encoder_lora/llm_lora分别调用merge_and_unload()将 LoRA 增量合回主干权重save_pretrained保存完整权重并用AutoTokenizer从model_path读取 tokenizer 一并保存从而生成包含配置的完整官方权重。使用该脚本时需注意脚本会校验trained_model_pth与save_path不能相同convert_to_official.py避免覆盖原始训练产物转换出的目录可直接被官方评测与对话工具链加载。常见注意事项小结DeepSpeed 与模型规模的匹配2B/4B 用 zero18B 用 zero226B 用 zero3直接套用错误策略会因显存不足或配置不匹配而失败数据目录结构使用 LLaVA SFT 数据时务必保持json中image字段指向image_folders下的相对路径纯文本样本无图的image_folders对应位置填None此时pixel_values会被填充为零张量占位max_length 截断max_length8192为默认值超长样本会被截断并打印警告可按需调整图片损坏数据集实现内置了最大 1000 次重取机制_max_refetch单张坏图不会导致训练中断但会降低有效样本数建议训练前清洗数据仅作流程验证README 明确指出当前以 LLaVA SFT 数据验证流程无法充分反映微调性能正式业务请基于自定义数据集自行评估。至此从数据准备、配置选型、训练启动到权重转换一条完整的 InternVL 微调链路已经打通你可以基于 xtuner/configs/internvl/v2/ 与 xtuner/configs/internvl/v1_5/ 中的模板替换数据与模型路径快速迁移到自己的多模态微调任务。【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价