如何用自己的数据训练?SWIFT与XTuner微调InternVL3-14B-Instruct完整教程
如何用自己的数据训练?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 |
仓库中的示例图片 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": "这是一只小熊猫……"}]}
数据准备清单:
- ✅ 用户消息中必须包含
<image>占位符,且与图片字段数量一致 - ✅ 回答要简短、准确、风格统一,避免"注水"长文
- ✅ 指令模板多样化(描述、问答、抽取、判断),防止过拟合单一问法
- ✅ 图像分辨率无需手动裁剪——模型按动态分辨率自动切分为最多 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 分配方案 |
📚 延伸参考文件
- 模型加载与推理完整示例:README.md
- 官方微调入口说明(SWIFT / XTuner):README.md
- 视觉编码器实现:modeling_intern_vit.py
- 视觉塔配置(448px、24 层):configuration_intern_vit.py
- 生成配置:generation_config.json
- 分片权重索引:model.safetensors.index.json
✅ 小结
- 用 JSONL 组织「图片 + 指令 + 回答」,
<image>占位符不能少 - 显存有限就选 LoRA + 冻结 ViT + 限制图块数
- SWIFT 胜在一条命令跑完,XTuner 胜在配置可复现,二选一即可
- 训练后合并 LoRA,用仓库自带示例图快速验证效果
按照以上步骤,你完全可以用自己的数据把 InternVL3-14B-Instruct 微调成一个领域专属的多模态模型。祝训练顺利!
