FP16

Statt eine Zahl mit 32 Bit zu speichern, reichen in vielen Fällen 16 Bit. Das halbiert den Speicherbedarf und beschleunigt Berechnungen. Dieses Format heißt FP16 (Half Precision) und ist heute eines der wichtigsten Werkzeuge für effizientes Arbeiten mit neuronalen Netzen.

Was FP16 beschreibt

Jede Zahl in einem Computer wird als Folge von Bits gespeichert. Das Standardformat für Gleitkommazahlen in der Wissenschaft verwendet 32 Bit pro Zahl (FP32, Single Precision). FP16 halbiert das auf 16 Bit. Die 16 Bit verteilen sich auf drei Bestandteile: 1 Bit für das Vorzeichen, 5 Bit für den Exponenten und 10 Bit für die Mantisse (den Nachkommaanteil).

Beispiel: Die Zahl 3,14 wird in FP32 mit 32 Bit codiert. In FP16 genügen 16 Bit. Die gespeicherte Zahl ist dann 3,140625 statt 3,1400001 in FP32. Für die Gewichte eines neuronalen Netzes ist dieser Unterschied in der Regel irrelevant.

Beispiel: Ein Modell mit 7 Milliarden Parametern belegt in FP32 rund 28 GB VRAM. In FP16 sind es 14 GB. Damit passt das Modell auf eine einzelne GPU mit 16 GB Speicher, was ohne FP16 nicht möglich wäre.

Der reduzierte Wertebereich von FP16 liegt zwischen circa 6,1 × 10-5 und 65.504. FP32 deckt dagegen bis zu 3,4 × 1038 ab. Für die meisten Gewichte und Aktivierungen in neuronalen Netzen reicht der FP16-Bereich aus.

Warum 16 Bit für neuronale Netze ausreichen

Die Gewichte in einem Deep-Learning-Modell sind typischerweise kleine Zahlen nahe Null. Werte jenseits von 100 oder unter -100 kommen selten vor. Der Wertebereich von FP16 deckt diesen Bereich vollständig ab.

Beispiel: In einem trainierten Transformer-Modell liegen mehr als 99 % der Gewichte typischerweise im Bereich von -2,0 bis +2,0. FP16 kann Werte in diesem Bereich mit einer Genauigkeit von etwa 0,001 darstellen.

Entscheidend ist die relative Genauigkeit: Die 10 Bit der Mantisse liefern etwa 3 Dezimalstellen Precision. Das genügt, weil das Training ohnehin ein stochastischer Prozess ist. Kleine Rundungsfehler gehen im Rauschen der Gradientenschätzung unter.

Beispiel: Beim stochastischen Gradientenabstieg schwanken die Gradienten von Batch zu Batch. Ein Gradient von 0,00537 und ein gerundeter Gradient von 0,00537109375 (FP16) führen praktisch zum gleichen Trainingsschritt.

Fachliche Einordnung: Die theoretische Grundlage für reduzierte Präzision beim Training lieferte Gupta et al. (2015) mit der Arbeit "Deep Learning with Limited Numerical Precision". Dort wurde gezeigt, dass Fixed-Point-Arithmetik mit 16 Bit vergleichbare Ergebnisse wie 32 Bit erzielt. Micikevicius et al. (2018) zeigten später, dass FP16 in Kombination mit Loss Scaling für praktisch alle gängigen Architekturen funktioniert.

Gemischte Präzision beim Training

Reines FP16-Training kann zu numerischen Problemen führen. Sehr kleine Gradienten fallen unter den darstellbaren Bereich (Underflow), und Akkumulationen über viele Werte laufen in Überläufe. Die Lösung: Nicht alles in FP16 rechnen, sondern gezielt mischen.

