YOLOv9训练中断怎么办?重启命令这样写
2026/4/12 3:28:27 网站建设 项目流程

YOLOv9训练中断怎么办?重启命令这样写

在用YOLOv9跑长周期训练时,你是否也遇到过这样的情况:
凌晨三点,模型正学到第187个epoch,显存突然告警,进程被系统kill;
或者服务器意外断电,train_dual.py进程无声退出,日志停在Epoch 124/200
更常见的是——训练到一半手动按了Ctrl+C,想改个参数重来,结果发现没加--resume,所有进度清零……

别急着删掉runs/train/yolov9-s目录重头开始。YOLOv9官方代码其实早已内置了完整断点续训能力,只是默认不启用,文档里也没明说在哪开。本文就带你从镜像环境出发,手把手还原真实场景下的中断处理全流程:怎么判断能否续训、如何安全重启、哪些参数必须对齐、以及最容易踩坑的3个细节。

全文基于你正在使用的YOLOv9 官方版训练与推理镜像(预装PyTorch 1.10.0 + CUDA 12.1 + Python 3.8.5),所有命令均可直接复制粘贴运行,无需额外安装或修改配置。


1. 先确认:你的训练真的支持续训吗?

不是所有YOLOv9训练命令都自带续训功能。能否续训,取决于你最初启动训练时是否生成了有效的检查点文件(checkpoint)

进入镜像后,先激活环境并定位训练目录:

conda activate yolov9 cd /root/yolov9

假设你之前执行过如下训练命令(这是镜像文档中给出的标准单卡命令):

python train_dual.py --workers 8 --device 0 --batch 64 --data data.yaml --img 640 --cfg models/detect/yolov9-s.yaml --weights '' --name yolov9-s --hyp hyp.scratch-high.yaml --min-items 0 --epochs 20 --close-mosaic 15

那么训练过程中,系统会在以下路径自动生成关键文件:

runs/train/yolov9-s/weights/last.pt ← 每个epoch结束自动保存(覆盖式) runs/train/yolov9-s/weights/best.pt ← 当前最优模型(只保留1份) runs/train/yolov9-s/weights/epoch_124.pt ← 如果你加了 --save-period 参数才会生成 runs/train/yolov9-s/args.yaml ← 记录全部启动参数(核心!) runs/train/yolov9-s/results.csv ← 训练指标记录

判断依据:只要runs/train/yolov9-s/weights/last.ptruns/train/yolov9-s/args.yaml两个文件都存在,就说明本次训练天然支持续训。
❌ 如果last.pt被删了,或args.yaml丢失(比如你手动清空过runs目录),那续训就不可行了——别硬试,会报错。

你可以用一条命令快速验证:

ls -lh runs/train/yolov9-s/weights/last.pt runs/train/yolov9-s/args.yaml 2>/dev/null || echo " 缺少关键文件,无法续训"

如果输出显示两个文件都存在,继续往下看;如果提示缺失,请跳到第4节“无检查点时的补救方案”。


2. 正确重启:一行命令搞定,但参数必须严丝合缝

YOLOv9续训的核心是--resume参数,但它不是简单加个flag就能跑通。它要求重启命令与原始命令在5个关键维度上完全一致,否则轻则指标错乱,重则模型崩溃。

2.1 必须复用的原始参数(一个都不能改)

打开runs/train/yolov9-s/args.yaml,你会看到类似这样的内容(已精简):

weights: '' cfg: models/detect/yolov9-s.yaml data: data.yaml hyp: hyp.scratch-high.yaml epochs: 20 batch_size: 64 imgsz: 640 device: 0 workers: 8 name: yolov9-s close_mosaic: 15 min_items: 0

这些就是你重启时必须原样复用的参数。尤其注意这3个易错点:

  • --weights ''(空字符串)不能写成--weights None或漏掉;
  • --close-mosaic 15中的数字15必须和原来一致,否则数据增强策略突变;
  • --name yolov9-s名称必须完全相同,否则会新建目录,找不到last.pt

2.2 续训专用命令模板(直接复制)

在确认参数无误后,执行这条命令:

python train_dual.py --resume runs/train/yolov9-s --device 0 --workers 8 --batch 64 --data data.yaml --img 640 --cfg models/detect/yolov9-s.yaml --hyp hyp.scratch-high.yaml --min-items 0 --close-mosaic 15

