FP8
FP8 ist ein 8-Bit-Gleitkommaformat mit den Varianten E4M3 und E5M2. Es halbiert den Speicherbedarf gegenüber 16-Bit-Formaten und verdoppelt den Matrixdurchsatz auf unterstützten GPUs.
FP8 ist ein 8-Bit-Gleitkommazahlenformat, mit dem sich neuronale Netze mit halb so viel Speicher und Datenverkehr wie bei 16-Bit-Formaten trainieren und ausführen lassen. Wie bei jedem Gleitkommatyp hat jeder Wert ein Vorzeichenbit, Exponentenbits für den Wertebereich und Mantissenbits für die Genauigkeit. Bei nur acht Bit insgesamt müssen jedoch große Abstriche bei beidem gemacht werden. Ingenieure von NVIDIA, Arm und Intel definierten die beiden Standardvarianten E4M3 und E5M2 im September 2022 im Dokument FP8-Formate für Deep Learning und validierten damit das Training von Sprachmodellen mit bis zu 175 Milliarden Parametern. Auf GPUs mit FP8-Tensor-Kernen, wie NVIDIAs 2022 eingeführter Hopper H100, erreichen FP8-Matrixmultiplikationen den doppelten Durchsatz von FP16 oder BF16.
E4M3 und E5M2#
Die beiden Varianten teilen die sieben Bits ohne Vorzeichen unterschiedlich auf:
- E4M3: Vier Exponentenbits und drei Mantissenbits. Auf Unendlichkeitswerte wird verzichtet und nur ein NaN-Muster beibehalten, sodass der Höchstwert 448 beträgt. Das Format eignet sich für Gewichte und Aktivierungen im Vorwärtsdurchlauf.
- E5M2: Fünf Exponentenbits und zwei Mantissenbits, entsprechend den Konventionen von IEEE 754 für Sonderwerte. Das Format erreicht mit gröberen Abstufungen den Wert 57.344 und eignet sich für Gradienten, deren Beträge einen größeren Bereich abdecken.
Beide Formate setzen kleine Werte auf null und begrenzen große Werte. FP8-Tensoren enthalten deshalb üblicherweise einen Skalierungsfaktor, der ihre Werte in den darstellbaren Bereich verschiebt. Ein Vergleich von gradientengroßen Werten mit und ohne Skalierung zeigt warum:
import torch
torch.manual_seed(0)
grads = torch.randn(10_000) * 1e-4 # gradient-sized values, far below 1
e4m3, e5m2 = torch.float8_e4m3fn, torch.float8_e5m2
print(f"E4M3 max {torch.finfo(e4m3).max:g}, E5M2 max {torch.finfo(e5m2).max:g}")
# Per-tensor scaling maps the largest magnitude onto the E4M3 maximum before casting
scale = torch.finfo(e4m3).max / grads.abs().max()
results = {
"E4M3 direct": grads.to(e4m3).float(),
"E5M2 direct": grads.to(e5m2).float(),
"E4M3 scaled": (grads * scale).to(e4m3).float() / scale,
}
for name, restored in results.items():
zeros = (restored == 0).float().mean()
error = ((restored - grads).abs() / grads.abs()).median()
print(f"{name}: {zeros:.0%} rounded to zero, median relative error {error:.1%}")Bei einer direkten E4M3-Umwandlung werden 100% der Werte auf null gerundet. Der größere Wertebereich von E5M2 erhält die meisten Werte mit einem relativen Medianfehler von 6.4%, während 7% verloren gehen. Werden die Werte zuerst skaliert, kann E4M3 alle Werte mit einem Medianfehler von 2.2% behalten. PyTorch bietet außerdem float8_e4m3fnuz und float8_e5m2fnuz, die Varianten, die AMDs MI300-Beschleuniger verwenden. Sie verzichten auf negative Null und verschieben den Exponentenbias, wodurch E4M3 auf 240 begrenzt wird. Ein FP8-Modell lässt sich daher nicht automatisch zwischen Herstellern übertragen.
Skalierungsstrategien#
Ein einziger Skalierungsfaktor für einen gesamten Tensor funktioniert nicht, wenn einige Ausreißer den Höchstwert bestimmen und alle übrigen Werte gegen null verschieben. Das kommt häufig bei Transformer-Aktivierungen vor. Die Verfahren unterscheiden sich darin, wie fein sie skalieren:
- Verzögerte Skalierung pro Tensor: NVIDIAs Transformer Engine wählt für jeden Tensor anhand der Maximalwerte der letzten Trainingsschritte einen Skalierungsfaktor aus. Ein zusätzlicher Durchlauf über die Daten ist dadurch nicht nötig.
- Blockskalierung: DeepSeek-V3 skalierte Aktivierungen pro Kachel mit 1 × 128 Werten und Gewichte pro Block mit 128 × 128 Werten. Das Team berichtete von der ersten Validierung des FP8-Trainings mit einem extrem großen Modell mit 671 Milliarden Parametern.
- MXFP8: Das Mikroskalierungsformat des Open Compute Project verwendet für jeweils 32 Werte einen gemeinsamen Zweierpotenz-Skalierungsfaktor. NVIDIAs Blackwell-GPUs unterstützen es in Hardware.
Matrixmultiplikationen sammeln ihre Ergebnisse mit höherer Genauigkeit. Empfindliche oder kostengünstige Schichten wie Normalisierung, Softmax und die Mastergewichte des Optimierers bleiben in BF16 oder FP32. FP8 ist daher ein Bestandteil eines Verfahrens mit gemischter Genauigkeit.
FP8 beim Training und bei der Inferenz#
Beim Training ersetzen NVIDIAs Transformer Engine und TorchAO lineare Schichten durch FP8-Varianten, während die Mastergewichte mit höherer Genauigkeit gespeichert bleiben. Bei der Inferenz speichern Inferenz-Engines Modellgewichte und den KV-Cache großer Sprachmodelle in FP8. Dadurch benötigen sie halb so viel Speicher wie bei 16-Bit-Formaten, sodass mehr gleichzeitige Anfragen möglich sind. TensorRT erstellt ebenfalls FP8-Engines für GPUs mit FP8-Tensor-Kernen. Damit sich das Format lohnt, muss die Hardware es unterstützen: NVIDIAs A100 verwendet auf seinen Tensor-Kernen FP16, BF16 und INT8, verfügt aber über keine FP8-Einheiten. GPUs mit Ada Lovelace, Hopper und Blackwell sowie AMDs MI300-Serie unterstützen FP8.
FP8 liegt zwischen benachbarten Formaten:
- FP16 oder halbe Genauigkeit: Doppelt so viele Bits, mit 10 Mantissenbits und einem ausreichenden Wertebereich für die meisten Inferenzanwendungen ohne Skalierung pro Tensor.
- FP4: Noch einmal halb so viele Bits; für eine ausreichende Genauigkeit sind fein abgestufte Blockskalierungen erforderlich.
- INT8: Das andere 8-Bit-Format mit 256 gleichmäßig verteilten Stufen statt der exponentiellen Abstufung von FP8. Es benötigt kalibrierte Skalierungsfaktoren, läuft dafür aber auf wesentlich mehr Hardware, darunter den meisten CPUs und NPUs.
Ultralytics YOLO26 nutzt INT8 für die 8-Bit-Inferenz: Wird das Modell im Exportmodus für Formate wie TensorRT und OpenVINO mit quantize=8 exportiert, wird eine Modellquantisierung nach dem Training ausgeführt. Dabei werden die Skalierungsfaktoren anhand von Bildern aus dem Datensatz data kalibriert. Ein mit quantize=8 feinabgestimmtes Modell wird dagegen per quantisierungsbewusstem Training trainiert und exportiert anschließend die erlernten Wertebereiche nach TensorRT. Eine Kalibrierung ist nicht erforderlich.










