混合精度トレーニングは、ディープラーニング(DL)において、モデルの精度に大きな影響を与えることなく、モデルのトレーニングを高速化し、メモリ消費量を削減するために使用される手法である。これは、ニューラルネットワーク(NN)内の値の格納と計算に、異なる数値精度フォーマットの組み合わせを戦略的に使用することで実現する。一般的には、モデルの重みを格納するような重要な部分には標準的な32ビット浮動小数点フォーマット(FP32または単精度)を使用し、フォワードパスとバックワードパス(バックプロパゲーション)の計算には、より高速でメモリ消費量の少ない16ビット浮動小数点フォーマット(FP16または半精度、場合によってはBF16またはBFloat16)を使用します。
ミックスド・プレシジョンの仕組み
混合精度の背後にある核となる考え方は、潜在的な数値安定性の問題を軽減しながら、低精度フォーマットのスピードとメモリの利点を活用することである。一般的なアプローチには以下のステップがある:
- マスターウエイトをFP32で保持:モデルのウエイトのプライマリーコピーを標準のFP32フォーマットで保持し、ウエイト更新の高精度を確保する。
- 計算にFP16/BF16を使用:トレーニングループでは、FP32の重みはフォワードパスとバックワードパスのためにFP16またはBF16にキャストされます。これらの低精度フォーマットを使用した計算は、低精度での行列乗算を高速化するために特別に設計されたTensor Coreを搭載したNVIDIA GPUのような最新のハードウェア上で大幅に高速化されます。
- 損失スケーリング:FP16を使用する場合、表現可能な数値の範囲はFP32よりもはるかに小さい。このため、バックプロパゲーション中に計算された小さな勾配値がゼロになり(アンダーフロー)、学習の妨げになることがある。これを防ぐため、バックプロパゲーションの前に損失値をスケールアップし、勾配をFP16で表現可能な範囲に効果的にスケールアップする。重み更新の前に、これらの勾配はスケールダウンされる。BF16はFP32に似た広いダイナミックレンジを持つが精度が低いため、多くの場合、ロスのスケーリングが不要になる。
- マスター重みの更新:計算された勾配(ロス・スケーリングが使用された場合は縮小される)は、FP32に残る重みのマスターコピーの更新に使用される。
このように慎重にバランスをとることで、モデルはより速くトレーニングでき、GPUの使用量も少なくてすむ。 GPUメモリをより少なくすることができます。
ミックスド・プレシジョンの利点
- トレーニングの高速化:低精度計算(FP16/BF16)は互換性のあるハードウェア上で非常に高速に実行されるため、各トレーニング・エポックに必要な時間が大幅に短縮されます。これにより、より迅速な反復と実験が可能になります。
- メモリ消費量の削減:FP16/BF16値はFP32値の半分のメモリで済みます。この削減は、フォワードパスで保存されるアクティブ値と、バックワードパスで計算される勾配に適用されます。メモリ使用量の削減により、より大きなモデルのトレーニングや、より大きなバッチサイズの使用が可能になり、モデルのパフォーマンスとトレーニングの安定性が向上します。
- 効率性の向上:より高速な計算と必要なメモリ帯域幅の低減の組み合わせは、ハードウェアリソースの効率的な利用につながり、クラウドコンピューティングやオンプレミスクラスターのトレーニングコストを削減できる可能性があります。
混合精度 vs 関連概念
- フル・プレシジョン(FP32):伝統的なトレーニングでは、すべてのストレージと計算にFP32を使用する。一般的に数値的には安定しているが、混合精度よりも遅く、メモリを多く消費する。
- 半精度(FP16/BF16):トレーニングを通してFP16またはBF16のみを使用すると、数値が著しく不安定になり(特にロス・スケーリングのようなテクニックを使用しないFP16)、精度が低下する可能性があります。混合精度は、FP32とFP16/BF16を組み合わせた、よりロバストなアプローチです。
- モデルの量子化:これは通常、モデルのウェイトやアクティベーションを8ビット整数(INT8)などの低精度フォーマットに変換することを指し、特にエッジデバイスでの 推論スピードと効率を最適化することが主な目的である。トレーニング中に使用されることもあるが(量子化対応トレーニング)、標準的なトレーニング段階で使用される一般的なFP32/FP16の混合精度とは異なる。