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上推理成功。

参考资料

下载MindSpore Lite

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