gfpgan_1.4.onnx转om时将Reszie使用ResizeBilinearV2后出现精度问题
收藏回复举报
gfpgan_1.4.onnx转om时将Reszie使用ResizeBilinearV2后出现精度问题
发表于2025-06-11 11:45:12
0 查看

【问题环境】

python 3.11
cann 8.1.rc1
hdk 23.0.6.2
A800T A2

【问题现象】

构造全1 fp32输入,推理onnx结果和om推理结果差距大

ONNX:

Input name: input
Output 0 shape: (1, 3, 512, 512)
输出 0 前几个值: [[[[0.9582745  0.9593843  1.0079391... 0.99618465 1.0035256
0.95998454]
[0.93535155 0.99297273 0.98873824 ... 0.9975622  1.0131495
    0.9739327 ]

ON:

Input name: input
.....Output 0 shape: (1, 3, 512, 512)
输出 0 前几个值: [[[[0.8773149  1.9461144  1.402598... 1.442317   1.5492649
    1.6140375 ]
   [1.06470951.9107456  1.430389   ... 1.3726659  1.5196142
    1.2167636 ]
   [1.20316431.22862    1.1450994  ... 1.07255291.0221734
1.354701  ]

【处理过程】

1. 使用msit工具分析算子支持情况,检查结果无不支持算子

msit analyze -gm /tmp/test.onnx -o ./out

2.使用msit debug compare工具dump数据进行对比,得到result_时间戳.csv文件

msit debug compare -gm ./gfpgan_1.4.onnx -om ./CANN.om -c /usr/local/Ascend/ascend-toolkit/latest -o ./output

3.将2中的csv文件里找到精度不满足要求的,本案例是找余弦相似度低于0.99的,再配合netron工具找到首个出精度问题节点

4.发现第一层的Resize,使用netron打开原始onnx找到对应的节点,检查属性信息

5.发现Resize算子属性里coordinate_transformation_mode使用的half_pixel模式

6.找昇腾ResizeBilinearV2算子使用的模式是pytorch_half_pixel模式

7.两种模式处理时的差异导致了此次精度问题,因此有两种方式解决该问题

  • 根据昇腾算子开发说明自行开发算子替代昇腾的ResizeBilinearV2算子和ONNX保持一致
  • 修改onnx的ReSize算子的模式为pytorch_half_pixel模式后再转换om使用

8. 查询对应版本onnx的Reszie属性默认是half_pixel模式,同样也支持pytorch_half_pixel模式

https://onnx.ai/onnx/operators/onnx__Resize.html

9.采用简单的修改onnx模式的方式解决,对比onnx修改前和修改后使用CPU推理精度对齐后再转换成OM,精度也对齐了。

【问题根因】

ONNX使用的ReSize模式使用half_pixel 和转换后的昇腾替代算子ResizeBilinearV2支持实现的pytorch_half_pixel模式精度差异导致

【解决方案】

  提供2种方案,本案例使用第二种处理,第一种未实践

  • 根据昇腾算子开发说明自行开发算子替代昇腾的ResizeBilinearV2算子和ONNX保持一致
  • 修改onnx的ReSize算子的模式为pytorch_half_pixel模式后再转换om使用

【相关知识】

不同模式的计算方式有差异,详细如下:

我要发帖子