FP4
FP4は通常E2M1を用いる4ビット浮動小数点形式で、ブロック単位のスケールを使ってAIモデルを小型化・高速化します。NVFP4、MXFP4、ハードウェア、コードについて解説します。
FP4は、モデル量子化でニューラルネットワークの重みや活性化を保存・計算するために使われる4ビット浮動小数点数形式です。AIハードウェアとソフトウェアではE2M1レイアウトが使われます。符号ビット1つ、指数ビット2つ、仮数ビット1つで構成され、表現できる値は0、±0.5、±1、±1.5、±2、±3、±4、±6だけです。各値のメモリ使用量はFP8の半分、FP16(半精度)の4分の1です。これは、メモリから重みを読み出す処理が推論レイテンシの大部分を占める大規模言語モデルやその他の生成AIモデルで特に重要です。NVIDIAのBlackwell GPUとAMD Instinct MI350シリーズでネイティブFP4行列演算が利用可能になり、FP4は推論と、近年では学習にも使われています。
FP4の仕組み#
異なる値が15個しかないFP4では、実際の重みや活性化の範囲を表現できません。そのため、実用的なFP4形式ではテンソルを小さなブロックに分割し、ブロックごとに共有スケールを1つ保存します。スケールは、ブロック内の最大絶対値がE2M1の最大値6に近くなるように選びます。主な2つの形式は、ブロックサイズとスケール精度が異なります。
- MXFP4: Open Compute ProjectのMicroscaling(MX)仕様で定義されています。MXFP4は32個の値を1つの8ビット2のべき乗スケール(E8M0)でまとめます。オープン仕様のため、AMDのMI350シリーズやNVIDIAのBlackwell GPUなど、複数ベンダーでサポートされています。
- NVFP4: NVIDIAの形式では、16個の値を1つのFP8(E4M3)スケールでまとめ、テンソルごとに2つ目のFP32スケールを追加します。ブロックが小さく、スケールがより細かいため、量子化誤差を低減できます。NVIDIAはDeepSeek-R1-0528のベンチマークで、FP8と比較した精度低下が1%以下だったと報告しています。
以下のスニペットでは、外れ値をいくつか含むテンソルをE2M1の値に丸めます。テンソル全体に1つのスケールを使う場合と、MXFP4およびNVFP4のブロックサイズである32個または16個の値ごとにスケールを使う場合を比較します。
import torch
# The eight non-negative values FP4 E2M1 can represent; the sign bit mirrors them
grid = torch.tensor([0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0])
torch.manual_seed(0)
x = torch.randn(4096)
x[::512] *= 20 # a few large outliers, as real weight and activation tensors have
# One shared scale for the whole tensor, then MXFP4-sized and NVFP4-sized blocks
for block in [4096, 32, 16]:
blocks = x.reshape(-1, block)
scale = blocks.abs().amax(dim=1, keepdim=True) / 6.0 # map each block's largest value to 6
nearest = ((blocks.abs() / scale).unsqueeze(-1) - grid).abs().argmin(dim=-1)
dequantized = grid[nearest] * blocks.sign() * scale
error = (dequantized.flatten() - x).abs().mean()
print(f"Block size {block:>4}: mean absolute error {error:.4f}")テンソル全体に1つのスケールを使うと、外れ値によってスケールが大きく引き伸ばされ、通常の値の大半がゼロに丸められるため、平均絶対誤差は0.7238になります。32個または16個の値ごとにブロック化すると、各外れ値は1つのブロック内に収まります。そのため、ほかのブロックでは細かなスケールが保たれ、誤差はそれぞれ0.0901と0.0747に低下します。
FP4による推論と学習#
推論では、TensorRTなどの推論エンジンが学習後に重みと、多くの場合は活性化もFP4に量子化し、行列乗算をFP4で実行して結果をより高い精度で累積します。TorchAOのNVFP4およびMXFP4設定を使うと、対応GPU上のPyTorchでも同じワークフローを利用できます。OpenAIは、Mixture of Expertsの重みをMXFP4で追加学習した gpt-oss-120bを公開しました。これにより、1,170億パラメーターのモデルを単一の80 GB GPUで実行できます。
FP4での学習は、混合精度学習を4ビットまで拡張します。勾配と活性化の範囲が学習中に変化するため、推論より困難です。NVIDIAのNVFP4事前学習の研究では、ランダムなHadamard変換で外れ値を分散し、勾配に確率的丸めを適用し、一部の層をより高い精度に保つことで、1,200億パラメーターのモデルを1,000兆トークンのNVFP4で学習しました。学習損失と下流タスクの精度はFP8ベースラインと同等でした。
FP4モデルのデプロイ#
ネイティブFP4テンソルコアには、NVIDIA Blackwell以降のB200やGeForce RTX 50シリーズなどのGPUが必要です。また、MXFP4にはAMD Instinct MI350アクセラレーターが必要です。H100などのHopper GPUはFP8を高速化しますが、FP4には対応しません。TensorRTの対応マトリックスで、各GPUがサポートする精度を確認できます。変換後、モデルをデプロイする前に精度を確認してください。精度に敏感な層や小規模なモデルでは性能が劣化することがあります。学習後の量子化だけでは不十分な場合、量子化対応学習で精度を回復できます。Ultralytics YOLO26のTensorRTエクスポートでは、quantize=16を使ったFP16、またはquantize=8を使ったINT8でエンジンを構築します。これはYOLOモデルで利用できる低精度オプションです。
FP4と関連形式の比較#
- FP8: FP8(E4M3またはE5M2)は表現可能な値がはるかに多く、範囲も広い形式です。大規模モデルの学習ではFP8が広く採用されているため、FP4の結果を評価する際の一般的なベースラインです。
- BFloat16: BF16は大規模モデルを最大品質で学習・提供する際の標準形式であり、FP4の4倍のビット数を使用します。
- INT4: INT4は16段階を均等に配置しますが、FP4は重みや活性化の多くが存在するゼロ付近に、より多くの段階を配置します。GPTQやAWQなどの手法を使った言語モデルの重みのみの圧縮では、今もINT4が広く使われています。
- AMD Socket FP4: FP4は、AMDの関連性のないノートPC向けプロセッサーソケットの名称でもあります。FX-8800Pなど、Carrizo世代のモバイルAPUに使われたパッケージです。










