常见翻车模式与排错手册

07-发布与边界 核心≈ 25 分钟 #排错#翻车#手册 reviewed
我的状态:

前置知识点

一句话定义

排错手册把微调的十大典型翻车整理成「症状 → 病根 → 处置」的查表结构,并给出贯穿所有故障的通用排查顺序。

为什么重要

故障发生时最贵的是盲目试错:改了 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 回答被截成两段——模型收到的是噪声标签。修模板后原超参一次跑通。教训:先看数据,再谈调参。

操作步骤

  1. 建立故障登记表:症状、首次出现步数、配置指纹、定位过程、根因、修复。
  2. 训练脚本内置 debug 开关:打印前 3 条 batch 的 decode 文本与 label mask。
  3. 每次新框架/新模型第一次训练前,强制跑 10 条过拟合测试(loss 应能压到 0.1 以下)。
  4. NaN 类故障:从 checkpoint 二分定位首发步,回看该步的样本与 grad norm。
  5. 季度复盘:把当季新故障模式补进速查表,手册是活的文档。

排错清单

  • 表内症状全对不上:回到通用四步,从数据可见化重新开始。
  • 同一故障反复出现:说明修复没进流程(如模板校验没自动化),把修复固化成检查项。
  • 多个症状同时出现:先修资源类(OOM/NaN),再修行为类,数值异常会污染一切观察。

常见误区

  • 先调超参:超参是最后该怀疑的,数据与模板才是高频病根。
  • 在生产配置上排错:全量训练一次两小时,最小复现十分钟,先复现再定位。
  • 修好不留痕:没有故障登记表,同样的坑每个新人都会再踩一遍。

与其他知识点的关系

各病根的机制细节分散在:超参 kp-016、显存 kp-017、精度 kp-018、监控 kp-019、遗忘 kp-020、模板 kp-014。

延伸阅读

本节不适用:排错手册是团队经验结晶,无文献可引,价值在于持续维护。

自测题

  1. 通用排查顺序的四步是什么?为什么这个顺序?

答:数据可见化 → 10 条过拟合测试 → 超参 → 环境。按成本与信息量排序:先排除「训错了东西」与「管线不通」,最后才怀疑配置与环境。

  1. 第一步 OOM 和中后期 OOM 的病根为何不同?

答:前者是权重+状态超限(需 QLoRA/降精度),后者是长样本激活峰值(需梯度检查点/截断),处置完全不同。

  1. 「模型输出带 <|im_start|> 残留」说明什么?

答:推理与训练模板不一致——模型按训练时的标记分布续写,服务端渲染却用错了模板。

相关知识点