bfloat16浮動小数点形式


Bfloat16_floating-point_format

別の16ビット浮動小数点形式
であるbinary16と混同しないでください
bfloat16(脳浮動小数点) 浮動小数点形式は、コンピュータの数値表現占める16ビットにコンピュータメモリ、浮動基数ポイントを使用して、幅広いダイナミックレンジの数値を表します。この形式は、機械学習とセンサーに近いコンピューティングを高速化することを目的とした、32ビットIEEE 754単精度浮動小数点形式(binary32)の切り捨てられた(16ビット)バージョンです。 8を保持することにより、32ビット浮動小数点数のおおよそのダイナミックレンジを維持します。 指数ビットですが、binary32形式の24ビット仮数ではなく、8ビット精度のみをサポートします。単精度32ビット浮動小数点数よりも、bfloat16数は整数計算には適していませんが、これは意図された用途ではありません。Bfloat16は、ストレージ要件を減らし、機械学習アルゴリズムの計算速度を上げるために使用されます。
bfloat16形式は、Googleの人工知能研究グループであるGoogleBrainによって開発されました。 bfloat16フォーマットは、インテルで利用されるAIプロセッサなど、ナバナNNP-L1000、のXeonプロセッサ(AVX-512 BF16拡張)、およびIntelのFPGA、 GoogleクラウドのTPU、 およびTensorFlow。 ARMv8.6-A、 AMD ROCm、およびCUDA も、bfloat16形式をサポートしています。これらのプラットフォームでは、bfloat16は混合精度の演算でも使用できます。この場合、bfloat16の数値を操作して、より幅広いデータ型に拡張できます。

コンテンツ
1 bfloat16浮動小数点形式
1.1 bfloat16と単精度との対比
1.1.1 伝説
1.2 指数エンコーディング
2 特別な値のエンコード
2.1 正と負の無限大 2.2 数字ではない
3 範囲と精度
4 例
4.1 零点と無限大 4.2 特別な値 4.3 NaN
5 も参照してください
6 参考文献

bfloat16浮動小数点形式
bfloat16の形式は次のとおりです。
符号ビット:1ビット
指数幅:8ビット
仮数 精度:従来の単精度浮動小数点形式の24ビットとは対照的に、8ビット(7は明示的に格納されます)
切り捨てられたIEEE754単精度32ビットfloatであるbfloat16形式により、IEEE754単精度32ビットfloatとの間の高速変換が可能になります。bfloat16形式への変換では、指数ビットは保持されますが、仮数フィールドは、NaNの特殊なケースを無視して、切り捨てによって減らすことができます(したがって、0への丸めに対応します)。指数ビットを保持する≈10の32ビット浮動小数点の範囲に維持-38を3×10≈に38。
ビットは次のように配置されます。
IEEE半精度16ビット浮動小数点
サイン 指数(5ビット) 分数(10ビット)
  ┃ ┌───────┐ ┌─────────────────┐  0   0   1   1   0   0   0   1   0   0 0  0 1  0 2  0 3  0   0 
 0 15 14 10 9 0
IEEE754単精度32ビット浮動小数点
サイン 指数(8ビット) 分数(23ビット)
  ┃ ┌─────────────┐ ┌───────────────────────────────────────────┐  0   0   1   1   1   1   1   0   0   0 0  0 1  0 2  0 3
 0   0   0   0   0   0   0   0   0   0   0 0  0 1  0 2  0 3  0   0   0   0 
 0 31 30 23 22 0 bfloat16 サイン 指数(8ビット) 分数(7ビット)
  ┃ ┌─────────────┐ ┌───────────┐  0   0   1   1   1   1   1   0   0   0 0  0 1  0 2  0 3  0   0 
 0 15 14 7 6 0 NVidiaのTensorFloat サイン 指数(8ビット) 分数(10ビット)
  ┃ ┌─────────────┐ ┌─────────────────┐  0   0   1   1   1   1   1   0   0   0 0  0 1  0 2  0 3  0   0   0   0   0 
 0 18 17 10 9 0
