oneAPI 1.3 暫定仕様書 Rev. 1 の解説 (21)

その他

この記事は、https://www.oneapi.io/spec/ で 2023年9月14日に公開された『oneAPI 1.3 Provisional Specification Rev. 1』 (HTMLPDF) をベースにしています。原文は2000 ページ近くあり、翻訳の時間とリソースも限られるため、全文翻訳ではなく、記事形式で区切った仕様とその解説を提供することにしました。


この回では、『oneAPI 1.3 Provisional Specification Rev. 1』の「oneDNN」の「Matrix Multiplication」と「Pooling」の節を取り上げています。

行列の乗算

行列乗算 (MatMul) プリミティブは、オプションのバイアス加算により 2 つの 2D テンソルの積を計算します。変数名は標準の規則 (英語) に従います。

MatMul プリミティブは、複数の独立した行列乗算計算のバッチ処理もサポートします。この場合、テンソルは 3D である必要があります。

バイアステンソルはオプションであり、暗黙のブロードキャストをサポートします。次元はいずれも 1 に設定することができ、対応する次元全体で同じ値が適用されます。ただし、biasdst と同じ次元数である必要があります。

実行引数

実行時に入力と出力は、次の表で示す実行引数インデックスにマップする必要があります。

操作の詳細

MatMul プリミティブは、実行時に指定される形状とメモリー形式の入力テンソルと出力テンソルをサポートします。実行時に与えられた次元やストライドは、プリミティブの初期化および作成段階で DNNL_RUNTIME_DIM_VAL ワイルドカード値で指定されます。実行段階でプリミティブが計算できるよう、ユーザーは完全な形式のメモリー・オブジェクトを渡す必要があります。作成時に与えられる形状や形式に関する情報が少ないほど、実行パフォーマンスが低下することに注意してください。作成時に形状が不明である場合、特殊形式タグ any を使用して実装が対応する入力または出力形状に最適なメモリー形式を選択することはできません。一方、実行時に指定された形状を利用すると、ユーザーはプリミティブを一度作成することでさまざまな状況に対応できます。

サポートされるデータタイプ

MatMul プリミティブは、ソース、デスティネーション、重み、およびバイアステンソルのデータタイプで次の組み合わせをサポートします。

注: この節では、可読性のためデータタイプの名称を短縮しています。例えば、dnnl::memory::data_type::f32f32 に短縮されます。

データ表現

MatMul プリミティブは、次のテンソルを想定します。

MatMul プリミティブは、通常、メモリー・オブジェクトがプレーンメモリー形式を使用する用途向けに最適化されています (いくつかの制限があります。次の表を参照してください)。ただし、入力テンソルが実行時に再利用される場合、プレースホルダー・メモリー形式 any を使用することを推奨します。この場合、プリミティブは対応する入力テンソルに最も適したメモリー形式を設定します。

次の表は、MatMul プリミティブが最適化されるメモリー形式の組み合わせを示します。デスティネーション・テンソルのメモリー形式は、2D の場合常に ab で、3D では abc である必要があります。

属性と post-ops

属性と post-ops により、MatMul プリミティブの動作を変えることができます。次の属性と post-op がサポートされます。

タイプ 操作 説明 制限事項
Attribute スケール 対応するテンソルにスケールを設定します。
Attribute ゼロポイント 対応するテンソルにゼロポイントを設定します。 Int8 計算のみ
Post-op 要素ごと 結果に要素ごとの操作を適用します。
post-op バイナリー 結果にバイナリー操作を適用します。
post-op 累計 演算結果を上書きせずに、デスティネーション・テンソルに加算します。

プリミティブは、実行時スケールを介した動的な量子化をサポートします。ユーザーは、プリミティブ記述子の作成時にスケールとゼロポイント属性を設定できます。ユーザーは、実行時に引数 DNNL_ARG_ATTR_SCALES および DNNL_ARG_ATTR_ZERO_POINTS を使用して、追加の入力メモリー・オブジェクトとしてスケールとゼロポイントを設定する必要があります (詳細は「量子化」の節で説明します)。

API

API については、こちら (英語) をご覧ください。

プーリング

プーリング・プリミティブは、1D、2D、または 3D 空間データに対し順方向または逆方向の平均プーリング操作を実行します。

