「Bfloat16」の版間の差分
Administrator (トーク | 投稿記録) 編集の要約なし |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| (同じ利用者による、間の8版が非表示) | |||
| 1行目: | 1行目: | ||
'''bfloat16''' (brain floating point、BF16) | {{小文字}} | ||
'''bfloat16''' (brain floating point、BF16)とは、[[浮動小数点]]を16ビット長で表す形式のひとつです。 | |||
[[Google]]が[[TensorFlow]] | [[Google]]が[[TensorFlow]]向けに[[開発]]したものです。 | ||
BF16は「単純に[[FP32]] | BF16は「単純に[[FP32]]の仮数部を切り詰めた」という[[仕様]]になっています。汎用的な「[[FP16]]」に対して「BF16はFP32と高速変換できる」のが利点であり、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=" | | colspan="2" style="border-width:0; background:#FFFFFF;" |sign | ||
| colspan="5" style="border-width:0; background:#FFFFFF;" |exponent (5 bit) | |||
| style="border-width:0; background:#FFFFFF; | | 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" style="border-width:0; background:#FFFFFF;" | ┃ | ||
| style="border-width:0; background:#FFFFFF;" colspan=" | | colspan="5" style="border-width:0; background:#FFFFFF;" |┌───────┐ | ||
| 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; | | 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=" | | colspan="2" style="border-width:0; background:#FFFFFF;" |sign | ||
| colspan="8" style="border-width:0; background:#FFFFFF;" |exponent (8 bit) | |||
| style="border-width:0; background:#FFFFFF; | | 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" style="border-width:0; background:#FFFFFF;" | ┃ | ||
| style="border-width:0; background:#FFFFFF;" colspan=" | | colspan="8" style="border-width:0; background:#FFFFFF;" |┌─────────────┐ | ||
| 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; | | 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=" | | colspan="2" style="border-width:0; background:#FFFFFF;" |sign | ||
| colspan="8" style="border-width:0; background:#FFFFFF;" |exponent (8 bit) | |||
| style="border-width:0; background:#FFFFFF; | | 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" style="border-width:0; background:#FFFFFF;" | ┃ | ||
| style="border-width:0; background:#FFFFFF;" colspan=" | | colspan="8" style="border-width:0; background:#FFFFFF;" |┌─────────────┐ | ||
| 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:# | | 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; | | 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: 浮動小数点数]] | |||
2024年8月26日 (月) 07:35時点における最新版
bfloat16 (brain floating point、BF16)とは、浮動小数点を16ビット長で表す形式のひとつです。
GoogleがTensorFlow向けに開発したものです。
BF16は「単純にFP32の仮数部を切り詰めた」という仕様になっています。汎用的な「FP16」に対して「BF16はFP32と高速変換できる」のが利点であり、FP32との変換が頻繁に発生する用途(主に人工知能)向けだと言われています。
| sign | exponent (5 bit) | fraction (10 bit) | ||||||||||||||
| ┃ | ┌───────┐ | ┌─────────────────┐ | ||||||||||||||
| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 15 | 14 | 10 | 9 | 0 | ||||||||||||
| sign | exponent (8 bit) | fraction (7 bit) | ||||||||||||||
| ┃ | ┌─────────────┐ | ┌───────────┐ | ||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
| 15 | 14 | 7 | 6 | 0 | ||||||||||||
| sign | exponent (8 bit) | fraction (23 bit) | ||||||||||||||||||||||||||||||
| ┃ | ┌─────────────┐ | ┌───────────────────────────────────────────┐ | ||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 31 | 30 | 23 | 22 | 0 | ||||||||||||||||||||||||||||
FP32からBF16への丸め処理の発動条件は
- FP32の仮数部の「7ビット目が0」かつ「8ビット目が1」