従来の変換 API からの移行¶
2023.1 OpenVINO リリースでは、OpenVINO モデル・コンバーターが、対応する Python API openvino.convert_model
メソッドとともに導入されました。ovc
および openvino.convert_model
は、現在従来 API と見なされている mo
および openvino.tools.mo.convert_model
の軽量の代替です。この記事では、mo
と ovc
のすべての違いが要約され、従来の API から新しい API への移行ガイドが提供されます。
パラメーターの比較¶
ov.convert_model()/OVC と mo.convert_model()/MO 間のパラメーターの比較。
mo.convert_model()/MO |
ov.convert_model()/OVC |
相違点の説明 |
---|---|---|
input_model |
input_model |
ov.convert_model() は、モデル・オブジェクトまたは入力モデルへのパスとともに、モデル部分のリスト (例えば、TensorFlow 重みへのパスと TensorFlow チェックポイントへのパス) を受け入れます。OVC ツールは、無名の入力モデルを受け入れます。 |
output_dir |
output_model |
OVC ツールの output_model は、出力モデル名と出力ディレクトリーの両方を設定します。 |
model_name |
output_model |
OVC ツールの output_model は、出力モデル名と出力ディレクトリーの両方を設定します。 |
input |
input |
ov.convert_model() は、複数のパラメーターを設定するタプルを受け入れます。OVC ツールの ‘入力’ には、タイプ設定とフリーズ機能がありません。ov.convert_model() では入力のカットは許可されません。 |
output |
output |
ov.convert_model() は出力のカットを許可しません。 |
input_shape |
N/A |
ov.convert_model()/OVC では利用できません。 |
example_input |
example_input |
違いはありません。 |
batch |
N/A |
ov.convert_model()/OVC では利用できません。モデル形状機能で置き換えることができます。以下を参照してください。 |
mean_values |
N/A |
ov.convert_model()/OVC では利用できません。 |
scale_values |
N/A |
ov.convert_model()/OVC では利用できません。 |
scale |
N/A |
ov.convert_model()/OVC では利用できません。 |
reverse_input_channels |
N/A |
ov.convert_model()/OVC では利用できません。 |
source_layout |
N/A |
ov.convert_model()/OVC では利用できません。 |
target_layout |
N/A |
ov.convert_model()/OVC では利用できません。 |
layout |
N/A |
ov.convert_model()/OVC では利用できません。 |
compress_to_fp16 |
compress_to_fp16 |
圧縮はモデルを IR (中間表現) に保存する際に行われるため、OVC はコマンドライン・ツールのみで ‘compress_to_fp16’ を提供します。 |
extensions |
extension からなります。 |
違いはありません。 |
transform |
N/A |
ov.convert_model()/OVC では利用できません。 |
transformations_config |
N/A |
ov.convert_model()/OVC では利用できません。 |
static_shape |
N/A |
ov.convert_model()/OVC では利用できません。 |
freeze_placeholder_with_value |
N/A |
ov.convert_model()/OVC では利用できません。 |
use_legacy_frontend |
N/A |
ov.convert_model()/OVC では利用できません。 |
use_legacy_frontend |
N/A |
ov.convert_model()/OVC では利用できません。 |
silent |
verbose |
OVC/ov.convert_model では、‘verbose’ が True に設定されている場合、詳細な変換情報を出力する ‘silent’ の代わりに ‘verbose’ パラメーターを提供します。 |
log_level |
N/A |
ov.convert_model()/OVC では利用できません。 |
version |
version |
N/A |
progress |
N/A |
ov.convert_model()/OVC では利用できません。 |
stream_output |
N/A |
ov.convert_model()/OVC では利用できません。 |
share_weights |
share_weights |
違いはありません。 |
framework |
N/A |
ov.convert_model()/OVC では利用できません。 |
help/-h |
help/-h |
OVC はコマンドライン・ツールでのみヘルプ・パラメーターを提供します。 |
example_output |
出力 |
OVC/ov.convert_model の ‘output’ パラメーターには、MO の ‘example_output’ パラメーターの機能が含まれています。 |
input_model_is_text |
N/A |
ov.convert_model()/OVC では利用できません。 |
input_checkpoint |
input_model |
サポートされているすべてのモデル形式を ‘input_model’ に渡すことができます。 |
input_meta_graph |
input_model |
サポートされているすべてのモデル形式を ‘input_model’ に渡すことができます。 |
saved_model_dir |
input_model |
サポートされているすべてのモデル形式を ‘input_model’ に渡すことができます。 |
saved_model_tags |
N/A |
ov.convert_model()/OVC では利用できません。 |
tensorflow_custom_operations_config_update |
N/A |
ov.convert_model()/OVC では利用できません。 |
tensorflow_object_detection_api_pipeline_config |
N/A |
ov.convert_model()/OVC では利用できません。 |
tensorboard_logdir |
N/A |
ov.convert_model()/OVC では利用できません。 |
tensorflow_custom_layer_libraries |
N/A |
ov.convert_model()/OVC では利用できません。 |
input_symbol |
N/A |
ov.convert_model()/OVC では利用できません。 |
nd_prefix_name |
N/A |
ov.convert_model()/OVC では利用できません。 |
pretrained_model_name |
N/A |
ov.convert_model()/OVC では利用できません。 |
save_params_from_nd |
N/A |
ov.convert_model()/OVC では利用できません。 |
legacy_mxnet_model |
N/A |
ov.convert_model()/OVC では利用できません。 |
enable_ssd_gluoncv |
N/A |
ov.convert_model()/OVC では利用できません。 |
input_proto |
N/A |
ov.convert_model()/OVC では利用できません。 |
caffe_parser_path |
N/A |
ov.convert_model()/OVC では利用できません。 |
k |
N/A |
ov.convert_model()/OVC では利用できません。 |
disable_omitting_optional |
N/A |
ov.convert_model()/OVC では利用できません。 |
enable_flattening_nested_params |
N/A |
ov.convert_model()/OVC では利用できません。 |
counts |
N/A |
ov.convert_model()/OVC では利用できません。 |
remove_output_softmax |
N/A |
ov.convert_model()/OVC では利用できません。 |
remove_memory |
N/A |
ov.convert_model()/OVC では利用できません。 |
従来の変換 API から新しい API への移行¶
mo.convert_model() は、幅広い前処理パラメーターを提供します。これらのパラメーターのほとんどは、OVC に類似のものがあるか、ov.PrePostProcessor
クラスの機能で置き換えることができます。ここでは、従来モデルの前処理から新しい API の前処理に移行するガイドを示します。
input_shape
¶
従来の API |
新しい API |
---|---|
from openvino.tools import mo
ov_model = mo.convert_model(model, input_shape=[[1, 3, 100, 100],[1]])
|
import openvino as ov
ov_model = ov.convert_model(model, input=[[1, 3, 100, 100],[1]])
|
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --input_shape [1,3,100,100],[1] --output_dir OUTPUT_DIR
|
ovc MODEL_NAME --input [1,3,100,100],[1] --output_model OUTPUT_MODEL
|
batch
¶
従来の API |
新しい API |
---|---|
from openvino.tools import mo
ov_model = mo.convert_model(model, batch=2)
|
import openvino as ov
ov_model = ov.convert_model(model)
input_shape = ov_model.inputs[0].partial_shape
input_shape[0] = 2 # batch size
ov_model.reshape(input_shape)
|
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --batch 2 --output_dir OUTPUT_DIR
|
OVC ツールでは利用できません。Python API を確認してください。 |
mean_values
¶
従来の API |
新しい API |
---|---|
from openvino.tools import mo
ov_model = mo.convert_model(model, mean_values=[0.5, 0.5, 0.5])
|
import openvino as ov
ov_model = ov.convert_model(model)
prep = ov.preprocess.PrePostProcessor(ov_model)
prep.input(input_name).tensor().set_layout(ov.Layout("NHWC"))
prep.input(input_name).preprocess().mean([0.5, 0.5, 0.5])
ov_model = prep.build()
現在、平均、スケール、または逆チャネルを適用しなければならないチャネルを自動検出するヒューリスティックはありません。 |
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --mean_values [0.5,0.5,0.5] --output_dir OUTPUT_DIR
|
OVC ツールでは利用できません。Python API を確認してください。 |
scale_values
¶
従来の API |
新しい API |
---|---|
from openvino.tools import mo
ov_model = mo.convert_model(model, scale_values=[255., 255., 255.])
|
import openvino as ov
ov_model = ov.convert_model(model)
prep = ov.preprocess.PrePostProcessor(ov_model)
prep.input(input_name).tensor().set_layout(ov.Layout("NHWC"))
prep.input(input_name).preprocess().scale([255., 255., 255.])
ov_model = prep.build()
現在、平均、スケール、または逆チャネルを適用しなければならないチャネルを自動検出するヒューリスティックはありません。 |
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --scale_values [255,255,255] --output_dir OUTPUT_DIR
|
OVC ツールでは利用できません。Python API を確認してください。 |
reverse_input_channels
¶
従来の API |
新しい API |
---|---|
from openvino.tools import mo
ov_model = mo.convert_model(model, reverse_input_channels=True)
|
import openvino as ov
ov_model = ov.convert_model(model)
prep = ov.preprocess.PrePostProcessor(ov_model)
prep.input(input_name).tensor().set_layout(ov.Layout("NHWC"))
prep.input(input_name).preprocess().reverse_channels()
ov_model = prep.build()
現在、平均、スケール、または逆チャネルを適用しなければならないチャネルを自動検出するヒューリスティックはありません。 |
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --reverse_input_channels --output_dir OUTPUT_DIR
|
OVC ツールでは利用できません。Python API を確認してください。 |
source_layout
¶
従来の API |
新しい API |
---|---|
import openvino as ov
from openvino.tools import mo
ov_model = mo.convert_model(model, source_layout={input_name: ov.Layout("NHWC")})
|
import openvino as ov
ov_model = ov.convert_model(model)
prep = ov.preprocess.PrePostProcessor(ov_model)
prep.input(input_name).model().set_layout(ov.Layout("NHWC"))
ov_model = prep.build()
|
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --source_layout input_name(NHWC) --output_dir OUTPUT_DIR
|
OVC ツールでは利用できません。Python API を確認してください。 |
target_layout
¶
従来の API |
新しい API |
---|---|
import openvino as ov
from openvino.tools import mo
ov_model = mo.convert_model(model, target_layout={input_name: ov.Layout("NHWC")})
|
import openvino as ov
ov_model = ov.convert_model(model)
prep = ov.preprocess.PrePostProcessor(ov_model)
prep.input(input_name).tensor().set_layout(ov.Layout("NHWC"))
ov_model = prep.build()
|
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --target_layout input_name(NHWC) --output_dir OUTPUT_DIR
|
OVC ツールでは利用できません。Python API を確認してください。 |
layout
¶
従来の API |
新しい API |
---|---|
from openvino.tools import mo
ov_model = mo.convert_model(model, layout={input_name: mo.LayoutMap("NCHW", "NHWC")})
|
import openvino as ov
ov_model = ov.convert_model(model)
prep = ov.preprocess.PrePostProcessor(ov_model)
prep.input(input_name).model().set_layout(ov.Layout("NCHW"))
prep.input(input_name).tensor().set_layout(ov.Layout("NHWC"))
ov_model = prep.build()
|
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --layout "input_name(NCHW->NHWC)" --output_dir OUTPUT_DIR
|
OVC ツールでは利用できません。Python API を確認してください。 |
transform
¶
従来の API |
新しい API |
---|---|
from openvino.tools import mo
ov_model = mo.convert_model(model, transform=[('LowLatency2', {'use_const_initializer': False}), 'Pruning', ('MakeStateful', {'param_res_names': {'input_name': 'output_name'}})])
|
import openvino as ov
from openvino._offline_transformations import apply_low_latency_transformation, apply_pruning_transformation, apply_make_stateful_transformation
ov_model = ov.convert_model(model)
apply_low_latency_transformation(model, use_const_initializer=False)
apply_pruning_transformation(model)
apply_make_stateful_transformation(model, param_res_names={'input_name': 'output_name'})
|
従来の API |
新しい API |
---|---|
mo --input_model MODEL_NAME --transform LowLatency2[use_const_initializer=False],Pruning,MakeStateful[param_res_names={'input_name':'output_name'}] --output_dir OUTPUT_DIR
|
OVC ツールでは利用できません。Python API を確認してください。 |
モデルの一部を切り取り¶
新しい変換 API では、モデルの入力と出力で切り取り操作ができなくなりました。代わりに、元のフレームワークでカットすることを推奨します。以下は、従来の変換 API を使用した TensorFlow protobuf、TensorFlow SavedModel、および ONNX 形式のモデルカットの例と、Tensorflow および ONNX フレームワークによって提供されるツールを使用して同じカットを実現する比較です。PyTorch、TensorFlow 2 Keras、PaddlePaddle では、元のモデルコードを変更してモデルカットを行うことを推奨します。
注: このガイドでは、MO ツールが input および output オプション (–input 1:name_op など) を使用した操作の入力ポートのモデルカットについては説明しません。
PyTorch
¶
PyTorch のモデルカットは従来の API では利用できません。
モデルからモジュール全体を削除する場合、モジュールを ID に置き換えることができます。以下は、resnet50 モデルの入力で conv1 および bn1 モジュールを削除し、出力で fc モジュールを削除する例です。
import openvino as ov
import torch
import torchvision
from torch.nn import Identity
# Load pretrained model
model = torchvision.models.resnet50(weights='DEFAULT')
# input cut
model.conv1 = Identity()
model.bn1 = Identity()
# output cut
model.fc = Identity()
# convert and compile the model
ov_model = ov.convert_model(model, input=([-1,64,-1,-1], torch.float32))
compiled_model = ov.compile_model(ov_model)
モデルから 1 つ以上の出力を削除する場合、モデルのラッパーを作成し、必要な出力のみを出力することができます。以下は、モデルから 2 番目の出力を削除する例です。
import openvino as ov
import torch
# Example of model with multiple outputs
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(100, 200)
self.activation1 = torch.nn.ReLU()
self.linear2 = torch.nn.Linear(200, 10)
self.activation2 = torch.nn.Sigmoid()
def forward(self, x):
x = self.linear1(x)
x = self.activation1(x)
y = self.linear2(x)
y = self.activation2(y)
return x, y
# New model, where some outputs are cut
class CutModel(torch.nn.Module):
def __init__(self):
super(CutModel, self).__init__()
self.model = Model()
def forward(self, x):
# get first output
x, _ = self.model(x)
return x
# Model with output cut
cut_model = CutModel()
# convert and compile the model
ov_model = ov.convert_model(cut_model, input=([-1,-1,-1], torch.float32))
compiled_model = ov.compile_model(ov_model)
TensorFlow protobuf format / tf.Graph / tf.GraphDef
¶
従来の API。
import openvino as ov
import openvino.tools.mo as mo
import tensorflow as tf
def load_graph(model_path):
graph_def = tf.compat.v1.GraphDef()
with open(model_path, "rb") as f:
graph_def.ParseFromString(f.read())
with tf.compat.v1.Graph().as_default() as graph:
tf.graph_util.import_graph_def(graph_def, name="")
return graph
# Load TF model
graph = load_graph("/path_to_model/HugeCTR.pb")
# Convert the model with input and output cut
input_name = "concat"
output_name = "MatVec_3/Squeeze"
ov_model = mo.convert_model(graph, input=(input_name, [-1, -1]), output=output_name)
# Compile the model
compiled_model = ov.compile_model(ov_model)
オリジナル FW でカットされたモデル。
import openvino as ov
import tensorflow as tf
from tensorflow.python.tools.strip_unused_lib import strip_unused
def load_graph(model_path):
graph_def = tf.compat.v1.GraphDef()
with open(model_path, "rb") as f:
graph_def.ParseFromString(f.read())
with tf.compat.v1.Graph().as_default() as graph:
tf.graph_util.import_graph_def(graph_def, name="")
return graph
# Load TF model
graph = load_graph("/path_to_model/HugeCTR.pb")
# Cut the model
input_name = "concat"
output_name = "MatVec_3/Squeeze"
graph_def = graph.as_graph_def()
new_graph_def = strip_unused(graph_def, [input_name], [output_name], tf.float32.as_datatype_enum)
# Convert and compile model
ov_model = ov.convert_model(new_graph_def, input=[-1, -1])
cmp_model = ov.compile_model(ov_model)
TensorFlow SavedModel format
¶
SavedModel 形式のモデルのカットは、従来の API では利用できません。
オリジナル FW でのモデルのカット例。
import openvino as ov
import tensorflow_hub as hub
import tensorflow as tf
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
from tensorflow.python.tools.strip_unused_lib import strip_unused
# Load TF model
model = hub.load("https://tfhub.dev/svampeatlas/vision/embedder/fungi_V2/1?tf-hub-format=compressed")
# Convert model to GraphDef
model_func = model.signatures["default"]
frozen_func = convert_variables_to_constants_v2(model_func)
graph_def = frozen_func.graph.as_graph_def()
# Cut the model
input_name = 'InceptionV4/InceptionV4/Conv2d_2b_3x3/Relu'
output_name = 'InceptionV4/InceptionV4/Mixed_7c/concat'
new_graph_def = strip_unused(graph_def, [input_name], [output_name], tf.float32.as_datatype_enum)
# Convert and compile the model
ov_model = ov.convert_model(new_graph_def)
compiled_model = ov.compile_model(ov_model)
ONNX
¶
従来の API。
import openvino as ov
import openvino.tools.mo as mo
input_path = "/path_to_model/yolov8x.onnx"
# Convert model and perform input and output cut
input_name = "/model.2/Concat_output_0"
output_name = "/model.22/Concat_3_output_0"
ov_model = mo.convert_model(input_path, input=input_name, output=output_name)
# Compile model
ov.compile_model(ov_model)
オリジナル FW でカットされたモデル。
import onnx
import openvino as ov
input_path = "/path_to_model/yolov8x.onnx"
# Cut the model
input_name = "/model.2/Concat_output_0"
output_name = "/model.22/Concat_3_output_0"
cut_model_path = "/path_to_model/yolov8x_cut.onnx"
onnx.utils.extract_model(input_path, cut_model_path, [input_name], [output_name])
# Convert model
ov_model = ov.convert_model(cut_model_path)
# Compile model
ov.compile_model(ov_model)
MO と OVC でサポートされるフレームワーク¶
ov.convert_model() および OVC ツールは、PyTorch、TF、TF Lite、ONNX、PaddlePaddle からの変換をサポートしています。