MiniMind-V 自定义训练指南:用你的数据集适配自己的 VLM 任务
MiniMind-V 让你在 2 小时内从 65M 参数的基座权重训出一个能看图、能对话的视觉语言模型,全程只需一条训练命令加一份 parquet 数据。
🎯 它适合解决什么问题
- 用自有图文数据训练垂直场景的看图问答,如商品图描述、医疗影像初筛
- 验证"视觉编码器 + 投影层 + 小 LLM"这条训练链路,成本约 2 小时、一张消费级显卡
- 小团队低成本复现多模态训练流程:预训练对齐 + 监督微调两阶段,产出物是一个可直接推理的 .pth 权重
MiniMind-V 整体架构就是视觉编码器、投影层和 LLM 三部分:图片被编码成视觉 token,经投影层转换后与文本 token 拼接进 LLM 统一处理。
📋 准备清单
动手前把这五项备齐,缺任何一项训练都会在初始化阶段报错:
| 项目 | 存放位置 | 备注 |
|---|---|---|
| 仓库代码 | 当前目录 | git clone --depth 1 https://gitcode.com/gh_mirrors/mi/minimind-v 后安装 requirements.txt |
| SigLIP2 视觉编码器 | model/siglip2-base-p32-256-ve | 读取图片并编码为视觉特征 |
| MiniMind 语言模型权重 | out/llm_768.pth | 两阶段训练共用的基座 LLM |
| 训练数据 | dataset/sft_i2t.parquet(可选 pretrain_i2t.parquet) | SFT 单文件 290 万条,已合并 caption 子集,可跳过 pretrain |
| CUDA 环境 | Python 3.10 + CUDA 12.x | 先用 torch.cuda.is_available() 确认可用 |
🔁 核心流程:从数据到权重文件
整个流程分数据 → 配置 → 训练 → 验证四步,约 2 小时跑完。
数据准备
这一步是把你的图文对整理成训练脚本能直接读取的 parquet 文件。每行两列:conversations 是 JSON 字符串,image_bytes 是图片字节,user 内容里的 <image> 占位符数量决定读几张图,按顺序一一对应。单图对话结构如下:
{"conversations": "[{\"role\":\"user\",\"content\":\"这张图片里有什么?<image>\"},{\"role\":\"assistant\",\"content\":\"图片中有一只气球狗\"}]", "image_bytes": "<图片字节>"}
多图任务就写多个 <image>,image_bytes 放字节列表。自己的数据集整理成同样的列结构、放到 dataset/ 下即可,加载逻辑在 数据加载模块,它负责把 JSON 对话拼成 prompt、切出只监督 assistant 部分的 labels。
训练配置
配置不靠改脚本,全部用命令行参数传给训练脚本:
| 参数 | 作用 | 说明 |
|---|---|---|
--epochs / --batch_size | 训练轮数 / 批大小 | 预训练默认 2 轮、bs16;SFT 默认 bs4 |
--learning_rate | 初始学习率 | 预训练 4e-4,SFT 5e-6 |
--max_seq_len | 截断长度 | 预训练 450,SFT 768 |
--from_weight | 基础权重 | llm 或 pretrain_vlm |
--data_path | 数据路径 | 默认指向 dataset/ 下的 parquet,换成你的文件路径即可接入自有数据集 |
冻结策略由 --freeze_llm 控制:预训练默认值 2(完全冻结 LLM,只训投影层),SFT 默认值 1(只放开 LLM 首尾层)。
训练执行
预训练先让投影层完成图文对齐,SFT 再教模型对话格式:
# 阶段一:图文对齐预训练
python trainer/train_pretrain_vlm.py --epochs 2 --from_weight llm
# 阶段二:对话监督微调(基于预训练权重)
python trainer/train_sft_vlm.py --epochs 2 --from_weight pretrain_vlm
日志每 100 步打印一次 loss,预训练阶段的下降曲线参考下图,收敛平滑即正常:
训练中断不用重跑,原命令追加 --from_resume 1 会从最近检查点继续。
产出验证
SFT 结束后 out/ 下生成 sft_vlm_768.pth,直接用它对评估图片批量提问验证效果:
python eval_vlm.py --load_from model --weight sft_vlm
它会遍历 dataset/eval_images 下的每张图,流式打印模型描述并给出 tokens/s 速度:
⚙️ 参数速查
| 参数 | 作用 | 推荐值 | 备注 |
|---|---|---|---|
--epochs | 训练轮数 | 预训练 2 / SFT 2 | 数据量大时再上调 |
--learning_rate | 初始学习率 | 预训练 4e-4 / SFT 5e-6 | 两阶段差异很大,别混用 |
--batch_size | 批大小 | 预训练 16 / SFT 4 | SFT 序列更长,显存占用更高 |
--freeze_llm | LLM 冻结策略 | 预训练 2 / SFT 1 | 0 全训、1 放开首尾层、2 只训投影层 |
--from_resume | 断点续训开关 | 中断后传 1 | 检查点自动存于 checkpoints/ |
🛟 常见问题与避坑
报"文件不存在"或读不到数据? 检查 --data_path 指向的 parquet 是否在 dataset/ 下,且列名必须是 conversations 和 image_bytes。
图片数量与占位符不匹配? <image> 个数必须等于该条样本的图片字节数,多一个少一个都会错位或报错。
显存不够怎么办? 优先调小 --batch_size,再用 --accumulation_steps 补偿等效批量,不要盲目堆卡。
训练中途被中断了? 别删文件重跑,原命令加 --from_resume 1,模型、优化器、scaler 状态都会从 checkpoints/ 恢复。
📈 下一步
用一份高质量小数据集就能拿到可交互的看图模型,数据质量比规模更重要。现在就跑 WebUI 演示 体验交互,或者调整 --epochs 重新训练验证效果 🚀
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考







