bfloat16 (脳内浮動小数点)[1] [2]浮動小数点形式は、コンピュータメモリ内で16ビットを占めるコンピュータ数値形式です。浮動小数点基数を使用して、数値の広いダイナミックレンジを表します。この形式は、機械学習とセンサー近傍のコンピューティングを加速することを目的として、32ビットIEEE 754単精度浮動小数点形式(binary32)の短縮版(16ビット)です。[3] 8つの指数ビットを保持することで32ビット浮動小数点数のダイナミックレンジをほぼ維持しますが、binary32形式の24ビットの仮数部ではなく、8ビットの精度のみをサポートします。単精度32ビット浮動小数点数よりもbfloat16数は整数計算には不向きですが、これはbfloat16数の本来の用途ではありません。 Bfloat16は、ストレージ要件を削減し、機械学習アルゴリズムの計算速度を向上させるために使用されます。[4]
bfloat16 形式は、Google の人工知能研究グループである Google Brain によって開発されました。Intel Xeonプロセッサ( AVX - 512 BF16 拡張)、Intel Data Center GPU、Intel Nervana NNP-L1000、Intel FPGA、[5] [6] [7] AMD Zen、AMD Instinct 、NVIDIA GPU、Google Cloud TPU、[8] [9] [10] AWS Inferentia、AWS Trainium、ARMv8.6-A、[11] Apple のM2 [12]およびA15チップ以降など、多くの CPU、GPU、AI プロセッサで利用されています。CUDA [13] Intel oneAPI Math Kernel Library、AMD ROCm [ 14 ] AMD Optimizing CPU Libraries、PyTorch、TensorFlowなど、多くのライブラリが bfloat16 をサポートしています。[10] [15]これらのプラットフォームでは、bfloat16は混合精度演算にも使用でき、bfloat16の数値を操作してより広いデータ型に拡張することができます。
bfloat16 浮動小数点形式
bfloat16 の形式は次のとおりです。
bfloat16 形式は、IEEE 754 単精度32 ビット浮動小数点の短縮版であり、IEEE 754 単精度 32 ビット浮動小数点との間で高速な変換が可能です。bfloat16 形式への変換では、指数ビットは保持されますが、有効桁フィールドは切り捨て (つまり0 への丸めに相当) または他の丸めメカニズムによって削減され、NaN特殊ケースは無視されます。指数ビットを保持することで、32 ビット浮動小数点の範囲は ≈ 10 −38から ≈ 3 × 10 38に維持されます。[16]
ビットは次のように配置されます。
指数エンコーディング
bfloat16 バイナリ浮動小数点指数は、ゼロ オフセットが 127 であるオフセット バイナリ表現を使用してエンコードされます。これは、IEEE 754 標準では指数バイアスとも呼ばれます。
- E最小= 01 H −7F H = −126
- E最大= FE H −7F H = 127
- 指数バイアス= 7F H = 127
したがって、オフセット バイナリ表現で定義された実際の指数を取得するには、指数フィールドの値からオフセット 127 を減算する必要があります。
指数フィールドの最小値と最大値 (00 Hと FF H ) は、IEEE 754 標準形式と同様に特別に解釈されます。
最小の正の正規値は 2 −126 ≈ 1.18 × 10 −38であり、最小の正(非正規)値は 2 −126−7 = 2 −133 ≈ 9.2 × 10 −41です。
丸めと変換
最も一般的な使用例は、IEEE 754 binary32と bfloat16 間の変換です。次のセクションでは、変換プロセスと変換における丸め方式について説明します。bfloat16 との間の形式変換には、他にも考えられるシナリオがあることに注意してください。たとえば、int16 と bfloat16 です。
- binary32からbfloat16へ。bfloat16が最初にストレージフォーマットとして導入されたとき[15] 、 IEEE 754 binary32(32ビット浮動小数点)からbfloat16への変換は切り捨て(0への丸め)でした。後に、それが行列乗算ユニットの入力になると、変換はハードウェアプラットフォームに応じてさまざまな丸めメカニズムを持つことができます。たとえば、Google TPUの場合、変換の丸め方式は最も近い偶数への丸めです。[17] ARMはIEEE以外の奇数への丸めモードを使用します。[18] NVIDIAの場合、最も近い偶数への丸めモードで浮動小数点数をbfloat16精度に変換できます。[19]
- bfloat16からbinary32へ。binary32はbfloat16のすべての正確な値を表現できるため、変換では有効ビットに16個のゼロを埋め込むだけです。[17]
特殊値のエンコード
正の無限大と負の無限大
IEEE 754 と同様に、正と負の無限大は対応する符号ビットで表され、指数部8ビットはすべて設定され(FF hex)、仮数部ビットはすべてゼロになります。明示的には、
val s_exponent_signcnd
+無限大 = 0_11111111_0000000
-無限大 = 1_11111111_0000000
数字ではない
IEEE 754 と同様に、NaN値は符号ビット、8 つの指数ビットがすべて設定され (FF hex )、すべての有効ビットがゼロではない状態で表されます。明示的には、
val s_exponent_signcnd
+NaN = 0_11111111_klmnopq
-NaN = 1_11111111_klmnopq
ここで、 k、l、m、n、o、p、 qのうち少なくとも 1 つが 1 です。IEEE 754 と同様に、NaN 値は quiet または signaling にすることができますが、2018 年 9 月現在、signaling bfloat16 NaN の使用例は知られていません。
範囲と精度
Bfloat16 は、32 ビットIEEE 754 単精度浮動小数点形式(binary32) の数値範囲を維持しながら、精度を 24 ビットから 8 ビットに削減するように設計されています。つまり、精度は 2 ~ 3 桁の小数点であり、bfloat16 は約 3.4 × 10 38までの有限値を表現できます。
例
これらの例は、浮動小数点値のビット表現、16 進数および2 進数で示されています。これには、符号、(バイアスされた) 指数、および仮数部が含まれます。
3f80 = 0 01111111 0000000 = 1 c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (2 8 − 1) × 2 −7 × 2 127 ≈ 3.38953139 × 10 38 (bfloat16精度の最大の有限正値) 0080 = 0 00000001 0000000 = 2 −126 ≈ 1.175494351 × 10 −38(bfloat16精度および単精度浮動小数点の最小正規化された正の値)
通常の bfloat16 数値の最大の正の有限値は 3.38953139 × 10 38で、単精度で表現できる最大の正の有限値である (2 24 − 1) × 2 −23 × 2 127 = 3.402823466 × 10 38よりわずかに小さくなります。
ゼロと無限大
0000 = 0 00000000 0000000 = 0 8000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = 無限大 ff80 = 1 11111111 0000000 = −無限大
特別な値
4049 = 0 10000000 1001001 = 3.140625 ≈ π ( パイ ) 3eab = 0 01111101 0101011 = 0.333984375 ≈ 1/3
NaNs
ffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN
参照
- 半精度浮動小数点形式: IEEE 754で定義されている 16 ビット浮動小数点、1 ビット符号、5 ビット指数、11 ビット仮数。
- ISO/IEC 10967、言語に依存しない算術演算
- プリミティブデータ型
- ミニフロート
- グーグルブレイン
- TPU での bfloat16 の使用に関する Google に対する訴訟
参考文献
- ^ Teich, Paul (2018-05-10). 「Tearing Apart Google's TPU 3.0 AI Coprocessor」. The Next Platform . 2020-08-11閲覧。Google
は、「brain floating point」(Google Brain にちなんで)という独自の内部浮動小数点形式を発明しました。
- ^ Wang, Shibo; Kanwar, Pankaj (2019-08-23). 「BFloat16: Cloud TPU で高パフォーマンスを実現する秘訣」。Google Cloud 。2020-08-11に取得。
このカスタム浮動小数点形式は、「Brain Floating Point Format」または略して「bfloat16」と呼ばれます。この名前は、この形式のアイデアが考案された Google の人工知能研究グループである「Google Brain」に由来しています。
- ^ Tagliavini, Giuseppe; Mach, Stefan; Rossi, Davide; Marongiu, Andrea; Benin, Luca (2018). 「超低消費電力コンピューティングのためのトランスプレシジョン浮動小数点プラットフォーム」。2018 Design , Automation & Test in Europe Conference & Exhibition (DATE)。pp. 1051–1056。arXiv : 1711.10374。doi : 10.23919 / DATE.2018.8342167。ISBN 978-3-9819263-0-9. S2CID 5067903。
- ^ イアン・カトレス博士 (2020-03-17). 「インテル: クーパー湖計画: BF16 が重要な理由?」. 2020-05-12に取得。
bfloat16 標準は、完全な 32 ビット数値の範囲を提供する数値を 16 ビット数値のデータ サイズで表現するターゲットを絞った方法です。精度はゼロに近くなりますが、精度は標準の限界に近づくほど緩くなります。 bfloat16 標準は、機械学習アルゴリズム内で多くの用途があり、アルゴリズム内の値の精度が向上し、任意のデータセットで 2 倍のデータ (またはそれらの計算セクションの速度) が得られます。
- ^ Khari Johnson (2018-05-23). 「Intel が AI トレーニングを加速する Nervana Neural Net L-1000 を発表」VentureBeat 2018-05-23閲覧。...
Intel は、Intel Xeon プロセッサーや Intel FPGA を含む AI 製品ライン全体に bfloat16 サポートを拡張します。
- ^ Michael Feldman (2018-05-23). 「Intel が AI ポートフォリオの新たなロードマップを発表」TOP500 スーパーコンピュータ サイト. 2018-05-23取得。Intel
は、Xeon および FPGA ラインを含むすべての AI 製品でこの形式をサポートする予定です。
- ^ Lucian Armasu (2018-05-23). 「Intel、初のニューラルネットワークプロセッサSpring Crestを2019年に発売へ」。Tom 's Hardware。2018-05-23閲覧。Intel
によると、NNP-L1000は、ML業界のすべての企業がニューラルネットワークに採用している数値形式であるbfloat16もサポートするとのこと。同社はFPGA、Xeon、その他のML製品でもbfloat16をサポートする予定。Nervana NNP-L1000は2019年に発売予定。
- ^ 「利用可能な TensorFlow Ops | Cloud TPU | Google Cloud」。Google Cloud。2018年 5 月 23 日閲覧。
このページには、Cloud TPU で利用可能な TensorFlow Python API とグラフ演算子がリストされています。
- ^ Elmar Haußmann (2018-04-26). 「ResNet-50 で Google の TPUv2 と Nvidia の V100 を比較」RiseML ブログ。2018-04-26 にオリジナルからアーカイブ。2018-05-23に取得。
Cloud TPU については、Google は TensorFlow 1.7.0 の公式 TPU リポジトリの bfloat16 実装を使用することを推奨しました。TPU と GPU の両方の実装は、それぞれのアーキテクチャで混合精度計算を使用し、ほとんどのテンソルを半精度で保存します。
- ^ ab Tensorflow Authors (2018-07-23). 「ResNet-50 using BFloat16 on TPU」. Google . 2018年11月6日閲覧。
- ^ 「Armv8-A の BFloat16 拡張機能」。community.arm.com。2019年 8 月 29 日。2019 年 8 月 30 日閲覧。
- ^ 「AArch64: 新しい Apple CPU のサポートを追加 · llvm/llvm-project@677da09」。GitHub。2023年 5 月 8 日閲覧。
- ^ 「CUDA ライブラリ bloat16 組み込み関数」。
- ^ 「ROCm バージョン履歴」. github.com . 2019年10月23日閲覧。
- ^ ab Joshua V. Dillon、Ian Langmore、Dustin Tran、Eugene Brevdo、Srinivas Vasudevan、Dave Moore、Brian Patton、Alex Alemi、Matt Hoffman、Rif A. Saurous (2017-11-28)。TensorFlow Distributions (レポート)。arXiv : 1711.10604。Bibcode : 2017arXiv171110604D。2018-05-23 にアクセス。TensorFlow Distributionsのすべての演算は、半精度、単精度、倍精度の浮動小数点数 (TensorFlow dtype: tf.bfloat16 (切り捨て浮動小数点数)、tf.float16、tf.float32、tf.float64) にわたって数値的に安定し
ています。クラス コンストラクターには、数値アサート用の valid_args フラグがあります。
{{cite report}}: CS1 maint: 複数の名前: 著者リスト (リンク) - ^ 「ライブストリーム 1 日目: ステージ 8 (Google I/O '18) - YouTube」。Google。2018年5 月 8 日。2018 年 5 月 23 日閲覧。
多くのモデルでは、これは float-32 の代替品です。
- ^ ab 「bfloat16 数値形式」。Google Cloud。2023年 7 月 11 日閲覧。TPU
では、変換時の丸め方式は、最も近い偶数に丸められ、無限大にオーバーフローします。
- ^ 「Arm A64 命令セットアーキテクチャ」。developer.arm.com 。2023 年 7 月 26 日閲覧。
非 IEEE Round-to-Odd 丸めモードを使用します。
- ^ 「1.3.5. Bfloat16 精度変換とデータ移動」(PDF) . docs.nvidia.com . p. 199 . 2023-07-26取得。
最も近い偶数への丸めモードで float 数を nv_bfloat16 精度に変換し、変換された値で nv_bfloat16 を返します。
