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.bin
、nvidia_ssd.mapping
、nvidia_ssd.xml
という3つのファイルが生成されています。拡張子xmlはネットワーク、binは重みということは認識していたのですが、もう1つ拡張子mappingのフィルが生成されていました。サイズは、半分くらいになっています。
ちなみに2019版のOpenVinoだとエラーとなっていました。
コメント
[…] 前の投稿でOpenVINO用に変換したモデルを、OpenVINOの推論エンジンIneference Engineに取り込みます。 […]