大模型训练检查点怎么备份?LLaMA-3/GPT级模型如何制定频率与恢复演练方案

大模型训练中,检查点“文件还在”不等于“训练可以恢复”。如果只保存模型权重,通常只能恢复推理或重新开始部分训练,不能保证优化器状态、学习率进度、随机数状态和数据读取位置连续。对 LLaMA-3、GPT 级别的预训练或全参数微调任务,检查点方案应同时回答五个问题:备份哪些状态、多久保存一次、如何保证分布式一致、保留多久,以及恢复后怎样验收。
检查点频率也不是由 GPU 数量直接决定的。大模型训练需要多少 GPU、LLaMA-3/GPT 级模型采用怎样的算力配置,主要取决于显存是否能容纳模型与并行策略、目标训练速度和通信条件;备份频率则取决于可接受的训练回退量、保存耗时和存储预算。两者需要联动测试,但不能用“GPU 越多就越应该频繁备份”代替实际验收。
先定义恢复目标:允许丢多少训练进度
制定策略前,先确定两个指标:
- RPO(恢复点目标):故障发生后,最多允许丢失多少训练进度,可以按训练步数或训练时间表示。
- RTO(恢复时间目标):从选择检查点到恢复训练并通过验证,最长允许花费多长时间。
例如,团队可以规定:训练中断后最多回退一个检查点周期,恢复后必须从一致的全局步数继续,并在规定时间内完成启动、校验和试运行。这里的具体时间不应直接照搬其他项目,而应根据单步训练耗时、故障影响和存储吞吐量实测。
检查点间隔可以先用下面的关系估算:
检查点间隔 ≤ 可接受的最大训练回退时间
如果故障发生时间近似随机,平均回退时间大约是检查点间隔的一半;但验收时仍应按最坏情况,也就是“刚完成一次检查点后立刻发生故障”来判断。与此同时,还要监控保存开销:
检查点开销比 = 单次保存耗时 ÷ 检查点间隔
如果一次保存需要较长时间,导致训练暂停、GPU 空转或数据管线堆积,即使 RPO 达标,整体方案也可能不可接受。
明确检查点范围:权重只是其中一部分
全量训练检查点应保存什么
对预训练和全参数微调,建议把检查点分成“继续训练必需状态”和“审计与复现辅助状态”。
| 状态类别 | 典型内容 | 是否影响继续训练 | 验收重点 |
|---|---|---|---|
| 模型参数 | 各层权重、分片文件、参数精度信息 | 是 | 分片是否完整、参数键是否匹配 |
| 优化器状态 | 一阶、二阶动量、主权重或混合精度状态 | 通常是 | 优化器步数、状态分片是否齐全 |
| 学习率状态 | 当前学习率、调度器位置、预热进度 | 是 | 恢复后学习率曲线是否连续 |
| 梯度缩放状态 | 混合精度训练使用的缩放因子等 | 视训练方式而定 | 是否出现异常溢出或训练震荡 |
| 随机数状态 | CPU、GPU、分布式进程的随机数状态 | 影响可复现性 | 固定条件下结果是否符合预期 |
| 数据读取状态 | 数据集版本、分片、样本位置、数据游标 | 是 | 是否重复过多数据或跳过数据 |
| 并行元数据 | 全局步数、进程数、并行拓扑、分片映射 | 是 | 所有进程是否指向同一训练步 |
| 配置与代码 | 模型配置、分词器、训练参数、代码版本 | 通常是 | 配置哈希和代码版本是否匹配 |
| 评估与日志 | loss、学习率、吞吐、异常记录 | 否,但很重要 | 用于恢复前后对比 |
如果只备份模型权重,适合“保存一个可推理版本”或“从权重重新开始优化器”的场景;如果目标是故障后接续预训练,则必须将优化器、调度器、数据读取和并行元数据纳入备份范围。
不同训练阶段的备份范围
预训练、全参数微调和参数高效微调的状态规模不同,但验收原则相同:
- 预训练:优先保证模型分片、优化器状态、学习率调度、数据游标和分布式元数据完整。
- 全参数微调:除模型权重外,优化器和调度器状态仍然是连续训练的关键。
- 参数高效微调:需要明确保存基础模型引用、适配器参数、训练器状态以及适配器配置。不能只保存一个适配器文件,却没有记录它对应的基础模型版本。
每份检查点都应有一个不可变的元数据清单,至少包含:
global_step
epoch 或数据游标
训练开始时间与保存完成时间
模型配置版本
分词器版本
数据集版本或数据快照标识
代码版本标识
并行规模与分片方式
权重、优化器、调度器文件列表
每个文件的大小和校验值
检查点状态:writing / complete / failed
这里的 complete 不能仅由训练进程写入。更稳妥的做法是:所有分片写入临时目录,校验值和元数据清单生成完毕后,再以原子方式发布完成标记。恢复程序只读取带有完成标记的目录,不读取仍处于 writing 状态的目录。
按指标制定检查点频率
三个必须测量的指标
不要直接从“每多少步保存一次”开始,而应先测量以下数据:
- 单次检查点总大小
统计所有权重、优化器、调度器和元数据文件的总量。分布式分片时,应统计所有分片之和,而不是只看某一台机器上的目录大小。
- 保存完成时间
从训练进程进入保存阶段,到远端存储确认完整可读的耗时。只统计本地写入时间,不能代表真正的备份完成时间。
- 恢复验证时间
从选定检查点开始,到完成文件校验、状态加载、进程启动和短步数试运行的总耗时。
可以把检查点策略看成三个成本之间的平衡:
- 保存太少:故障后回退的训练计算更多;
- 保存太多:写入压力、训练暂停和存储占用增加;
- 保存不完整:即使文件数量很多,也无法恢复。
频率的实际制定方法
建议使用“时间间隔 + 训练步数 + 事件触发”三种条件中的任意一种触发保存。
时间间隔适合训练吞吐稳定的任务。先根据允许的回退时间设定一个待测周期,再通过实际保存耗时和恢复演练调整。
训练步数适合单步时间稳定、训练指标按步数管理的任务。步数间隔应换算为时间间隔验证,防止因为序列长度、数据批次或 GPU 利用率变化而使实际 RPO 偏离目标。
事件触发用于降低关键变更带来的回退风险,典型场景包括:
- 更换数据集版本或数据混合比例前;
- 修改模型配置、并行策略或优化器前;
- 调整学习率、批次大小或梯度累积策略前;
- 重要评估节点前后;
- 即将进行长时间无人值守训练前;
- 完成一个可交付模型版本时。
频率不应只设置一个“最新检查点”。实际运行中至少要区分以下几类:
| 类型 | 作用 | 典型保存策略 |
|---|---|---|
| 工作检查点 | 应对近期故障 | 高频滚动保留,旧版本按容量淘汰 |
| 周期检查点 | 支持回退和对比 | 按较长周期保留多个版本 |
| 里程碑检查点 | 支持版本交付和重大变更回滚 | 变更前后单独保留,不参与普通滚动淘汰 |
| 验收检查点 | 用于恢复演练 | 在隔离环境中保留到验收完成 |
这里的“高频”和“较长周期”不能脱离容量预算确定。单份检查点大小为 V,计划保留 N 份,存储副本数为 R 时,基础存储量可先按下面方式估算:
存储量 ≈ V × N × R + 元数据、日志和临时空间
如果检查点采用增量方式,不能简单套用这个公式,还要把基线检查点、增量链长度和链断裂后的重建空间计算进去。对恢复稳定性要求较高的训练任务,保留完整检查点通常比过长的增量链更容易验收。
GPU 数量对备份方案的影响
GPU 数量不是检查点频率的唯一变量,但会影响以下环节:
- 写入并发度:多个训练进程可能同时写入大量分片,远端存储和共享文件系统会出现突发压力。
- 文件数量:按进程或分片保存时,GPU 数量增加可能带来更多文件和元数据操作。
- 通信同步:某个进程保存失败、其他进程继续运行,可能造成混合步数或部分检查点。
- 恢复拓扑:原训练使用的 GPU 数量、张量并行、流水线并行或数据并行配置变化后,原分片未必能直接加载。
因此,回答“大模型训练需要多少GPU?LLaMA-3/GPT级模型算力配置”时,至少应分别验收“训练是否能跑”和“检查点是否能写、能读、能恢复”。GPU 数量应由显存、并行策略和目标吞吐决定;备份频率应由 RPO、保存开销和存储预算决定。二者有关联,但不能相互替代。
保证分布式检查点的一致性
一致性至少包含四层
第一层是全局步数一致。 所有训练进程必须在同一个全局训练步进入保存点。不能由某个进程先写出自己的分片,其他进程仍在更新参数时就把整个目录标记为完成。
第二层是状态之间一致。 模型参数、优化器状态、学习率调度器和梯度缩放器必须属于同一个训练步。最常见的错误是权重来自第 N 步,优化器状态来自第 N-1 步,文件本身都能打开,但恢复后训练行为已经改变。
第三层是分片集合一致。 检查点清单必须记录预期分片数量、实际分片数量和每个分片的校验值。不能只验证目录存在,必须确认没有缺片、重片或同名覆盖。
第四层是配置一致。 恢复时要比对模型配置、分词器、数据版本、并行方式和代码版本。配置不一致时,即使框架能够加载文件,也不能直接判定恢复成功。
推荐的发布流程
在不确定训练框架具体实现时,可以按以下逻辑设计外围备份流程:
- 训练进程在目标全局步执行同步,确认所有进程抵达保存点。
- 将状态写入带有唯一标识的临时目录,例如
step-10000.writing。 - 写完所有分片后生成文件清单、大小记录和校验值。
- 由协调进程检查分片数量、全局步数和关键元数据。
- 将状态标记从
writing更新为complete,或在同一文件系统内发布完成目录。 - 训练程序和恢复程序只选择
complete状态的检查点。 - 远端复制完成后再次检查对象数量、大小和校验值,不能把“复制任务已提交”当作“备份已完成”。
Linux 环境可以使用 sha256sum 验证已生成的文件清单。下面的命令应在检查点已经停止写入的临时目录中执行,适用于 GNU/Linux 常见发行版:
cd /path/to/checkpoint.step-10000.writing
find . -type f ! -name 'manifest.sha256' -print0 \
| sort -z \
| xargs -0 sha256sum > manifest.sha256
sha256sum -c manifest.sha256
校验通过只说明文件内容与清单一致,不能证明训练状态语义正确。例如,权重和优化器状态可能都没有损坏,但它们来自不同训练步。因此还需要在清单中记录统一的 global_step,并由恢复程序加载后检查。
确认所有文件和清单完成后,再发布完成状态。下面的示例只适用于源目录和目标目录位于同一文件系统、目标名称不存在且没有并发写入的情况:
mv /path/to/checkpoint.step-10000.writing \
/path/to/checkpoint.step-10000.complete
该操作不会修复缺失分片,也不会验证远端副本。若目标名称已经存在,不应直接覆盖,应先停止发布流程并检查是否发生重复任务或名称冲突。
恢复演练:从“能加载”到“能继续训练”
准备条件
恢复演练不要直接覆盖生产训练目录,应准备隔离的恢复目录,并记录以下条件:
- 检查点路径和版本;
- 使用的代码版本;
- 模型、分词器和数据版本;
- 原训练的 GPU 数量与并行配置;
- 计划使用的恢复 GPU 数量;
- 目标 RTO 和允许的步数回退;
- 恢复前后的配置差异;
- 演练开始和完成时间。
如果恢复时 GPU 数量或并行拓扑改变,应先确认训练框架是否支持重新分片或重新映射。不能因为加载接口没有立即报错,就认定改变拓扑后的训练等价于原训练。对于不支持直接变更拓扑的情况,应先在原拓扑恢复,再通过明确的转换流程生成新拓扑可用的检查点。
恢复验收步骤
第一步:检查完成状态和完整性。
验证目录状态、文件数量、文件大小和校验值。校验失败时不要继续启动训练,先重新复制缺失文件或选择上一份完整检查点。
第二步:检查关键元数据。
至少比对:
global_step;- 优化器步数;
- 学习率调度器位置;
- 模型配置;
- 分词器版本;
- 数据版本和数据游标;
- 并行规模与分片信息。
第三步:只读加载测试。
先在不更新参数的模式下加载模型、优化器和调度器,观察是否出现缺失键、额外键、形状不匹配或状态数量不一致。只读加载通过,说明文件结构基本可用,但还不能证明可以继续训练。
第四步:短程继续训练。
恢复后执行一小段受控训练,记录:
- 首个恢复步的 loss;
- 学习率;
- 梯度范数或梯度溢出情况;
- GPU 显存和利用率;
- 数据游标;
- 检查点再次写入结果。
如果使用固定输入和固定随机数状态,应对比恢复前后相同条件下的输出。分布式训练、混合精度和非确定性算子可能带来微小差异,因此应预先定义允许范围,而不是简单要求每个浮点数完全相同。
第五步:验证恢复后的新检查点。
恢复成功后必须再保存一份新检查点,并重复完整性校验。这样才能证明系统不仅能读旧检查点,也能在恢复后的训练进程中继续生成可用备份。
三类故障场景
| 演练场景 | 需要模拟的问题 | 通过标准 |
|---|---|---|
| 训练进程或单个工作进程中断 | 是否能从最近完整检查点恢复 | 进程重新启动后无混合步数,训练可继续 |
| 保存过程中发生中断 | 是否会留下可被误选的半成品 | 半成品被识别为未完成,不参与恢复 |
| 远端文件缺失或校验失败 | 是否能发现损坏并切换版本 | 校验失败可定位到文件,自动或人工选择上一份完整版本 |
| GPU 数量或并行方式变化 | 分片是否能够重新映射 | 有明确兼容性判断,不把错误加载当作成功 |
| 代码或配置变更 | 是否能阻止不兼容恢复 | 版本不符时告警或拒绝启动 |
| 数据版本变化 | 是否会重复或跳过数据 | 数据游标和数据版本有记录,行为符合预定策略 |
验收项目、正常与异常分界
验收不能只看“训练进程重新启动”。建议形成一份可追溯的检查表:
| 验收项目 | 正常表现 | 异常分界 | 应保留的证据 |
|---|---|---|---|
| 检查点状态 | 目录或对象明确标记为 complete | 只有目录存在,状态不明或仍为 writing | 状态文件、发布时间、任务日志 |
| 文件完整性 | 所有清单文件校验通过 | 缺片、校验失败、大小不一致 | sha256sum -c 输出、文件清单 |
| 步数一致性 | 权重、优化器、调度器属于同一 global_step | 任一状态步数不同 | 元数据清单、恢复日志 |
| 参数加载 | 无缺失键、额外键和形状错误 | 加载报错或被静默跳过 | 加载日志、参数统计 |
| 优化器恢复 | 状态数量和步数符合预期 | 只加载权重,优化器被重新初始化 | 优化器日志、配置记录 |
| 数据恢复 | 数据版本和游标符合策略 | 未知游标、重复或跳过范围不可解释 | 数据版本、游标记录 |
| 训练连续性 | 恢复后 loss、学习率和梯度行为处于预设范围 | loss 突然异常、学习率跳变或持续溢出 | 恢复前后指标曲线 |
| 新检查点生成 | 恢复后能生成新的完整检查点 | 只能读取旧检查点,无法写出新版本 | 新检查点清单和校验结果 |
| 恢复耗时 | 在 RTO 内完成 | 超过 RTO 或需要人工临时修复 | 时间戳、启动日志、故障记录 |
需要特别区分以下几种情况:
- 文件损坏:校验值失败,属于备份完整性问题;
- 状态不一致:文件都能读取,但步数或配置不匹配,属于一致性问题;
- 恢复过慢:状态正确但加载和复制耗时过长,属于 RTO 或存储吞吐问题;
- 恢复后指标异常:文件可以加载,但训练语义可能改变,需要检查优化器、调度器、数据游标和随机数状态;
- 无法改变 GPU 数量继续训练:不一定是备份失败,可能是分片拓扑不兼容,应按“原拓扑恢复或重新分片”的路径处理。
保留周期:按回退窗口而不是按文件数量决定
保留周期至少要覆盖三类需求:
- 故障恢复窗口:最近一段时间内可以快速回到可用状态;
- 实验回退窗口:发现数据、配置或训练策略问题后,可以回退到变更前;
- 版本交付窗口:已验收模型不会因为滚动清理被删除。
可以采用分层保留:
- 最近检查点:用于快速恢复,滚动保留;
- 周期检查点:用于跨时间点比较和回退;
- 变更前检查点:在数据、代码、并行策略或优化器发生变化前单独保留;
- 里程碑检查点:通过评估并准备交付的版本,按版本生命周期保留。
如果某训练任务需要覆盖七天,检查点间隔为两小时,那么周期检查点数量的估算就是七天内的时间点数量,再叠加变更前和里程碑版本。这个计算只是容量规划示例,不代表所有任务都应采用相同间隔。真正的保留数量还要根据单份检查点大小、副本数量、远端存储空间和恢复演练结果调整。
清理策略必须避开以下风险:
- 删除仍在上传或校验的检查点;
- 删除唯一一份通过恢复演练的版本;
- 只保留最新权重,却清理掉对应的优化器状态;
- 清理了模型文件,却保留无用的临时分片,造成容量判断失真;
- 按文件修改时间清理,误删里程碑版本。
任何自动清理任务都应先读取完成状态和保留标签,再执行删除;清理前应保留清单和操作日志,必要时先做一次目录级快照或远端版本保护。未经确认,不要使用通配符直接删除检查点目录。
用复测结果决定频率和算力配置
一套可执行的初始方案,应在小规模环境先完成以下闭环:
- 生成一份包含完整训练状态的检查点;
- 验证所有分片和校验值;
- 在隔离环境加载并记录恢复耗时;
- 用相同拓扑进行短程继续训练;
- 模拟保存中断、文件缺失和进程中断;
- 验证异常是否被识别,旧版本是否可用;
- 测量保存开销、存储增长和恢复耗时;
- 再决定正式训练的检查点间隔和保留数量。
如果保存耗时超过预设开销比,优先检查写入并发、分片数量、临时空间和远端存储吞吐,而不是盲目降低备份频率。如果恢复后训练步数、学习率或优化器状态不一致,增加检查点数量也不能解决问题,应先修复一致性。若恢复正确但超过 RTO,则需要优化恢复路径、提前准备环境或调整存储层级。
最终的决策边界可以归纳为:
- RPO 不达标:缩短检查点间隔,或增加关键事件触发;
- 保存开销过高:优化写入和分片策略,确认异步保存不会读取变化中的状态;
- RTO 不达标:提高恢复读取吞吐,减少人工步骤,并提前演练兼容拓扑;
- 恢复后指标异常:检查优化器、调度器、随机数和数据游标;
- 存储预算超限:调整保留层级和副本数量,但不能删除唯一可恢复版本;
- GPU 数量变化导致无法加载:先确认框架的重分片能力,不能把改变并行规模直接视为普通重启。
当一份检查点能够被完整校验、在预定拓扑或明确兼容的拓扑中加载、按同一训练步恢复关键状态、完成短程训练并再次生成新检查点时,才可以称为“可恢复检查点”。频率、保留周期和 GPU 算力配置,都应以这套验收结果为依据,而不是只看备份目录中有多少文件。