本节摘要:NanoGPT 用配置文件(.py)管理训练参数——想改模型大小、训练时长、学习率,改配置即可。本节讲清配置文件的组织方式、关键参数的含义(模型类、训练类、优化类),以及"一次只改一个参数"的实验方法。
阅读完本节,你应当能够:
"改模型大小?改训练时长?"——答案都在配置文件里。NanoGPT 把参数集中在 config/ 目录:训练命令指定配置文件,改配置就是改实验。这让"跑实验"变成"改文件 + 跑命令"的简单操作。
配置文件是 Python 文件而不是 JSON,好处是可以用注释说明每个参数的用途,还能在命令行临时覆盖。这种设计让每个实验都有据可查。
# config/train_shakespeare.py(真实内容节选) # 模型配置:约 10M 参数的小模型 n_layer = 6 n_head = 6 n_embd = 384 block_size = 256 vocab_size = 65 dropout = 0.0 # 训练配置 batch_size = 64 gradient_accumulation_steps = 1 max_iters = 5000 lr_decay_iters = 5000 # 评估与保存 eval_interval = 250 eval_iters = 200 save_interval = 1000 # 优化配置 learning_rate = 1e-3 weight_decay = 0.1 warmup_iters = 200 min_lr = 1e-4 beta1 = 0.9 beta2 = 0.95 grad_clip = 1.0
这套参数是 NanoGPT 官方为莎士比亚数据调好的"默认好值":6 层 384 维的小模型,5000 步训练,在单张消费级 GPU 上十几分钟跑完,损失能降到 2 以下。初学时建议原样跑通,再逐步改动。
| 参数 | 作用 | 调大效果 |
|---|---|---|
| n_layer | 模型深度 | 更强但更贵 |
| n_embd | 嵌入维度 | 更强但更贵 |
| max_iters | 训练轮次 | 学更多但更久 |
| batch_size | 批次大小 | 更稳但更耗显存 |
| learning_rate | 学习步幅 | 更快但易不稳 |
不想改文件也能调参——NanoGPT 支持命令行覆盖:
# 训练 1000 步,学习率改为 5e-4 python train.py config/train_shakespeare.py --max_iters=1000 --learning_rate=5e-4 # 换数据继续训练 python train.py config/train_shakespeare.py --dataset=my_data
命令行参数的优先级高于配置文件,适合快速试探;正式的对比实验建议新建配置文件,保证可复现。
# train.py 的 get_lr:warmup + 余弦衰减 def get_lr(iter_num): # 1) warmup 阶段线性升 if iter_num < warmup_iters: return learning_rate * (iter_num + 1) / warmup_iters # 2) 余弦衰减到 min_lr(10% 学习率) if iter_num > lr_decay_iters: return min_lr decay_ratio = (iter_num - warmup_iters) / (lr_decay_iters - warmup_iters) coeff = 0.5 * (1.0 + math.cos(math.pi * decay_ratio)) return min_lr + coeff * (learning_rate - min_lr)
前 200 步学习率从 0 线性升到 1e-3(warmup),之后按余弦曲线衰减到 1e-4。warmup 让训练初期稳定,余弦衰减让后期精细收敛——这套调度是大模型训练的标配。
💡 关键直觉:配置文件是"实验的记录本"——每个实验存一个配置文件,效果好坏都能追溯"当时用了什么参数"。
实验 1:基线配置 实验 2:只改学习率(5e-4 → 1e-3) 实验 3:只改层数(n_layer 4 → 6) 对比:哪个参数带来的变化最大
⚠️ 常见坑:一次改多个参数。效果变好不知道是谁的功劳,变差不知道是谁的锅——控制变量,实验才有结论。
第一步 定模型规模:按显存预算 第二步 定学习率:影响最大 第三步 定训练时长:看损失是否收敛 第四步 微调其余:批次、衰减等
| 实验 | 改动 | 损失 | 结论 |
|---|---|---|---|
| 基线 | 无 | 3.8 | 起点 |
| 大学习率 | 1e-3 | 3.5 | 有效 |
| 更深模型 | n_layer=6 | 3.4 | 更好但贵 |
建议每跑一个实验就复制一份配置文件,命名带日期与改动,例如 config/train_shakespeare_lr5e4.py。几个月后回看,你还能说清每个数字背后的实验。
| 误区 | 正确做法 |
|---|---|
| 盲目抄别人的学习率 | 按自己的模型与数据重调 |
| 一上来就调很多参数 | 控制变量,逐个验证 |
| 只看训练损失 | 训练验证一起看 |
| 忽略 warmup 与衰减 | 使用标准调度 |
配置里的 dropout 常被忽略,但它对训练质量有真实影响:
dropout = 0.0:默认关闭,小模型训练时常用 dropout = 0.1:正则化,防过拟合 注意:dropout 只在训练时生效,推理时自动关闭
对小模型和小数据,dropout 可能反而拖慢收敛;数据量增大或模型变深后,适当加 dropout 有助于泛化。它的"开关时机"比数值本身更重要——这又是一个值得单独做对比实验的参数。
| 场景 | 推荐组合 |
|---|---|
| 快速验证流程 | 小模型 + 短训练 + 默认学习率 |
| 认真复现基线 | 按官方配置原样跑 |
| 有限算力做实验 | 中等模型 + 梯度累积 + bf16 |
| 中文数据起步 | 小模型 + 词表适配 + 更少步数 |
组合的原则是"匹配资源与目标":验证流程用小配置,正式对比用固定基线,优化实验才动关键旋钮。
实践全部跑通了,第 4 章进阶——复现 GPT-2 与性能优化。