モデルの準備¶
OpenVINO は次のモデル形式をサポートしています。
PyTorch
TensorFlow
TensorFlow Lite
ONNX
PaddlePaddle
OpenVINO IR
モデルを取得する最も簡単な方法は、TensorFlow Hub、Hugging Face、Torchvision models モデルなどのオンライン・データベースからモデルをダウンロードすることです。これには、2 つのオプションがあります。
-
モデル変換をスキップし、TensorFlow、TensorFlow Lite、ONNX、または PaddlePaddle ソース形式から直接推論を実行します。変換は引き続き実行されますが、それは内部的に自動で行われます。このオプションは便利ですが、パフォーマンスと安定性が十分でなく、最適化オプションも少なくなります。
-
明示的にモデルを OpenVINO IR に変換します。このアプローチは可能な限り最良の結果を提供し、特に実稼働対応のソリューションに推奨されるアプローチです。場合によっては、一次推論のレイテンシーを最小限に抑え、モデルの最適化を実行し、ドライブ上のスペースを節約するため、モデルをこの形式で保存することを検討してください。明示的な変換は次の 2 つの方法で行われます。
Python API 関数 (
openvino.convert_model
およびopenvino.save_model
)ovc コマンドライン・ツール。
OpenVINO IR (
.xml
ファイルと.bin
ファイルのセット) として保存すると、モデルを最大のパフォーマンスでデプロイできます。OpenVINO 推論向けにすでに最適化されているため、遅延なく読み取り、コンパイル、そして推論を行うことができます。
注
OpenVINO 2023.1 以前のモデル変換 API は廃止されました。既存および新規プロジェクトは、openvino.tools.mo.convert_model
または mo
CLI ツールと完全な下位互換性がないことに留意して、新しいソリューションに移行することを推奨します。詳細については、モデル変換 API 移行ガイドを参照してください。
PyTorch モデルでは、Python API が唯一の変換オプションです。
モデルのステータス¶
OpenVINO のモデルには、ディスクに保存されている、ロードされているがコンパイルされていない (ov.Model
)、またはロードされてコンパイルされている (ov.CompiledModel
) という 3 つのステータスがあります。
例:
ov.Model
) は、ファイルを解析するか、既存のフレームワーク・オブジェクトを変換することでメモリー内に作成されます。このオブジェクトは特定のデバイスに接続されていないため、推論を行うことはできませんが、入力の再形成、量子化の適用、モデルをコンパイルする前の前処理ステップの追加などのカスタマイズが可能です。ov.CompiledModel
) に 1 つ以上のデバイスが指定されている状態であり、デバイスの最適化が可能になり、推論を実行できます。各機能の詳細については、OpenVINO ワークフローのページを参照してください。
Python でモデルを変換する: convert_model
¶
Python のモデル変換 API は、openvino.convert_model
関数を使用して、特定のモデルを openvino.Model オブジェクトに変換しメモリーにロードします。openvino.save_model
を使用してドライブに保存するか、保存する前に NNCF を使用してさらに最適化することができるようになりました。
最も人気のあるパブリック・リポジトリーのモデルで openvino.convert_model
を使用する方法をご覧ください。
import openvino as ov
import torch
from torchvision.models import resnet50
model = resnet50(weights='DEFAULT')
# prepare input_data
input_data = torch.rand(1, 3, 224, 224)
ov_model = ov.convert_model(model, example_input=input_data)
###### Option 1: Save to OpenVINO IR:
# save model to OpenVINO IR for later use
ov.save_model(ov_model, 'model.xml')
###### Option 2: Compile and infer with OpenVINO:
# compile model
compiled_model = ov.compile_model(ov_model)
# run inference
result = compiled_model(input_data)
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained("bert-base-uncased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='pt')
import openvino as ov
ov_model = ov.convert_model(model, example_input={**encoded_input})
###### Option 1: Save to OpenVINO IR:
# save model to OpenVINO IR for later use
ov.save_model(ov_model, 'model.xml')
###### Option 2: Compile and infer with OpenVINO:
# compile model
compiled_model = ov.compile_model(ov_model)
# prepare input_data using HF tokenizer or your own tokenizer
# encoded_input is reused here for simplicity
# run inference
result = compiled_model({**encoded_input})
import tensorflow as tf
import openvino as ov
tf_model = tf.keras.applications.ResNet50(weights="imagenet")
ov_model = ov.convert_model(tf_model)
###### Option 1: Save to OpenVINO IR:
# save model to OpenVINO IR for later use
ov.save_model(ov_model, 'model.xml')
###### Option 2: Compile and infer with OpenVINO:
# compile model
compiled_model = ov.compile_model(ov_model)
# prepare input_data
import numpy as np
input_data = np.random.rand(1, 224, 224, 3)
# run inference
result = compiled_model(input_data)
import tensorflow as tf
import tensorflow_hub as hub
import openvino as ov
model = tf.keras.Sequential([
hub.KerasLayer("https://tfhub.dev/google/imagenet/mobilenet_v1_100_224/classification/5")
])
# Check model page for information about input shape: https://tfhub.dev/google/imagenet/mobilenet_v1_100_224/classification/5
model.build([None, 224, 224, 3])
ov_model = ov.convert_model(model)
###### Option 1: Save to OpenVINO IR:
ov.save_model(ov_model, 'model.xml')
###### Option 2: Compile and infer with OpenVINO:
compiled_model = ov.compile_model(ov_model)
# prepare input_data
import numpy as np
input_data = np.random.rand(1, 224, 224, 3)
# run inference
result = compiled_model(input_data)
import onnx
model = onnx.hub.load("resnet50")
onnx.save(model, 'resnet50.onnx') # use a temporary file for model
import openvino as ov
ov_model = ov.convert_model('resnet50.onnx')
###### Option 1: Save to OpenVINO IR:
# save model to OpenVINO IR for later use
ov.save_model(ov_model, 'model.xml')
###### Option 2: Compile and infer with OpenVINO:
# compile model
compiled_model = ov.compile_model(ov_model)
# prepare input_data
import numpy as np
input_data = np.random.rand(1, 3, 224, 224)
# run inference
result = compiled_model(input_data)
-
モデルの保存 (オプション 1) は、デプロイメント外部の別のステップで使用されます。提供されるファイルは最終的なソフトウェア・ソリューションで使用され、依存関係が減り、モデルの読み込みが高速化されるため、パフォーマンスが最大化されます。
-
モデルのコンパイル (オプション 2) は、既存の Python 推論アプリケーションでフレームワーク・ベースのコードから OpenVINO ベースのコードに素早く切り替える便利な方法を提供します。変換されたモデルは IR には保存されませんが、コンパイルされ、同じアプリケーション内で推論に使用されます。
モデルを OpenVINO IR に保存する前に、より効率良い推論とより小さいモデルを実現するために、トレーニング後の最適化を検討してください。
CLI でモデルを変換する: ovc
¶
ovc
は、openvino.convert_model
と openvino.save_model
の機能を組み合わせたコマンドラインのモデル・コンバーターで、OpenVINO IR への保存で同じパラメーター・セットが使用されると、全く同じ結果が得られます。ファイルを OpenVINO IR に変換し、最終的な推論アプリケーションで読み取り、コンパイル、実行できるようにします。
注
PyTorch モデルは ovc
で変換できません。代わりに openvino.convert_model
を使用してください。
関連情報¶
次の記事では、ソースのモデルタイプに応じてモデルを取得して準備する方法を詳しく説明しています。
最高のモデル推論のパフォーマンスとコンパクトな OpenVINO IR 表現を実現するには、次の手順に従います。
従来の変換 API (mo
または openvino.tools.mo.convert_model
) を使用している場合、次の資料を参照してください。