AMDのfp24フォーマット
サイン 指数(7ビット) 分数(16ビット)
  ┃ ┌───────────┐ ┌─────────────────────────────┐  0   0   1   1   1   1   0   0   0   0 0  0 1  0 2  0 3  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   0 0  0 1  0 2  0 3  0   0   0   0   0   0   0   0   0 
 0 
 0 23 22 15 14
0

bfloat16と単精度との対比編集E E E E E E E E 伝説
  S:
サイン
  E:
指数
  F:両方の形式の分数(末尾の
仮数)
  f:32ビット単精度の分数(末尾の仮数) (比較)

指数エンコーディング
bfloat16バイナリ浮動小数点指数は、オフセットバイナリ表現を使用してエンコードされます。ゼロオフセットは127です。IEEE754標準では指数バイアスとも呼ばれます。
E min = 01 H −7F H = −126
E max = FE H −7F H = 127
指数バイアス= 7F H = 127
したがって、オフセットバイナリ表現で定義された真の指数を取得するには、指数フィールドの値から127のオフセットを減算する必要が
指数フィールド(00の最小値と最大値HとFF Hは)IEEE 754標準フォーマットのように、特別に解釈されます。
指数 仮数ゼロ 仮数がゼロ以外 方程式 00 H ゼロ、-0 非正規化数 (-1)signbit ×2 -126 ×0.significandbits
01 H、…、FE H
正規化された値 (-1)signbit ×2指数ビット-127×1.significandbits FF H ±無限大 NaN(静かな、シグナリング)
最小の正の通常の値は2である-126 ≈1.18×10 -38と最小の正(非正規)の値は2である-126-7 = 2 -133 ≈9.2×10 -41。
特別な値のエンコード編集

正と負の無限大
IEEE 754の場合と同様に、正と負の無限大は、対応する符号ビット、8つの指数ビットすべてが設定され(FF hex)、すべての仮数ビットがゼロで表されます。明示的に、
val s_exponent_signcnd+ inf = 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です。IEEE754と同様に、NaN値は静かまたはシグナリングできますが、2018年9月の時点でbfloat16NaNのシグナリングの既知の使用法はありません。

範囲と精度
Bfloat16は、32ビットIEEE 754単精度浮動小数点形式(binary32)の数値範囲を維持しながら、精度を24ビットから8ビットに下げるように設計されています。この手段精度は2と3桁の間であり、そしてbfloat16は、最大約3.4×10に有限の値を表すことができる38。


これらの例は、浮動小数点値の16進数および2進数のビット表現で示されています。これには、符号、(偏った)指数、および仮数が含まれます。
3f80 = 0 01111111 0000000 = 1c000 = 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 = 08000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 =無限大ff80 = 1 11111111 0000000 = −無限大

特別な値
4049 = 0 10000000 1001001 =3.140625≈π(pi)3eab = 0 01111101 0101011 =0.333984375≈1/ 3

NaN
ffc1 = x 11111111 1000001 => qNaNff81 = x 11111111 0000001 => sNaN

も参照してください
半精度浮動小数点形式:IEEE 754で定義されている、1ビット符号、5ビット指数、および11ビット仮数を含む16ビット浮動小数点
ISO / IEC 10967、言語に依存しない算術
プリミティブデータ型
ミニフロート
グーグルブレイン

