| 浮動小数点形式 |
|---|
| IEEE 754 |
| 他の |
| 代替案 |
| テーパード浮動小数点 |
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データセンター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形式は、IEEE 754単精度32ビット浮動小数点の短縮版であり、IEEE 754単精度32ビット浮動小数点との間で高速な変換を可能にします。bfloat16形式への変換では、指数ビットは保持されますが、仮数部は切り捨て(つまり0への丸め)またはその他の丸めメカニズムによって縮小され、NaN特殊ケースは無視されます。指数ビットを保持することで、32ビット浮動小数点の範囲は≈ 10 −38から≈ 3 × 10 38に維持されます。[ 16 ]
ビットは次のように配置されます。
| IEEE半精度16ビット浮動小数点数 | ||||||||||||||||||||||||||||||||||
| サイン | 指数(5ビット) | 分数(10ビット) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 10 | 9 | 0 | ||||||||||||||||||||||||||||||
| bfloat16 | ||||||||||||||||||||||||||||||||||
| サイン | 指数(8ビット) | 分数(7ビット) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 7 | 6 | 0 | ||||||||||||||||||||||||||||||
| NvidiaのTensorFloat-32(19ビット) | ||||||||||||||||||||||||||||||||||
| サイン | 指数(8ビット) | 分数(10ビット) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||
| 18 | 17 | 10 | 9 | 0 | ||||||||||||||||||||||||||||||
| ATIのfp24フォーマット[ 17 ] | ||||||||||||||||||||||||||||||||||
| サイン | 指数(7ビット) | 分数(16ビット) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||
| 23 | 22 | 16 | 15 | 0 | ||||||||||||||||||||||||||||||
| ピクサーのPXR24フォーマット | ||||||||||||||||||||||||||||||||||
| サイン | 指数(8ビット) | 分数(15ビット) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||
| 23 | 22 | 15 | 14 | 0 | ||||||||||||||||||||||||||||||
| IEEE 754 単精度32 ビット浮動小数点 | ||||||||||||||||||||||||||||||||||
| サイン | 指数(8ビット) | 分数(23ビット) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||
| 31 | 30 | 23 | 22 | 0 | ||||||||||||||||||||||||||||||
bfloat16 バイナリ浮動小数点指数は、オフセットバイナリ表現を使用してエンコードされ、ゼロオフセットは 127 です。これは、IEEE 754 標準では指数バイアスとも呼ばれます。
したがって、オフセット バイナリ表現で定義された実際の指数を取得するには、指数フィールドの値からオフセット 127 を減算する必要があります。
指数フィールドの最小値と最大値 (00 Hと FF H ) は、IEEE 754 標準形式と同様に特別に解釈されます。
| 指数 | 仮数ゼロ | 仮数がゼロでない | 方程式 |
|---|---|---|---|
| 00時間 | ゼロ、−0 | 非正規数 | (−1)符号ビット×2 −126 × 0.有効ビット数 |
| 01 H、…、FE H | 正規化された値 | (−1)符号ビット× 2指数ビット − 127 × 1 仮数ビット | |
| FF H | ±無限大 | NaN (静音、シグナリング) | |
最小の正の正規値は 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 hex)、仮数部ビットはすべてゼロとなる。明示的には、
val s_exponent_signcnd +無限大 = 0_11111111_0000000 -inf = 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
ffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN
Googleは独自の内部浮動小数点形式「bfloat」(「brain floating point」(Google Brainにちなむ))を発明した。
このカスタム浮動小数点形式は「Brain Floating Point Format」、略して「bfloat16」と呼ばれています。この名前は、この形式のアイデアが考案されたGoogleの人工知能研究グループ「Google Brain」に由来しています。
規格は、32ビット数値の範囲を16ビット数値のデータサイズで表現することを目的とした規格であり、精度はほぼゼロに保たれる一方で、規格の限界に近い精度に対してはやや緩い値となっています。bfloat16規格は、機械学習アルゴリズムにおいて多くの用途があり、アルゴリズム内部の値の精度を向上させると同時に、任意のデータセットで2倍のデータ量(または計算セクションの速度)を実現しています。
...Intelは、Intel XeonプロセッサーやIntel FPGAを含むAI製品ライン全体にbfloat16のサポートを拡大する予定です。
Intelは、XeonおよびFPGA製品ラインを含むすべてのAI製品でこのフォーマットをサポートする予定です。
は、NNP-L1000がbfloat16もサポートすると発表しました。bfloat16は、ML業界のあらゆる企業がニューラルネットワークに採用している数値フォーマットです。同社はFPGA、Xeon、その他のML製品でもbfloat16をサポートする予定です。Nervana NNP-L1000は2019年に発売予定です。
このページでは、Cloud TPUで利用可能なTensorFlow Python APIとグラフ演算子の一覧を示します。
については、GoogleはTensorFlow 1.7.0で公式TPUリポジトリのbfloat16実装を使用することを推奨しています。TPUとGPUの実装はどちらも、それぞれのアーキテクチャで混合精度計算を利用し、ほとんどのテンソルを半精度で保存します。
TensorFlow Distributions のすべての演算は、半精度、単精度、倍精度の浮動小数点数(TensorFlow dtype:tf.bfloat16(切り捨て浮動小数点数)、tf.float16、tf.float32、tf.float64)にわたって数値的に安定しています。クラスコンストラクタには、数値アサート用のvalidate_argsフラグがあります。
{{cite report}}: CS1 maint: 複数の名前: 著者リスト (リンク)多くのモデルでは、これはfloat-32の代替として使用できます。
では、変換時の丸め方式は、最も近い偶数に丸められ、オーバーフローは無限大になります。
非IEEE Round-to-Odd丸めモードを使用します。
値をnv_bfloat16精度に丸め(最も近い偶数への丸め)モードで変換し、変換された値を含むnv_bfloat16を返します。