Dataset

从 parquet 到训练 batch

MiniMind-V 的数据设计很简洁:一列聊天 JSON,一列图像二进制。Dataset 负责套聊天模板、展开图像占位符、生成 labels,并把图像转成 SigLIP2 输入张量。

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 做了什么

读取 parquetpyarrow.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_idself.eos_id:它们定义了 assistant 回复的边界,决定哪些 token 会真正参与 loss。

5. collate_fn 与多图样本

vlm_collate_fn 把每条样本的 input_idslabelspixel_values 堆成 batch。当前 README 说明发布的 Transformers 版本是单图 SFT 后模型,但代码对 image_bytes list 和多图张量做了兼容。

6. 预览数据

把 parquet 放到 dataset/ 后,可以运行数据脚本预览前 5 条样本,快速检查图片与文本是否匹配。

cd dataset
python lm_dataset.py

脚本会读 pretrain_i2t.parquetsft_i2t.parquet,保存预览图片。若只下载了一个文件,需要按实际文件名调整脚本或先跳过缺失文件。