参考文献
^ Teich、Paul(2018-05-10)。「GoogleのTPU3.0AIコプロセッサを分解する」。次のプラットフォーム。Googleは、「ブレイン浮動小数点」の「bfloat」と呼ばれる独自の内部浮動小数点形式を発明しました(Google Brainの後)。
^ 王、志保; Kanwar、Pankaj(2019-08-23)。「BFloat16:クラウドTPUでの高性能の秘訣」。GoogleCloud 。このカスタム浮動小数点形式は、「Brain Floating Point Format」、または略して「bfloat16」と呼ばれます。この名前は、このフォーマットのアイデアが考案されたGoogleの人工知能研究グループである「GoogleBrain」に由来しています。
^ タリアヴィーニ、ジュゼッペ; マッハ、ステファン; ロッシ、ダビデ; マロンギウ、アンドレア; ベナン、ルカ(2018)。「超低電力コンピューティングのための超高精度浮動小数点プラットフォーム」。2018 Design、Automation&Test in Europe Conference&Exhibition(DATE)。pp。1051-1056。arXiv:1711.10374。土井:10.23919 /DATE.2018.8342167。ISBN  978-3-9819263-0-9。S2CID  5067903。
^ イアン・カトレス博士(2020-03-17)。「Intel ‘:Cooper Lake Plans:なぜBF16が重要なのですか?」。bfloat16標準は、完全な32ビット数の範囲を与える数を表すターゲットを絞った方法ですが、16ビット数のデータサイズでは、精度をゼロに近づけますが、精度がに近いと少し緩くなります。標準の限界。bfloat16標準は、特定のデータセットのデータを2倍にする(またはこれらの計算セクションの速度を2倍にする)一方で、アルゴリズム内の値の精度を高めることにより、機械学習アルゴリズム内で多くの用途が
^ アバディ、マルティン; バーハム、ポール; チェン、ジャンミン; Chen、Zhifeng; デイビス、アンディ; ディーン、ジェフリー; デヴィン、マシュー; ゲマワット、サンジャイ; アーヴィング、ジェフリー; Isard、Michael; クドゥラー、マンジュナス; レベンバーグ、ジョシュ; モンガ、ラジャット; ムーア、シェリー; マレー、デレクG。; シュタイナー、ブノワ; タッカー、ポール; Vasudevan、Vijay; ワーデン、ピート; ウィッケ、マーティン; ゆう、元; 鄭、小強(2016)。「TensorFlow:大規模な機械学習のためのシステム」(PDF)。arXiv:1605.08695。
^ ハリジョンソン(2018-05-23)。「Intelは、AIトレーニングを加速するためのNervana Neural NetL-1000を発表しました」。VentureBeat 。… Intelは、IntelXeonプロセッサやIntelFPGAを含むAI製品ライン全体でbfloat16サポートを拡張します。
^ マイケルフェルドマン(2018-05-23)。「IntelがAIポートフォリオの新しいロードマップを発表」。TOP500スーパーコンピューターサイト。Intelは、XeonおよびFPGAラインを含むすべてのAI製品でこのフォーマットをサポートする予定です。
^ ルシアンアルマス(2018-05-23)。「Intelが2019年に最初のニューラルネットワークプロセッサであるSpringCrestを発売」。トムスハードウェア。Intelは、NNP-L1000はbfloat16もサポートすると述べました。これは、ニューラルネットワークのすべてのML業界プレーヤーによって採用されている数値形式です。同社はまた、FPGA、Xeon、およびその他のML製品でbfloat16をサポートします。NervanaNNP-L1000は2019年にリリースされる予定です。
^ 「利用可能なTensorFlowOps | Cloud TPU | GoogleCloud」。GoogleCloud 。このページには、CloudTPUで利用可能なTensorFlowPythonAPIとグラフ演算子が一覧表示されます。
^ ElmarHaußmann(2018-04-26)。「GoogleのTPUv2とResNet-50でのNvidiaのV100の比較」。RiseMLブログ。クラウドTPUの場合、GoogleはTensorFlow1.7.0で公式TPUリポジトリのbfloat16実装を使用することを推奨しました。TPUとGPUの両方の実装は、それぞれのアーキテクチャで混合精度の計算を利用し、ほとんどのテンソルを半精度で格納します。
^ Tensorflow作成者(2018-07-23)。「TPUでBFloat16を使用するResNet-50」。Google 。
^ 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ディストリビューション(レポート)。arXiv:1711.10604。Bibcode:2017arXiv171110604D。2018年5月23日にアクセス。TensorFlowディストリビューションのすべての操作は、半精度、単精度、および倍精度の浮動小数点精度で数値的に安定しています(TensorFlow dtypes:tf.bfloat16(切り捨てられた浮動小数点)、tf.float16、tf.float32、tf.float64として)。クラスコンストラクターには、数値アサート用のvalidate_argsフラグがあります ^ 「Armv8-A用のBFloat16拡張機能」。community.arm.com 。
^ 「ROCmバージョン履歴」。github.com 。
^ 「CUDAライブラリbloat16組み込み関数」。
^ 「ライブストリーム1日目:ステージ8(Google I / O ’18)-YouTube」。Google。2018-05-08 。多くのモデルでは、これはfloat-32のドロップイン代替品です。