检查点保存与恢复
万卡训练每小时都有东西在坏(见训练容错),检查点是唯一的安全网。但检查点本身就是个工程挑战:70B 模型的完整状态 ~1.1 TB,写入太慢会挤占训练(每次停顿几分钟),恢复太慢会放大故障损失。本章讲清楚 TB 级检查点的保存、恢复、与存储格式的完整设计。
检查点里有什么
Section titled “检查点里有什么”完整训练状态 = 模型 + 一切恢复所需:
| 组成 | 大小(每参数) | 说明 |
|---|---|---|
| 模型权重(BF16) | 2 B | |
| 优化器状态(FP32) | 12 B | AdamW 的主副本 + 动量 + 方差 |
| 梯度/杂项 | ~1–2 B | |
| 数据游标 | 小 | 分片 + 偏移(见数据管道) |
| 调度器进度 | 小 | 学习率、step 数 |
| 随机数状态 | 小 | dropout 等的 RNG |
合计 ~16 B/参数:7B 模型 112 GB,70B 模型 1.1 TB,175B 模型 2.8 TB。少存任何一项(游标、RNG、schedule),恢复后的训练状态就不连续——loss 跳变或隐性漂移。
保存:三个设计决策
Section titled “保存:三个设计决策”一、分片保存(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 级根本写不动也读不快。
二、异步保存(async checkpoint)
Section titled “二、异步保存(async checkpoint)”同步保存的停顿 = 写入时间(70B 约 2 分钟/次,每 30 分钟一次 = 6% 的训练时间在停顿)。异步化:
同步:训练 ──停顿──写盘──继续 ← 停顿挤占训练异步:训练 ──快照到 CPU 内存──继续 └──后台写盘(与训练并行) ← 几乎零停顿快照到 CPU 内存(GPU 侧先分页拷出),后台线程/进程写盘——现代实现(torch async checkpoint)已把停顿压到秒级。
三、频率与保留策略
Section titled “三、频率与保留策略”| 参数 | 权衡 | 经验 |
|---|---|---|
| 间隔 | 太密挤占训练,太疏丢失进度 | 30–60 分钟(丢失期望 = 间隔/2) |
| 保留数 | 每个都留 vs 只留最近几个 | 最近 2–3 个 + 里程碑(检测点回退用) |
| 异地 | 本地盘 vs 对象存储 | 写两份:本地(快)+ 对象存储(安全) |
恢复:速度决定故障损失
Section titled “恢复:速度决定故障损失”恢复时间公式(见训练容错):
以 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。
- 存储系统 — 下一章:检查点落在哪
- 训练容错与弹性 — 检查点之上的容错体系
- 数据并行与 ZeRO / FSDP — 分片拓扑的由来
- 故障恢复 — 恢复的完整流程