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

その他

この記事は、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」の「Elementwise」と「Inner Product」の節を取り上げています。

要素単位 (Elementwise)

要素単位のプリミティブは、テンソルのすべての要素に操作を適用します。変数名は標準の規則 (英語) に従います。

の場合、以下が成り立ちます。

順方向 (前方)

次の順方向操作をサポートしています。ここで sd は、それぞれ srcdst テンソル値を示します。

逆方向 (後方)

逆方向伝播は、 および に基づいて、 を計算します。ただし、一部の操作では順伝播で生成された メモリーを使用した計算をサポートします。入力メモリーとしてデスティネーションをサポートする操作の一覧と対応する式に関しては前述の表を参照してください。

次の逆方向操作をサポートしています。ここで、sdds および dd は、それぞれ srcdstdiff_srcdiff_dst テンソル値を示します。

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

#dnnl_forward_training#dnnl_forward_inference 伝播の種類に違いはありません。

実行引数

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

操作の詳細

  1. dnnl::eltwise_forward::primitive_descdnnl::eltwise_backward::primitive_desc コンストラクターは、パラメーター αβ を受け取ります。これらのパラメーターは、アルゴリズムで使用されない場合無視されます。

  2. srcdst のメモリー形式とデータタイプは同一であると想定されます。同じことが diff_srcdiff_dst にも当てはまります。

  3. 順方向と逆方向の両方でインプレース操作がサポートされ、src は順方向伝播の入力および出力として使用でき、diff_dst は逆伝播の入力および出力として使用できます。インプレースの場合、元のデータは上書きされます。ただし、逆伝播では一部のアルゴリズムが元の src を必要とするため、対応する順伝播をそれらのアルゴリズムのインプレースで実行してはなりません。逆伝播で dst を使用するアルゴリズムは、インプレースで安全に実行できます。

  4. 一部の操作では、パフォーマンスを向上させるため ではなく に基づいて逆伝播を計算すると良いことがあります。

注: 入力としてデスティネーション・メモリーをサポートする操作では、逆方向伝播を計算する際に src の代わりに dst を使用できます。これにより、パフォーマンスの最適化が可能になります (以下のヒントを参照)。

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

要素ごとのプリミティブは次のデータタイプの組み合わせをサポートする必要があります。

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

伝播 ソース/デスティネーション 中間データタイプ
順方向/逆方向 f32bf16 f32
順方向 f16 f16
順方向 s32/s8/u8 f32

中間データタイプは、入力値が最初に中間データタイプに変換されてから演算が適用され、最後に結果が出力データタイプに変換されます。

データ表現

要素ごとのプリミティブは任意のデータテンソルで機能します。論理的な次元については特別な意味はありません。

post-ops と属性

タイプ 操作 説明 制限事項
post-ops バイナリー 結果にバイナリー操作を適用します。  

API

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

内積

内積プリミティブ (全結合レイヤーとも呼ばれる) は、ミニバッチ内の活性化をベクトルとして扱い、2D テンソルを出力する重み 2D テンソルを使用して、その積を計算します。

順方向 (前方)

srcweightsbias および dst をそれぞれ N×ICOC×ICOC、そして N×OC テンソルとします。変数名は標準規則 (英語) に従います。

ここでは以下が成り立ちます。

src テンソルと weights テンソルが空間次元を持つ場合、それらは 2D に平坦化されます。例えば、4D N×IC′×IH×IW および OC×IC′×KH×KW テンソルでは、上記の式は IC=IC′⋅IH⋅IW として適用されます。この場合、srcweights テンソルは、同じ空間次元を持つ必要があります (例: 4D テンソルでは KH=IHKW=IW)。

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

forward_trainingforward_inference 伝播の種類に違いはありません。

逆方向 (後方)

逆方向伝播は、diff_dstweights に基づいて diff_src を計算します。

重みの更新では、diff_dstsrc に基づいて diff_weightsdiff_bias が計算されます。

注: 最適化されたメモリー形式の srcweights は、順方向伝播、逆方向伝播、および重みの更新で異なることがあります。

実行引数

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

操作の詳細

N/A

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

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

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

データ表現

他の 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 またはその子会社の商標です。

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

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