プーリング操作は次の式で定義されます。高次元と低次元のケースで一般化が容易な 2D 空間データの式のみを示します。変数名は標準の規則 (英語) に従います。

順方向 (前方)

最大プーリング:

平均プーリング:

ここで、出力空間次元は、畳み込みと逆畳み込みと同様に計算されます。

平均プーリングは 2 つのアルゴリズムをサポートします。

  • pooling_avg_include_padding の場合、DENOM=KH⋅KW です。

  • pooling_avg_exclude_padding の場合、平均ウィンドウとイメージ間のオーバーラップ・サイズは等しくなります。

順方向トレーニングと順方向推論の違い

最大プーリングでは、forward_training 伝播種別の workspace が必要ですが、forward_inference では必要ありません (詳細は以下参照)。

逆方向 (後方)

逆方向伝播では、diff_dst(n,c,h,w) に基づいて diff_src(n,c,h,w) が計算され、最大プーリングでは workspace が計算されます。

実行引数

実行時に入力と出力は、次の表で示す実行引数インデックスにマップする必要があります。

操作の詳細

  1. トレーニング中、最大プーリングでは、最大値が検出されたインデックスを保持するため、前方パス (forward_training) と後方パスでワークスペースが必要になります。ワークスペースの形状は不透過であり、インデックスを復元することはできません。ただし、後方プーリングによりアップサンプリングが可能です (一部の検出トポロジーで使用されます)。ワークスペースは dnnl::pooling_forward::primitive_desc::workspace_desc() を介して作成できます。

  2. ユーザーは、プーリング順伝播を作成する際に dst メモリー記述子に any メモリー形式タグを使用できます。ライブラリーは src メモリー記述子から適切な形式を判断しますが、src そのものは定義する必要があります。同様に、ユーザーはプーリング逆伝播を作成する際に diff_src メモリー記述子にメモリー形式タグ any を使用できます。

サポートされるデータタイプ

プーリング・プリミティブは次のデータタイプの組み合わせをサポートします。

注: この節では、可読性のためデータタイプの名称を短縮しています。例えば、dnnl::memory::data_type::f32f32 に短縮されます。

データ表現

ソース、デスティネーション、およびそれらの勾配

他の CNN プリミティブのように、プーリング・プリミティブは、データが 1D 空間の場合は N × C × W テンソル、2D 空間では N × C × H × W テンソル、3D 空間では N × C × D × H × W テンソルであることを期待します。

プーリング・プリミティブは次のメモリー形式に最適化されています。

ここで、optimized^ は、先行する計算集約型プリミティブによって選択された形式です。

post-ops と属性

プーリング・プリミティブは post-ops や属性をサポートしません。

API

API については、こちら (英語) をご覧ください。


法務上の注意書き

The content of this oneAPI Specification is licensed under the Creative Commons Attribution 4.0 International License (英語). Unless stated otherwise, the sample code examples in this document are released to you under the MIT license (英語).

This specification is a continuation of Intel’s decades-long history of working with standards groups and industry/academia initiatives such as The Khronos Group*, to create and define specifications in an open and fair process to achieve interoperability and interchangeability. oneAPI is intended to be an open specification and we encourage you to help us make it better. Your feedback is optional, but to enable Intel to incorporate any feedback you may provide to this specification, and to further upstream your feedback to other standards bodies, including The Khronos Group SYCL* specification, please submit your feedback under the terms and conditions below. Any contribution of your feedback to the oneAPI Specification does not prohibit you from also contributing your feedback directly to other standard bodies, including The Khronos Group under their respective submission policies.

By opening an issue, providing feedback, or otherwise contributing to the specification, you agree that Intel will be free to use, disclose, reproduce, modify, license, or otherwise distribute your feedback at its sole discretion without any obligations or restrictions of any kind, including without limitation, intellectual property rights or licensing obligations.

This document contains information on products, services and/or processes in development. All information provided here is subject to change without notice.

© Intel Corporation. Intel、インテル、Intel ロゴ、その他のインテルの名称やロゴは、Intel Corporation またはその子会社の商標です。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

« パート 20        目次        パート 22 »
タイトルとURLをコピーしました