bfloat16 (ブレイン浮動小数点) [ 1 ] [ 2 ]浮動小数点形式は、コンピュータのメモリ内で 16 ビットを占めるコンピュータ数値形式です。浮動小数点を使用して、広いダイナミックレンジの数値を表現します。この形式は、機械学習とニアセンサー コンピューティングを高速化することを目的として、 32 ビットIEEE 754 単精度浮動小数点形式(binary32) を短縮 (16 ビット) したバージョンです。[ 3 ] 8ビットの指数部を保持することで、32 ビット浮動小数点数のほぼダイナミック レンジを維持しますが、binary32 形式の 24 ビット仮数部ではなく、8 ビット精度のみをサポートします。単精度 32 ビット浮動小数点数よりも、bfloat16 数は整数計算には適していませんが、これは意図された用途ではありません。 Bfloat16は、機械学習アルゴリズムのストレージ要件を削減し、計算速度を向上させるために使用されます。[ 4 ]
bfloat16 フォーマットは、Google の人工知能研究グループであるGoogle Brainによって、 2017 年にリリースされたTPU v2で使用するために開発されました。 [ 1 ]これは、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 ]など、多くのCPU、GPU、AI プロセッサで利用されています。したがって、A15チップ以降で使用されています。CUDA [ 13 ] Intel oneAPI Math Kernel Library、AMD ROCm [ 14 ] AMD Optimizing CPU Libraries、PyTorch、TensorFlow [ 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規格では指数バイアスとも呼ばれます。
したがって、オフセットバイナリ表現で定義される真の指数を取得するには、指数フィールドの値からオフセット値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 の間などです。
IEEE 754 と同様に、正の無限大と負の無限大は対応する符号ビットで表され、8 つの指数ビットはすべてセットされ (FF 16 進数)、仮数ビットはすべてゼロになります。具体的には、
val s_exponent_signcnd +inf = 0_11111111_0000000 -inf = 1_11111111_0000000 IEEE 754 と同様に、NaN値は、符号ビット、8 つの指数ビットすべてがセット (FF 16 進数)、および仮数ビットすべてがゼロではないいずれかの方法で表現されます。具体的には、
val s_exponent_signcnd +NaN = 0_11111111_klmnopq -NaN = 1_11111111_klmnopq ここで、k、l、m、n、o、p、 qのうち少なくとも 1 つが1 です。IEEE 754 と同様に、NaN 値は静止状態または信号状態になりますが、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
ffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN
Googleは、Google Brainにちなんで「脳浮動小数点」を意味する「bfloat」と呼ばれる独自の内部浮動小数点フォーマットを発明しました。
このカスタム浮動小数点形式は「Brain Floating Point Format」、略して「bfloat16」と呼ばれています。この名前は、この形式のアイデアが考案された Google の人工知能研究グループ「Google Brain」に由来しています。
標準は、完全な32ビット数値の範囲を与える数値を表現するためのターゲット方式ですが、データサイズは16ビット数値で、精度はゼロに近いままですが、標準の限界付近では精度がやや緩くなります。bfloat16標準は、機械学習アルゴリズム内で多くの用途があり、アルゴリズム内の値の精度を向上させながら、任意のデータセットで2倍のデータを提供(または、これらの計算セクションでの速度を2倍に)します。
は、Intel XeonプロセッサーやIntel FPGAを含む、当社のAI製品ライン全体でbfloat16のサポートを拡張します。
インテルは、XeonおよびFPGA製品ラインを含むすべてのAI製品でこのフォーマットをサポートする予定です。
Intelは、NNP-L1000がニューラルネットワーク向けに機械学習業界のすべての企業が採用している数値形式であるbfloat16もサポートすると述べた。同社はまた、FPGA、Xeon、その他の機械学習製品でもbfloat16をサポートする予定である。Nervana NNP-L1000は2019年に発売予定である。
このページでは、Cloud TPU で利用可能な TensorFlow Python API とグラフ演算子の一覧が表示されます。
Cloud TPU については、Google は TensorFlow 1.7.0 で公式 TPU リポジトリの bfloat16 実装を使用することを推奨しています。TPU と GPU の実装はどちらも、それぞれのアーキテクチャで混合精度計算を使用し、ほとんどのテンソルを半精度で格納します。
TensorFlow Distributions のすべての演算は、半精度、単精度、倍精度の浮動小数点数 (TensorFlow dtypes: tf.bfloat16 (切り捨て浮動小数点数)、tf.float16、tf.float32、tf.float64) で数値的に安定しています。クラス コンストラクタには、数値アサート用の validate_args フラグがあります。
多くのモデルでは、これは float-32 のドロップイン代替品です。
では、変換時の丸め方式は最も近い偶数に丸め、オーバーフローは inf になります。
非準拠の奇数丸めモードを使用します。
float 数値を nv_bfloat16 精度に丸め偶数モードで変換し、変換された値を持つ nv_bfloat16 を返します。