最近要使用openvino部署一个深度学习模型,模型主要是使用pytorch进行训练,部署时首先转为onnx模型,然后在将onnx模型转为openvino进行部署,本文就记录一下在onnx模型转openvino时所遇到的坑以及解决办法,未来有遇到新的问题会补充到本文。
1:openvino模型不支持动态shape的输入和输出
onnx模型转openvino的第一个问题就是openvino不支持输入和输出的shape是动态的,而onnx是支持动态shape的输入和输出,onnx动态shape的设置是torch.export.onnx()中的dynamic_axes参数,具体使用方法不在多说。
2.openvino模型只支持单个输入
这个问题还是比较麻烦的,openvino好像可以使用多个输出。目前我尝试的只能使用单个输入,但是onnx可以确定的是支持多个输入和输出。评论区有老哥尝试成功了openvino的多输入输出,具体可以询问评论区的老哥。
3.openvino并不支持onnx所有的operator
openvino支持的onnx的operator可在https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_prepare_model_Supported_Frameworks_Layers.html#onnx_supported_operators查询,我当时没有用openvino部署成功是因为我的模型中有LSTM,而openvino不支持onnx中使用了peephole的LSTM,虽然我用的是pytorch的LSTM接口而pytorch中并未说明LSTM是否使用了peephole,但是我的onnx模型并未成功转成openvino,因此估计pytorch中的LSTM还是使用了peephole。
4.openvino模型不支持onnx模型中的if节点
这个问题着实难为我了好几天,就是因为openvino不支持if语句,然后我把代码中的所有if语句全部删除了,但是删除了if语句发现转换的onnx模型中依然有if节点,最后发现是pytroch中的squeeze()算子在转换成onnx之后会产生If节点,具体可以看另外的一篇博客onnx模型转openvino报错nGraph does not support the following ONNX operations: If_hyliuisme的博客-CSDN博客。
5.加载openvino模型报错tensor dynamic shape
这个报错好像还是因为onnx模型中有些变量是动态shape的原因,我代码中有很多变量使用诸如view()方法或者其他需要维度的方法时没有使用固定的数据而是使用tensor.size(),如a.view(b.size(0), b.size(1))这种写法时就报错了,但是当我改成a.view(5, 10)这种固定数据的写法就不报错了,因此我估计是onnx模型转openvino时参数都需要直接固定下来而不是使用其他变量提供参数,openvino只支持静态图结构,所以为了避免出错还是建议参数直接写死。
目前遇到的onnx转openvino坑就这几个,后续有新的坑还会及时补充本文。