打开微信,使用扫一扫进入页面后,点击右上角菜单,
点击“发送给朋友”或“分享到朋友圈”完成分享
【硬件设备】:MLU270
【环境】:Ubuntu
(量化代码,配在附件里,py文件不允许,故cv后改成了txt版本)
你好,我参考官方论坛上的教程进行【Pytorch Yolov7】Yolov7模型寒武纪200移植分享(下篇) - 寒武纪软件开发平台 - 开发者论坛 (cambricon.com),
模型训练的是自己的数据集,推理正常,在cpu上unzip后推理也正常,
甚至在量化一步中,先get_model()加载好state_dict,然后运用(1)
quantized_net = mlu_quantize.quantize_dynamic_mlu(model,qconfig_spec=qconfig, dtype='int8', gen_quant=True).float().eval()
运用该quantized_net推理,结果也是正常的。
但是一旦用torch.save成pth文件之后,再运用(2)
torch_mlu.core.mlu_quantize.quantize_dynamic_mlu(model)
进行加载pth,推理能正常运行,(但我甚至还没进行解码的后处理,先将结果打印+NMS后,与cpu跑unzip/ 量化时做的推理结果进行比对):
但是推理结果完全不对,不说测试集,甚至采用训练集的图片进行测试,只有6个物体的图片,能检测出了20+个框,而且每个框参数中心全都是0.几大小,甚至还有负值,挤在左上角,结果不对。(但是cpu跑unzip、量化时先推理再保存时候的推理结果都是正确的)
于是我怀疑torch.save时并未保存下来正确的参数,尝试跳过不保存,而是直接用(1)中的quantized_net进行MLU逐层,但报错如下:
报的是替换成MLUConv2D的算子没有收到正确的输入,而且我通过打log确认,这出错出现在网络的第一层。。。。。。
没有办法,我只能沿用教程+手册里推荐的先save再load的方法,并尝试通过print模型+torchinfo查看模型结构,以及使用模拟MLU量化推理工具进行hook定位,但结果也并不如人意。相关的log我会稍后放在二楼进行详细描述。
想请问是我的量化过程出现问题了吗?还是说我总的长串流程里出现了什么问题呢?如何才能load正确的量化模型+逐层成功呢?
为了方便locate问题,有点啰嗦的把整个流程都描述了一遍,希望能有帮助,望不吝赐教!
===========================================
FYI,有额外值得注意的一些点:
v7的最新版本里,最后一层的检测层用的是IDetect,而非教程里的Detect,这点是否会影响?
IDetect层中的,Forward并没有修改,并没有采用v5_detect_output算子,但这点不应该在量化+逐层中导致如此大的偏差。
在量化+保存模型的过程中,我尝试了两种方法:
不喂输入直接load+save;
喂单张/多张图片,load+推理+save,结果只有此种方法能检出,a的方法NMS后一个框都没剩下(和喂的图片张数有关系吗)?
load的时候,strict= Ture/False都尝试了,并无过多的不同?
热门帖子
精华帖子