モデルの準備

OpenVINO は次のモデル形式をサポートしています。

  • PyTorch

  • TensorFlow

  • TensorFlow Lite

  • ONNX

  • PaddlePaddle

  • OpenVINO IR

モデルを取得する最も簡単な方法は、TensorFlow HubHugging FaceTorchvision 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 つのステータスがあります。

ディスクに保存されている
この状態のモデルは、ニューラル・ネットワークを完全に表す 1 つ以上のファイルで構成されます。モデルはさまざまな方法で保存できます。
例:
OpenVINO IR: .xml ファイルと .bin ファイルのペア
ONNX: .onnx ファイル
TensorFlow: .pb ファイルと 2 つのサブフォルダー、または .pb ファイルのみを含むディレクトリー
TensorFlow Lite: .tflite ファイル
PaddlePaddle: .pdmodel ファイル
ロードされているがコンパイルされていない
モデル・オブジェクト (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_modelopenvino.save_model の機能を組み合わせたコマンドラインのモデル・コンバーターで、OpenVINO IR への保存で同じパラメーター・セットが使用されると、全く同じ結果が得られます。ファイルを OpenVINO IR に変換し、最終的な推論アプリケーションで読み取り、コンパイル、実行できるようにします。

PyTorch モデルは ovc で変換できません。代わりに openvino.convert_model を使用してください。

関連情報

次の記事では、ソースのモデルタイプに応じてモデルを取得して準備する方法を詳しく説明しています。

最高のモデル推論のパフォーマンスとコンパクトな OpenVINO IR 表現を実現するには、次の手順に従います。

従来の変換 API (mo または openvino.tools.mo.convert_model) を使用している場合、次の資料を参照してください。