従来の変換 API からの移行

2023.1 OpenVINO リリースでは、OpenVINO モデル・コンバーターが、対応する Python API openvino.convert_model メソッドとともに導入されました。ovc および openvino.convert_model は、現在従来 API と見なされている mo および openvino.tools.mo.convert_model の軽量の代替です。この記事では、moovc のすべての違いが要約され、従来の 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 では利用できません。input パラメーターに置き換えることができます。

example_input

example_input

違いはありません。

batch

N/A

ov.convert_model()/OVC では利用できません。モデル形状機能で置き換えることができます。以下を参照してください。

mean_values

N/A

ov.convert_model()/OVC では利用できません。PrePostProcessor の機能で置き換えることができます。詳細は後述の説明を参照してください。

scale_values

N/A

ov.convert_model()/OVC では利用できません。PrePostProcessor の機能で置き換えることができます。詳細は後述の説明を参照してください。

scale

N/A

ov.convert_model()/OVC では利用できません。PrePostProcessor の機能で置き換えることができます。詳細は後述の説明を参照してください。

reverse_input_channels

N/A

ov.convert_model()/OVC では利用できません。PrePostProcessor の機能で置き換えることができます。詳細は後述の説明を参照してください。

source_layout

N/A

ov.convert_model()/OVC では利用できません。PrePostProcessor の機能で置き換えることができます。詳細は後述の説明を参照してください。

target_layout

N/A

ov.convert_model()/OVC では利用できません。PrePostProcessor の機能で置き換えることができます。詳細は後述の説明を参照してください。

layout

N/A

ov.convert_model()/OVC では利用できません。PrePostProcessor の機能で置き換えることができます。詳細は後述の説明を参照してください。

compress_to_fp16

compress_to_fp16

圧縮はモデルを IR (中間表現) に保存する際に行われるため、OVC はコマンドライン・ツールのみで ‘compress_to_fp16’ を提供します。

extensions

extension からなります。

違いはありません。

transform

N/A

ov.convert_model()/OVC では利用できません。PrePostProcessor の機能で置き換えることができます。詳細は後述の説明を参照してください。

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()

現在、平均、スケール、または逆チャネルを適用しなければならないチャネルを自動検出するヒューリスティックはありません。Layout は “C” チャネルで明示的に指定する必要があります。例えば、“NHWC”、“NCHW”、“?C??”。レイアウト API の概要も参照してください。

従来の 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()

現在、平均、スケール、または逆チャネルを適用しなければならないチャネルを自動検出するヒューリスティックはありません。Layout は “C” チャネルで明示的に指定する必要があります。例えば、“NHWC”、“NCHW”、“?C??”。レイアウト API の概要も参照してください。

従来の 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()

現在、平均、スケール、または逆チャネルを適用しなければならないチャネルを自動検出するヒューリスティックはありません。Layout は “C” チャネルで明示的に指定する必要があります。例えば、“NHWC”、“NCHW”、“?C??”。レイアウト API の概要も参照してください。

従来の 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 からの変換をサポートしています。