Beim Mixed Precision Training wird eine Kopie der Gewichte in FP32 gehalten (Master Weights). Die Vorwärts- und Rückwärtspropagation laufen in FP16. Die berechneten Gradienten werden in FP32 konvertiert, auf die Master Weights angewendet, und die aktualisierten Gewichte wieder nach FP16 kopiert.

FP32 Master WeightsVolle Präzision
FP16 KopieHalbe Präzision
Forward PassFP16
Backward PassFP16
Gradienten → FP32Update Master Weights

Beispiel: In PyTorch aktiviert torch.cuda.amp.autocast() Mixed Precision. Der GradScaler skaliert die Loss-Werte vor dem Backpropagation-Schritt hoch (typisch um Faktor 1024 bis 65536), damit kleine Gradienten nicht zu Null gerundet werden. Nach der Rückwärtspropagation werden die Gradienten wieder herunterskaliert.

Beispiel: Ein Gradient mit dem Wert 0,00002 liegt unterhalb des FP16-Minimums von 6,1 × 10-5. Durch Loss Scaling mit Faktor 1024 wird der Wert zu 0,02048, der in FP16 darstellbar ist. Nach dem Rückskalieren ergibt sich wieder 0,00002.

Hardware-Beschleunigung für FP16

Moderne GPUs besitzen spezialisierte Recheneinheiten für FP16-Operationen. NVIDIA führte mit der Volta-Architektur (2017) Tensor Cores ein, die 4×4-Matrixoperationen in einem Takt ausführen.

Beispiel: Eine NVIDIA A100 GPU erreicht 312 TFLOPS bei FP16-Operationen mit Tensor Cores, verglichen mit 19,5 TFLOPS bei FP32 ohne Tensor Cores. Das entspricht einem Faktor 16 beim Rohdurchsatz für Matrixberechnungen.

Neben dem reinen Rechendurchsatz profitiert FP16 von der halbierten Speicherbandbreite. Daten müssen zwischen GPU-Speicher und Recheneinheiten transportiert werden. Halbierter Speicherbedarf bedeutet doppelte effektive Bandbreite. Bei speicherbandbreitenlimitierten Operationen (Memory-Bound) kann das den Gesamtdurchsatz verdoppeln.

Beispiel: Eine Batch Size von 32 mit einem Modell von 1,5 Milliarden Parametern benötigt in FP32 rund 6 GB allein für die Gewichte. In FP16 sind es 3 GB. Der freigewordene Speicher erlaubt eine Batch Size von 64, was die GPU-Auslastung verbessert und das Training beschleunigt.

FP16 bei der Inferenz

Für den produktiven Einsatz trainierter Modelle (Inferenz) ist FP16 oft die Standardwahl. Die Anforderungen an numerische Stabilität sind bei der Inferenz geringer als beim Training, da keine Gradienten akkumuliert werden.

Beispiel: Ein Sprachmodell, das eine Textzusammenfassung erstellt, durchläuft nur den Forward Pass. Die Wahrscheinlichkeitsverteilung über das Vokabular unterscheidet sich zwischen FP16 und FP32 typischerweise erst ab der vierten Nachkommastelle. Der generierte Text ist in der Praxis identisch.

Die Konvertierung eines FP32-Modells nach FP16 für die Inferenz ist ein einzelner Befehl. In PyTorch: model.half(). Dabei werden alle Gewichte von 32 Bit auf 16 Bit reduziert. Die Modellarchitektur bleibt unverändert.

Beispiel: Ein Bildklassifikationsmodell (ResNet-50) erreicht in FP16 eine Top-1-Accuracy von 76,1 %, verglichen mit 76,15 % in FP32. Der Unterschied von 0,05 Prozentpunkten liegt innerhalb der normalen Schwankung zwischen verschiedenen Evaluierungsläufen.

FP16 im Vergleich mit anderen Zahlenformaten

FP16 ist eines von mehreren Formaten für reduzierte Präzision. Die Alternativen unterscheiden sich in Bitbreite, Wertebereich und Einsatzzweck.

