> For the complete documentation index, see [llms.txt](https://yeasy.gitbook.io/llm_internals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yeasy.gitbook.io/llm_internals/di-er-bu-fen-xun-lian-pian/07_distributed_training/7.7_checkpoint.md).

# 7.7 检查点管理与容错

大规模训练任务往往持续数周甚至数月，硬件故障几乎不可避免。稳健的检查点管理和容错机制是确保训练能够成功完成的工程基石。到这里，前面几节已经留下了一串必须落盘的东西：7.2 分片后的优化器状态、7.6.2 那份 FP32 主权重副本，以及 7.3 与 7.4 决定的它们究竟散落在哪几张卡上。容错的难处正在于把这些原样拼回来——哪怕重启之后的 GPU 数量已经和崩溃前不一样了。

## 7.7.1 检查点的内容与策略

一个完整的训练检查点应保存所有恢复训练所需的状态：模型参数、优化器状态（一阶/二阶矩）、学习率调度器状态、当前步数、随机数生成器状态，以及数据加载器的位置（确保断点续训时不重复使用已见数据）。

检查点保存频率是一个权衡：**太频繁**会导致大量 I/O 开销（保存一个 70B 模型的完整检查点涉及数百 GB 的写入），**太稀少**则意味着故障后损失更多的训练进度。常见做法是每 500\~2000 步保存一次。

现代大规模训练中常用的优化策略包括：

* **分片检查点**（Sharded Checkpoints）：在分布式训练中，不是让某个 GPU 保存整个模型，而是让每张 GPU 保存自己负责的参数切片，大幅减少单 GPU 的 I/O 负载。恢复时各 GPU 并行读取自己的分片，加速重启。
* **异步保存**（Asynchronous Checkpointing）：检查点写入由后台线程或另一个进程完成，不阻塞训练循环。这允许 GPU 在 I/O 进行时继续计算，显著降低检查点保存的性能开销。

## 7.7.2 检查点平均

**检查点平均**（Checkpoint Averaging）是一种有时能提升最终模型性能的技巧。在训练后期，取若干相邻检查点的参数权重求平均，可能获得比任何单个检查点更平滑的解；但收益强依赖任务、指标、训练阶段和检查点间距，不能把某个 benchmark 上的数值直接外推为通用 LLM 收益。

其原理与模型集成类似：不同检查点对应损失曲面上略有不同的位置，取平均后的模型更接近损失盆地的中心，泛化性能更好。

## 7.7.3 容错机制

大规模集群上的故障类型包括 GPU 硬件错误、网络中断、节点宕机等。常见的容错策略包括：

* **自动重启**：检测到节点失败后自动从最近的检查点恢复训练
* **弹性重启**：支持节点失败或成员变化时由调度器重启 worker，并从最近检查点恢复
* **拓扑可迁移检查点**：当 GPU 数量、ZeRO/FSDP 分片或 TP/PP/DP 拓扑变化时，需要能重分片模型、优化器、随机数和数据加载器状态；这比普通弹性重启更复杂
* **冗余存储**：检查点保存到分布式文件系统或对象存储，避免单点故障

框架如 DeepSpeed、Megatron-LM 和 Ray Train 都提供了不同程度的容错支持。
