模型训练意外中断之后,在绝大多数情况下可以从断点接着往下跑,前提是你之前保存了包含模型权重、优化器状态和学习率调度器状态的检查点文件,并且这个文件在中断前已经完整写入磁盘。
模型训练中断了能接着训练吗?先看断点里存了什么
训练被中断,最常见的场景包括服务器突然断电、显存被其他任务挤爆、训练脚本崩溃,或者你自己手滑按了 Ctrl+C,遇到这种情况,第一反应往往是:这几天的训练是不是白跑了?只要你在训练脚本里写过保存检查点的逻辑,并且最近一次保存成功完成,损失通常很小。
深度学习框架在设计时早就考虑到了长训练任务的不稳定性。多数情况下,断点续训并不是什么高级技巧,而是常规工程能力。 PyTorch、TensorFlow、PaddlePaddle 等主流框架都提供了保存和恢复训练状态的接口。
关键点在于“断点”里存了什么,一个完整的训练断点不应该只有模型参数,模型参数只是推理需要的部分,如果你想接着之前的进度训练,还得保存优化器状态、当前 epoch 数、学习率调度器状态,以及必要时的随机种子,这四样东西决定了你能否真正从断点处“无缝”继续。
哪些中断场景能恢复?
- 断电或系统崩溃:只要检查点文件已经落盘,并且文件系统没有损坏,恢复概率很高。
- 显存溢出(OOM):训练进程被异常终止,但之前保存的检查点仍然有效。
- 手动中断:即使你主动停止了训练,只要有检查点就能接着跑。
- 程序错误导致的退出:错误发生在保存之后,检查点通常可用;错误发生在保存过程中,则该次文件可能不完整。
断点续训怎么做:PyTorch保存与恢复的完整操作
这里以 PyTorch 为例,给出一个可以直接套用的保存和恢复流程,TensorFlow、PaddlePaddle 思路类似,只是接口名称不同。
保存时别只存权重
保存单个文件时,建议把训练相关的状态都打包进去,一个常见的写法如下:
import torch
checkpoint = {
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'scheduler_state_dict': scheduler.state_dict(),
'epoch': epoch,
'best_val_loss': best_val_loss,
'random_state': torch.random.get_rng_state()
}
torch.save(checkpoint, f'checkpoint_epoch_{epoch}.pt')
这里的小技巧是:把 epoch 和 best_val_loss 也存进去,这样恢复之后不用重新计算当前训练到了第几轮,早停逻辑也不会乱掉。

恢复时逐项加载
恢复训练的代码同样不复杂:
checkpoint = torch.load('checkpoint_epoch_10.pt')
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
scheduler.load_state_dict(checkpoint['scheduler_state_dict'])
start_epoch = checkpoint['epoch'] + 1
best_val_loss = checkpoint['best_val_loss']
torch.random.set_rng_state(checkpoint['random_state'])
然后你只需要把训练循环的起始轮次改成 start_epoch 即可,优化器状态恢复之后,Adam、SGD 等优化器里的动量、方差估计都会回到中断前的数值,训练曲线不会出现明显跳变。
学习率调度器也不能忘
很多人保存了模型和优化器,却漏掉学习率调度器,结果恢复之后学习率回到初始值,训练方向虽然没有大问题,但收敛节奏变了,对 CosineAnnealing、ReduceLROnPlateau 这类调度器来说,漏存之后影响更明显,所以保存 scheduler_state_dict 是必要的,不要因为省一行代码给自己找麻烦。
恢复后快速验证续训是否生效
恢复之后不要直接挂机跑几十个小时,先跑一个 batch,观察损失值与中断前最后一个 batch 的损失值是否接近,如果两者相差在个位数百分比以内,说明恢复成功,如果差距突然放大好几倍,多半是优化器状态没加载成功,或者模型权重和当前代码结构不匹配。
只存了模型权重,还能接着训练吗?
能,但要接受一点代价,如果你只保存了 model.state_dict(),没有存优化器状态,那么模型权重可以完整恢复,但是优化器内部的动量项、梯度平方累积值都会回到初始状态。
实际影响有多大?对于 SGD 带动量、Adam 这类依赖历史梯度的优化器,丢掉优化器状态意味着训练会有一个短暂的“重新热身”过程,损失值可能会出现小幅波动,但通常几步到几十步之后就能重新稳定。并不需要从头训练。 对于只跑了几十个 epoch 的任务,这点波动可以忽略;对于千卡级别的大模型预训练,丢失优化器状态可能会浪费一定算力,但也不会导致模型不可用。
TensorFlow/Keras的断点续训有什么不同?
TensorFlow 的生态里,断点续训通常依赖回调机制和自带保存格式,操作路径比 PyTorch 更“傻瓜化”。
ModelCheckpoint 回调自动保存
在 Keras 中训练时加入回调,就能周期性地保存检查点:
checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(
filepath='model_checkpoint.h5',
save_weights_only=False,
save_best_only=False,
save_freq='epoch'
)
model.fit(train_dataset, epochs=100, callbacks=[checkpoint_callback])

