AI・機械学習
中級

Mixed Precision Training(ミックスド プレシジョン トレーニング)

深層学習の学習時に FP32(単精度)と FP16/BF16(半精度)を混合して使用する手法。計算速度を最大 2 倍に向上させ、メモリ使用量を約半減させる。NVIDIA の Tensor Core や AMD の Matrix Core を活用するための標準的な学習最適化技術。

0 回閲覧
0 いいね

Mixed Precision Training とは

Mixed Precision Training(混合精度学習)は、ニューラルネットワークの学習において異なる数値精度を戦略的に使い分ける手法です。2018 年に NVIDIA の Micikevicius らにより体系化されました。メモリと計算の両面で効率化を実現しつつ、FP32 のみの学習とほぼ同等の精度を維持できます。

数値精度の種類と特性

精度ビット数仮数部指数部ダイナミックレンジ用途
FP323223bit8bit±3.4×10³⁸マスターウェイト
FP161610bit5bit±6.5×10⁴活性化値・勾配
BF16167bit8bit±3.4×10³⁸活性化値・勾配(推奨)
TF321910bit8bit±3.4×10³⁸NVIDIA Ampere 以降の内部形式
FP8 (E4M3)83bit4bit±448推論最適化(Hopper 以降)

BF16 は FP16 と同じ 16 ビットですが、指数部が FP32 と同じ 8 ビットあるため、ダイナミックレンジが広く、勾配のアンダーフローが起きにくいのが利点です。Google の TPU と NVIDIA Ampere 以降の GPU でネイティブサポートされています。

3 つの主要テクニック

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 3090FP16, TF323rd Gen71 TFLOPS
RTX 4090FP16, BF16, TF32, FP84th Gen165 TFLOPS
A100 80GBFP16, BF16, TF32, FP643rd Gen312 TFLOPS
H100 80GBFP16, BF16, TF32, FP84th Gen990 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 が推奨。

BF16 vs FP16 の選択指針

2026 年現在、以下の判断基準が一般的です。

  • Ampere 以降(RTX 30xx/40xx, A100, H100): BF16 推奨。Loss Scaling 不要で実装がシンプル
  • Turing 以前(RTX 20xx, V100): FP16 + Loss Scaling。BF16 未サポートのため
  • TPU: BF16 がネイティブサポートで最適

FAQ

Q1: Mixed Precision で学習精度は落ちますか?

A1: 適切に実装すれば FP32 のみの学習とほぼ同等の精度が得られます。NVIDIA の論文では ImageNet や SQuAD など多数のベンチマークで精度劣化がないことが示されています。ただし非常に小さなモデルや特殊なアーキテクチャでは稀に影響が出ることがあります。

Q2: FP8 Training は実用段階ですか?

A2: NVIDIA H100 以降で FP8 がサポートされ、Transformer Engine ライブラリで利用可能です。2025〜2026 年に MetaやGoogleが FP8 での LLM 学習成功を報告しており、次世代の標準になりつつあります。ただし個人環境では RTX 50xx 世代以降が本格的な対応になる見込みです。

Q3: 推論でも Mixed Precision は使われますか?

A3: はい。推論ではさらに攻めた量子化(INT8、INT4、FP8)が一般的です。学習時の Mixed Precision は精度を維持しつつ速度とメモリを改善する手法で、推論時の量子化はさらに大幅な効率化を目指す別の最適化です。