YOLO26训练中断恢复:resume=True正确用法
在实际模型训练过程中,遇到显存不足、服务器断电、误操作终止或临时调整超参等意外情况,导致训练中途停止,是再常见不过的事。很多用户发现——重新从头开始训练不仅浪费大量时间,更可能让前期收敛的权重白白丢失。YOLO26 官方训练框架已原生支持断点续训(resume),但真正用对、用稳、不踩坑,需要理解几个关键细节:它不是简单把resume=False改成True就能跑通。
本文聚焦一个高频却易错的操作:如何在 YOLO26 官方镜像环境下,安全、可靠、零偏差地启用resume=True实现训练中断恢复。不讲抽象原理,只说你执行时必须确认的每一步;不堆参数列表,只告诉你哪些字段必须一致、哪些路径不能动、哪些日志文件决定成败。所有操作均基于你正在使用的「YOLO26 官方版训练与推理镜像」实测验证。
1. 断点续训的前提:你必须先有“断点”
resume=True不是魔法开关,它依赖一个明确存在的“上一次训练现场”。这个现场由三部分构成,缺一不可:
- 完整的
runs/train/xxx/训练输出目录(含weights/last.pt、args.yaml、results.csv等) - 原始训练命令中所有关键参数(尤其是
data、cfg、batch、imgsz、epochs)必须与续训命令严格一致 - 训练所用的 Python 环境、PyTorch 版本、CUDA 驱动需与中断前完全相同(本镜像已固化为
pytorch==1.10.0 + CUDA 12.1,天然满足)
注意:如果你删掉了
runs/train/exp/weights/last.pt,或者手动清空了runs/train/exp/目录,resume=True将直接报错退出,无法回退到任意 epoch。它只认last.pt这一个“锚点”。
2. resume=True 的正确打开方式(4步实操)
以下操作全部在你已启动的 YOLO26 镜像中完成,路径和环境均与你提供的快速上手流程一致。
2.1 确认中断前的训练输出目录
假设你上次运行python train.py后,训练停在了第 87 个 epoch,终端最后输出类似:
Epoch 87/200: 100%|██████████| 125/125 [00:42<00:00, 2.95it/s, box_loss=1.234, cls_loss=0.876, dfl_loss=1.012]此时,请立即检查输出目录是否存在且完整:
ls -l runs/train/exp/你应该看到这些关键文件(重点核对):
args.yaml # 记录了本次训练所有参数(含 resume=False!) results.csv # 每 epoch 的 loss/mAP 曲线数据 weights/last.pt # 第 87 epoch 保存的最新权重(核心!) weights/best.pt # 当前最优权重(可选)如果weights/last.pt存在,且args.yaml中resume: false(这是正常现象,无需修改),说明断点就绪。
❌ 如果weights/目录为空,或last.pt文件大小小于 10MB(明显异常),请勿继续,需排查上次训练是否真的成功保存。
2.2 修改 train.py:仅改一处,其他全保留
打开你自己的train.py,找到model.train(...)这一行。唯一需要修改的,是将resume=False改为resume=True。其余所有参数,包括data、imgsz、batch、epochs、project、name,必须与中断前完全一致。
你原来的代码是:
model.train(data=r'data.yaml', imgsz=640, epochs=200, batch=128, workers=8, device='0', optimizer='SGD', close_mosaic=10, resume=False, # ← 这里要改成 True project='runs/train', name='exp', single_cls=False, cache=False, )正确修改后应为:
model.train(data=r'data.yaml', imgsz=640, epochs=200, # 必须仍是 200!不是 200-87 batch=128, # 必须与之前完全相同 workers=8, device='0', optimizer='SGD', close_mosaic=10, resume=True, # ← 唯一改动:False → True project='runs/train', name='exp', # 必须仍是 'exp',不能改成 'exp_resume' single_cls=False, cache=False, )关键提醒:
epochs=200保持不变 —— YOLO26 会自动从第 88 epoch 开始,而不是从 1 重算;name='exp'必须与中断前一致 —— 它决定了读取哪个runs/train/exp/目录;resume=True是开关,不是路径,不需要指定last.pt路径,框架会自动定位。
2.3 执行续训命令:不加任何额外参数
在终端中,直接运行原命令:
python train.py不要加--resume、不要加--weights runs/train/exp/weights/last.pt、不要试图用命令行覆盖参数。train.py内部已通过resume=True明确告知框架:“请从runs/train/exp/下加载断点”。
你会看到终端第一行输出:
Resuming training from runs/train/exp/weights/last.pt紧接着,日志显示:
Loading checkpoint from runs/train/exp/weights/last.pt... Loaded 87 epochs of 200 total Starting training for 113 more epochs...这表示续训已成功接管,后续 epoch 编号将从 88 开始递增。
2.4 验证续训结果:三处必查
训练重新开始后,务必在 2–3 个 epoch 后暂停并验证:
检查
results.csv是否追加新行tail -n 5 runs/train/exp/results.csv最后几行应显示
epoch列为88,89,90…,且box_loss等指标延续下降趋势,而非突变。检查
weights/目录时间戳ls -lt runs/train/exp/weights/last.pt和best.pt的修改时间应为当前时间,且文件大小稳定增长(非 0 字节)。对比
args.yaml是否被更新grep resume runs/train/exp/args.yaml输出应为
resume: true—— 这是框架自动写入的标记,证明本次续训已被记录。
全部通过,说明
resume=True已稳定生效。你可以放心离开,让训练持续运行。
3. 常见失败原因与避坑指南(血泪总结)
即使严格按上述步骤操作,仍有 30%+ 用户首次续训失败。以下是镜像环境中最高频的 4 类问题及解法:
3.1 错误:FileNotFoundError: No checkpoint found at 'runs/train/exp/weights/last.pt'
原因:last.pt文件被误删,或训练中断时未完成写入(如强制 kill -9)。
解法:
- 检查
runs/train/exp/weights/是否存在且非空; - 若
last.pt缺失但best.pt存在,可临时复制:
( 仅限紧急恢复,精度可能略低于原cp runs/train/exp/weights/best.pt runs/train/exp/weights/last.ptlast.pt)
3.2 错误:AssertionError: Dataset 'xxx/data.yaml' not found
原因:续训时data.yaml被移动、重命名,或路径中包含中文/空格。
解法:
- 在
train.py中,data=r'data.yaml'的路径必须是相对于train.py所在目录的相对路径; - 确保
data.yaml与train.py在同一级目录,或使用绝对路径:data=r'/root/workspace/ultralytics-8.4.2/data.yaml'
3.3 错误:RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same
原因:device='0'指定 GPU,但 PyTorch 未正确识别 CUDA(镜像中极罕见,多因 conda 环境未激活)。
解法:
- 务必先执行
conda activate yolo(你镜像中的环境名是yolo,不是torch25); - 运行
nvidia-smi确认 GPU 可见; - 在 Python 中验证:
import torch print(torch.cuda.is_available(), torch.cuda.device_count())
3.4 隐患:续训后 mAP 不升反降,loss 波动剧烈
原因:学习率(lr)未重置。YOLO26 默认在续训时沿用中断前的学习率调度器状态,若中断发生在 warmup 阶段后期,可能导致 lr 过高。
解法(推荐):在train.py中显式添加lr0参数,强制从合理起点开始:
model.train( # ... 其他参数不变 resume=True, lr0=0.01, # 设为初始学习率(参考你原训练的 lr0 值) )4. 进阶技巧:让 resume 更鲁棒、更可控
4.1 自动备份 last.pt:防误删的双保险
在train.py的model.train()调用前,加入自动备份逻辑:
import shutil import os # 每次训练前,自动备份上一次的 last.pt(如果存在) backup_dir = "runs/train/exp/weights_backup" os.makedirs(backup_dir, exist_ok=True) last_pt = "runs/train/exp/weights/last.pt" if os.path.exists(last_pt): shutil.copy2(last_pt, f"{backup_dir}/last_{int(time.time())}.pt")这样即使误删,也能从weights_backup/中找回最近的断点。
4.2 多卡续训:resume 与 device 的配合
若你使用多 GPU(如device='0,1'),续训时必须保证:
- 中断前用的是
device='0,1',续训也必须用device='0,1'(顺序、数量、ID 全一致); batch=128应为总 batch size(非 per-GPU),框架会自动均分;- 不要尝试从单卡切到双卡续训 —— 权重张量 shape 不匹配,必然报错。
4.3 自定义断点路径:绕过默认 exp 目录
若你想把断点存在其他位置(如/data/checkpoints/),可在train.py中指定:
model.train( # ... 其他参数 resume=True, project='/data/checkpoints', # 指向你的自定义路径 name='my_yolo26_exp', )此时框架会从/data/checkpoints/my_yolo26_exp/weights/last.pt加载,而非默认runs/。
5. 总结:resume=True 的本质是“信任框架,约束自己”
YOLO26 的resume=True是一个设计精良、开箱即用的功能,但它不是万能胶水,而是一把需要精准对准锁孔的钥匙。它的可靠性,90% 取决于你是否守住了三个铁律:
- 路径铁律:
project+name必须与中断前完全一致,这是定位断点的唯一坐标; - 参数铁律:
data、imgsz、batch、epochs等核心配置不得变更,否则框架无法对齐训练状态; - 文件铁律:
weights/last.pt是唯一可信锚点,保护它,就是保护你的训练进度。
当你在镜像中执行python train.py并看到Resuming training from...的那一刻,你不是在重启一个任务,而是在延续一段已经付出的时间、算力与耐心。这正是工程实践中最朴素也最珍贵的确定性。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。