FP4
FP4 è un formato in virgola mobile a 4 bit, solitamente E2M1, che usa scale per blocco per ridurre le dimensioni e accelerare i modelli IA. Panoramica di NVFP4, MXFP4, hardware e codice.
FP4 è un formato numerico in virgola mobile a 4 bit usato per memorizzare e calcolare i pesi e le attivazioni delle reti neurali nella quantizzazione dei modelli. L'hardware e il software per l'IA usano il layout E2M1: un bit di segno, due bit di esponente e un bit di mantissa, che può rappresentare soltanto 0, ±0.5, ±1, ±1.5, ±2, ±3, ±4 e ±6. Ogni valore occupa metà della memoria di FP8 e un quarto di FP16 (precisione a metà), un aspetto importante soprattutto per i modelli linguistici di grandi dimensioni e altri modelli di IA generativa, la cui latenza di inferenza è dominata dal trasferimento dei pesi dalla memoria. Il calcolo nativo delle matrici FP4 è arrivato con le GPU Blackwell di NVIDIA e la serie Instinct MI350 di AMD; FP4 viene usato sia per l'inferenza sia, sempre più spesso, per l'addestramento.
Come funziona FP4#
Quindici valori distinti non possono coprire l'intervallo dei pesi e delle attivazioni reali, quindi ogni formato FP4 pratico suddivide un tensore in piccoli blocchi e memorizza una scala condivisa per blocco, scelta in modo che la magnitudine massima del blocco si avvicini al valore massimo E2M1 di 6. I due formati principali differiscono per dimensione del blocco e precisione della scala:
- MXFP4: definito nella specifica Microscaling (MX) dell'Open Compute Project, MXFP4 raggruppa 32 valori associando loro una scala a potenza di due a 8 bit (E8M0). Essendo una specifica aperta, è supportato da diversi produttori, tra cui AMD con la serie MI350 e NVIDIA con le GPU Blackwell.
- NVFP4: il formato di NVIDIA raggruppa 16 valori associando loro una scala FP8 (E4M3) e aggiunge una seconda scala FP32 per tensore. I blocchi più piccoli e le scale più precise riducono l'errore di quantizzazione; NVIDIA ha riportato una perdita di precisione dell'1% o inferiore rispetto a FP8 sui benchmark DeepSeek-R1-0528.
Il frammento seguente arrotonda un tensore con alcuni valori anomali ai valori E2M1 usando prima una scala per l'intero tensore, poi una scala ogni 32 e ogni 16 valori, corrispondenti alle dimensioni dei blocchi MXFP4 e NVFP4:
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}")Con una sola scala per l'intero tensore, i valori anomali allargano così tanto l'intervallo della scala che la maggior parte dei valori ordinari viene arrotondata a zero, con un errore assoluto medio di 0.7238. I blocchi da 32 e 16 valori confinano ciascun valore anomalo a un solo blocco, così tutti gli altri mantengono una scala precisa e l'errore scende rispettivamente a 0.0901 e 0.0747.
Inferenza e addestramento FP4#
Per l'inferenza, un motore di inferenza come TensorRT quantizza i pesi e, spesso, le attivazioni in FP4 dopo l'addestramento, esegue le moltiplicazioni di matrici in FP4 e accumula i risultati a precisione più elevata. Le configurazioni NVFP4 e MXFP4 di TorchAO portano lo stesso flusso di lavoro in PyTorch sulle GPU supportate. OpenAI ha rilasciato gpt-oss-120b con i pesi del suo modello a miscela di esperti post-addestrati in MXFP4, consentendo al modello da 117 miliardi di parametri di funzionare su una singola GPU da 80 GB.
L'addestramento in FP4 estende l'addestramento a precisione mista fino a 4 bit ed è più difficile dell'inferenza, perché l'intervallo di gradienti e attivazioni cambia durante l'addestramento. Nello studio di preaddestramento NVFP4, NVIDIA ha addestrato in NVFP4 un modello da 12 miliardi di parametri su 10.000 miliardi di token, ottenendo una loss di addestramento e una precisione a valle comparabili a una baseline FP8. Il risultato è stato ottenuto combinando trasformate di Hadamard casuali per distribuire i valori anomali, arrotondamento stocastico per i gradienti e alcuni livelli mantenuti a precisione più elevata.
Distribuzione di modelli FP4#
I tensor core FP4 nativi richiedono GPU NVIDIA Blackwell o successive, come B200 e la serie GeForce RTX 50, oppure acceleratori AMD Instinct MI350 per MXFP4; le GPU Hopper come H100 accelerano FP8, ma non FP4. La matrice di supporto di TensorRT elenca le precisioni supportate da ciascuna GPU. Dopo la conversione e prima della distribuzione del modello, è necessario verificare la precisione, poiché i livelli sensibili o i modelli piccoli possono degradarsi; l'addestramento consapevole della quantizzazione recupera la precisione quando la quantizzazione post-addestramento non basta. L'esportazione TensorRT di Ultralytics YOLO26 crea motori FP16 con quantize=16 o INT8 con quantize=8, le opzioni a precisione ridotta offerte per i modelli YOLO.
FP4 e formati correlati#
- FP8: FP8 (E4M3 o E5M2) ha molti più valori distinti e un intervallo più ampio; poiché l'addestramento FP8 è ampiamente adottato per i modelli di grandi dimensioni, FP8 è la baseline abituale con cui si confrontano i risultati FP4.
- BFloat16: BF16 resta il formato standard per addestrare e servire modelli di grandi dimensioni alla massima qualità, con un numero di bit quadruplo rispetto a FP4.
- INT4: INT4 distribuisce uniformemente i suoi 16 livelli, mentre FP4 concentra più livelli vicino allo zero, dove si trova la maggior parte dei pesi e delle attivazioni. INT4 resta comune per la compressione dei soli pesi dei modelli linguistici, con metodi come GPTQ e AWQ.
- Socket FP4 di AMD: FP4 è anche il nome di un socket per processori per portatili AMD, non correlato a questo formato, usato dalle APU mobili della generazione Carrizo, come FX-8800P.










