「Bfloat16」の版間の差分

編集の要約なし
編集の要約なし
 
(同じ利用者による、間の8版が非表示)
1行目: 1行目:
'''bfloat16''' (brain floating point、BF16)とは、浮動小数点を16ビット長で表す形式のひとつである。
{{小文字}}
'''bfloat16''' (brain floating point、BF16)とは、[[浮動小数点]]を16ビット長で表す形式のひとつです。


[[Google]]が[[TensorFlow]]向けに開発しているもの。
[[Google]]が[[TensorFlow]]向けに[[開発]]したものです。


BF16は「単純に[[FP32]]の仮数部を切り詰めた」というものである。
BF16は「単純に[[FP32]]の仮数部を切り詰めた」という[[仕様]]になっています。汎用的な「[[FP16]]」に対して「BF16はFP32と高速変換できる」のが利点であり、FP32との変換が頻繁に発生する用途(主に[[人工知能]])向けだと言われています。
汎用的な[[FP16]]に対して、BF16は「FP32から高速変換できる」のが利点で、出し入れの激しい[[人工知能]]向けだと言われている。


{| class="wikitable" style="text-align:center; border-width:0;"
{| class="wikitable" style="text-align:center; border-width:0;"
|+ [[FP16]]
|+[[FP16]]
|- style="line-height:70%;"
|- style="line-height:70%;"
| style="border-width:0; background:#FFFFFF;" colspan="2" | sign
| colspan="2" style="border-width:0; background:#FFFFFF;" |sign
| style="border-width:0; background:#FFFFFF;" colspan="5" | exponent (5 bit)
| colspan="5" style="border-width:0; background:#FFFFFF;" |exponent (5 bit)
| style="border-width:0; background:#FFFFFF;" colspan="10"| fraction (10 bit)
| colspan="10" style="border-width:0; background:#FFFFFF;" |fraction (10 bit)
|- style="line-height:70%;"
|- style="line-height:70%;"
| style="border-width:0; background:#FFFFFF;" colspan="2" |   ┃
| colspan="2" style="border-width:0; background:#FFFFFF;" |  ┃
| style="border-width:0; background:#FFFFFF;" colspan="5" | ┌───────┐
| colspan="5" style="border-width:0; background:#FFFFFF;" |┌───────┐
| style="border-width:0; background:#FFFFFF;" colspan="10"| ┌─────────────────┐
| colspan="10" style="border-width:0; background:#FFFFFF;" |┌─────────────────┐
|- style="font-size:9pt;"
|- style="font-size:9pt;"
| style="border-width:0; background:#FFFFFF;" | || style="background:#C4FCFF;" |  0  || style="background:#9FFFAC;" |  0  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  0  || style="background:#9FFFAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  1  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0 
| style="border-width:0; background:#FFFFFF;" | || style="background:#C4FCFF;" | 0 || style="background:#9FFFAC;" | 0 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 0 || style="background:#9FFFAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 1 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 
|-
|-
| style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" | 15 || style="border-width:0; background:#FFFFFF;" | 14 || style="border-width:0; background:#FFFFFF;" colspan="3" | || style="border-width:0; background:#FFFFFF;" | 10 || style="border-width:0; background:#FFFFFF;" | 9 || style="border-width:0; background:#FFFFFF;" colspan="8" | || style="border-width:0; background:#FFFFFF;" | 0
| style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |15|| style="border-width:0; background:#FFFFFF;" |14|| colspan="3" style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |10|| style="border-width:0; background:#FFFFFF;" |9|| colspan="8" style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |0
|}
|}


{| class="wikitable" style="text-align:center; border-width:0;"
{| class="wikitable" style="text-align:center; border-width:0;"
|+ bfloat16
|+bfloat16
|- style="line-height:70%;"
|- style="line-height:70%;"
| style="border-width:0; background:#FFFFFF;" colspan="2" | sign
| colspan="2" style="border-width:0; background:#FFFFFF;" |sign
| style="border-width:0; background:#FFFFFF;" colspan="8" | exponent (8 bit)
| colspan="8" style="border-width:0; background:#FFFFFF;" |exponent (8 bit)
| style="border-width:0; background:#FFFFFF;" colspan="7" | fraction (7 bit)
| colspan="7" style="border-width:0; background:#FFFFFF;" |fraction (7 bit)
|- style="line-height:70%;"
|- style="line-height:70%;"
| style="border-width:0; background:#FFFFFF;" colspan="2" |   ┃
| colspan="2" style="border-width:0; background:#FFFFFF;" |  ┃
| style="border-width:0; background:#FFFFFF;" colspan="8" | ┌─────────────┐
| colspan="8" style="border-width:0; background:#FFFFFF;" |┌─────────────┐
| style="border-width:0; background:#FFFFFF;" colspan="7" | ┌───────────┐
| colspan="7" style="border-width:0; background:#FFFFFF;" |┌───────────┐
|- style="font-size:9pt;"
|- style="font-size:9pt;"
| style="border-width:0; background:#FFFFFF;" | || style="background:#C4FCFF;" |  0  || style="background:#9FFFAC;" |  0  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  0  || style="background:#9FFFAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  1  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0 
| style="border-width:0; background:#FFFFFF;" | || style="background:#C4FCFF;" | 0 || style="background:#9FFFAC;" | 0 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 0 || style="background:#9FFFAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 1 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 
|-
|-
| style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" | 15 || style="border-width:0; background:#FFFFFF;" | 14 || style="border-width:0; background:#FFFFFF;" colspan="6" | || style="border-width:0; background:#FFFFFF;" | 7 || style="border-width:0; background:#FFFFFF;" | 6 || style="border-width:0; background:#FFFFFF;" colspan="5" | || style="border-width:0; background:#FFFFFF;" | 0
| style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |15|| style="border-width:0; background:#FFFFFF;" |14|| colspan="6" style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |7|| style="border-width:0; background:#FFFFFF;" |6|| colspan="5" style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |0
|}
|}


