第 6 章:从零训练
必须走的两步:预训练学会语言,SFT 学会当助手。单卡 3090 用 mini 数据大约 2.3 小时、约 3 元。
1先看门槛(单卡 3090 估算)
| 模型 | pretrain mini | sft mini | 合计(约) |
|---|---|---|---|
| minimind-3 64M | 1.21h / 1.57 元 | 1.10h / 1.43 元 | 2.31h / 3.0 元 |
| minimind-3-moe | 1.69h / 2.20 元 | 1.54h / 2.00 元 | 3.23h / 4.2 元 |
按约 1.3 元/小时租 3090 估算,只作体感参考。8×H100 可以把总时长压到分钟级。所有训练脚本都在 ./trainer 目录执行。
2预训练:先学会词语接龙
模型埋头读大量文本(百科、新闻、书、对话),自己总结规律。没有人逐条说对错。输入「秦始皇」,它应能接出「是中国历史上的第一位皇帝」这类通顺后续。
cd trainer
# 单卡
python train_pretrain.py
# 或显式 1 卡 DDP
torchrun --nproc_per_node 1 train_pretrain.py
权重每隔 save_interval 步覆盖保存为 out/pretrain_*.pth(* 是维度,默认 768)。
python eval_llm.py --weight pretrain
此时它还不是助手,只是会续写。回答可能通顺,也可能跑题,都正常。
3SFT:学会多轮对话
如果预训练是广泛读书,SFT 就是在高质量、有目标的数据上深加工。主线 14GB 的 SFT 已经接近 mid-training:既对齐 user / assistant / system / tool 模板,也继续灌知识和助手风格。Tool Call、思考标签都在这一阶段混入。
cd trainer
python train_full_sft.py
# 或
torchrun --nproc_per_node 1 train_full_sft.py
产出 out/full_sft_*.pth。测试:
python eval_llm.py --weight full_sft
推理时打开 YaRN,可以免训练把上下文扩到 2048 以上(第 9 章)。
4断点续训与多卡
所有训练脚本都支持检查点。加 --from_resume 1 会自动找进度:
python train_pretrain.py --from_resume 1
python train_full_sft.py --from_resume 1
- 完整检查点在
./checkpoints/,例如full_sft_512_resume.pth - 支持换 GPU 数量恢复(自动调 step)
- 支持 wandb / SwanLab 的同一个 run 续上
# N 张卡
torchrun --nproc_per_node N train_pretrain.py
# 可视化(国内建议 SwanLab,接口兼容 wandb)
python train_full_sft.py --use_wandb
2025 年 6 月后国内常连不上 WandB。把
import wandb 换成 import swanlab as wandb 即可,调用基本不用改。5怎样算训完了
你现在手里应该有:
out/pretrain_768.pth(或你设的维度)out/full_sft_768.pth- 用
eval_llm.py --weight full_sft能多轮对话
这就是文档里的 MiniMind Zero 对话模型。官方也提供训好的 *.pth:ModelScope PyTorch 权重。