Transformers documentation

混合精度トレーニング

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

混合精度トレーニング

フルプレシジョン(fp32)の学習では、すべての保存と計算が32ビットで行われます。混合精度では、計算負荷の高いフォワードパスとバックワードパスにfp16またはbf16を使用し、オプティマイザーの更新には重みのfp32コピーを保持します。これにより、計算が高速化され、重みと活性化のメモリ使用量が削減され、かつ学習の安定性が維持されます。

┌─────────────────────────────────────────────────────┐
│           MIXED PRECISION TRAINING LOOP             │
│                                                     │
│  fp32 master weights ──cast──▶ fp16/bf16            │
│         ▲                          │                │
│         │                    FORWARD (autocast)     │
│         │                    matmuls in fp16/bf16   │
│         │                    reductions stay fp32   │
│         │                          │ loss           │
│         │                    LOSS SCALE ×S  ──fp16  │
│         │                          │                │
│         │                    BACKWARD               │
│         │                    grads in fp16/bf16     │
│         │                          │                │
│         │                    UNSCALE ÷S    ──fp16   │
│         │                    check inf/nan          │
│         │                    cast grads → fp32      │
│         └────────────────────────── optimizer.step  │
└─────────────────────────────────────────────────────┘

bf16() または fp16() を True に設定すると、混合精度トレーニングが有効になります。どちらも 16 ビット型ですが、bf16 は fp32 と同じ指数範囲を持つため、オーバーフローがほぼ発生しません。Ampere 世代以降の GPU(A100、H100 など)では bf16 を使用し、V100 や T4 などの旧世代ハードウェアでは fp16 にフォールバックしてください。

モデルを fp32 で読み込みます。そうしないと、autocast は何もしなくなります。bf16 または fp16 で読み込むと、オプティマイザーが更新元の fp32 マスターコピーがなくなります。

from transformers import TrainingArguments

args = TrainingArguments(..., bf16=True)
args = TrainingArguments(..., fp16=True)

モデルが bf16/fp16 で数値的に安定している場合、混合精度を完全にスキップして、bf16/fp16 で直接ロードおよびトレーニングを行うことができます。これにより、メモリ内の重みの fp32 コピーを回避できます。

tf32

tf32 は Ampere GPU 上の計算モードで、matmul に 23 ビットではなく 10 ビットの mantissa を使用します。これにより高速化が得られ、特に bf16/fp16 と組み合わせる場合に効果的です。PyTorch は Ampere 以降の GPU において matmul 用の tf32 をデフォルトで有効にしていますが、TrainingArguments で明示的に設定することで、PyTorch のバージョンや環境のデフォルト設定に関係なく有効化が保証されます。

from transformers import TrainingArguments

args = TrainingArguments(..., bf16=True, tf32=True)

次のステップ

  • カスタム融合カーネルによる学習の高速化方法については、Kernelsガイドを参照してください。
  • torch.compileのガイドを参照し、フォワードパスとバックワードパスをコンパイルしてスループットをさらに向上させる方法について学習してください。
Update on GitHub