この記事は、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」の「Data Model」の節を取り上げています。
データモデル
oneDNN グラフは、論理テンソルを使用してデータタイプ、形状、レイアウトを記述します。32 ビット IEEE 単精度浮動小数点データタイプに加え、oneDNN グラフは他のデータタイプもサポートできます。形状には複数の次元が含まれており、合計次元と次元サイズが不明のまま設定される可能性があります。
oneDNN グラフは、次の列挙を使用してサポートするデータタイプを参照します。異なる操作間で異なるデータタイプの入力と出力がサポートされる可能性があるため、各操作の定義ページを参照することをお勧めします。
enum dnnl::graph::logical_tensor::data_type
undef
未定義データタイプ (空の論理テンソルに使用)。
f16
16 ビット半精度浮動小数点。
bf16
非標準 の 16 ビット浮動小数点 (7 ビット仮数)。
f32
32 ビット単精度浮動小数点。
s32
32 ビット符号付き整数。
s8
8 ビット符号付き整数。
u8
8 ビット符号なし整数。
boolean
ブーリアン・データ・タイプ。サイズは C++ 実装で定義されます。
oneDNN グラフは、パブリックレイアウトと不透明 (opaque
) レイアウトをサポートする必要があります。論理テンソルの layout_type
が strided
である場合、テンソルレイアウトは公開されており、ユーザーが物理メモリー内の各テンソルの要素を識別可能であることを意味します。
例えば、dims[][][]=x,y,z、strides[][][]=s0,s1,s2
の場合、物理メモリーの場所は s0∗x+s1∗y+s2∗z
になければなりません。
論理テンソルの layout_type
が不透明 (opaque
) である場合、ユーザーがメモリーバッファーを直接解釈することは想定されていません。不透明 (opaque
) テンソルは、oneDNN グラフのコンパイル済みパーティションからのみ出力可能であり、入力テンソルとしてのみ別のコンパイル・パーティションにフィードできます。
低い精度のサポート
oneDNN グラフ拡張機能は、u8
、s8
、bf16
そして f16
などの oneDNN プリミティブと同じ低精度をサポートします。int8
では、oneDNN グラフ API は、静的量子化による量子化モデルをサポートします。bf16
または f16
では、oneDNN グラフはディープラーニング・フレームワークの自動混合精度メカニズムをサポートします。どちらの場合も、oneDNN グラフ API はユーザーが計算グラフを低精度に変換し、データの精度と量子化パラメーターを指定することを期待します。oneDNN グラフ API の実装では、計算の数値精度を厳密にする必要があります。
int8
では、oneDNN グラフ API は、逆量子化 (dequantize) と量子化 (quantize) の 2 つの操作を提供します。逆量子化は関連するスケールとゼロポイントを持つ整数テンソルを受け取って、f32 テンソルを返し、量子化は f32 テンソル、スケール、ゼロポイントを受け取って整数テンソルを返します。スケールとゼロポイントは 1 次元のテンソルであり、テンソルごとの量子化では 1 つの値を、チャネルごとの量子化では複数の値を保持することができます。unsigned int8 または signed int8 の両方で整数テンソルを表現できます。ゼロポイントは、対称量子化スキームの場合はゼロ、非対称量子化スキームでは非ゼロの値になります。
ユーザーは、量子化プロセスでグラフに逆量子化と量子化を挿入して oneDNN グラフに渡す必要があります。oneDNN グラフはユーザーが指定するデータタイプを尊重しつつ、データタイプのセマンティクスに従います。例えば、グラフに同じスケールとゼロポイントの量子化と続く逆量子化がある場合、暗黙的に数値精度が変更されるため、oneDNN グラフの実装ではそれらを排除すべきではありません。
oneDNN グラフのパーティション化 API は、逆量子化、量子化、畳み込み操作を含むパーティションを返すことがあります。ユーザーは、サブグラフパターンを認識して融合操作に変換する必要はありません。oneDNN グラフの実装能力に応じて、パーティションに含まれる操作数が変動する可能性があります。
bf16 では、oneDNN グラフは f32 テンソルを bf16 または f16 に、またはその逆に変換する TypeCast
操作を提供します。すべての oneDNN グラフ操作は bf16 と f16 をサポートします。数値精度を明確にするため、TypeCast を挿入するのはユーザーの責任です。oneDNN グラフの実装は、ユーザーが指示する数値精度に従います。ユーザーが f32 から bf16 にタイプキャストして、その後逆に戻す場合、oneDNN グラフ実装は正確にデータタイプ変換を行います。
操作セット
oneDNN グラフは操作のセットを定義しますが、操作セットのサブセットをサポートする場合があります。
操作セットの詳細はこちら (英語) を参照してください。
法務上の注意書き
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 またはその子会社の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。