GPU の数値精度(FP32/FP16/BF16/FP8)と TFLOPS — LLM でなぜ低精度・GPU なのか¶
作成日: 2026-06-22 出典 / きっかけ: Software Design 2026年7月号 GPU 特集(p.199 付近)。「FP16 とは? TFLOPS とは?」の疑問を起点に整理 関連: llm学習_並列化戦略5次元_整理、llm_agent_sandbox_隔離技術
0. 要点(3行)¶
- FP16/BF16/FP8 は「数値を何ビットで表すか」の違い。ビットを削るほど精度は粗くなるが、同じメモリに倍のデータが載り、同じ時間に倍計算できる。LLM は行列積の塊なので、1 個 1 個の数が多少雑でも全体の答えはほぼ変わらず、低精度化が定石になる。
- TFLOPS は演算スピードの単位(1 秒あたり何兆回の浮動小数点演算)。同じ H100 でも FP32 の 67 → dense FP16 の 989 と桁違いに速くなるのが、低精度を使う最大の動機。
- ただし TFLOPS は理論上限。演算器にデータを供給するメモリ帯域が追いつかないと演算器は手待ちになり、実効性能は理論値に届かない。
1. FP16 とは — 「数を何ビットで表すか」の話¶
コンピュータは数をビットで表す。FP = Floating Point(浮動小数点=小数を扱える数値形式)で、後ろの数字がそこに何ビット使うかを表す。
浮動小数点の中身は 3 つに分かれる:
- 指数部が広い → 表せる範囲(ダイナミックレンジ)が広い。オーバーフロー/アンダーフローしにくい
- 仮数部が広い → 細かい精度が高い
ビット数が決まっている中で、この配分をどうするかが各フォーマットの個性になる。
1-0. 指数部 vs 仮数部 — 科学的記数法で覚える¶
毎回こんがらがるので具体例で固定する。中学で習う科学的記数法(a × 10ⁿ)がそのまま対応する。
- 仮数部 = 有効数字(1.23 の部分)= 細かさ=精度
- ここのビットを増やすと
1.23が1.2345まで書けるようになる(数の「中身の解像度」が上がる) - 指数部 = 桁(
10⁵の 5 の部分)= 大きさのスケール=範囲 - ここのビットを増やすと
10⁵も10⁻³⁸も10³⁸も書けるようになる(扱える数の「大きさの幅」が広がる)
具体的にイメージすると:
| 表したい数 | 効いているのは | 足りないとどうなる |
|---|---|---|
0.0000001234(極小)や 1.234 × 10³⁸(極大) |
指数部(範囲) | 指数部が狭いと表せず、オーバーフロー/アンダーフロー(0 や ∞ に化ける) |
3.14159265… を細かく刻みたい |
仮数部(精度) | 仮数部が狭いと 3.14 止まりになり、丸め誤差が増える |
→ だから BF16(指数部 8bit)は「桁あふれしにくいが粗い」、FP16(仮数部 10bit)は「細かいが範囲が狭い」 という違いになる(次節)。
1-1. 主要フォーマットのビット配分¶
| フォーマット | 総ビット | 符号 | 指数部 | 仮数部 | 特徴 |
|---|---|---|---|---|---|
| FP32(単精度) | 32 | 1 | 8 | 23 | 範囲も精度も十分。従来の科学計算の標準 |
| TF32(NVIDIA 独自) | 19※ | 1 | 8 | 10 | 範囲は FP32 並み、精度は FP16 並み。Tensor Core 用 |
| FP16(半精度) | 16 | 1 | 5 | 10 | 精度寄り。範囲が狭くオーバーフローしやすい |
| BF16(bfloat16) | 16 | 1 | 8 | 7 | 範囲は FP32 並み、精度は粗い。学習で人気 |
| FP8(E4M3) | 8 | 1 | 4 | 3 | 精度寄りの FP8。推論・順伝播向け |
| FP8(E5M2) | 8 | 1 | 5 | 2 | 範囲寄りの FP8。勾配など広レンジ向け |
※ TF32 は内部 19 ビット相当(実体は 32 ビット枠に格納)。
1-2. FP16 と BF16 — 同じ 16 ビットでも狙いが逆¶
ここが一番の勘所。両方 16 ビットだが、ビットの振り方が逆。
- FP16: 仮数部 10 ビットで精度は出るが、指数部 5 ビットで範囲が狭い。学習中に値が大きくなると桁あふれ(オーバーフロー)しやすく、loss scaling 等の工夫が要る
- BF16: 指数部 8 ビットで範囲は FP32 と同じ。代わりに仮数部 7 ビットで精度は粗いが、学習では「桁あふれしない範囲の広さ」の方が効くので扱いやすい
→ 学習では BF16、推論では FP16/FP8 という棲み分けになりやすいのはこのため。
ポイントは「絶対的な正確さ」ではなく、精度 ↔ 速度・メモリのトレードオフを相対で捉えること。半分のビットなら同じメモリに倍のデータが載り、同じ時間に倍計算できる。
2. TFLOPS とは — 「1 秒に何回計算できるか」¶
- FLOPS = FLoating point Operations Per Second(1 秒あたりの浮動小数点演算回数)
- T = テラ = 10¹²(1 兆) → 1 TFLOPS = 1 秒に 1 兆回の小数演算
- 整数演算側は TOPS(Operations、INT8 など)と呼ぶ
数字が大きいほど「速い」。ただし後述の通りこれは理論上限値。
3. H100 SXM の構成と性能(一次資料で確認)¶
3-1. 階層構造¶
NVIDIA H100 SXM5 の内部は階層になっている。
H100 SXM5 GPU
├── SM × 132基(Streaming Multiprocessor: 計算の基本ユニット)
│ ├── CUDA Core × 128(FP32 の汎用演算器)/ SM
│ └── Tensor Core × 4(行列積特化の演算器)/ SM
└── HBM3 メモリ 80GB / 帯域 3.35 TB/s
- CUDA Core: 汎用の数値演算器。1 命令 1 演算が基本
- Tensor Core: 行列積(matmul)に特化。FP16/BF16/FP8 など低精度を一気に処理する。LLM の推論・学習はこの Tensor Core が主役
3-2. ピーク演算性能(NVIDIA 公称・H100 SXM)¶
| 精度 | 性能 | 備考 |
|---|---|---|
| FP64 | 34 TFLOPS | 汎用 FP64 |
| FP64 Tensor Core | 67 TFLOPS | dense |
| FP32 | 67 TFLOPS | dense(書籍記載値) |
| TF32 Tensor Core | 989 TFLOPS | ※with sparsity |
| FP16 Tensor Core | 1,979 TFLOPS | ※with sparsity(dense は約 989) |
| BF16 Tensor Core | 1,979 TFLOPS | ※with sparsity |
| FP8 Tensor Core | 3,958 TFLOPS | ※with sparsity |
| INT8 Tensor Core | 3,958 TOPS | ※with sparsity |
| メモリ | 80GB HBM3 / 3.35 TB/s | — |
数値の読み方の注意(重要): Software Design 本文の「FP16 Tensor Core 989TFLOPS」は dense(密行列)の実効値を指している。NVIDIA データシートに大きく載る「1,979 TFLOPS」は sparsity(構造的疎性)を活用したときの値で、dense はその約半分(≒989)。つまり本文の 989 は dense FP16 として正しい。ベンチ比較時は「dense か with-sparsity か」を必ず揃えること(揃えないと 2 倍ズレる)。
3-3. なぜ GPU で、なぜ低精度か¶
- FP32 の 67 → dense FP16 の 989 で約 15 倍。同じハードでもビットを半分に落とすだけで桁違いに速くなる。これが LLM がわざわざ低精度を使う最大の動機
- 一般的なサーバー向け CPU の演算性能は数 TFLOPS 程度。行列積を大量に回す LLM では、GPU と CPU で数百倍の差がつく。「行列積を大量に実行する LLM で GPU が使われる理由は明らか」(本文)
4. 落とし穴 — 理論性能 ≠ 実効性能(メモリ帯域の壁)¶
TFLOPS は演算器がフル稼働したときの理論上限であり、実アプリがそのまま引き出せるわけではない。
- GPU 内部では何千ものスレッドが並列動作し、あるスレッドがメモリ待ちの間に別スレッドを走らせて演算器を遊ばせない設計になっている
- それでも演算器にデータを供給できなければ演算器は待機し、全体性能が落ちる
- だから GPU の性能は演算性能(TFLOPS)だけでなくメモリ帯域(H100 SXM で 3.35 TB/s)も同じくらい重要
直感的に言えば「料理人(演算器)がいくら速くても、食材(データ)の搬入が遅ければ意味がない」。LLM 推論はとくにメモリ帯域律速(memory-bound)になりやすく、ここが KV キャッシュ最適化や量子化が効く理由にもつながる。
5. まとめ — いつ何を使うか早見表¶
| 状況 | 推奨 | 理由 |
|---|---|---|
| 学習(pre-training / fine-tuning) | BF16 | 範囲が広く桁あふれしにくい。精度の粗さは学習で吸収される |
| 学習で精度を詰めたい一部演算 | FP32 / TF32 | 累積誤差が効く箇所(loss、optimizer state 等) |
| 推論で速度・省メモリ優先 | FP16 / FP8 | 仮数部の精度で十分。FP8 はさらに速いがキャリブレーション要 |
| 性能を見積もる | TFLOPS とメモリ帯域を両方見る | 多くの LLM 推論は memory-bound。TFLOPS だけ見ると過大評価する |
| ベンチ数値を比較する | dense / with-sparsity を揃える | 揃えないと約 2 倍ズレる |
参考リンク¶
- NVIDIA H100 製品ページ(公称スペック表): https://www.nvidia.com/en-us/data-center/h100/
- NVIDIA Hopper Architecture In-Depth(技術ブログ): https://developer.nvidia.com/blog/nvidia-hopper-architecture-in-depth/
- NVIDIA H100 Datasheet(PDF): https://resources.nvidia.com/en-us-gpu-resources/h100-datasheet-24306
- 出典: Software Design 2026年7月号 GPU 特集(技術評論社、Kindle 版 p.199 付近)
作成: 2026-06-22 / 最終更新: 2026-06-22