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

危険

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

このガイドでは、非推奨である 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):
    # "op" クラス属性は、抽出機能をトリガーする必要があるフレームワーク内の操作のタイプ 
    # (この場合は TensorFlow) を定義します。 
    op = 'Const’ 
    enabled = True # この抽出機能が有効であることを示すフラグ

    @Classmethod 
    def extract(cls, node): # エクストラクターのエントリーポイント。
        # `node.pb` 属性は、操作の TensorFlow 表現を格納します。 
        # これは、特定の形式の Protobuf メッセージです。特に、メッセージには定数の説明を含む 
        # "value" と呼ばれる属性が含まれています。
        # 文字列 "pb.attr["value"].tensor" は、Protobuf メッセージ解析用の Python バインディングです。 
        pb_tensor = node.pb.attr["value"].tensor 
        # ヘルパー関数 "tf_tensor_shape" を使用して、protobuf メッセージからテンソルの形状を取得。 
        shape = tf_tensor_shape(pb_tensor.tensor_shape) 
        # 必要な属性を持つ辞書を作成します。 
        attrs = { 
            'shape': shape, 
            # "tf_tensor_content" ヘルパー関数を使用してテンソル値を取得します。
            'value': tf_tensor_content(pb_tensor.dtype, shape, pb_tensor), 
            # "tf_dtype_extractor" ヘルパー関数を使用して、テンソルデータのタイプを取得します。
            'data_type': tf_dtype_extractor(pb_tensor.dtype), 
        } 
        # "Const" 操作のデフォルト属性と "attrs" 辞書に保存された属性を使用して、 
        # ノード属性を更新します。
        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): 
        # "node" に保存された操作の Protobuf 表現を解析する "onnx_attr" ヘルパーメソッドを使用します。
        # 名前が "value" の属性の値を "TensorProto" タイプ (キーワード "t" で指定) として取得します。 
        pb_value = onnx_attr(node, 'value', 't') 
        # "numpy_helper.to_array()" ONNX ヘルパーメソッドを使用して、"TensorProto" オブジェクトを numpy 配列に変換します。 
        value = numpy_helper.to_array(pb_value) 

        attrs = { 
           'data_type': value.dtype, 
            'value': value, 
        } 
        # "Const" 操作のデフォルト属性と "attrs" 辞書に保存された属性を使用して、 
        # ノード属性を更新します。
        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 配列を使用します。

関連情報#