如何用自己的数据训练?SWIFT与XTuner微调InternVL3-14B-Instruct完整教程

原创2026-10-18 18:13:231,339 阅读

如何用自己的数据训练?SWIFT与XTuner微调InternVL3-14B-Instruct完整教程

想要用自己的数据训练多模态大模型,却不知道从何下手?本文就是 InternVL3-14B-Instruct 微调的完整指南:它是一个经过原生多模态预训练与 SFT 的开源视觉-语言大模型(ViT + MLP + LLM 架构),支持动态分辨率图像理解、多图和视频问答。我们将带你走通「准备数据集 → 用 SWIFT 或 XTuner 做 LoRA 微调 → 合并权重并验证效果」的全流程,新手也能照着做。

🧭 为什么选择 InternVL3-14B-Instruct 做微调

InternVL3 系列采用「ViT-MLP-LLM」范式:视觉编码器 InternViT 将图像切分为 448×448 的动态分辨率图块,通过 MLP 投影后接入 Qwen2.5-14B 语言模型,并引入了 V2PE 位置编码以获得更强的长上下文理解能力。

本仓库即为 SFT 版本模型,关键文件一览:

文件 作用
config.json 模型结构配置(InternViT-6B 视觉塔 + Qwen2.5-14B 语言模型)
modeling_internvl_chat.py 模型主体,提供 chat、batch_chat 对话接口
conversation.py 内置 internvl2_5 对话模板定义
preprocessor_config.json 图像预处理参数(448 缩放 + ImageNet 归一化)
added_tokens.json <img>、<IMG_CONTEXT> 等多模态特殊 token

InternVL3-14B-Instruct 多模态大模型理解小熊猫示例图片

仓库中的示例图片 examples/image1.jpg 和视频 examples/red-panda.mp4 可以直接拿来当微调后的"验收样本"。

🖥️ 微调前的硬件与软件准备

硬件参考(14B 模型,bf16):

  • 纯推理:8-bit 量化约需 2 张 80GB 卡,全精度需 3 张 80GB 卡(README.md 有说明)
  • LoRA 微调:建议单卡 48GB 起步,显存紧张时用双卡 + DeepSpeed
  • 只微调 LLM、冻结视觉塔时可显著省显存

软件依赖:

pip install transformers>=4.37.2   # 官方要求不低于此版本

加载模型时记得带上 trust_remote_code=True,因为本模型依赖自定义代码(auto_map 见 config.json)。

🗂️ 第一步:准备自己的训练数据

微调成败 80% 取决于数据。建议从 300~2000 条高质量样本起步,先跑通流程再扩量。

SWIFT 数据集格式(JSONL,每行一条):

{"messages": [{"role": "user", "content": "<image>\n请识别图中动物并说明特征"},
              {"role": "assistant", "content": "这是一只小熊猫(红熊猫),毛色红褐……"}],
 "images": ["data/train/0001.jpg"]}

XTuner 数据集格式(JSONL):

{"image": "data/train/0001.jpg",
 "conversations": [{"from": "human", "value": "<image>\n请识别图中动物"},
                   {"from": "gpt", "value": "这是一只小熊猫……"}]}

数据准备清单:

  1. ✅ 用户消息中必须包含 <image> 占位符,且与图片字段数量一致
  2. ✅ 回答要简短、准确、风格统一,避免"注水"长文
  3. ✅ 指令模板多样化(描述、问答、抽取、判断),防止过拟合单一问法
  4. ✅ 图像分辨率无需手动裁剪——模型按动态分辨率自动切分为最多 12 块(max_dynamic_patch 见 config.json)

🚀 第二步A:使用 SWIFT 微调 InternVL3-14B-Instruct

SWIFT(ms-swift)支持命令行一键微调,对新手最友好。

pip install "ms-swift[all]" -U

swift sft \
  --model OpenGVLab/InternVL3-14B \
  --dataset /path/to/your_data.jsonl \
  --train_type lora \
  --torch_dtype bfloat16 \
  --num_train_epochs 2 \
  --per_device_train_batch_size 1 \
  --gradient_accumulation_steps 8 \
  --learning_rate 1e-4 \
  --output_dir output/internvl3-lora

关键参数速查:

参数 说明 推荐值
--train_type 训练类型 lora(省显存)或 full
--freeze_vit / --freeze_llm 冻结视觉塔 / 语言模型 显存紧张时冻结 ViT
--max_pixels 限制输入图像最大像素 按显存调整,可配合 max_num 限制图块数
--deepspeed 多卡分布式 zero2 或 zero3
--torch_dtype 训练精度 bfloat16

🚀 第二步B:使用 XTuner 微调 InternVL3-14B-Instruct

XTuner 是另一款主流微调框架,采用「配置文件 + 一条命令」的方式,便于复现实验。

pip install "xtuner[deepspeed]" -U

创建一个配置文件 internvl3_lora.py,核心字段如下:

model = 'OpenGVLab/InternVL3-14B'
dataset = ['/path/to/your_data.jsonl']
max_num_tiles = 1          # 每个图像块数上限,控显存的关键旋钮
freeze_llm = False
freeze_vit = True
use_lora = True
max_iters = 400

然后执行:

xtuner train internvl3_lora.py

新手建议:先设 max_num_tiles=1、freeze_vit=True 跑通,再逐步放大图块数和开放视觉塔。

🧪 第三步:合并权重并验证微调效果

训练完成后需要把 LoRA 权重合并回基座模型,才能高效部署。

# SWIFT 合并
swift export --adapters output/internvl3-lora/v0-xxx --merge_lora true

# XTuner 合并
xtuner convert internvl3_lora.py

验证时可以用仓库自带的小熊猫示例图做"体检题":

pixel_values = load_image('./examples/image1.jpg', max_num=12)
question = '<image>\n请用一句话识别图中的动物,这是你微调后学会的领域知识吗?'
response = model.chat(tokenizer, pixel_values, question, generation_config)

验收标准:回答风格符合你的数据模板、领域问题准确率明显高于原始模型、纯文本对话不出现能力退化。

⚠️ 微调常见问题与快速排查

问题 原因 解决方案
CUDA out of memory 图像图块太多 / batch 过大 降低 max_num_tiles/max_pixels、减小 batch、开 gradient checkpointing
输出乱码或复读 对话模板不匹配 确认使用 internvl2_5 模板(定义于 conversation.py),部署时 --chat-template internvl2_5
图像"没生效" 数据格式错误 检查 <image> 占位符与图片列表是否一一对应
trust_remote_code 报错 未允许加载自定义代码 加载时添加 trust_remote_code=True
多卡张量不同设备报错 层未正确切分 参考 README.md 中的 split_model 分配方案

📚 延伸参考文件

✅ 小结

  1. 用 JSONL 组织「图片 + 指令 + 回答」,<image> 占位符不能少
  2. 显存有限就选 LoRA + 冻结 ViT + 限制图块数
  3. SWIFT 胜在一条命令跑完,XTuner 胜在配置可复现,二选一即可
  4. 训练后合并 LoRA,用仓库自带示例图快速验证效果

按照以上步骤,你完全可以用自己的数据把 InternVL3-14B-Instruct 微调成一个领域专属的多模态模型。祝训练顺利!

登录后查看全文
InternVL3-14B-Instruct