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.pt和runs/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 15YOLOv9会自动检测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.yaml和hyp.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件事的组合:
- 识别信号:通过
last.pt和args.yaml是否存在,快速判断续训可行性; - 精准复刻:用
--resume路径+原始参数,确保训练状态无缝衔接; - 主动防御:通过
--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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。