跳转到内容

检查点保存与恢复

万卡训练每小时都有东西在坏(见训练容错),检查点是唯一的安全网。但检查点本身就是个工程挑战:70B 模型的完整状态 ~1.1 TB,写入太慢会挤占训练(每次停顿几分钟),恢复太慢会放大故障损失。本章讲清楚 TB 级检查点的保存、恢复、与存储格式的完整设计。

完整训练状态 = 模型 + 一切恢复所需:

组成大小(每参数)说明
模型权重(BF16)2 B
优化器状态(FP32)12 BAdamW 的主副本 + 动量 + 方差
梯度/杂项~1–2 B
数据游标小分片 + 偏移(见数据管道)
调度器进度小学习率、step 数
随机数状态小dropout 等的 RNG

合计 ~16 B/参数:7B 模型 112 GB,70B 模型 1.1 TB,175B 模型 2.8 TB。少存任何一项(游标、RNG、schedule),恢复后的训练状态就不连续——loss 跳变或隐性漂移。

一、分片保存(sharded checkpoint)

Section titled “一、分片保存(sharded checkpoint)”

与训练的分片对齐(ZeRO/FSDP 的每卡分片):每卡只写自己的分片,写入带宽随卡数线性扩展:

单文件检查点分片检查点
写入一个进程写 1.1 TB(~2 分钟 @10GB/s)70B/8 卡:每卡 137 GB 并行写(~15 s)
恢复灵活性死板(拓扑变了就麻烦)按新拓扑重新分片加载(弹性恢复的基石)
工具—torch distributed checkpoint、DeepSpeed

分片是唯一的正解,单文件检查点在 TB 级根本写不动也读不快。

同步保存的停顿 = 写入时间(70B 约 2 分钟/次,每 30 分钟一次 = 6% 的训练时间在停顿)。异步化:

同步:训练 ──停顿──写盘──继续 ← 停顿挤占训练
异步:训练 ──快照到 CPU 内存──继续
└──后台写盘(与训练并行) ← 几乎零停顿

快照到 CPU 内存(GPU 侧先分页拷出),后台线程/进程写盘——现代实现(torch async checkpoint)已把停顿压到秒级。

参数权衡经验
间隔太密挤占训练,太疏丢失进度30–60 分钟(丢失期望 = 间隔/2)
保留数每个都留 vs 只留最近几个最近 2–3 个 + 里程碑(检测点回退用)
异地本地盘 vs 对象存储写两份:本地(快)+ 对象存储(安全)

恢复时间公式(见训练容错):

T恢复=T重启+检查点大小读取带宽+T验证T_{\text{恢复}} = T_{\text{重启}} + \frac{\text{检查点大小}}{\text{读取带宽}} + T_{\text{验证}}

以 70B(1.1 TB)为例:

读取带宽读取时间
单流 1 GB/s~18 分钟
并行 10 GB/s~2 分钟
并行 50 GB/s(本地 NVMe + 多卡)~22 秒

三个加速手段:

一、多流并行读:分片检查点的天然优势——所有卡的存储通道并行读,带宽随卡数扩展

二、本地缓存:最近一个检查点放在本地 NVMe(快),更早的放对象存储(安全)——恢复从本地读,异地只做灾备

三、按新拓扑重新分片:坏了几张卡后,集群拓扑变了——分片检查点按新拓扑映射加载(某些分片要从备份重算/重切),torch distributed checkpoint 的 resharding

恢复演练:每 N 个检查点做一次真实恢复(加载 → 跑几步 → loss 连续性验证)——没演练过的检查点等于没有检查点(见训练容错)。

格式特点适用
torch .pt/.pth简单,单文件小模型、原型
safetensors安全(零 pickle)、快模型分发、推理加载
torch distributed checkpoint (dcp)分片、异步、reshard训练检查点首选
DeepSpeed 格式分片、与 DS 配套DS 用户
HF 格式社区分发标准发布模型时转换

训练用分片格式(dcp),发布转 safetensors/HF 格式——两种用途两种格式。

  • 完整状态 ~16 B/参数(权重 2 + 优化器 12 + 杂项);70B = 1.1 TB;数据游标/RNG/schedule 少一样恢复就不连续。
  • 分片保存是唯一正解:写入带宽随卡数线性扩展,且支持按新拓扑 reshard(弹性恢复的基石)。
  • 异步化(快照到 CPU + 后台写盘)把停顿从分钟压到秒;同步保存每 30 分钟停 2 分钟 = 6% 时间浪费。
  • 恢复速度决定故障损失:多流并行读 + 本地 NVMe 缓存,70B 恢复从 18 分钟压到 ~20 秒。
  • 每个检查点都要有恢复演练;没演练过的检查点等于没有检查点。
  • 训练用分片格式(dcp),发布转 safetensors/HF。