| # utils/config-and-cli.md · 配置与命令行 |
|
|
| ## 机制 |
|
|
| `utils/training.apply_config(parser, default_config=None)` 让 **YAML 成为 argparse 默认值,CLI 显式参数覆盖 YAML**: |
|
|
| ```python |
| 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 例: |
|
|
| ```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 层数等) |
| 都会驱动模型结构,而非仅少数硬编码字段。 |
|
|
| ## 启动 |
|
|
| ```bash |
| 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 等配置 |
|
|
| 常用参数: |
|
|
| ```bash |
| 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 段对齐。 |
|
|