{| class="wikitable" style="text-align:center; border-width:0;"
{| class="wikitable" style="text-align:center; border-width:0;"
|+ FP32
|+FP32
|- style="line-height:70%;"
|- style="line-height:70%;"
| style="border-width:0; background:#FFFFFF;" colspan="2" | sign
| colspan="2" style="border-width:0; background:#FFFFFF;" |sign
| style="border-width:0; background:#FFFFFF;" colspan="8" | exponent (8 bit)
| colspan="8" style="border-width:0; background:#FFFFFF;" |exponent (8 bit)
| style="border-width:0; background:#FFFFFF;" colspan="23"| fraction (23 bit)
| colspan="23" style="border-width:0; background:#FFFFFF;" |fraction (23 bit)
|- style="line-height:70%;"
|- style="line-height:70%;"
| style="border-width:0; background:#FFFFFF;" colspan="2" |   ┃
| colspan="2" style="border-width:0; background:#FFFFFF;" |  ┃
| style="border-width:0; background:#FFFFFF;" colspan="8" | ┌─────────────┐
| colspan="8" style="border-width:0; background:#FFFFFF;" |┌─────────────┐
| style="border-width:0; background:#FFFFFF;" colspan="23"| ┌───────────────────────────────────────────┐
| colspan="23" style="border-width:0; background:#FFFFFF;" |┌───────────────────────────────────────────┐
|- style="font-size:9pt;"
|- style="font-size:9pt;"
| style="border-width:0; background:#FFFFFF;" | || style="background:#C4FCFF;" |  0  || style="background:#9FFFAC;" |  0  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  1  || style="background:#9FFFAC;" |  0  || style="background:#9FFFAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  1  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0  || style="background:#FFACAC;" |  0 
| style="border-width:0; background:#FFFFFF;" | || style="background:#C4FCFF;" | 0 || style="background:#9FFFAC;" | 0 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 1 || style="background:#9FFFAC;" | 0 || style="background:#9FFFAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 1 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#ACFFAC;" | 1 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 || style="background:#FFACAC;" | 0 
|-
|-
| style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" | 31 || style="border-width:0; background:#FFFFFF;" | 30 || style="border-width:0; background:#FFFFFF;" colspan="6" | || style="border-width:0; background:#FFFFFF;" | 23 || style="border-width:0; background:#FFFFFF;" | 22 || style="border-width:0; background:#FFFFFF;" colspan="21" | || style="border-width:0; background:#FFFFFF;" | 0
| style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |31|| style="border-width:0; background:#FFFFFF;" |30|| colspan="6" style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |23|| style="border-width:0; background:#FFFFFF;" |22|| colspan="21" style="border-width:0; background:#FFFFFF;" | || style="border-width:0; background:#FFFFFF;" |0
|}
|}


== 主なBF16をサポートする製品 ==
FP32からBF16への丸め処理の発動条件は
* [[Intel]]の[[CPU]] ([[AVX-512]]対応製品の一部)
* FP32の仮数部の「7ビット目が0」かつ「8ビット目が1」
* [[NVIDIA]]の[[GPU]] ([[NVIDIA Ampere]]搭載品)
 
==主なBF16をサポートする製品==
*[[Intel]]の[[CPU]] ([[AVX-512]]対応製品の一部)
*[[NVIDIA]]の[[GPU]] ([[NVIDIA Ampere]]搭載品)
 
== 関連項目 ==
* [[半精度浮動小数点数]]
* [[binary16]]
* [[bfloat16]]
 
[[category: 人工知能]]
[[category: 浮動小数点数]]