昇腾的om离线模型推理结果与原模型不对应问题
昇腾的om离线模型推理结果与原模型不对应问题解决方法总结 昇腾的om离线模型推理结果与原模型不对应问题是一个常见的问题,在昇腾芯片适配过程中,模型迁移适配可能会出现精度问题,导致推理结果与原模型不一致。本文将总结解决这个问题的方法,包括分析推理流程代码、使用精度比对工具进行模型精度对比、分析模型结构,并对模型结构进行修改。 一、分析推理流程代码 在模型迁移适配过程中,如果遇到模型离线推理出现精度问题,一般是按下面的步骤进行分析定位:分析推理流程代码,查看是否存在代码处理不当的情况。在本案例中,通过分析推理代码,发现acl推理代码在做数据预处理的时候,和onnx的不一致,所以需要对预处理数据进行一致性处理,然后再对推理结果进行比对。 二、使用精度比对工具进行模型精度对比 在分析了推理流程代码之后,使用精度比对工具进行模型精度对比,以确定模型本身是否存在精度丢失的问题。在本案例中,使用“一键式全流程精度比对”工具收集两个模型的输入输出对比数据,从对比数据判断模型是否存在精度丢失问题。 三、分析模型结构 如果模型精度对比结果没有出现问题,那么我们就需要对网络结构进行分析。在本案例中,我们发现om模型输出部分网络结构中进行了算子融合操作,改变了对应节点的输出维度。因此,我们需要在模型转换的时候,关闭算子融合规则,以确保模型的精度不受影响。 四、修改模型结构 如果关闭算子融合暂时无法正常转换模型,那么我们需要另外再想办法解决问题。在本案例中,我们将模型的最后一个算子“Sigmoid”给去除掉,然后再进行模型转换。修改模型结构代码如下: ``` import onnx model = onnx.load('face_mask_tiny.onnx') # model = onnx.load('new.onnx') # 查找需要修改的节点 # for node_id,node in enumerate(model.graph.node): # print("######%s######" % node_id) # print(node) #删除节点 old_squeeze_node = model.graph.node[187] model.graph.node.remove(old_squeeze_node) #修改输出节点 # print("*") model.graph.node[186].output[0] = model.graph.node[186].output[0].replace("1320", "output") print(model.graph.node[186].output) onnx.checker.check_model(model) onnx.save(model,"new.onnx") ``` 修改好模型之后,再进行模型转换,进行模型推理,推理结果如下: onnx模型推理结果: om模型推理结果: 从打印结果可以看出,推理结果基本一致。 遗留问题: 需要分析关闭算子融合导致atc模型转换失败的原因,并将具体情况反馈研发处。
剩余6页未读,继续阅读
- 粉丝: 27w+
- 资源: 33
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助