導入
- 動的グラフを静的グラフに変換して推論モデルをエクスポートすることに加えて、
- ONNXモデルのエクスポート機能もPaddle2.0に正式搭載
- この記事では、例を通じて Paddle モデルを ONNX モデルにエクスポートする方法を説明します。
- そしてONNXRunTime上でモデルの推論予測を完了します
ONNX
- 機械学習モデルのオープンスタンダードである Open Neural Network Exchange (ONNX) により、異なるフレームワーク間のモデル交換が容易になります。
- ONNX モデルのエクスポートをサポートする多くのフレームワークでモデルを構築し、予測展開のために ONNX モデルをエクスポートできます。
パドル2ONNX
- 現在、Paddle エクスポート ONNX モデルでは追加サポートのために Paddle2ONNX をインストールする必要があります
- Paddle2ONNX は、PaddlePaddle モデル形式から ONNX モデル形式への変換をサポートしています。
- モデル形式は、Paddle の静的および動的グラフ モデルの ONNX への変換をサポートしており、save_inference_model によってエクスポートされた静的グラフ モデルを変換できます。動的グラフ変換は現在実験段階にあり、Paddle 2.0 の正式版のリリースに伴い詳細なチュートリアルが提供される予定です。
- オペレーターのサポート。現在、安定して ONNX Opset 9 ~ 11 のエクスポートをサポートしています。一部の Paddle オペレーターは、より低い ONNX Opset 変換をサポートしています。詳細については、オペレーター リストを参照してください。
- モデルタイプ、公式テストコンバーチブルモデルについてはモデルライブラリを参照してください。
- 詳細については、 Paddle2ONNX のGithub ホームページを参照してください。
# PIP 安装
$ pip install paddle2onnx
# 源码安装
$ git clone https://github.com/paddlepaddle/paddle2onnx
$ cd paddle2onnx
$ python setup.py install
動的グラフ ONNX モデルのエクスポート
- Paddle2.0 によって構築された動的グラフ モデルを使用する場合は、 paddle.onnx.export()を呼び出してONNX モデルをすばやくエクスポートできます。
- 一般原則として、動的から静的への変換は静的グラフ モデルを ONNX モデルに変換するため、変換されたコードは動的から静的へのコードと非常に似ています。
- 次に、コードを使用してエクスポート プロセスを示します。
import os
import time
import paddle
# 从模型代码中导入模型
from u2net import U2NETP
# 实例化模型
model = U2NETP()
# 加载预训练模型参数
model.set_dict(paddle.load([path to the pretrained model]))
# 将模型设置为评估状态
model.eval()
# 定义输入数据
input_spec = paddle.static.InputSpec(shape=[None, 3, 320, 320], dtype='float32', name='image')
# ONNX模型导出
paddle.onnx.export(model, [path to the save onnx model], input_spec=[input_spec], opset_version=[opset version])
2021-01-09 17:12:24 [INFO] ONNX model saved in u2netp.onnx
静的グラフモデルの変換
- 動的グラフに加えて、モデルを ONNX モデルとしてエクスポートできます
- もちろん静的グラフの推論モデルもONNXモデルに変換可能
- 変換は、コマンドラインから次のコマンドを実行することで完了できます。
- 詳細については、paddle2onnx 公式 Github ドキュメントを参照してください。
$ paddle2onnx \
--model_dir [model dir] \
--model_filename [model filename] \
--params_filename [params filename] \
--save_file [save file] \
--opset_version [opset version]
2021-01-09 17:12:28 [INFO] ONNX model saved in u2netp_static.onnx
モデルの視覚化
- モデル構造の視覚的な表示は、VisualDL ツールを通じて簡単に実行できます。
- 保存したばかりのサフィックス .onnx を持つモデル ファイルを選択します
- 具体的な可視化イメージは以下の図のとおりです。
モデルのテスト
- ここで ONNXRunTime は ONNX モデル検証テストに使用されます
# 安装ONNXRunTime
$ pip install onnxruntime
import time
import numpy as np
from onnxruntime import InferenceSession
# 加载ONNX模型
model = InferenceSession([path to the save onnx model])
# 准备输入
x = np.random.random((1, 3, 320, 320)).astype('float32')
# 模型预测
d0, _, _, _, _, _, _ = model.run(output_names=None, input_feed={
'image': x})
# 打印输出形状
print(d0.shape)
# 速度测试
start = time.time()
d0, _, _, _, _, _, _ = model.run(output_names=None, input_feed={
'image': x})
end = time.time()
print('predict time: %.04f s' % (end - start))
(1, 1, 320, 320)
predict time: 0.7178 s
デプロイメントインスタンス
- 次に、データの前処理と後処理を追加して、モデル推論のデプロイを完了します。
import cv2
import time
import numpy as np
import matplotlib.pyplot as plt
from onnxruntime import InferenceSession
from processor import preprocess, postprocess
# 输入输出设置
img_path = [path to the input image]
output_dir = [output dir]
# 数据预处理
img = preprocess(img_path)
# 加载模型
model = InferenceSession([path to the save onnx model])
# 模型推理
start = time.time()
d0, _, _, _, _, _, _ = model.run(output_names=None, input_feed={
'image': img})
end = time.time()
print('predict time: %.04f s' % (end - start))
# 结果后处理
mask_path, result_path = postprocess(d0, img_path, output_dir)
# 图像显示
img = np.concatenate([
cv2.imread(img_path),
cv2.imread(mask_path),
cv2.imread(result_path)
], 1)
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
predict time: 0.7305 s
要約する
- 現在、Paddle2.0 には ONNX モデルをエクスポートするためのインターフェイスが組み込まれており、ONNX モデルを簡単にエクスポートできます。
- 以前の静的グラフ モデルの場合、Paddle2ONNX ツールも変換に使用できます。
- ONNX モデルを推論展開に使用することも比較的簡単で便利です。
- ただし、一部の Paddle オペレーターとの互換性の問題が依然として存在しており、一部のモデルが正常にエクスポートできません。
- 全体的なエクスペリエンスは良好であり、この機能が将来的により完璧になり、より多くのオペレーターをサポートすることを願っています