1. 问题来了:升级PyTorch 2.6.0后,YOLOv5突然跑不动了
最近是不是手痒,把PyTorch升级到了最新的2.6.0版本,然后兴冲冲地打开你的YOLOv5项目,准备跑一下经典的detect.py来检测几张图片?结果,熟悉的流程没走几步,终端里就给你抛出了一大段红色的错误信息,直接给你整懵了。我前几天就遇到了这个情况,当时正在给一个客户演示模型效果,结果当场“翻车”,场面一度十分尴尬。错误信息的核心,通常指向torch.load函数,并且会提到一个关键词:weights_only。很多朋友一看这错误,第一反应是模型文件坏了,或者环境装错了,折腾半天重装环境、重新下载权重,结果问题依旧。别慌,这其实不是你代码的问题,也不是模型的问题,而是PyTorch 2.6.0版本为了安全考虑,做的一个默认行为变更,刚好和YOLOv5(尤其是v5.0等早期版本)的模型加载方式撞上了。
简单来说,PyTorch在加载模型文件(通常是.pt或.pth文件)时,有一个叫torch.load的函数。在2.6.0版本之前,这个函数加载文件时,默认会执行文件里可能包含的任何代码(weights_only=False)。这虽然方便,但也带来了安全风险,万一你加载了一个恶意构造的模型文件,它可能会在你的机器上执行任意代码。所以,从PyTorch 2.6.0开始,官方为了提升安全性,把这个参数的默认值改成了True。这意味着,torch.load现在默认只允许加载纯数据(比如模型的权重、偏置),而禁止加载和执行任何可能带有“代码”的对象。
那么,YOLOv5的模型文件里有什么呢?以官方的yolov5s.pt为例,它不仅仅保存了模型的权重参数,还保存了模型的结构定义、一些训练配置信息,甚至可能包含一些用于重建模型对象的pickle指令。其中就可能涉及到像numpy.core.multiarray._reconstruct这样的全局对象。在weights_only=True的严格模式下,这类对象是不被允许加载的,因此就会触发我们看到的UnpicklingError错误,提示“Weights only load failed”。所以,问题的根源很明确:新版的PyTorch安全规则变严格了,而老版的YOLOv5模型保存格式恰好包含了不被新规则允许的内容。接下来,我们就来彻底解决它。
2. 深入理解:torch.load的“安全模式”与weights_only参数
要解决问题,不能光知道改个参数,还得明白背后发生了什么。咱们把torch.load这个函数掰开揉碎了讲讲。你可以把它想象成一个快递员,你的模型文件(.pt)就是一个包裹。在PyTorch 2.6.0之前,这个快递员非常“耿直”,你给他包裹,他不管里面是衣服、书本,还是一个会自己跳出来的整蛊玩具(比喻可能存在的恶意代码),他都会原封不动地递给你。这就是weights_only=False的模式,功能强大但风险自担。
从PyTorch


5286

被折叠的 条评论
为什么被折叠?



