服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-09-15 更新于 2026-09-15 简米科技 4,844 字 12 分钟阅读

模型训练意外中断之后能不能从断点接着往下跑?断点续训怎么恢复

导读模型训练意外中断之后,在绝大多数情况下可以从断点接着往下跑,前提是你之前保存了包含模型权重、优化器状态和学习率调度器状态的检查点文件,并且这个文件在中断前已经完整写入磁盘,模型训练中断了能接着训练吗?先看断点里存了什么训练被中断,最常见的场景包括服务器突然断电、显存被其他任务挤爆、训练脚本崩溃,或者你自己手滑按……

模型训练意外中断之后,在绝大多数情况下可以从断点接着往下跑,前提是你之前保存了包含模型权重、优化器状态和学习率调度器状态的检查点文件,并且这个文件在中断前已经完整写入磁盘。

模型训练中断了能接着训练吗?先看断点里存了什么

训练被中断,最常见的场景包括服务器突然断电、显存被其他任务挤爆、训练脚本崩溃,或者你自己手滑按了 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、学习率、优化器类型,这些变了,续训效果会打折。
  • 多卡训练时,注意检查点是否使用了 DataParallelDistributedDataParallel 包装,保存和加载前最好统一使用

    模型训练意外中断之后能不能从断点接着往下跑?断点续训怎么恢复

    model.module 方式处理。

  • 检查随机种子是否保存,如果数据加载使用随机打乱,种子不同会导致每个 epoch 的数据顺序变化,虽然不影响最终结果,但无法精确复现中断前状态。
  • 如果使用混合精度训练,还要检查 AMP 的 scaler 状态是否保存,部分框架需要显式保存 amp.scaler.state_dict(),否则恢复后梯度缩放因子会重置,训练初期可能出现数值不稳定。

常见误区:保存越频繁越好吗?

不一定,保存检查点需要把模型权重和优化器状态从 GPU 显存拷到 CPU 内存,再写入磁盘,对于参数量很大的模型,这个过程会占用不少时间,每 10 分钟保存一次听起来很安全,可能让训练速度明显下降。行业共识认为,保存频率应该和训练总时长以及单次保存成本匹配。 一个小时的训练任务,每 5 到 10 分钟保存一次可以接受;一个星期的预训练任务,每小时或每几千步保存一次更合理。

另一个误区是只保留一个检查点文件,反复覆盖写入,如果恰好在保存过程中断电,这个唯一的文件可能损坏,建议使用轮换保存策略,保留最近 2 到 3 个检查点,checkpoint_epoch_10.ptcheckpoint_epoch_11.ptcheckpoint_epoch_12.pt,这样即使最新文件坏掉,也能退回上一个。

Q&A:模型训练中断恢复相关疑问

断电后模型训练能接着跑吗?

大多数情况下可以,断电前最后一次成功写入的检查点文件仍然有效,恢复时加载该检查点,把 start_epoch 设置为保存时的 epoch 加 1,然后继续训练即可,唯一的风险是文件系统损坏导致最近一次检查点不完整,所以建议同时保留最近 2 到 3 个检查点,不要只覆盖同一个文件。

没有保存检查点还能恢复吗?

不能,如果训练过程中从未保存过任何检查点,进程中断后内存中的数据全部丢失,无法恢复训练状态,这也是为什么长训练任务必须从一开始就写好保存逻辑,没有检查点,断点续训无从谈起。

断点续训做多了会损伤模型吗?

不会,断点续训只是从保存的状态继续优化,本质上和一次长训练没有区别,只要每次保存和加载都正确,不会引入额外噪声或损伤模型权重,真正可能影响效果的是频繁从不同超参数状态续训,导致训练轨迹不连贯,但这不是断点续训本身的问题。

别再担心训练中断是不是灾难,保存好完整的检查点,中断之后从断点接着跑,只是训练流程里的常规操作,真正要避免的,是从来不保存检查点。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