当前位置: 首页 > news >正文

YOLO26训练中断恢复:resume=True正确用法

YOLO26训练中断恢复:resume=True正确用法

在实际模型训练过程中,遇到显存不足、服务器断电、误操作终止或临时调整超参等意外情况,导致训练中途停止,是再常见不过的事。很多用户发现——重新从头开始训练不仅浪费大量时间,更可能让前期收敛的权重白白丢失。YOLO26 官方训练框架已原生支持断点续训(resume),但真正用对、用稳、不踩坑,需要理解几个关键细节:它不是简单把resume=False改成True就能跑通

本文聚焦一个高频却易错的操作:如何在 YOLO26 官方镜像环境下,安全、可靠、零偏差地启用resume=True实现训练中断恢复。不讲抽象原理,只说你执行时必须确认的每一步;不堆参数列表,只告诉你哪些字段必须一致、哪些路径不能动、哪些日志文件决定成败。所有操作均基于你正在使用的「YOLO26 官方版训练与推理镜像」实测验证。


1. 断点续训的前提:你必须先有“断点”

resume=True不是魔法开关,它依赖一个明确存在的“上一次训练现场”。这个现场由三部分构成,缺一不可:

  • 完整的runs/train/xxx/训练输出目录(含weights/last.ptargs.yamlresults.csv等)
  • 原始训练命令中所有关键参数(尤其是datacfgbatchimgszepochs)必须与续训命令严格一致
  • 训练所用的 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.yamlresume: false(这是正常现象,无需修改),说明断点就绪。

❌ 如果weights/目录为空,或last.pt文件大小小于 10MB(明显异常),请勿继续,需排查上次训练是否真的成功保存。

2.2 修改 train.py:仅改一处,其他全保留

打开你自己的train.py,找到model.train(...)这一行。唯一需要修改的,是将resume=False改为resume=True。其余所有参数,包括dataimgszbatchepochsprojectname,必须与中断前完全一致。

你原来的代码是:

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 后暂停并验证:

  1. 检查results.csv是否追加新行

    tail -n 5 runs/train/exp/results.csv

    最后几行应显示epoch列为88,89,90…,且box_loss等指标延续下降趋势,而非突变。

  2. 检查weights/目录时间戳

    ls -lt runs/train/exp/weights/

    last.ptbest.pt的修改时间应为当前时间,且文件大小稳定增长(非 0 字节)。

  3. 对比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.pt
    ( 仅限紧急恢复,精度可能略低于原last.pt

3.2 错误:AssertionError: Dataset 'xxx/data.yaml' not found

原因:续训时data.yaml被移动、重命名,或路径中包含中文/空格。
解法

  • train.py中,data=r'data.yaml'的路径必须是相对于train.py所在目录的相对路径
  • 确保data.yamltrain.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.pymodel.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必须与中断前完全一致,这是定位断点的唯一坐标;
  • 参数铁律dataimgszbatchepochs等核心配置不得变更,否则框架无法对齐训练状态;
  • 文件铁律weights/last.pt是唯一可信锚点,保护它,就是保护你的训练进度。

当你在镜像中执行python train.py并看到Resuming training from...的那一刻,你不是在重启一个任务,而是在延续一段已经付出的时间、算力与耐心。这正是工程实践中最朴素也最珍贵的确定性。


获取更多AI镜像

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

http://www.cnnetsun.cn/news/763808.html

相关文章:

  • 通义千问3-14B实战教程:JSON输出与函数调用完整配置
  • AssetRipper探索指南:从入门到精通的资源解析之旅
  • 零基础入门YOLOv9:官方镜像保姆级使用教程
  • 为什么TurboDiffusion启动失败?镜像环境问题解决指南
  • 从部署到生成:Live Avatar数字人全流程实战记录
  • 企业级应用首选!YOLOv13镜像稳定可靠
  • 测试开机启动脚本使用心得:稳定可靠易修改
  • Qwen儿童图像模型性能评测:GPU利用率优化实战分析
  • FSMN-VAD + Gradio,网页界面超易用
  • Sambert模型版本管理:多版本共存部署实战技巧
  • 区块链3.0时代:技术成熟度与价值互联网的构建路径
  • 企业私有化部署:Qwen2.5-7B定制模型安全方案
  • NewBie-image-Exp0.1核心组件解析:Diffusers集成部署使用教程
  • 解锁第三方鼠标潜能:Mac Mouse Fix让你的鼠标在macOS上焕发新生
  • Voice Sculptor核心优势解析|基于LLaSA和CosyVoice2的语音合成实战
  • 3个维度解析3dgrut:重新定义三维渲染性能边界
  • 支持术语干预与上下文翻译|HY-MT1.5-7B镜像快速上手教程
  • 如何从零搭建专业无人机仿真系统?
  • Z-Image-Turbo使用心得:指令遵循能力超预期
  • 基于YOLOv12官版镜像的工业质检实战分享
  • 如何让炉石传说效率提升300%?HsMod插件全场景应用指南
  • Emotion2Vec+ Large镜像常见问题全解,新手必看FAQ
  • 磁盘清理工具Czkawka:拯救你的“数字囤积症“
  • 3步实现Linux运行macOS:基于KVM技术的轻量级虚拟化方案
  • 前后端分离公交线路查询系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • NewBie-image-Exp0.1性能瓶颈分析:GPU利用率低的五个常见原因
  • NewBie-image-Exp0.1自动化脚本:用Python批量生成动漫图像教程
  • macOS第三方鼠标优化工具:彻底解决兼容性问题的完整方案
  • 3步让普通鼠标获得苹果级体验:Mac Mouse Fix优化指南
  • YOLOv10官版镜像打造可复现的AI实验环境