この記事は、https://www.oneapi.io/spec/ で 2023年9月14日に公開された『oneAPI 1.3 Provisional Specification Rev. 1』 (HTML、PDF) をベースにしています。原文は2000 ページ近くあり、翻訳の時間とリソースも限られるため、全文翻訳ではなく、記事形式で区切った仕様とその解説を提供することにしました。
この回では、『oneAPI 1.3 Provisional Specification Rev. 1』の「oneDNN」の「Elementwise」と「Inner Product」の節を取り上げています。
要素単位 (Elementwise)
要素単位のプリミティブは、テンソルのすべての要素に操作を適用します。変数名は標準の規則 (英語) に従います。
の場合、以下が成り立ちます。
順方向 (前方)
次の順方向操作をサポートしています。ここで s
と d
は、それぞれ src
と dst
テンソル値を示します。
逆方向 (後方)
逆方向伝播は、 および に基づいて、 を計算します。ただし、一部の操作では順伝播で生成された メモリーを使用した計算をサポートします。入力メモリーとしてデスティネーションをサポートする操作の一覧と対応する式に関しては前述の表を参照してください。
次の逆方向操作をサポートしています。ここで、s
、d
、ds
および dd
は、それぞれ src
、dst
、diff_src
、diff_dst
テンソル値を示します。
順方向トレーニングと順方向推論の違い
#dnnl_forward_training
と #dnnl_forward_inference
伝播の種類に違いはありません。
実行引数
実行時に入力と出力は、次の表で示す実行引数インデックスにマップする必要があります。
操作の詳細
dnnl::eltwise_forward::primitive_desc
とdnnl::eltwise_backward::primitive_desc
コンストラクターは、パラメーターα
とβ
を受け取ります。これらのパラメーターは、アルゴリズムで使用されない場合無視されます。src
とdst
のメモリー形式とデータタイプは同一であると想定されます。同じことがdiff_src
とdiff_dst
にも当てはまります。順方向と逆方向の両方でインプレース操作がサポートされ、
src
は順方向伝播の入力および出力として使用でき、diff_dst
は逆伝播の入力および出力として使用できます。インプレースの場合、元のデータは上書きされます。ただし、逆伝播では一部のアルゴリズムが元のsrc
を必要とするため、対応する順伝播をそれらのアルゴリズムのインプレースで実行してはなりません。逆伝播でdst
を使用するアルゴリズムは、インプレースで安全に実行できます。一部の操作では、パフォーマンスを向上させるため ではなく に基づいて逆伝播を計算すると良いことがあります。
注: 入力としてデスティネーション・メモリーをサポートする操作では、逆方向伝播を計算する際に src
の代わりに dst
を使用できます。これにより、パフォーマンスの最適化が可能になります (以下のヒントを参照)。
サポートされるデータタイプ
要素ごとのプリミティブは次のデータタイプの組み合わせをサポートする必要があります。
注: この節では、可読性のためデータタイプの名称を省略しています。例えば、dnnl::memory::data_type::f32
は f32
に省略されます。
伝播 | ソース/デスティネーション | 中間データタイプ |
---|---|---|
順方向/逆方向 | f32 、bf16 |
f32 |
順方向 | f16 |
f16 |
順方向 | s32 /s8 /u8 |
f32 |
中間データタイプは、入力値が最初に中間データタイプに変換されてから演算が適用され、最後に結果が出力データタイプに変換されます。
データ表現
要素ごとのプリミティブは任意のデータテンソルで機能します。論理的な次元については特別な意味はありません。
post-ops と属性
タイプ | 操作 | 説明 | 制限事項 |
---|---|---|---|
post-ops | バイナリー | 結果にバイナリー操作を適用します。 |
API
API については、こちら (英語) をご覧ください。
内積
内積プリミティブ (全結合レイヤーとも呼ばれる) は、ミニバッチ内の活性化をベクトルとして扱い、2D テンソルを出力する重み 2D テンソルを使用して、その積を計算します。
順方向 (前方)
src
、weights
、bias
および dst
をそれぞれ N×IC
、OC×IC
、OC
、そして N×OC
テンソルとします。変数名は標準規則 (英語) に従います。
ここでは以下が成り立ちます。
src
テンソルと weights
テンソルが空間次元を持つ場合、それらは 2D に平坦化されます。例えば、4D N×IC′×IH×IW
および OC×IC′×KH×KW
テンソルでは、上記の式は IC=IC′⋅IH⋅IW
として適用されます。この場合、src
と weights
テンソルは、同じ空間次元を持つ必要があります (例: 4D テンソルでは KH=IH
と KW=IW
)。
順方向トレーニングと順方向推論の違い
forward_training
と forward_inference
伝播の種類に違いはありません。
逆方向 (後方)
逆方向伝播は、diff_dst
と weights
に基づいて diff_src
を計算します。
重みの更新では、diff_dst
と src
に基づいて diff_weights
と diff_bias
が計算されます。
注: 最適化されたメモリー形式の src
と weights
は、順方向伝播、逆方向伝播、および重みの更新で異なることがあります。
実行引数
実行時に入力と出力は、次の表で示す実行引数インデックスにマップする必要があります。
操作の詳細
N/A
サポートされるデータタイプ
内積プリミティブは、ソース、デスティネーション、重み、およびバイアスのデータタイプで次の組み合わせをサポートします。
注: この節では、可読性のためデータタイプの名称を短縮しています。例えば、dnnl::memory::data_type::f32
は f32
に短縮されます。
データ表現
他の CNN プリミティブと同様に、内積プリミティブは次のテンソルを想定します。
内積プリミティブのパフォーマンスにとって、データのメモリー形式とメモリー・オブジェクトの重みは重要です。oneDNN プログラミング・モデルでは、内積プリミティブはプレースホルダー形式の any
をサポートし、プリミティブ・パラメーターに基づいてメモリー・オブジェクト形式を定義できる数少ないプリミティブの 1 つです。any
を使用する場合、最初に内積プリミティブ記述子を作成してから、実際のデータと重みメモリー・オブジェクト形式を照会する必要があります。
次の表は、内積プリミティブが最適化されるプレーンメモリー形式の組み合わせを示します。デスティネーション・テンソル (常に N×C
) では、メモリー形式は常に nc
(ab
) です。
post-ops と属性
次の post-ops 操作が内積プリミティブでサポートされる必要があります。
タイプ | 操作 | 説明 | 制限事項 |
---|---|---|---|
属性 | スケール | 対応するテンソルにスケールを設定します。 | Int8 計算のみ |
属性 | ゼロポイント | 対応するテンソルにゼロポイントを設定します。 | Int8 計算のみ |
post-op | 要素ごと | 結果に要素ごとの操作を適用します。 | |
post-op | バイナリー | 結果にバイナリー操作を適用します。 | |
post-op | 累積 | 演算結果を上書きせずに、デスティネーション・テンソルに加算します。 |
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 またはその子会社の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。