Nonzero算子常量折叠后shape异常问题
2023/05/23
149
问题信息
问题来源 | 产品大类 | 关键字 |
---|---|---|
官方 | 算子开发 | 无 |
问题现象描述
atc工具将onnx模型转换成om模型后,msame工具做推理时报错,如下图所示:
执行推理命令:
./msame --model "/home/username/bert2.om" --output "./out/" --outfmt BIN --loop 1
将onnx模型转换成om模型,日志重定向在atc.log命令:
atc --framework=5 --model=bert.onnx --input_format=ND --input_shape="input1:1,512;input2:1,512" --output=./out/ --log=debug --soc_version=Ascend310P3
原因分析
- 通过查看ge图可以发现PartitionedCall_NonZero_14_Transpose_219这个节点中输入的shape为[-1,1],常量折叠正常情况下shape不应该存在负数。
- 更换CANN版本并增加该算子的日志打印,定位出Nonzero算子常量折叠。Nonzero算子实现中输入的shape为[1, 512], 但GE层获取到的shape为[1,-1]。
- 查看该算子实现中又刷新为实际的shape(非负数)。
- 最终可以确认该算子为三类算子,即infershape依赖tensor的值。
infershape完成后,会将shape刷新为-1,等compute完成会再把计算出的shape反刷回去,但是常量折叠场景没有这个反刷的流程,所以引擎GE层获取到的shape就是-1,该算子默认在常量折叠场景下的shape为[1,-1]。
解决措施
直接更改算子信息库中的配置,以便该算子不存在常量折叠。
获取配置文件/usr/local/Ascend/ascend-toolkit/latest/opp/built-in/op_impl/aicpu/aicpu_kernel/config/aicpu_kernel.json,在文件对应的算子中添加opInfo.opsFlag=OPS_FLAG_CLOSE,如下图所示:
msame工具重新进行推理验证,结果如下:
本页内容