深層学習の学習時に FP32(単精度)と FP16/BF16(半精度)を混合して使用する手法。計算速度を最大 2 倍に向上させ、メモリ使用量を約半減させる。NVIDIA の Tensor Core や AMD の Matrix Core を活用するための標準的な学習最適化技術。
Mixed Precision Training(混合精度学習)は、ニューラルネットワークの学習において異なる数値精度を戦略的に使い分ける手法です。2018 年に NVIDIA の Micikevicius らにより体系化されました。メモリと計算の両面で効率化を実現しつつ、FP32 のみの学習とほぼ同等の精度を維持できます。
| 精度 | ビット数 | 仮数部 | 指数部 | ダイナミックレンジ | 用途 |
|---|---|---|---|---|---|
| FP32 | 32 | 23bit | 8bit | ±3.4×10³⁸ | マスターウェイト |
| FP16 | 16 | 10bit | 5bit | ±6.5×10⁴ | 活性化値・勾配 |
| BF16 | 16 | 7bit | 8bit | ±3.4×10³⁸ | 活性化値・勾配(推奨) |
| TF32 | 19 | 10bit | 8bit | ±3.4×10³⁸ | NVIDIA Ampere 以降の内部形式 |
| FP8 (E4M3) | 8 | 3bit | 4bit | ±448 | 推論最適化(Hopper 以降) |
BF16 は FP16 と同じ 16 ビットですが、指数部が FP32 と同じ 8 ビットあるため、ダイナミックレンジが広く、勾配のアンダーフローが起きにくいのが利点です。Google の TPU と NVIDIA Ampere 以降の GPU でネイティブサポートされています。
Mixed Precision Training は以下の 3 つの要素で構成されます。
1. FP32 マスターウェイト: モデルのパラメータは FP32 で保持し、順伝播・逆伝播は FP16/BF16 のコピーで計算。更新は FP32 のマスターウェイトに適用。これにより小さな勾配更新が丸め誤差で消失するのを防ぎます。
2. Loss Scaling(FP16 使用時): FP16 の表現範囲に収まるよう、損失値にスケーリングファクター(通常 2¹⁰〜2²⁴)を掛けてから逆伝播を行い、勾配計算後にスケールを戻します。Dynamic Loss Scaling では、勾配のオーバーフロー(Inf/NaN)を検出してスケーリングファクターを自動調整します。BF16 ではダイナミックレンジが広いため Loss Scaling は通常不要です。
3. 精度の使い分け: 大部分の計算を FP16/BF16 で実行しつつ、数値的に敏感な操作(Softmax、LayerNorm、損失計算)は FP32 にアップキャストして精度を維持します。
| GPU | 対応精度 | Tensor Core 世代 | 理論性能(FP16) |
|---|---|---|---|
| RTX 3090 | FP16, TF32 | 3rd Gen | 71 TFLOPS |
| RTX 4090 | FP16, BF16, TF32, FP8 | 4th Gen | 165 TFLOPS |
| A100 80GB | FP16, BF16, TF32, FP64 | 3rd Gen | 312 TFLOPS |
| H100 80GB | FP16, BF16, TF32, FP8 | 4th Gen | 990 TFLOPS |
FP16 での計算性能は FP32 の 2〜8 倍に達するため、Mixed Precision を有効化するだけで学習速度が大幅に向上します。RTX 4090 では FP32 の 83 TFLOPS に対し FP16 は 165 TFLOPS で約 2 倍です。
PyTorch AMP(Automatic Mixed Precision): torch.amp.autocast と torch.amp.GradScaler の 2 つの API で実現。autocast はコンテキスト内の演算を自動的に FP16/BF16 に変換し、GradScaler は Loss Scaling を管理します。
DeepSpeed: 設定ファイルで fp16.enabled または bf16.enabled を true にするだけ。ZeRO との組み合わせでメモリ効率がさらに向上。
Hugging Face Trainer: fp16=True または bf16=True を TrainingArguments に指定。Ampere 以降の GPU では BF16 が推奨。
2026 年現在、以下の判断基準が一般的です。
A1: 適切に実装すれば FP32 のみの学習とほぼ同等の精度が得られます。NVIDIA の論文では ImageNet や SQuAD など多数のベンチマークで精度劣化がないことが示されています。ただし非常に小さなモデルや特殊なアーキテクチャでは稀に影響が出ることがあります。
A2: NVIDIA H100 以降で FP8 がサポートされ、Transformer Engine ライブラリで利用可能です。2025〜2026 年に MetaやGoogleが FP8 での LLM 学習成功を報告しており、次世代の標準になりつつあります。ただし個人環境では RTX 50xx 世代以降が本格的な対応になる見込みです。
A3: はい。推論ではさらに攻めた量子化(INT8、INT4、FP8)が一般的です。学習時の Mixed Precision は精度を維持しつつ速度とメモリを改善する手法で、推論時の量子化はさらに大幅な効率化を目指す別の最適化です。