OpenVINO IR 形式

OpenVINO IR (中間表現) は、OpenVINO の独自のモデル形式であり、OpenVINO の機能を最大限に活用できます。これは、モデル変換 API または OpenVINO コンバーターを使用して、サポートされているモデル形式のいずれかからモデルを変換することで取得できます。このプロセスでは、元のネットワークの一般的なディープラーニング操作を OpenVINO の対応する表現に変換し、関連する重みとバイアスで調整します。生成される OpenVINO IR には 2 つのファイルが含まれます。

  • .xml - モデルトポロジーが含まれます。

  • .bin - 重みとバイナリーデータが含まれます。

OpenVINO IR への変換が推奨される理由をご覧ください。

IR 構造

OpenVINO ツールキットは、独自のグラフ表現形式と独自の操作セットを導入しています。グラフは、XML とバイナリーの 2 つのファイルで表されます。この表現は一般に中間表現または IR と呼ばれます。

XML ファイルは、演算ノードの <layer> タグとデータフロー接続の <edge> タグを使用してモデルのトポロジーを記述します。各操作には、ノードに使用される操作フレーバーを定義する固定数の属性があります。例えば、畳み込み演算には、dilationstridepads_beginpads_end などの属性があります。

XML ファイルには、畳み込みの重みのような大きな定数値は含まれません。代わりに、そのような値をバイナリー形式で保存するバイナリーファイルの位置を指します。

以下は、前のセクションのグラフに対応する小さな IR XML ファイルの例です。

<?xml version="1.0" ?>
<net name="model_file_name" version="10">
   <layers>
      <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>
                  <dim>32</dim>
                  <dim>100</dim>
               </port>
            </output>
      </layer>
      <layer id="1" name="conv1/weights" type="Const" version="opset1">
            <!-- Const is only operation from opset1 that refers to the IR binary file by specifying offset and size in bytes relative to the beginning of the file. -->
            <data element_type="f32" offset="0" shape="64,3,3,3" size="6912"/>
            <output>
               <port id="1" precision="FP32">
                  <dim>64</dim>
                  <dim>3</dim>
                  <dim>3</dim>
                  <dim>3</dim>
               </port>
            </output>
      </layer>
      <layer id="2" name="conv1" type="Convolution" version="opset1">
            <data auto_pad="same_upper" dilations="1,1" output_padding="0,0" pads_begin="1,1" pads_end="1,1" strides="1,1"/>
            <input>
               <port id="0">
                  <dim>1</dim>
                  <dim>3</dim>
                  <dim>32</dim>
                  <dim>100</dim>
               </port>
               <port id="1">
                  <dim>64</dim>
                  <dim>3</dim>
                  <dim>3</dim>
                  <dim>3</dim>
               </port>
            </input>
            <output>
               <port id="2" precision="FP32">
                  <dim>1</dim>
                  <dim>64</dim>
                  <dim>32</dim>
                  <dim>100</dim>
               </port>
            </output>
      </layer>
      <layer id="3" name="conv1/activation" type="ReLU" version="opset1">
            <input>
               <port id="0">
                  <dim>1</dim>
                  <dim>64</dim>
                  <dim>32</dim>
                  <dim>100</dim>
               </port>
            </input>
            <output>
               <port id="1" precision="FP32">
                  <dim>1</dim>
                  <dim>64</dim>
                  <dim>32</dim>
                  <dim>100</dim>
               </port>
            </output>
      </layer>
      <layer id="4" name="output" type="Result" version="opset1">
            <input>
               <port id="0">
                  <dim>1</dim>
                  <dim>64</dim>
                  <dim>32</dim>
                  <dim>100</dim>
               </port>
            </input>
      </layer>
   </layers>
   <edges>
      <!-- Connections between layer nodes: based on ids for layers and ports used in the descriptions above -->
      <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
      <edge from-layer="1" from-port="1" to-layer="2" to-port="1"/>
      <edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
      <edge from-layer="3" from-port="1" to-layer="4" to-port="0"/>
   </edges>
   <meta_data>
      <!-- This section that is not related to a topology; contains auxiliary information that serves for the debugging purposes. -->
      <MO_version value="2022.3"/>
      <cli_parameters>
            <blobs_as_inputs value="True"/>
            <caffe_parser_path value="DIR"/>
            <data_type value="float"/>

            ...

            <!-- Omitted a long list of CLI options that always are put here by MO for debugging purposes. -->

      </cli_parameters>
   </meta_data>
</net>

IR は、前のセクションで説明した明示的なデータノードを使用しません。対照的に、テンソル次元やデータタイプなどのデータ・プロパティーは、演算の入力ポートと出力ポートのプロパティーとして記述されます。