[従来] 操作エクストラクター

危険

ここで説明されているコードは非推奨になりました。従来のソリューションの適用を避けるため使用しないでください。下位互換性を確保するためにしばらく保持されますが、最新のアプリケーションでは使用してはなりません

このガイドでは、非推奨である TensorFlow 変換方法について説明します。新しい推奨方法に関するガイドは、フロントエンド拡張に記載されています。

モデル・オプティマイザーは、モデルの読み込み中にモデル内の各操作に対し特定のエクストラクターを実行します。

モデル・オプティマイザーのエクストラクター拡張機能にはいくつかの種類があります。

  1. この記事で説明する一般的なもの。

  2. Python レイヤーを含む Caffe モデル用の特別なエクストラクター。この種類のエクストラクターは、Caffe Python レイヤーを使用したモデル・オプティマイザーの拡張ガイドで説明されています。

汎用拡張機能は、すべてのフレームワークに適用できる操作エクストラクターの汎用メカニズムを提供します。モデル・オプティマイザーは、エクストラクターを実装する基本クラスとして mo.front.extractor.FrontExtractorOp を提供します。これには、データを抽出するグラフノードに対応する唯一のパラメーター Node を取得する extract クラスメソッドがあります。ノードの属性 pb には独自のフレームワーク形式の操作記述が格納されます。エクストラクターの目的は、この属性を解析して必要な属性を対応するグラフのノードに保存することです。Const TensorFlow 操作のエクストラクターを検討してください (extensions/front/tf/const_ext.py ファイルを参照)。

from openvino.tools.mo.front.extractor import FrontExtractorOp
from openvino.tools.mo.front.tf.extractors.utils import tf_dtype_extractor, tf_tensor_shape, tf_tensor_content
from openvino.tools.mo.ops.const import Const


class ConstExtractor(FrontExtractorOp):
    # The "op" class attribute defines a type of the operation in the framework (in this case it is a TensorFlow),
    # for which the extractor should be triggered.
    op = 'Const'
    enabled = True  # The flag that indicates that this extractor is enabled.

    @classmethod
    def extract(cls, node):  # The entry point of the extractor.
        # The `node.pb` attribute stores the TensorFlow representation of the operation, which is a Protobuf message of the
        # specific format. In particular, the message contains the attribute called "value" containing the description of
        # the constant. The string "pb.attr["value"].tensor" is just a Python binding for Protobuf message parsing.
        pb_tensor = node.pb.attr["value"].tensor
        # Get the shape of the tensor from the protobuf message, using the helper function "tf_tensor_shape".
        shape = tf_tensor_shape(pb_tensor.tensor_shape)
        # Create a dictionary with necessary attributes.
        attrs = {
            'shape': shape,
            # Get the tensor value, using "tf_tensor_content" helper function.
            'value': tf_tensor_content(pb_tensor.dtype, shape, pb_tensor),
            # Get the tensor data type, using "tf_dtype_extractor" helper function.
            'data_type': tf_dtype_extractor(pb_tensor.dtype),
        }
        # Update the node attributes, using default attributes from the "Const" operation and attributes saved to the
        # "attrs" dictionary.
        Const.update_node_stat(node, attrs)
        return cls.enabled

Constant ONNX 操作のエクストラクターを使用した別の例を考えてみます (extensions/front/onnx/const_ext.py ファイルを参照)。

from onnx import numpy_helper
from onnx.numpy_helper import to_array

from openvino.tools.mo.front.extractor import FrontExtractorOp
from openvino.tools.mo.front.onnx.extractors.utils import onnx_attr
from openvino.tools.mo.ops.const import Const


class ConstantExtractor(FrontExtractorOp):
    op = 'Constant'
    enabled = True

    @classmethod
    def extract(cls, node):
        # Use "onnx_attr" helper method, which parses the Protobuf representation of the operation saved in the "node".
        # Gets the value of the attribute with name "value" as "TensorProto" type (specified with a keyword "t").
        pb_value = onnx_attr(node, 'value', 't')
        # Use "numpy_helper.to_array()" ONNX helper method to convert "TensorProto" object to a numpy array.
        value = numpy_helper.to_array(pb_value)

        attrs = {
            'data_type': value.dtype,
            'value': value,
        }
        # Update the node attributes, using default attributes from the "Const" operation and attributes saved to the
        # "attrs" dictionary.
        Const.update_node_stat(node, attrs)
        return cls.enabled

さまざまなフレームワークからの操作のエクストラクターは同様に機能します。唯一の違いは、フレームワーク固有の表現でエンコードされた操作属性を解析するヘルパーメソッドです。

一般的な方法は、専用の Op クラスの update_node_stat() メソッドを使用してノード属性を更新することです。このメソッドは以下を行います。

  1. optypeinferin_ports_countout_ports_countversion などの共通属性の値を、専用の操作 (この場合は Const 操作) 固有の値に設定します。

  2. Op クラスで定義されている supported_attrs() メソッドと backend_attrs() メソッドを使用して、特定のノード属性 IE を更新します。IR エミッターは、IE 属性に保存されている値を使用して属性値を前処理し、IR に保存します。

  3. オプションで、update_node_stat() 関数に 2 番目のパラメーターとして提供する追加の属性を設定します。通常、これらの属性は操作の特定のインスタンスから解析されます。

モデル・オプティマイザーは、値を格納するのに numpy 配列を使用し、グラフ内の形状を格納するのに np.int64 タイプの numpy 配列を使用します。