OpenVINO の操作セット

ここでは、OpenVINO ツールキットでのディープラーニング・モデルの表現に使用される形式と、サポートされている操作セットに関する重要な情報を示しています。

人工的なニューラル・ネットワーク表現の概要

ディープラーニング・ネットワークは通常、ネットワーク入力データから推論結果までのデータの流れを記述する有向グラフとして表されます。入力データは、画像、ビデオ、テキスト、オーディオ、または注目する対象領域からのオブジェクトを表現する前処理された情報の形式にすることができます。

以下は、単一の畳み込みレイヤーとアクティベーション関数で構成されるモデルを表す小さなグラフ図です。

../../_images/small_IR_graph_demonstration.png

グラフ内の頂点は、レイヤーまたは畳み込み、プーリング、テンソルによる要素ごとの演算インスタンスを表します。“レイヤー(層)” と “オペレーション (操作)” という用語は、OpenVINO ドキュメント内で同じ意味で使用され、グラフ内のノードの出力データを生成するため入力データがどのように処理されるかを定義します。グラフ内の演算ノードは、1 つまたは複数の入力ポートでデータを消費する場合があります。例えば、要素ごとの加算演算には、合計されるテンソルを受け入れる 2 つの入力ポートがあります。一部の操作には入力ポートがありません。例えば、入力なしで生成する Const 操作などです。操作間のエッジは、ある操作ノードから別の操作ノードへのデータフローまたはデータの依存関係を表します。

各操作によって、1 つまたは複数の出力ポートにデータが生成されます。例えば、畳み込みは、単一の出力ポートでのアクティベーションを含む出力テンソルを生成します。通常、Split 操作には複数の出力ポートがあり、それぞれが入力テンソルの一部を生成します。

ディープラーニング・フレームワークによっては、演算間のテンソルを明示的に表す追加のノードをグラフに含めることもできます。その場合、演算ノードは互いに直接接続されていません。代わりに、データフローの中間地点としてデータノードを使用しています。データノードが使用されない場合、生成されたデータは、データの生成に対応する演算ノードの出力ポートに関連付けられます。

ネットワークで使用されるそれぞれの操作セットは、通常、ディープラーニング・フレームワークごとに固定されています。それらは、フレームワークで利用できる表現力と表現レベルを決定します。場合によっては、あるフレームワークで表現できるネットワークを別のフレームワークでは表現することが困難または不可能であるか、または、これら 2 つのフレームワークで使用される操作セットが一致しないため、大幅に異なるグラフが必要になることがあります。

操作セット

OpenVINO 操作セットの操作は、サポートされるディープラーニング・フレームワークの機能とターゲット推論デバイスのハードウェア機能に基づいて選択されます。セットは、いくつかの操作グループで構成されます。

  • ConvolutionMaxPool、および MatMul (FullyConnected とも呼ばれる) など従来のディープラーニング・レイヤー。

  • ReLUTanhPReLU などの各種アクティベーション関数。

  • AddSubtractMultiply などの一般的な要素ごとの算術テンソル演算。

  • 2 つの数値テンソルを比較し、ブール値テンソル (LessEqualGreater など) を生成する比較演算。

  • ブールテンソルを扱う論理演算 (AndXorNot など)。

  • テンソルの一部を扱うデータ移動操作 (ConcatSplitStridedSliceSelect など)。

  • DetectionOutputRegionYoloPriorBox など、特定タイプのモデル専用の複雑なアルゴリズムを実装する特殊操作。

詳細については、利用可能な操作セットでサポートされている操作セットの詳細を参照してください。

opset 仕様の読み方

利用可能な操作セットには、操作セット (opsets) と操作があります。各 opset の仕様には、その opset に含まれる操作の説明へのリンクリストがあります。2 つ以上の opset が同じ操作を参照する場合があります。つまり、ある操作セットから別の操作セットへの操作は変更されません。

