ONNX模型轉Openvino部署踩坑記錄

hyliuisme發表於2020-11-08

最近要使用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模型只支援一個輸入

這個問題還是比較麻煩的,onnx模型的支援多個輸入而openvino只支援單個輸入,openvino好像也只支援單個輸出,這個不太清楚也並未驗證,但是onnx可以確定的是支援多個輸入和輸出。

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,雖然我用的是pytroch的LSTM介面而pytorch中並未說明LSTM是否使用了peephole,但是我的onnx模型並未成功轉成openvino,因此估計pytroch中的LSTM還是使用了peephole。

4.openvino模型不支援onnx模型中的if節點

這個問題著實難為我了好幾天,就是因為openvino不支援if語句,然後我吧程式碼中的所有if語句全部刪除了,但是刪除了if語句發現轉換的onnx模型中依然有if節點,最後發現是pytroch中的squeeze()運算元在轉換成onnx之後會產生If節點,具體可以看另外的一篇部落格https://blog.csdn.net/lhyyhlfornew/article/details/109562383

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坑就這幾個,後續有新的坑還會及時補充本文。

相關文章