1. 数据来源
README 记录当前训练数据来自 ALLaVA-4V 系列。MiniMind-V 把数据重新整理为两个 parquet 文件:
| 文件 | 规模 | 用途 | 训练建议 |
|---|---|---|---|
pretrain_i2t.parquet | 约 127 万条 | 图片 caption,对齐视觉 token 与语言 token。 | 可选,先跑会让 Projector 收敛更稳。 |
sft_i2t.parquet | 约 290 万条 | 图像问答、长描述、纯文本对话混合。 | 必需;已包含 Pretrain caption 子集,可直接 SFT。 |
数据中英比例相对均衡:中文有利于中文输出,英文描述通常更细。纯文本对话样本用于保护 MiniMind 语言主干原本的对话能力。
2. parquet 字段
列名:
conversations: json string
image_bytes: binary 或 binary list
conversations 示例:
[
{"role": "user", "content": "<image>\n请提供对图片的详细文字描述。"},
{"role": "assistant", "content": "这张图片展示的是一个..."}
]
image_bytes 直接存图片二进制,避免把几十万张图片拆成零散文件。训练时用 PIL 从 bytes 读图,再交给 SigLIP2 processor。
3. VLMDataset 做了什么
读取 parquet
pyarrow.parquet 把表加载进内存。处理聊天概率添加 system prompt,去除部分空 thinking 标签。
展开图像
<image> 替换为 64 个 <|image_pad|>。生成 labels用户和 system 位置填
-100,只监督 assistant。处理图片
MiniMindVLM.image2tensor 得到 pixel values。4. 为什么 label 里有 -100
训练对话模型时,通常只希望模型学习 assistant 的回复,而不是学习复读 user prompt。PyTorch 的交叉熵会忽略 label 为 -100 的位置,所以 generate_labels 会扫描 assistant 起止 token,只保留回答部分作为监督信号。
读数据代码时可以重点看
self.bos_id 和 self.eos_id:它们定义了 assistant 回复的边界,决定哪些 token 会真正参与 loss。
5. collate_fn 与多图样本
vlm_collate_fn 把每条样本的 input_ids、labels 和 pixel_values 堆成 batch。当前 README 说明发布的 Transformers 版本是单图 SFT 后模型,但代码对 image_bytes list 和多图张量做了兼容。
6. 预览数据
把 parquet 放到 dataset/ 后,可以运行数据脚本预览前 5 条样本,快速检查图片与文本是否匹配。
cd dataset
python lm_dataset.py
脚本会读 pretrain_i2t.parquet 和 sft_i2t.parquet,保存预览图片。若只下载了一个文件,需要按实际文件名调整脚本或先跳过缺失文件。
