##はじめに
2020年5月半ばに発表されたNVIDIAのAmpereアーキテクチャの記事を眺めているとBF16とかTF32とか聞きなれない用語が出てくるのでざっと調べてみた。
##浮動小数点数
簡単には計算機上において符号+指数部+仮数部で数値を表す形式。
多くの言語の型にfloatとあるのはFloating Point Numberから。FP16,FP32なんて型のFPもFloating Pointの略。
##IEEE754
まずは広く使われている浮動小数点数の整理から。
IEEE754、正式にはIEEE Standard for Floating-Point Arithmetic (ANSI/IEEE Std 754-2008)として規格されている浮動小数点数のうちいくつかを下記表に挙げる。
IEEE754名 | 一般名 | 指数部 | 仮数部 | 合計 |
---|---|---|---|---|
binary16 | 半精度(half,FP16) | 5 bits | 10 bits | 16 bits |
binary32 | 単精度(single,FP32) | 8 bits | 23 bits | 32 bits |
binary64 | 倍精度(double,FP64) | 11 bits | 52 bits | 64 bits |
FP16はNVIDIA Pascalアーキテクチャからサポートされる。
IntelのCPUもIvy BridgeからFP32との変換命令セット(F16C)をサポートする。
##BF16
名称 | 指数部 | 仮数部 | 合計 |
---|---|---|---|
bfloat16(BF16) | 8 bits | 7 bits | 16 bits |
FP32と同じ8bitsの指数部により、-256〜256の範囲の整数を正しく表現できる。それによりINT8から変換しても精度を失わない。
GoogleのTPUでも採用されている様子。
##TF32
名称 | 指数部 | 仮数部 | 合計 |
---|---|---|---|
Tensor Float 32(TF32) | 8 bits | 10 bits | 19 bits |
FP32,BF16と同じ8bitsの指数部、半精度と同じ10bitsの仮数部を持つ。
合計19bitsは内部処理で用いられ、入出力は32bitsになるからTF32という名称らしい。
##おわりに
Tesla A100いじってみたい。
##参考
- IEEE754(Wikipedia EN)
- F16C(Wikipedia EN)
- TensorFloat-32 in the A100 GPU Accelerates AI Training, HPC up to 20x(NVIDIA Blog)
- TensorFlow モデルでの bfloat16 の使用(Google TPU Document)
- BFloat16の適用と実装状況(Qiita @sakaia)
- FP64, FP32, FP16, BFLOAT16, TF32, and other members of the ZOO(medium.com @moocaholic)
##免責
記事の内容は個人の見解であり、所属組織を代表するものではありません。