Loop

バージョン名: Loop-5

カテゴリー: インフラストラクチャー

簡単な説明: Loop 操作は、body で記述されているネットワークの反復実行し、データを反復処理します。この操作には、ONNX ループ操作と同様のセマンティクスがあります。

詳細な説明:

ループのボディーは、“トリップカウント”、“実行条件” と呼ばれるループ操作入力、および “現在の反復” と呼ばれるループボディーの入力に渡される値に応じて、0 回以上実行できます。

これらのループ操作入力には次の意味があります。

  1. トリップカウントは、最大反復数を指定する 1 要素入力を持つ整数スカラーまたは 1D テンソルです。無限ループをシミュレートするには、定数 -1 を入力とします。

  2. ループ実行条件の入力は、最初のループ反復を実行するかどうかを指定する 1 要素入力を持つブールスカラーまたは 1D テンソルです。ループのボディーは、連続する反復の条件値を設定する必要があることに注意してください。

これら 2 つの入力 (trip_count, execution condition) にはいくつかの組み合わせがありますが、次のコードで説明します。

input (-1, true) // infinite loop
    bool cond = true;
    for (int i = 0; cond; ++i)
    {
        cond = true; // sub-graph calculating condition must always return "true"!
    }

input (-1, cond) // while loop
    bool cond = ...;
    for (int i = 0; cond; ++i)
    {
        cond = ...;
    }

input (-1, true) // do-while loop
    bool cond = true;
    for (int i = 0; cond; ++i)
    {
        cond = ...;
    }

input (trip_count, true) // for loop
    int trip_count = ...;
    bool cond = true;
    for (int i = 0; i < trip_count; ++i)
    {
        cond = true; // sub-graph calculating condition must always return "true"!
    }

input (trip_count, cond) // for with condition
    int trip_count = ...;
    bool cond = ...;
    for (int i = 0; i < trip_count && cond; ++i)
    {
        cond = ...;
    }
  1. “現在の反復” と呼ばれるボディーグラフ入力の 1 つは、現在の反復数を指定する数値を持つ整数スカラーまたは 1D 整数テンソルです。反復数は 0 から始まり、反復ごとに 1 ずつ増加します。この入力はオプションであり、反復数の値がボディーで使用されていないと存在しない可能性があります。

  2. ボディーグラフ出力の 1 つは “条件” と呼ばれ、ブールスカラーまたは 1 つの要素の 1D テンソルです。この値は、次の反復を実行するか決定するために使用されます。

IR のループ操作の記述には、inputoutput という通常のセクションがあります。ループボディーを外側のグラフに接続し、条件を指定します。IR のループ操作の記述には、いくつかの特別なセクションもあります: bodyport_map および back_edges は、TensorIterator 操作と似ていますが、以下で説明する重要な機能があります。

  1. メイングラフから入力を取得するボディーの操作には、ループ操作の port_map セクションにエントリーが必要です。これらのエッジは、ループの入力ポートをボディーの ``Parameter`` に接続します。

  2. ループの入力テンソルは指定された軸に沿ってスライスでき、ループはスライスされたすべての部分を反復できます。port_map 内の対応する input エントリーには、スライスする軸を指定する axis 属性が必要です。したがって、axis 属性のない port_mapinput エントリーに対応するループ操作への入力は、“そのまま” (スライスなしで) 使用されます。

  3. 後続の反復で使用されるテンソルを生成するボディー操作 (RNN モデルなど) には、操作の back_edges セクションで記述されるバックエッジが必要です。バックエッジは、それぞれのボディーの ParameterResult 操作を接続します。この場合、ループ操作ノードは最初の反復に入力を提供し、対応するループ操作の出力は最後の反復中に計算されたテンソルを生成します。

  4. すべての反復にわたる特定のボディー操作で生成された出力テンソルは、連結してループ操作出力として返すことができます (これは ONNX* ループ操作仕様 による “スキャン出力” です)。port_map 内の対応する output エントリーには、連結する軸を指定する axis 属性が必要です。したがって、axis 属性のない port_mapoutput エントリーに対応する操作からの出力は、“そのまま” (連結せずに) 返されます。

  5. port_map を介して接続されていないボディーの 1 つの Parameter 操作があります。これは “現在の反復” 入力です。ループ操作は、各反復に適切な値を提供する責任があります。

  6. ループボディー内のノードとメイングラフとの接続は、ParameterResult ボディーの操作で行う必要があります。グラフを接続する他の方法は許可されません。