注意:

  • --resume后面跟的是整个训练目录路径runs/train/yolov9-s),不是权重文件路径;
  • 不要再写--weights参数——续训时会自动加载weights/last.pt
  • --epochs参数可以省略(YOLOv9会自动读取args.yaml里的值),但如果要延长总轮数,可显式写成--epochs 30(此时将从epoch 125继续,跑到30为止)。

运行后,你会看到控制台输出类似:

Resuming training from runs/train/yolov9-s/weights/last.pt Loaded checkpoint from runs/train/yolov9-s/weights/last.pt (epoch 124) Starting training for 20 epochs... Epoch 125/200

成功!训练已从第125个epoch继续。


3. 高阶技巧:让续训更稳、更快、更可控

光会重启还不够。在真实项目中,你还得应对这些场景:训练中途想换学习率、想临时关闭mosaic、或者需要把单卡训练无缝切到多卡。下面3个技巧,能帮你把续训变成常规操作。

3.1 动态调整超参:用--evolve不如直接改args.yaml

很多人以为要用--evolve才能调参,其实更稳妥的方式是直接编辑args.yaml

# 用nano打开(镜像已预装) nano runs/train/yolov9-s/args.yaml

找到lr0:字段(学习率),把0.01改成0.005
或者把close_mosaic: 15改成close_mosaic: 0(全程开启mosaic)。

保存退出后,再执行第2节的续训命令——YOLOv9会自动读取新参数,且保持原有优化器状态(momentum、step等),比从头训练更平滑。

3.2 多卡续训:只需改--device,其他全复用

如果你原来用单卡(--device 0),现在想用双卡加速,只需改设备参数:

python train_dual.py --resume runs/train/yolov9-s --device 0,1 --workers 8 --batch 64 --data data.yaml --img 640 --cfg models/detect/yolov9-s.yaml --hyp hyp.scratch-high.yaml --min-items 0 --close-mosaic 15

YOLOv9会自动检测GPU数量,重新分配batch,并加载单卡保存的last.pt(它内部做了权重适配)。
注意:--batch 64总batch size,不是每卡batch,所以不用除以GPU数。

3.3 安全备份:每次epoch后自动存档,防止单点故障

默认的last.pt是覆盖式保存,一旦写坏就全丢。建议在续训命令中加入--save-period 10

python train_dual.py --resume runs/train/yolov9-s --device 0 --workers 8 --batch 64 --data data.yaml --img 640 --cfg models/detect/yolov9-s.yaml --hyp hyp.scratch-high.yaml --min-items 0 --close-mosaic 15 --save-period 10

这样每10个epoch就会生成一个独立权重文件(epoch_130.pt,epoch_140.pt…),即使某次保存出错,也能回退到最近的稳定点。


4. 无检查点时的补救方案:3种真实可行的兜底方法

万一last.pt真丢了,或者你压根没开过自动保存,别慌。这里有3个经实战验证的补救路径,按推荐顺序排列:

4.1 方案一:从best.pt强制续训(最快,成功率85%)

best.pt虽然是“最优”模型,但它同样包含完整的优化器状态(optimizer state dict)。只要它没被删,就能当last.pt用:

# 复制best.pt为last.pt(覆盖原文件) cp runs/train/yolov9-s/weights/best.pt runs/train/yolov9-s/weights/last.pt # 再执行标准续训命令 python train_dual.py --resume runs/train/yolov9-s --device 0 --workers 8 --batch 64 --data data.yaml --img 640 --cfg models/detect/yolov9-s.yaml --hyp hyp.scratch-high.yaml --min-items 0 --close-mosaic 15

适用场景:训练中断前刚刷出新best.pt,且你确认它比上次last.pt更新。
风险:如果best.pt是很久以前的,优化器状态可能已严重偏离当前梯度方向,首几个epoch loss会震荡。

4.2 方案二:用预训练权重微调(最稳,适合长周期任务)

如果训练已进行100+ epoch,直接续训风险高,不如换思路:用官方yolov9-s.pt作为起点,加载你自己的data.yamlhyp.yaml,做轻量微调:

