常见翻车模式与排错手册
前置知识点
一句话定义
排错手册把微调的十大典型翻车整理成「症状 → 病根 → 处置」的查表结构,并给出贯穿所有故障的通用排查顺序。
为什么重要
故障发生时最贵的是盲目试错:改了 lr 没用又改 batch,一小时过去了病根其实在模板。查表式排错把平均定位时间从小时级压到分钟级;而通用排查顺序(数据可见化 → 过拟合测试 → 超参 → 环境)解决表外的新故障。
前置知识
kp-021 的完整训练经验;kp-019 的监控体系。
核心概念
- 通用排查顺序:①数据可见化(decode 打印真实进入模型的字符串与 label)→ ②过拟合测试(10 条样本能否记熟)→ ③超参配置 → ④框架与环境版本。
- 症状分类:不收敛类、数值异常类、行为异常类、资源类。
- 最小复现:任何故障先在最小配置(小模型/小数据/短训练)复现,再回到生产配置。
原理与机制
十大翻车速查表:
| 症状 | 高频病根 | 首选处置 |
|---|---|---|
| loss 纹丝不动 | lr 过小(LoRA 用了全参 lr);数据/模板错 | lr 升 10 倍;decode 查数据 |
| loss 降到近 0 | 严重过拟合或数据泄漏 | 减 epoch;跑 kp-013 扫描 |
| loss 剧烈震荡 | lr 过大或批量过小 | lr 减半 / 增梯度累积 |
| loss 变 NaN | 精度配置、lr 过大、脏数据 | 查 kp-018 顺序,定位 NaN 首发步 |
| 第一步就 OOM | 权重超显存 | QLoRA / 降精度 / 小模型 |
| 中后期 OOM | 长样本激活峰值 | 梯度检查点;max_seq_len 截断 |
| 模型不停/无限续写 | eos 未进 label 或模板不一致 | 按 kp-014 修模板与 label |
| 输出带模板标记 | 推理模板≠训练模板 | 统一模板(kp-029 服务端) |
| 学会了但变笨了 | 灾难性遗忘 | kp-020 缓解序列 |
| 合并/量化后掉点 | 合并精度;校准集差 | fp32 合并;换领域校准集 |
通用顺序为什么这么排:数据可见化最便宜且能一举排除「训练的根本不是你以为的数据」这类最高频低级错误;10 条过拟合测试是管线健全性的金标准——连 10 条都记不住,问题必在配置而不在数据量;超参与环境放最后,因为它们的症状常与前两类重叠。
图示
故障 ─► ①decode数据(最便宜) ─► ②10条过拟合测试 ─► ③超参对照 ─► ④版本/环境
"训的是不是你以为的东西" "管线通不通" "配置对不对" "环境有没有坑"直观类比
急诊分诊:先量生命体征(数据可见化),再做基础反射测试(过拟合测试),然后才安排影像与专科(超参、环境)。不分诊就开药,是排错中最常见的浪费。
实例或案例
「loss 半天不降」的定位过程:团队怀疑超参,调了三轮 lr 无效。按通用顺序第①步 decode 数据,发现模板渲染把 system 段重复拼接、assistant 回答被截成两段——模型收到的是噪声标签。修模板后原超参一次跑通。教训:先看数据,再谈调参。
操作步骤
- 建立故障登记表:症状、首次出现步数、配置指纹、定位过程、根因、修复。
- 训练脚本内置 debug 开关:打印前 3 条 batch 的 decode 文本与 label mask。
- 每次新框架/新模型第一次训练前,强制跑 10 条过拟合测试(loss 应能压到 0.1 以下)。
- NaN 类故障:从 checkpoint 二分定位首发步,回看该步的样本与 grad norm。
- 季度复盘:把当季新故障模式补进速查表,手册是活的文档。
排错清单
- 表内症状全对不上:回到通用四步,从数据可见化重新开始。
- 同一故障反复出现:说明修复没进流程(如模板校验没自动化),把修复固化成检查项。
- 多个症状同时出现:先修资源类(OOM/NaN),再修行为类,数值异常会污染一切观察。
常见误区
- 先调超参:超参是最后该怀疑的,数据与模板才是高频病根。
- 在生产配置上排错:全量训练一次两小时,最小复现十分钟,先复现再定位。
- 修好不留痕:没有故障登记表,同样的坑每个新人都会再踩一遍。
与其他知识点的关系
各病根的机制细节分散在:超参 kp-016、显存 kp-017、精度 kp-018、监控 kp-019、遗忘 kp-020、模板 kp-014。
延伸阅读
本节不适用:排错手册是团队经验结晶,无文献可引,价值在于持续维护。
自测题
- 通用排查顺序的四步是什么?为什么这个顺序?
答:数据可见化 → 10 条过拟合测试 → 超参 → 环境。按成本与信息量排序:先排除「训错了东西」与「管线不通」,最后才怀疑配置与环境。
- 第一步 OOM 和中后期 OOM 的病根为何不同?
答:前者是权重+状态超限(需 QLoRA/降精度),后者是长样本激活峰值(需梯度检查点/截断),处置完全不同。
- 「模型输出带
<|im_start|>残留」说明什么?
答:推理与训练模板不一致——模型按训练时的标记分布续写,服务端渲染却用错了模板。