FP8
FP8とは何か、E4M3とE5M2の仕組み、スケーリング、ハードウェアサポート、混合精度がAIのトレーニングと推論を向上させる方法を学べます。
FP8、つまり8ビット浮動小数点は、各値を8ビットで格納する低精度の数値形式です。AIシステムでは、互換性のあるハードウェア上でメモリトラフィックを削減し、行列乗算、畳み込み、その他の負荷の高い処理を高速化するためにFP8を使用します。FP16やFP32と比較すると表現できる個別の値が少ないため、FP8を効果的に使用するワークフローでは、モデル品質を維持するために、高速な低精度計算にスケーリングと選択的な高精度処理を組み合わせます。
FP8による数値の表現方法#
浮動小数点値には、符号、値の範囲を制御する指数部、詳細度を制御する仮数部が含まれます。FP8には、PyTorchの浮動小数点データ型で文書化されている次の2つの形式が一般的に使用されます。
- E4M3: 符号ビット1個、指数ビット4個、仮数ビット3個で構成されます。数値の詳細度が高い一方で、範囲は狭くなります。
- E5M2: 符号ビット1個、指数ビット5個、仮数ビット2個で構成されます。より広い範囲をカバーしますが、値はより大きく丸められます。
E4M3は重みとアクティベーションに適していることが多く、E5M2は値の範囲が大きい勾配により適しています。正確なバリアントはプラットフォームによって異なるため、AMDの低精度浮動小数点ドキュメントに示されているように、FP8モデルがすべてのアクセラレータとランタイム間で自動的に移植できるとは限りません。
8ビットではテンソルの元の範囲と詳細度を完全には表現できないため、フレームワークでは通常、変換前に値へスケーリング係数を乗算します。NVIDIAのFP8スケーリング入門では、過去に観測された最大値から将来のスケールを算出する遅延スケーリングなどの戦略について説明しています。スケーリングにより、すべての処理を高精度で実行しなくても、オーバーフロー、アンダーフロー、飽和を抑制できます。
FP8と関連形式の比較#
FP8は、一般的なAIデータ型の中間的な位置付けにあります。
- FP16または半精度: 2倍のビット数を使用するため、数値の詳細度が高く、一般的にトレーニングも容易です。FP8はストレージと帯域幅をさらに削減できますが、より慎重なスケーリングが必要です。
- BF16: 広い指数範囲を維持しながら、FP16より小数部の詳細度を抑えています。FP8トレーニングでは、より高精度な補完形式として使用されることが多くあります。
- INT8: 浮動小数点値ではなく整数を表現します。INT8のモデル量子化では通常、スケールを使用して実数値を固定された整数レベルに対応付けますが、FP8では指数を保持することで、自然な不均一間隔を実現します。
- FP4: 4ビットのみを使用するため、より高い圧縮率を実現できますが、範囲と粒度が極めて限定されるため、通常は精度の維持がより困難です。
FP8は、すべてのテンソルに使用するデータ型ではなく、混合精度ワークフローの一部として使用されることがよくあります。累積、正規化、オプティマイザーの状態、または影響を受けやすいレイヤーは、BF16、FP16、またはFP32のままにする場合があります。また、数値精度は、正しいモデルの陽性予測が何件あるかを測定する適合率評価指標とは異なります。
実世界での利用例#
FP8が重要である理由を示す実用的な用途を2つ紹介します。
-
大規模モデルのトレーニング: Transformerのトレーニングでは、大規模な行列乗算を繰り返し実行します。FP8対応フレームワークでは、安定性が必要な箇所では高精度を維持しながら、対象となる重みとアクティベーションをFP8にキャストできます。これにより帯域幅の需要が低下し、トレーニングスループットが向上する可能性があります。TorchAOの量子化トレーニングワークフローには、最大速度と外れ値への対応力の向上をトレードオフする、テンソル単位および行単位のスケーリングの選択肢が含まれています。
-
高スループットのビジョン推論: データセンターでは、小売、交通、製造現場の数百のビデオストリームに対して物体検出を実行する場合があります。FP8対応カーネルは、対象となるモデルレイヤーで使用する時間とメモリを削減し、推論レイテンシを短縮するとともに、同時に処理できるストリーム数を増やせる可能性があります。TensorRTの量子化型ガイドでは、明示的な量子化および逆量子化処理によってFP8実行を記述する方法を説明しています。
数値上のリスクとハードウェアサポート#
不適切なスケーリングにより、大きな値が飽和し、小さな値がゼロに丸められる可能性があります。1つのスケールでテンソル全体をカバーする場合、外れ値は特に問題になります。これらの影響によって信頼度スコアが変化したり、トレーニングが不安定になったり、検出精度が低下したりする可能性があるため、開発者は変換後のモデルを高精度のベースラインと比較して検証する必要があります。
ネイティブのハードウェアサポートも同様に重要です。NVIDIA HopperアーキテクチャではFP8 Tensor Coreアクセラレーションが導入されましたが、旧世代のNVIDIA A100 GPUはFP16、BF16、INT8をサポートする一方、ネイティブのFP8計算はサポートしていません。そのため、デプロイ精度を選択する前に、TensorRTハードウェアサポートマトリックスを確認する必要があります。
実際のFP8の使用方法#
この小さなPyTorchの例では、E4M3への変換と、FP8値をFP32に戻したときに生じる丸め誤差を示します。
import torch
values = torch.tensor([0.1, 1.0, 3.14, 100.0], dtype=torch.float32)
# Convert to E4M3 FP8, then restore the values for comparison.
fp8_values = values.to(torch.float8_e4m3fn)
restored = fp8_values.to(torch.float32)
absolute_error = (restored - values).abs()
print(torch.stack((values, restored, absolute_error), dim=1))文書化されているUltralytics TensorRTエクスポートワークフローでは、Ultralytics YOLO向けにFP16およびキャリブレーション済みINT8のオプションが提供されていますが、1つの引数だけで実行できるFP8エクスポートは提供されていません。そのため、FP8デプロイには互換性のある下流変換ツールチェーンが必要です。選択した精度にかかわらず、本番環境へデプロイする前に、対象のGPU上でUltralyticsベンチマークモードを使用し、レイテンシ、スループット、メモリ使用量、タスク精度を比較してください。






