tensorflow/models 训练中断后如何从 checkpoint 继续训练并避免学习率曲线偏移?
【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models
在 TensorFlow Model Garden(tensorflow/models仓库)里用official/vision的 TFM 训练框架跑图像分类、语义分割等任务时,训练作业可能因 TPU 抢占、作业被手动停止等原因中断。恢复的关键只有一条:让新作业落在同一个model_dir,并且不要改动原来的步数与学习率调度配置。本文基于仓库内的 FAQ、优化文档、运行时配置文档 和 训练驱动源码,给出中断后继续训练的操作路径,以及学习率(LR)曲线发生偏移的原因与规避方法。
中断点在哪里:checkpoint 保存在 model_dir
TFM 的 checkpoint 机制由 train_lib.py 管理:训练器把 checkpoint 写入model_dir,并通过tf.train.CheckpointManager按配置里的trainer.checkpoint_interval(每多少步存一次)周期保存。因此中断发生后,model_dir里最新的那份 checkpoint 就是恢复训练的起点,不需要额外导出或拷贝权重。
多 worker 场景有一个前提要注意:运行时配置文档 说明worker_hosts只有第一个 host 会写 TensorBoard Summaries 并保存 checkpoint,恢复时确认作业仍由该节点承担保存职责。
最短路径:同一 model_dir 重跑原命令
恢复训练的最小操作是用原配置原样重跑训练命令。FAQ 中对"已经跑了 30k 步、想从断点继续"的场景给出的方案是:
model_dir设为原训练目录(直接重跑即生效);或init_checkpoint设为最后一次保存的 checkpoint(换目录时使用,见下文可选分支)。
以仓库 starter 示例展示的本地训练命令为模板,重跑时只要求--experiment、--config_file、--model_dir与中断前一致:
# 假设当前位于 official/vision/examples 目录下 python3 starter/train.py \ --experiment=tf_vision_example_experiment \ --config_file=${PWD}/example/example_config_local.yaml \ --mode=train \ --model_dir=/tmp/tfvision_test/命令中的${PWD}是文档原样给出的 shell 变量,取当前工作目录;--experiment和--model_dir按你自己实验的注册名和实际目录替换。用official/vision/train.py正式驱动时参数形式相同(必填项为experiment、mode、model_dir,配置经--gin_file/--gin_params传入)。
如果中断的原因是 TPU 抢占,train.py 内置了恢复循环:捕获到抢占导致的tf.errors.OpError后,打印Some TPU workers had been preempted ... retarting training from the last checkpoint...并自动从最后一个 checkpoint 重启训练,无需人工干预;作业整体挂掉后按上面的命令重跑即可走同一条恢复路径。
可选分支:换新 model_dir,用 init_checkpoint 指回旧 checkpoint
FAQ 明确指出一个边界:在同一个 model_dir 继续训练会覆盖旧运行的 checkpoint——因为只保留最后 5 个。所以 FAQ 的建议是:如果打算在旧 checkpoint 上做微调类实验,开一个新的 model_dir,并用以下 task 级配置指回旧 checkpoint(FAQ Q2/Q3):
task: init_checkpoint: <旧 model_dir 中最后一次保存的 checkpoint 路径> init_checkpoint_modules: 'all'init_checkpoint_modules取all时加载 checkpoint 的全部权重;对检测和分割任务还可以只加载backbone或decoder,其余权重从头初始化。该分支适合"旧实验保留原样、新实验在其之上继续"的诉求;单纯想接着跑完原定训练步数时,优先使用上一节的同目录重跑。
避免学习率曲线偏移:保持步数与调度配置不变
LR 偏移的根因在 FAQ Q15 里说得很直接:"After you modify the training steps, the LR curve will change."——修改训练步数后,LR 曲线会跟着改变。优化文档 进一步解释了机制:学习率调度以step为输入返回值(支持stepwise、polynomial、exponential、cosine、power及constant),并给出两条必须遵守的约束:
- Batch size:改变 batch size 通常需要同步调整学习率数值和训练步数;
- Train steps:
train_steps与调度字段(如 cosine/exponential 的decay_steps)强相关,"Changing one without changing the other might result in undesired behavior"(只改其一可能导致非预期行为)。
因此恢复训练时的操作规则是:trainer.train_steps和trainer.optimizer_config下的调度字段一个都不要改。这些字段的形态可以对照 runtime_configurations.md 给出的 ImageNet 示例:
trainer: optimizer_config: learning_rate: type: 'exponential' exponential: initial_learning_rate: 0.256 decay_steps: 780 decay_rate: 0.94 staircase: true warmup: type: 'linear' linear: warmup_steps: 1560上例数值取自文档中global_batch_size: 4096的配置组,仅用于展示字段结构。恢复训练时原样保留这些值;只有当文档建议的场景成立——例如加速器数量变化需要按 runtime_configurations.md "How to adjust according to different runtime configurations" 一节同步调整 batch size、步数和学习率——才成套修改,且必须同时改decay_steps等关联字段,不要只动train_steps。
验证:看 learning_rate 的 summary 是否按原调度走
恢复后有两个文档明确给出的观测点:
- LR 曲线本身:优化文档 说明学习率数值会按
trainer.summary_interval周期写入 summary。恢复训练后在 TensorBoard 中查看该标量序列,对照 YAML 里的调度参数(initial_learning_rate、decay_steps、warmup_steps等)确认曲线仍按原计划衰减,而不是在重启处出现跳变或重新 warmup。文档同时提醒:若warmup_steps小于summary_interval,warmup 阶段的数值不会出现在 summary 里,不要把它误判为异常。 - 恢复路径是否生效:TPU 抢占恢复时会输出
retarting training from the last checkpoint...日志(原文如此);手动重跑后则确认新作业的 checkpoint 仍写入同一model_dir,且按checkpoint_interval继续产生新 checkpoint。
限制说明
- 同一
model_dir只保留最后 5 个 checkpoint,继续训练会滚动覆盖旧运行的 checkpoint(FAQ Q15);需要长期保留旧运行产物时走"新 model_dir +init_checkpoint"分支。 - FAQ 中"修改训练步数后 LR 曲线会变化"是机制性警告,文档没有给出重算
decay_steps的公式;因此恢复场景的正确做法就是不改步数,而不是改完步数再人工补偿调度。 - 若希望训练过程中按指标自动导出最优 checkpoint,可在配置中使用
best_checkpoint_eval_metric属性(config_definitions.py,FAQ Q25),它指定 trainer 监控的评估指标,用于导出 best checkpoint;这与断点恢复是独立的可选配置。
【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考