如何处理使用MindSpore Lite的converter_lite工具转换模型失败的问题

现象描述

使用MindSpore进行模型部署时需要首先使用MindSpore Lite的converter_lite工具进行模型转换,将*.mindir模型转换为*.ms模型。模型转换失败,日志包含CONVERT RESULT FAIL错误。

1.converter_lite工具包括linux和windows两个版本,使用完全一致,问题案例分析中不做区分。 2.因不同版本中日志行号可能存在差异,下述示例日志报错信息中的行号信息均用”*”表示; 3.示例日志中只列出了通用信息,其他涉及具体场景的信息均用“***”表示。

原因分析

模型转换失败的问题需要借助日志报错信息来分析,出现该问题的可能原因及对应日志信息如下:

  • 读取原模型文件失败,日志报错信息:
WARNING: Logging before InitGoogleLogging() is written to STDERR
[WARNING] LITE(11979,7fbdc90a8ec0,converter_lite):2021-12-13-16:20:49.506.071 [mindspore/lite/tools/common/protobuf_utils.cc: **] ReadProtoFromBinaryFile] Parse ***.onnx failed.
[ERROR] LITE(11979,7fbdc90a8ec0,converter_lite):2021-12-13-16:20:49.506.122 [mindspore/lite/build/tools/converter/parser/onnx/onnx_op_parser.cc: **] InitOriginModel] Read onnx model file failed, model path: ***.onnx
[ERROR] LITE(11979,7fbdc90a8ec0,converter_lite):2021-12-13-16:20:49.506.131 [mindspore/lite/build/tools/converter/parser/onnx/onnx_op_parser.cc: **] Parse] init origin model failed.
[ERROR] LITE(11979,7fbdc90a8ec0,converter_lite):2021-12-13-16:20:49.506.137 [mindspore/lite/tools/converter/converter.cc: **] BuildFuncGraph] Get funcGraph failed for fmk: ONNX
[ERROR] LITE(11979,7fbdc90a8ec0,converter_lite):2021-12-13-16:20:49.506.143 [mindspore/lite/tools/converter/converter.cc: **] Convert] Parser/Import model return nullptr
[ERROR] LITE(11979,7fbdc90a8ec0,converter_lite):2021-12-13-16:20:49.506.162 [mindspore/lite/tools/converter/converter.cc: **] RunConverter] CONVERT RESULT FAILED:-1 Common error code.
CONVERT RESULT FAILED:-1 Common error code.
  • 存在不支持的算子,日志报错信息:
[mindspore/lite/tools/converter/converter.cc:**] BuildFuncGraph] Get funcGraph failed for fmk: ****
[mindspore/lite/tools/converter/converter.cc:**] Converter] Parser/Import model return nullptr
[mindspore/lite/tools/converter/converter_context.h:**] PrintOps] ===========================================
[mindspore/lite/tools/converter/converter_context.h:**] PrintOps] UNSUPPORTED OP LIST:
[mindspore/lite/tools/converter/converter_context.h:**] PrintOps] FMKTYPE: ****, OP TYPE: ****
[mindspore/lite/tools/converter/converter_context.h:**] PrintOps] ===========================================
[mindspore/lite/tools/converter/converter.cc:**] RunConverter] CONVERT RESULT FAILED:-300 Failed to find operator.
  • 存在不支持的算子,日志报错信息包含:
[mindspore/lite/tools/converter/parser/caffe/caffe_model_parser.cc:**] ConvertLayers] parse node **** failed.

解决办法

检查报错日志,查找是否包含上述场景中所展示的错误信息。

步骤1:检查模型文件是否有效。

  1. 如检查发现读取原模型文件失败,则为模型路径无效或模型文件损坏。
  2. 检查模型路径无误后,若确认模型文件损坏,可以重新下载或导出原模型文件。

步骤2:检查是否存在不支持的算子。

  1. 如检查发现Failed to find operator,则为存在不支持的算子,可以依据UNSUPPORTED OP LIST所展示内容查看具体的算子类型。
  2. 对于转换工具不支持的算子,可以尝试通过继承API接口NodeParser 自行添加parser并通过NodeParserRegistry 进行Parser注册;或者在社区提ISSUE 给MindSpore Lite开发人员处理。

步骤3:检查是否存在算子解析与转换失败。

  1. 如检查发现parse node **** failed,则为转换工具支持该算子转换,但是不支持该算子的某种特殊属性或参数导致模型转换失败。
  2. 可以尝试通过继承API接口NodeParser 添加自定义算子parser并通过NodeParserRegistry 进行Parser注册;或者在社区提ISSUE 给MindSpore Lite开发人员处理。