Code Map

按文件读懂 MiniMind-V

这一页把仓库文件和学习任务对应起来。读代码时建议从数据入口开始,再看模型注入图像特征,最后回到训练与推理脚本。

1. 文件职责

model/model_minimind.py
MiniMind 语言模型:配置、RMSNorm、RoPE、Attention、FFN、MoE、Transformer block、CausalLM 和 generate。
model/model_vlm.py
VLM 扩展:VLMConfig、MMVisionProjector、SigLIP2 加载、图像预处理、视觉 embedding 注入、forward 和 generate 多返回兼容。
dataset/lm_dataset.py
parquet 数据读取、聊天模板、图像占位符展开、labels 生成、图像 bytes 转 tensor。
trainer/trainer_utils.py
参数统计、学习率、随机种子、DDP 初始化、模型初始化、冻结策略、检查点保存与恢复、collate_fn。
trainer/train_pretrain_vlm.py
可选图文对齐阶段,默认只训练 projector,学习率较高,最大序列长度 450。
trainer/train_sft_vlm.py
监督微调阶段,默认训练 projector 和 LLM 首尾层,学习率较低,最大序列长度 768。
eval_vlm.py
命令行评估入口,支持原生 PyTorch 权重和 Transformers 格式,遍历 eval_images 并输出速度。
scripts/web_demo_vlm.py
Gradio WebUI,扫描模型目录、加载模型、处理图片上传、流式生成回答。
scripts/convert_vlm.py
原生 PyTorch 与 Transformers 格式互转。

2. 推荐阅读顺序

  1. 先读 dataset/lm_dataset.py,确认一个样本如何变成 input_ids, labels, pixel_values
  2. 再读 model/model_vlm.py,重点看 forwardcount_vision_proj
  3. 回到 trainer/trainer_utils.py,理解 freeze_llm 三种策略。
  4. 最后看训练脚本,确认日志、保存、resume、DDP 和 mixed precision。

3. 一条样本的调用链

DataLoader
  └─ VLMDataset.__getitem__
       ├─ create_chat_prompt
       ├─ tokenizer(prompt)
       ├─ generate_labels
       └─ MiniMindVLM.image2tensor
  └─ vlm_collate_fn
       └─ train_epoch
            └─ model(input_ids, labels, pixel_values)
                 ├─ embed_tokens
                 ├─ get_image_embeddings
                 ├─ vision_proj
                 ├─ count_vision_proj
                 └─ MiniMind decoder + lm_head + cross_entropy

4. 练习题

追踪 token

VLMDataset.__getitem__ 里临时打印 prompt、input_ids 长度、labels 中非 -100 的比例,观察不同样本的监督信号。

比较冻结策略

小规模数据上分别试 freeze_llm=2freeze_llm=1,观察 loss、回答风格和语言能力变化。

改评估 prompt

eval_vlm.py 的 prompt 改成细节、位置、数量、颜色类问题,检查模型在哪些场景更容易幻觉。

读 MoE 辅助损失

在 MoE 模式下观察 aux_loss 是否过大,理解 router load balancing 对训练稳定性的意义。