入力形状の設定

openvino.convert_model は、未定義の次元を含む動的入力形状を持つモデルの変換をサポートします。ただし、データの形状が推論要求ごとに変化しない場合、input パラメーターを使用して入力の静的な形状 (すべての次元が完全に定義されている) を設定することを推奨します。これは、実行時ではなく、モデルの準備段階で行うと、パフォーマンスとメモリー消費の点で有利になる可能性があります。

実行時の入力形状の変更の詳細については、入力形状の変更を参照してください。また、実行時の動的形状の詳細については、動的形状を参照してください。

OpenVINO ランタイム API では、一部のハードウェアで未定義の次元を持つモデルを推論する際に、制限が生じることがあります。機能サポート一覧を参照してください。この場合、input パラメーターと reshape メソッドは、未定義次元の問題を解決するのに役立ちます。

例えば、単一入力を使用して TensorFlow MobileNet モデルのモデル変換を実行し、入力形状 [2,300,300,3] を指定します。

import openvino as ov
ov_model = ov.convert_model("MobileNet.pb", input=[2, 300, 300, 3])
ovc MobileNet.pb --input [2,300,300,3]

モデルに複数の入力がある場合、入力形状をリストとして input パラメーターに指定する必要があります。ovc では、これは個別のリストであり、openvino.convert_model では、モデル内の入力の数と一致する要素の数を持つ Python のリストまたはタプルです。元のモデルの入力名を使用して、入力と指定された形状の間のマッピングを定義します。次の例は、入力 dataseq_len のペアを使用した ONNX OCR モデルの変換を示し、それぞれに形状 [3,150,200,1][3] を指定します。

import openvino as ov
ov_model = ov.convert_model("ocr.onnx", input=[("data", [3,150,200,1]), ("seq_len", [3])])
ovc ocr.onnx --input data[3,150,200,1],seq_len[3]

入力の順序が入力モデルで定義されており、その順序が判明している場合は、名前を省略できます。その場合、入力モデルの入力と同じ順序で形状を指定することが重要です。

import openvino as ov
ov_model = ov.convert_model("ocr.onnx", input=([3,150,200,1], [3]))
ovc ocr.onnx --input [3,150,200,1],[3]

モデルが指定された入力順序を持つかどうかは、元のフレームワークによって異なります。通常、PyTorch モデル変換の場合、パラメーター名ではなく形状を設定すると便利です。これは、PyTorch モデルが位置パラメーターを受け入れる呼び出しが可能と見なされているためです。一方、入力名は、モデルをファイルにシリアル化する多くのフレームワークで推奨されているため、モデルファイルからモデルを変換する場合には便利です。

モデルトポロジーでサポートされている場合、input パラメーターを使用して元の入力形状をオーバーライドできます。元のモデルの動的な次元を持つ形状を、変換されたモデルの静的な形状に置き換えることも、その逆も可能です。動的次元は、ovc を使用する場合、モデル変換 API パラメーターで -1 または ? としてマークできます。例えば、ONNX OCR モデルのモデル変換を起動し、入力の動的バッチ次元を指定します。

import openvino as ov
ov_model = ov.convert_model("ocr.onnx", input=[("data", [-1, 150, 200, 1]), ("seq_len", [-1])])
ovc ocr.onnx --input "data[?,150,200,1],seq_len[?]"

実行時に次元が定義されていないモデルのメモリー消費を最適化するため、モデル変換 API には次元の境界を定義する機能が用意されています。未定義の次元の境界は、コマンドラインの省略記号を使用するか、Python の openvino.Dimension クラスで指定できます。例えば、ONNX OCR モデルのモデル変換を起動し、バッチ次元 1..3 の境界を指定します。これは、推論の入力テンソルのバッチ次元が最小値 1 と最大値 3 を持つことを意味します。

import openvino as ov
batch_dim = ov.Dimension(1, 3)
ov_model = ov.convert_model("ocr.onnx", input=[("data", [batch_dim, 150, 200, 1]), ("seq_len", [batch_dim])])
ovc ocr.onnx --input data[1..3,150,200,1],seq_len[1..3]

実際には、すべてのモデルが入力形状の変更を許可するように設計されているわけではありません。このようなモデルの形状を変更しようとすると、モデル変換中、または後のモデル推論で例外が発生したり、例外が発生しなくても誤った推論結果を生成する可能性があります。形状を適切に設定するには、モデルトポロジーに関する知識が必要です。