tools/train.py 会默默地捕获训练异常,并以代码 0 退出(通过 @logger.catch 但不重新抛出异常)
作者: HikeAndMap创建于 2026年9月2日更新于 2026年9月2日
`tools/train.py` 的 `main()` 被 loguru 的 `@logger.catch` 装饰,默认值为 `reraise=False`。在 `trainer.train()` 期间引发的任何异常 - 包括真正的训练崩溃 - 都会被捕获并记录到一个完整的诊断追踪,但随后被忽略:`main()` 正常返回,并且进程以状态码 0 退出。任何脚本、CI 流水线或包装工具驱动 `train.py` 并检查其退出代码都无法区分真正成功的运行和在一半途中崩溃的运行。`trainer.py` 自身的 `finally` 块日志更加误导:`after_train()` 总是打印 `"Training of experiment is done and the best AP is {X}"`,即使在崩溃之后,也使用迄今为止累积的任何 `best_ap`(通常为 `0.00`,如果崩溃发生在任何评估都成功之前)。日志读取的内容与正常的训练摘要完全相同,即使训练从未完成。
内容来源: Megvii-BaseDetection/YOLOX