news 2026/6/10 16:19:20

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:51:26

如何提升响应质量?DeepSeek-R1-Distill-Qwen-1.5B top-p调参指南

如何提升响应质量&#xff1f;DeepSeek-R1-Distill-Qwen-1.5B top-p调参指南 你有没有遇到过这样的情况&#xff1a;明明用的是同一个模型&#xff0c;别人生成的代码逻辑清晰、数学推导严谨&#xff0c;而你输入相似提示词&#xff0c;结果却绕来绕去、关键步骤缺失&#xff…

作者头像 李华
网站建设 2026/6/10 11:53:08

Mac Mouse Fix技术解析:重构第三方鼠标在macOS的输入体验

Mac Mouse Fix技术解析&#xff1a;重构第三方鼠标在macOS的输入体验 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 诊断输入瓶颈&#xff1a;macOS外设兼…

作者头像 李华
网站建设 2026/6/10 11:52:22

verl在电商客服中的应用:自动化应答落地方案

verl在电商客服中的应用&#xff1a;自动化应答落地方案 随着电商平台的快速发展&#xff0c;用户对客服响应速度、服务质量和个性化体验的要求日益提升。传统人工客服面临人力成本高、响应不及时、服务质量波动等问题&#xff0c;而基于大语言模型&#xff08;LLM&#xff09…

作者头像 李华
网站建设 2026/6/10 11:53:06

Qwen3-Embedding-4B部署报错?显存溢出解决方案实战

Qwen3-Embedding-4B部署报错&#xff1f;显存溢出解决方案实战 当你第一次尝试在本地或服务器上部署 Qwen3-Embedding-4B 模型时&#xff0c;很可能遇到一个非常典型、又让人抓狂的问题&#xff1a;服务启动失败&#xff0c;日志里反复出现类似 CUDA out of memory、OOM when …

作者头像 李华
网站建设 2026/6/10 11:52:26

3大核心技术解决Mac鼠标痛点:Mac Mouse Fix深度技术测评

3大核心技术解决Mac鼠标痛点&#xff1a;Mac Mouse Fix深度技术测评 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 问题诊断&#xff1a;第三方鼠标在macO…

作者头像 李华
网站建设 2026/6/10 13:35:08

Final h-encore:PS Vita一键破解工具,实现全固件兼容系统解锁

Final h-encore&#xff1a;PS Vita一键破解工具&#xff0c;实现全固件兼容系统解锁 【免费下载链接】finalhe Final h-encore, a tool to push h-encore exploit for PS VITA/PS TV automatically 项目地址: https://gitcode.com/gh_mirrors/fi/finalhe Final h-encor…

作者头像 李华