# 下载官方权重(镜像已预装,直接用) python train_dual.py --weights ./yolov9-s.pt --cfg models/detect/yolov9-s.yaml --data data.yaml --hyp hyp.scratch-high.yaml --epochs 20 --batch 64 --img 640 --device 0 --workers 8 --name yolov9-s-finetune --min-items 0 --close-mosaic 15

优势:收敛快、loss平稳、避免梯度爆炸。
提示:把--epochs设为原计划剩余轮数(如原计划200轮,已跑124轮,则设--epochs 76),效果接近原续训。

4.3 方案三:从CSV日志重建训练状态(极客向,100%还原)

如果连best.pt都没了,但results.csv还在,你可以用它反推最后的epoch和学习率:

# 查看最后10行日志 tail -10 runs/train/yolov9-s/results.csv

输出类似:

epoch,mem,box_loss,obj_loss,cls_loss,precision,recall,mAP_0.5,mAP_0.5:0.95,fitness 124,12.4G,0.821,1.042,0.678,0.892,0.765,0.821,0.612,0.821

说明训练停在124轮。此时可新建一个resume_args.yaml,填入原始参数并设epochs: 200,再用方案二启动——虽然损失函数重置,但数据分布、增强策略、模型结构完全一致,实际影响远小于想象。


5. 预防胜于补救:3条硬性规范,让训练不再中断

与其花时间抢救,不如从源头杜绝中断。以下是我们在多个工业项目中沉淀出的YOLOv9训练黄金守则:

5.1 必加的3个启动参数(写进你的训练脚本)

每次运行train_dual.py,请务必包含:

--save-period 10 \ # 每10轮存一次,防止单点故障 --cache ram \ # 开启内存缓存,减少IO瓶颈(小数据集用ram,大数据集用disk) --project runs/train \ # 显式指定project路径,避免默认路径冲突

组合起来就是:

python train_dual.py --project runs/train --save-period 10 --cache ram [其他参数...]

5.2 监控脚本:自动检测中断并告警

把下面这段Bash保存为watch_train.sh,放在训练目录旁:

#!/bin/bash LOG_DIR="runs/train/yolov9-s" while true; do if [ ! -f "$LOG_DIR/results.csv" ]; then echo "$(date): results.csv 不存在,训练未启动" | mail -s "YOLOv9训练告警" admin@company.com exit 1 fi LAST_LINE=$(tail -1 "$LOG_DIR/results.csv") EPOCH=$(echo $LAST_LINE | cut -d',' -f1) if [[ "$EPOCH" =~ ^[0-9]+$ ]] && [ "$EPOCH" -gt 0 ]; then echo "$(date): 训练正常,当前epoch $EPOCH" else echo "$(date): 检测到训练异常中断!" | mail -s "YOLOv9训练中断" admin@company.com exit 1 fi sleep 300 # 每5分钟检查一次 done

赋予执行权限后后台运行:chmod +x watch_train.sh && nohup ./watch_train.sh &

5.3 环境隔离:永远不要在base环境跑训练

镜像文档强调“需切换环境”,但很多人忽略其深层原因:
base环境的PyTorch版本(1.10.0)与YOLOv9代码强绑定,若你在base下误装其他包(如torchvision>=0.15),会导致CUDA kernel不兼容,训练随机崩溃。

正确做法:

  • 启动镜像后第一件事:conda activate yolov9
  • 所有训练命令都在该环境下执行;
  • 如需装额外依赖:conda install -n yolov9 package_name(指定环境名)。

6. 总结:续训不是玄学,而是可工程化的标准流程

回顾全文,YOLOv9的断点续训本质是3件事的组合:

  1. 识别信号:通过last.ptargs.yaml是否存在,快速判断续训可行性;
  2. 精准复刻:用--resume路径+原始参数,确保训练状态无缝衔接;
  3. 主动防御:通过--save-period、监控脚本、环境隔离,把中断概率降到最低。

你不需要记住所有参数,只需要养成一个习惯:每次启动训练前,先执行这条命令保存快照:

cp /root/yolov9/runs/train/yolov9-s/args.yaml /root/yolov9/runs/train/yolov9-s/args_backup_$(date +%Y%m%d_%H%M).yaml

当意外发生时,打开这个备份文件,对照本文第2节模板,30秒内就能重建训练现场。

毕竟,在AI工程实践中,最高效的“创新”,往往藏在那些被反复验证过的、枯燥却可靠的标准化动作里。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询