dynamic shape模型推理失败的案例分析
### 1 关键字 dynamic shape; MindSpore Lite; input tensor;模型编译失败; ### 2 问题描述 模型decoder_model.ms是动态shape模型。在使用MindSpore Lite 1.8.1 linux版本发布件中的benchmark工具,对whisper tiny转换的decoder_model
1 关键字
dynamic shape; MindSpore Lite; input tensor;模型编译失败;
2 问题描述
模型decoder_model.ms是动态shape模型。
在使用MindSpore Lite 1.8.1 linux版本发布件中的benchmark工具,对whisper tiny转换的decoder_model.ms模型进行推理时执行失败,错误提示InferShape在处理squeeze算子时失败了。
但同一个模型在MindSpore Lite 2.1.0 的benchmark工具上执行推理却是可以成功的。
3 问题原因
MindSpore Lite 1.8.1是按照v11版本及以前的算子集支持squeeze算子的,对于v13版本算子集的squeeze不支持。而decoder_model.ms模型中的squeeze算子是v13格式的,因此导致MindSpore Lite 1.8.1上模型推理失败。
而MindSpore Lite 2.1.0上支持v13的squeeze,因此在改版本上decoder_model.ms模型能够推理成功。
4 解决方案
在导出onnx模型时指定opset版本为11,这样导出的squeeze算子只有一个input。
使用MindSpore Lite 1.8.1进行模型推理就可以成功了。
5 定位过程
1、在MindSpore Lite 1.8.1上推理失败的原因是:squeeze算子在InferShape校验输入时,预期输入个数为1(对应data),而实际的输入个数为2(对应data和axes),输入个数非法导致推理失败。
对比MindSpore Lite 2.1.0上对squeeze算子输入的校验改为输入个数可以为1或者2,在2.1.0版本上能够推理成功。
2、参考onnx squeeze算子的规格,在opset V11及以前的版本上,axes是作为attribute,输入只有1个就是data。
下图是decoder_model的原始onnx模型,其opset为v11:
opset从V13开始,axes作为输入,再加上data就有2个输入了。下图opset为v13的squeeze算子:
3、再看转换为ms的模型文件decoder_model.ms中的squeeze算子的输入为2,是onnx opset v13版本的格式。
而在MindSpore Lite 1.8.1上不支持v13版本的squeeze算子,只支持v11版本的squeeze,因此导致MindSpore Lite 1.8.1上推理改模型失败。
下图的decoder_model.ms中squeeze算子是v13格式的。
4、综上所述,是由于MindSpore Lite 1.8.1支持的squeeze算子的版本较低导致推理失败的。只要升级MindSpore Lite版本或者降低模型的opset版本就能够解决问题。
6 知识分享
- 使用推理引擎进行推理时要注意算子版本是否配套支持;
- 直接使用MindSpore Lite发布版中的benchmark工具,可以在本地环境上快速验证模型能否在OpenHarmony上推理成功。
参考资料
更多推荐
所有评论(0)