BFloat16 (BF16) verwendet ebenfalls 16 Bit, verteilt sie aber anders: 8 Bit für den Exponenten und 7 Bit für die Mantisse. Dadurch hat BF16 den gleichen Wertebereich wie FP32, aber weniger Genauigkeit als FP16. BF16 eignet sich besonders für das Training, weil der größere Wertebereich Overflow-Probleme vermeidet.

Beispiel: Der Wert 100.000 ist in FP16 nicht darstellbar (Maximum: 65.504). In BF16 ist dieser Wert problemlos darstellbar, weil der Exponent 8 Bit hat. Das vermeidet Überläufe bei großen Aktivierungswerten.

Quantisierung auf ganzzahlige Formate wie INT8 oder INT4 geht noch weiter: Statt Gleitkommazahlen werden die Gewichte als ganze Zahlen mit Skalierungsfaktor gespeichert. Das reduziert den Speicher auf ein Viertel (INT8) oder ein Achtel (INT4) im Vergleich zu FP32, bringt aber größere Genauigkeitsverluste mit sich.

Beispiel: Ein Modell mit 70 Milliarden Parametern belegt in FP16 rund 140 GB. In INT4-Quantisierung sind es 35 GB. Damit passt das Modell auf zwei GPUs mit je 24 GB statt auf mehrere teure Server-GPUs. Die Textqualität sinkt allerdings messbar, typischerweise um 1 bis 3 Prozentpunkte bei Benchmark-Aufgaben.

Grenzen und typische Probleme

FP16 ist kein universelles Format. Es gibt Szenarien, in denen die reduzierte Präzision zu messbaren Fehlern führt.

Das häufigste Problem ist Underflow: Werte, die kleiner sind als das FP16-Minimum (6,1 × 10-5), werden zu Null. Bei der Gradientenberechnung kann das dazu führen, dass ein Modell aufhört zu lernen, weil alle Updates auf Null gerundet werden. Loss Scaling ist die Standardlösung, funktioniert aber nicht in jedem Fall zuverlässig.

Beispiel: Generative Adversarial Networks (GANs) sind besonders anfällig für FP16-Instabilitäten. Der Diskriminator-Gradient kann extrem klein werden, sodass selbst Loss Scaling nicht ausreicht. In solchen Fällen ist BF16 oder FP32 für den Diskriminator die robustere Wahl.

Overflow tritt auf, wenn Zwischenergebnisse den Wert 65.504 übersteigen. Das passiert bei bestimmten Normalisierungsschichten (Layer Norm, Batch Norm) oder bei sehr großen Lernraten. Mixed Precision löst das, indem diese Operationen automatisch in FP32 ausgeführt werden.

Beispiel: Beim Training eines Vision Transformers mit Batch Size 4096 und Lernrate 1e-3 können die Attention-Scores Werte über 65.504 erreichen. PyTorch AMP erkennt dies und führt die Softmax-Berechnung automatisch in FP32 aus.

Akkumulationsfehler entstehen, wenn viele kleine FP16-Werte addiert werden. Die begrenzte Mantisse führt dazu, dass ab einer bestimmten Summe weitere Additionen keinen Effekt mehr haben (Absorption). Tensor Cores lösen das, indem sie intern in FP32 akkumulieren, auch wenn die Eingaben FP16 sind.

Fachliche Einordnung: Die Forschung an numerisch effizienten Formaten geht über FP16 hinaus. Formate wie FP8 (E4M3 und E5M2), die in NVIDIA Hopper GPUs unterstützt werden, halbieren den Speicherbedarf erneut. Die Herausforderung verschiebt sich dabei von der reinen Bitreduktion hin zu adaptiven Skalierungsmechanismen, die den verfügbaren Wertebereich optimal nutzen.


Karl Kratz · 09.07.2025 (aktualisiert 15.03.2026)

Technologie Künstliche Intelligenz Llm