FP32・FP16・BF16・INT8の違い:ビット構成・範囲・精度・用途を比較
FP32は32ビットの単精度の浮動小数点数で、計算の基準として使われます。FP16とBF16はどちらも16ビットですが、ビットの割り当てが違います。FP16は仮数に多くのビットを使って精度を取り、表せる範囲は最大65504と狭くなります。BF16は指数部をFP32と同じ8ビットにして範囲をFP32並みに保ち、そのぶん精度を下げています。INT8は8ビットの整数で、スケールをかけて実数を近似する量子化に使い、AIの推論でメモリと電力を大きく減らせます。
| 項目 | FP32 | FP16 | BF16 | INT8 |
|---|---|---|---|---|
| ビット数 | 32ビット | 16ビット | 16ビット | 8ビット |
| 符号・指数・仮数のビット数 | 1・8・23 | 1・5・10 | 1・8・7 | 指数と仮数はない。2の補数の整数で−128〜127 |
| 表せる最大の値 | 約3.4 × 10³⁸ | 65504 | 約3.4 × 10³⁸(FP32とほぼ同じ) | 127(実数はスケールをかけて表す) |
| 最小の正規化数 | 約1.2 × 10⁻³⁸ | 約6.1 × 10⁻⁵(2⁻¹⁴) | 約1.2 × 10⁻³⁸ | なし(表せる値の刻みはスケールで決まる) |
| 精度の目安 | 10進で約7桁(1と次の数の差は2⁻²³ ≈ 1.2 × 10⁻⁷) | 10進で約3桁(2⁻¹⁰ ≈ 9.8 × 10⁻⁴) | 10進で2〜3桁(2⁻⁷ ≈ 7.8 × 10⁻³) | 256段階の目盛り |
| FP32からの変換 | なし(基準) | 範囲が狭いので、大きな値はあふれ、小さな値は0になりうる | 上位の16ビットを取り出して丸めるだけで、範囲はあふれない | スケール(とゼロ点)を決めて量子化する。値の範囲を調べるキャリブレーションが必要 |
| 1つの値のメモリ | 4バイト | 2バイト | 2バイト | 1バイト |
| 演算器の効率 | 乗算器が大きく、同じ面積での積和の数は少ない | FP32より小さな演算器で、多くの積和を並べられる | FP16と同じくらい。仮数が短いぶん乗算器はさらに小さい | 乗算器が最も小さく省電力。積は32ビットの整数で足し合わせることが多い |
| 学習での使い方 | マスターウェイト、オプティマイザの状態、積の累積 | 混合精度の学習。ロススケーリングで小さな勾配が0になるのを防ぐ | 混合精度の学習で広く使われる。多くの場合ロススケーリングが不要 | 一般には使わない(量子化を考慮した学習では、量子化の影響をまねる) |
| 推論での使い方 | 精度の基準。性能より正確さを優先するとき | GPUなどでの推論 | GPUやAIアクセラレータでの推論 | 量子化したモデルの推論。特にエッジのNPUなど |
数値は代表的な目安で、世代や製品によって異なります。