各操作の説明には、Versioned name フィールドがあります。例えば、opset1ReLU エントリーポイントは、バージョン名として ReLU-1 を参照します。一方、opset2ReLU は同じ ReLU-1 を参照しており、両方の ReLU 操作は同じであり、記述が 1 つであるため、opset1opset2 は同じ操作 ReLU を共有します。

ReLU などの同じ操作タイプのバージョンを区別するには、操作のバージョン名に -N サフィックスが使用されます。N サフィックスは通常、このバージョンの操作が導入される最初の opsetN を指します。新しい操作がこの規則に従って命名される保証はありません。命名規則は変更される可能性がありますが、確定されている古い操作は変更されません。

IR バージョンと操作セットバージョン

OpenVINO 操作の表現力は、サポートされるフレームワークとターゲット・ハードウェアの機能に大きく依存します。今後フレームワークとハードウェアの機能が向上するにつれて、操作セットは新しいモデルをサポートするため常に進化します。下位互換性と増大する需要を維持するために、IR 形式と操作セットの両方がバージョン管理されます。

IR のバージョンは、モデルを表す XML ファイルとバイナリーファイルを読み取るルールを指定します。これは、操作の記述に使用できる XML スキーマと互換性のある操作セットを定義します。

歴史的に、IR バージョンには 2 つの主要な定義があります。

  1. 古いものには、操作セットのバージョン管理のない、バージョン 1 からバージョン 7 までの IR バージョンが含まれています。その期間に、操作セットは進化的に成長し、より多くのレイヤータイプを蓄積し、既存のレイヤー・セマンティクスを拡張してきました。これらのバージョンの操作セットの変更は、IR バージョンの増加を意味します。

  2. OpenVINO 2020.1 は次の世代の出発点となりました。OpenVINO 2020.1 で導入された IR バージョン 10 では、操作セットのバージョン管理は IR のバージョン管理とは別に定義されます。また、nGraph が OpenVINO に統合されたことで、操作セットが大幅に作り直されました。

新しい世代で最初にサポートされる操作セットは opset1 です。opset の後の数値は、リリースサイクルで新しい操作が追加されるか、古い操作が削除されるたびに増加します。

新しい世代の操作は、古い IR バージョン (7 以前) で使用されていた操作セットと比較して、フレームワークの元の操作セマンティクスとさらに一致する TensorFlow および ONNX 操作の多くをカバーしています。

opset の名前は、IR の操作ごとに指定されます。IR バージョンは 1 回指定されます。IR の例を次に示します。

<?xml version="1.0" ?>
<net name="model_file_name" version="10">  <!-- Version of the whole IR file is here; it is 10 -->
    <layers>
        <!-- Version of operation set that the layer belongs to is described in <layer>
            tag attributes. For this operation, it is version="opset1". -->
        <layer id="0" name="input" type="Parameter" version="opset1">
            <data element_type="f32" shape="1,3,32,100"/> <!-- attributes of operation -->
            <output>
                <!-- description of output ports with type of element and tensor dimensions -->
                <port id="0" precision="FP32">
                    <dim>1</dim>
                    <dim>3</dim>

                     ...

上の例の type="Parameter" 属性と version="opset1" 属性は、“opset1 操作セットに含まれる Parameter 操作のバージョンを使用する“ ことを意味します。

新しい操作セットが導入されると、ほとんどの操作は変更されず、新しい操作セット内の以前の操作セットからエイリアス化されるだけです。操作セットのバージョン進化の目標は、新しい操作を追加し、既存の操作の一部を変更することです (バグの修正とセマンティクスの拡張)。ただし、この変更は新しい操作セットの新しいバージョンの操作にのみ影響し、古い操作は適切なバージョンを指定することで使用されます。古いバージョンが指定される場合、古い IR との下位互換性を提供するために、動作は指定されたバージョンから変更されません。

IR を含む単一の xml ファイルには、さまざまな opset からの操作が含まれる場合があります。複数の opset に含まれる操作は、その操作を含む任意の opset を指す version で参照される場合があります。例えば、両方の opset が同じ畳み込み操作を行うため、同じ畳み込みversion="opset1"version="opset2" で使用できます。