大模型训练跑到一半因为断电、显存溢出或者集群调度被中断,是每个训练团队都会遇到的事。真正昂贵的不是中断本身,而是恢复之后训练状态对不齐:模型权重回到了旧检查点,优化器状态却用了新的,或者数据从头开始喂,导致模型把同一批数据重复学了两遍,损失曲线出现不该有的跳变。断点续训的本质,就是让权重、优化器、学习率进度和数据游标四者同时回到同一个时间点。检查点要存的东西比很多人以为的多。除了模型权重,还要保存优化器内部状态、学习率调度器的当前步数、随机数生成器状态,以及全局训练步数。随机数状态尤其容易被忽略,数据打乱顺序、随机丢弃都依赖它,恢复时不还原,数据顺序就会错位,复现性也就无从谈起。保存频率同样需要权衡,存得太密会拖慢训练、占满存储,存得太稀则一次中断丢掉的进度太多,常见做法是按固定步数存全量检查点,中间再用轻量方式记录步数,恢复时回到最近的完整点。数据恢复是最容易出隐性错误的环节。数据加载器在中断时正读到数据集的某个位置,恢复时必须从同一位置继续,而不是从头开始,也不是从检查点步数反推一个大概位置。分布式训练下还要保证每个并行分片的状态一致,任何一个分片错位都会让整体数据分布悄悄偏移。验证恢复是否成功,不能只看程序跑起来了,要对比恢复前后几步的损失值和梯度范数是否连续,出现跳变就要先排查状态对齐,而不是继续往下跑。落地的清单可以归纳为四条。第一,检查点写入要原子化,先写临时文件再重命名,避免中断恰好发生在写盘中途留下损坏文件。第二,定期做恢复演练,真的从某个检查点恢复跑几步并对比指标,不要等到真实故障时才第一次验证恢复流程。第三,记录每个检查点的元数据,包括步数、数据版本和代码版本,数据或代码变了,旧检查点未必还能直接用。第四,明确恢复策略的优先级,是优先保进度还是优先保复现性,不同选择下的数据游标处理方式并不相同,事先定好比事后争论强。