ONNXモデルをRaspi+Intel NCS2向けのItermediate Representationに変換

PyTorchモデルをONNXに変換の続きです。

Model Optimizerを使ってONNXモデルをRaspberry Pi+Intel NCS2で動かそうとしています。前回の記事ではPyTorchの学習済みモデルを、汎用的なONNXモデルに変換しました。

OpenVinoをインストールすると、mo.pyという 変換用のスクリプトもインストールされるので、このスクリプトを使ってONNXモデルなどの学習済みモデルを、Intelの推論エンジンで実行可能なIntermediate Representation (IR)に変換します。

環境準備

実行環境については、前回の記事で記載したのですが、そこからさらに

conda install -c conda-forge onnx

で、Anaconda環境にONNXを追加します。この時点で以下のONNXモデルを扱うPythonコードは動作しませんでした。

import onnx

# Load the ONNX model
model = onnx.load("nvidia_ssd.onnx")
for node in model.graph.node:
   print(node)

# Check that the IR is well formed
print(onnx.checker.check_model(model))

このコードを実行すると

ImportError: libprotobuf.so.20: cannot open shared object file: No such file or directory

のエラーとなります。OpenVinoのModel Optimizerも何故か「前提条件(Prerequisites)」が満たされないので失敗する、というエラーが出て実行出来ません。最終的にはbinary build of onnx is failing to load libprotobuf.so.20 #2434を参照して、

conda install protobuf=3.9

を実行してprotobufのバージョンを3.9.xに落とすことで解決しました。

Intermedeate Representationへの変換

ONNXモデルは前回出力しています。前述のとおり、この変換はOpenVinoインストール時にインストールされるmo.pyを使用して行います。TensofFlowの変換の際には、いろいろと細かくオプションを指定する必要があるようですが、ONNXモデルの場合簡単に変換できました。
Intel NCS2はFP32に対応していないので、 --data_type FP16オプションにより、FP16に変換しています。

$ python /opt/intel/openvino_2020.2.120/deployment_tools/model_optimizer/mo.py --input_model nvidia_ssd.onnx --data_type FP16
-input_model nvidia_ssd.onnx --data_type FP16
Model Optimizer arguments:
Common parameters:
        - Path to the Input Model:      /home/hajime/git/nd131-openvino-fundamentals-project-starter/convertModels/nvidia_ssd.onnx
        - Path for generated IR:        /home/hajime/git/nd131-openvino-fundamentals-project-starter/convertModels/.
        - IR output name:       nvidia_ssd
        - Log level:    ERROR
        - Batch:        Not specified, inherited from the model
        - Input layers:         Not specified, inherited from the model
        - Output layers:        Not specified, inherited from the model
        - Input shapes:         Not specified, inherited from the model
        - Mean values:  Not specified
        - Scale values:         Not specified
        - Scale factor:         Not specified
        - Precision of IR:      FP16
        - Enable fusing:        True
        - Enable grouped convolutions fusing:   True
        - Move mean values to preprocess section:       False
        - Reverse input channels:       False
ONNX specific parameters:
Model Optimizer version:        2020.2.0-60-g0bc66e26ff

[ SUCCESS ] Generated IR version 10 model.
[ SUCCESS ] XML file: /home/hajime/git/nd131-openvino-fundamentals-project-starter/convertModels/./nvidia_ssd.xml
[ SUCCESS ] BIN file: /home/hajime/git/nd131-openvino-fundamentals-project-starter/convertModels/./nvidia_ssd.bin
[ SUCCESS ] Total execution time: 13.23 seconds. 
[ SUCCESS ] Memory consumed: 458 MB

nvidia_ssd.onnxから
nvidia_ssd.binnvidia_ssd.mappingnvidia_ssd.xmlという3つのファイルが生成されています。拡張子xmlはネットワーク、binは重みということは認識していたのですが、もう1つ拡張子mappingのフィルが生成されていました。サイズは、半分くらいになっています。
ちなみに2019版のOpenVinoだとエラーとなっていました。

コメント

  1. […] 前の投稿でOpenVINO用に変換したモデルを、OpenVINOの推論エンジンIneference Engineに取り込みます。 […]

タイトルとURLをコピーしました