ループ属性:

  • ボディー:

    body は反復的に実行されるネットワークです。このネットワークは、典型的な IR ネットワークとして動作ごとに記述されます。

    • Body 属性:

      利用可能な属性はありません。

  • ポートマップ:

    port_map は、Loop 操作の入力または出力データテンソルを body データテンソルにマッピングするルールのセットです。port_map エントリーは `` input`` と output に使用できます。各エントリーは、対応するマッピングルールを説明します。

    • ポートマップ属性:

      • external_port_id
        • 説明: external_port_id は、Loop 操作のポート ID です。値 -1 は、ボディーノードが -1 操作に接続されていないことを意味します。

        • 値の範囲: ループ出力の ID

        • タイプ: int

        • デフォルト値: なし

        • 必須: はい

      • internal_layer_id
        • 説明: internal_layer_id は、マッピング先の body ネットワーク内の Parameter または Result オペレーション ID です。

        • 値の範囲: ループ操作内の Parameter 操作の ID

        • タイプ: int

        • デフォルト値: なし

        • 必須: はい

      • axis
        • 説明: output エントリーに axis が指定されている場合、それはすべての反復にわたってボディーの Result 出力を連結する軸になります。

        input エントリーに axis が指定されている場合、それは反復処理の対象となる軸であり、入力テンソルのスライスをトリガーします。

        • 値の範囲: 整数。負の値は、次元を端から数えることを意味します。

        • タイプ: int

        • デフォルト値: なし

        • 必須: いいえ

  • バックエッジ:

    back_edges は、ある反復での body 出力から次の反復への body パラメーターにテンソル値を転送するルールのセットです。バックエッジは、body 内の一部の Result 操作を同じ body 内の Parameter 操作に接続します。

    • バックエッジ属性:

      • from-layer
        • 説明: from-layer は、body ネットワーク内の Result 操作 ID です。

        • 値の範囲: ループ内の Result 操作の ID

        • タイプ: int

        • デフォルト値: なし

        • 必須: はい

      • to-layer
        • 説明: to-layer は、マッピングを終了する body ネットワーク内の Parameter 操作 ID です。

        • 値の範囲: ループ内の Parameter 操作の ID

        • タイプ: int

        • デフォルト値: なし

        • 必須: はい

ループの入力:

  • トリップカウント: 最大反復回数を指定する int64 または int32 タイプの要素を持つスカラーまたは 1D テンソル。必須。

  • ExecutionCondition: 最初の反復を実行するか指定する boolean タイプの要素を持つスカラーまたは 1D テンソル。True 値は、最初の反復を実行することを意味します。必須。

  • 他の複数の入力: さまざまなタイプと形状のテンソル。オプション。

ループの出力:

  • 複数の出力: body の実行結果。あらゆるタイプと形状のテンソル。

ボディーの入力:

  • 複数の入力: 現在の反復数に対応するものを除く、さまざまなタイプと形状のテンソル。この入力は、port_map 内で属性 purpose = "current_iteration" でマークされ、int64 または int32 タイプの要素を持つスカラーまたは 1D テンソルを生成します。オプション。

ボディーの出力:

  • 複数の出力: body の実行結果。実行条件付きの出力に対応するものを除く、任意のタイプおよび形状のテンソル。この出力は、port_map 内で属性 purpose = "execution_condition" でマークされており、必須であり、boolean タイプの要素を持つスカラーまたは 1D テンソルを生成します。他の出力はオプションです。

例:

例 1: 典型的な Loop 構造

<layer type="Loop" ... >
    <input> ... </input>
    <output> ... </output>
    <port_map>
        <input external_port_id="0" internal_layer_id="0"/>
        <input external_port_id="1" internal_layer_id="1"/>
        <input external_port_id="-1" internal_layer_id="2" purpose="current_iteration"/>
        ...
        <output external_port_id="3" internal_layer_id="4"/>
        <output external_port_id="4" internal_layer_id="10" axis="1"/>
        <output external_port_id="-1" internal_layer_id="22" purpose="execution_condition"/>
        ...
    </port_map>
    <back_edges>
        <edge from-layer="1" to-layer="5"/>
        ...
    </back_edges>
    <body>
        <layers> ... </layers>
        <edges> ... </edges>
    </body>
</layer>