utils/config-and-cli.md · 配置与命令行
机制
utils/training.apply_config(parser, default_config=None) 让 YAML 成为 argparse 默认值,CLI 显式参数覆盖 YAML:
def apply_config(parser, default_config=None):
pre, _ = parser.parse_known_args() # 先读出 --config
config_path = getattr(pre, 'config', None) or default_config
if config_path and os.path.exists(config_path):
defaults = _load_yaml_config(config_path)
parser.set_defaults(**defaults) # 注入默认值
return parser.parse_args() # 最终解析(CLI 覆盖)
_load_yaml_config 把 YAML 的 model / train / paths 三段扁平化为顶层键:
model.hidden_size → hidden_size,train.epochs → epochs,paths.data_path → data_path ……
这些键名与 trainer 的 --hidden_size / --epochs / --data_path 等 argparse 参数一一对应。
配置文件位置
configs/
├── lm/ # lm_pretrain.yaml / lm_full_sft.yaml / lm_pretrain_mini.yaml / lm_full_sft_mini.yaml / lm_pretrain_moe.yaml / lm_full_sft_moe.yaml
├── vlm/ # vlm_pretrain.yaml / vlm_pretrain_moe.yaml / vlm_sft.yaml / vlm_sft_moe.yaml
└── vam/ # vam.yaml / vam_moe.yaml
checkpoint/
└── tokenizer/ # tokenizer.json / tokenizer_config.json
每个 YAML 例:
model:
hidden_size: 768
num_hidden_layers: 8
use_moe: 0
vocab_size: 6400
train:
epochs: 2
batch_size: 16
learning_rate: 1.0e-5
from_weight: pretrain
paths:
save_dir: checkpoint/lm
data_path: dataset/lm/sft.jsonl
配置如何真正生效
trainer 用 LMConfig(**vars(args))(或 VLMConfig / VAMConfig)构造模型配置,
因此 YAML 里所有 model 字段(含 vocab_size、head 数、MoE 专家数、talker 层数等)
都会驱动模型结构,而非仅少数硬编码字段。
启动
python -m trainers.lm.full_sft --config configs/lm/lm_full_sft.yaml
python -m trainers.vlm.full_sft --config configs/vlm/vlm_sft_moe.yaml
python -m trainers.vam.full_sft --config configs/vam/vam.yaml --epochs 10
python -m trainers.lm.train_tokenizer --data_path dataset/lm/sft_t2t_mini.jsonl \
--vocab_size 6400 --no_eval
Tokenizer 训练
trainers/lm/train_tokenizer.py 仅供学习参考(MiniMind 已自带 tokenizer,重复训练会导致词表不统一)。
训练得到的 tokenizer 直接保存到 **checkpoint/tokenizer/**(与模型权重同目录),包含:
tokenizer.json/vocab.json/merges.txt:BPE 词表tokenizer_config.json:special token、chat template 等配置
常用参数:
python -m trainers.lm.train_tokenizer --data_path dataset/lm/sft_t2t_mini.jsonl \
--vocab_size 6400 \
--checkpoint_dir ../checkpoint \
--no_eval
要点(面试)
- 设计亮点:单一事实源(YAML)+ CLI 覆盖,实验可复现、参数可微调。
set_defaults注入后,argparse 仍允许命令行覆盖 → 优先级CLI > YAML > 代码默认。- 扁平化约定要求 YAML 键名与
--arg名一致,故trainers的参数命名需与 YAML 段对齐。