save_weights_only=False 表示保存完整模型,包括优化器状态和训练配置,中断后直接使用 tf.keras.models.load_model('model_checkpoint.h5') 就能恢复全部训练状态,然后继续调用 fit 即可,如果只保存了权重,就需要先重建模型结构再加载权重,优化器状态会丢失。
分布式训练中的注意点
使用 MirroredStrategy 或 MultiWorkerMirroredStrategy 时,检查点文件可能被写在多个 worker 的本地路径上,恢复前需要确认主检查点文件路径存在,并确保所有 worker 都能读取到同一个检查点。不要只从单个 worker 的临时目录里找文件,否则会出现部分 worker 从头开始、部分 worker 从断点开始的不同步问题。
训练中断后从断点继续跑,和重新训练的区别
| 对比项 | 从断点续训 | 重新从头训练 |
|---|---|---|
| 时间成本 | 只补齐中断到目标轮次 | 重复全部已消耗时间 |
| 收敛路径 | 在当前权重基础上继续优化 | 从随机初始化开始重新探索 |
| 优化器状态 | 可恢复动量、方差估计 | 全部重置 |
| 数据随机性 | 可保存随机种子保持一致 | 种子不同则数据顺序不同 |
| 适用场景 | 长任务、预训练、微调 | 实验验证、数据量很小 |
从表格可以看出,如果你关心的只是最终模型效果,而不是复现某次实验的精确轨迹,续训明显更划算。多数情况下,断点续训是默认选择,除非你怀疑之前训练已经跑偏或者代码有 bug。
模型训练中断怎么恢复:一个可操作的检查清单
恢复之前,按下面顺序过一遍,能避开大多数坑:
- 检查 checkpoint 文件大小是否异常,如果文件大小比上一次正常保存小很多,可能写入不完整,建议退回到更早的检查点。
- 确认保存时使用的模型结构没有改动,如果你改了网络定义,旧权重加载会报错,这时候只能部分加载。
- 确认训练脚本中的超参数没有改动,尤其是 batch size、学习率、优化器类型,这些变了,续训效果会打折。
- 多卡训练时,注意检查点是否使用了
DataParallel或DistributedDataParallel包装,保存和加载前最好统一使用方式处理。
model.module
- 检查随机种子是否保存,如果数据加载使用随机打乱,种子不同会导致每个 epoch 的数据顺序变化,虽然不影响最终结果,但无法精确复现中断前状态。
- 如果使用混合精度训练,还要检查 AMP 的 scaler 状态是否保存,部分框架需要显式保存
amp.scaler.state_dict(),否则恢复后梯度缩放因子会重置,训练初期可能出现数值不稳定。
常见误区:保存越频繁越好吗?
不一定,保存检查点需要把模型权重和优化器状态从 GPU 显存拷到 CPU 内存,再写入磁盘,对于参数量很大的模型,这个过程会占用不少时间,每 10 分钟保存一次听起来很安全,可能让训练速度明显下降。行业共识认为,保存频率应该和训练总时长以及单次保存成本匹配。 一个小时的训练任务,每 5 到 10 分钟保存一次可以接受;一个星期的预训练任务,每小时或每几千步保存一次更合理。
另一个误区是只保留一个检查点文件,反复覆盖写入,如果恰好在保存过程中断电,这个唯一的文件可能损坏,建议使用轮换保存策略,保留最近 2 到 3 个检查点,checkpoint_epoch_10.pt、checkpoint_epoch_11.pt、checkpoint_epoch_12.pt,这样即使最新文件坏掉,也能退回上一个。
Q&A:模型训练中断恢复相关疑问
断电后模型训练能接着跑吗?
大多数情况下可以,断电前最后一次成功写入的检查点文件仍然有效,恢复时加载该检查点,把 start_epoch 设置为保存时的 epoch 加 1,然后继续训练即可,唯一的风险是文件系统损坏导致最近一次检查点不完整,所以建议同时保留最近 2 到 3 个检查点,不要只覆盖同一个文件。
没有保存检查点还能恢复吗?
不能,如果训练过程中从未保存过任何检查点,进程中断后内存中的数据全部丢失,无法恢复训练状态,这也是为什么长训练任务必须从一开始就写好保存逻辑,没有检查点,断点续训无从谈起。
断点续训做多了会损伤模型吗?
不会,断点续训只是从保存的状态继续优化,本质上和一次长训练没有区别,只要每次保存和加载都正确,不会引入额外噪声或损伤模型权重,真正可能影响效果的是频繁从不同超参数状态续训,导致训练轨迹不连贯,但这不是断点续训本身的问题。
别再担心训练中断是不是灾难,保存好完整的检查点,中断之后从断点接着跑,只是训练流程里的常规操作,真正要避免的,是从来不保存检查点。