FP8
FP8 è un formato in virgola mobile a 8 bit con varianti E4M3 ed E5M2, che dimezza la memoria rispetto ai 16 bit e raddoppia il throughput delle matrici sulle GPU supportate.
FP8 è un formato a virgola mobile a 8 bit usato per addestrare ed eseguire reti neurali con metà della memoria e del trasferimento dei dati rispetto ai formati a 16 bit. Come in qualsiasi tipo a virgola mobile, ogni valore ha un bit di segno, bit di esponente che ne determinano l'intervallo e bit di mantissa che ne determinano la precisione; con soli otto bit in totale, però, il formato rinuncia a molto sia in termini di intervallo sia di precisione. Nel documento del settembre 2022 FP8 Formats for Deep Learning, gli ingegneri di NVIDIA, Arm e Intel hanno definito le due varianti standard, E4M3 ed E5M2, e ne hanno convalidato l'uso nell'addestramento di modelli linguistici fino a 175 miliardi di parametri. Sulle GPU con Tensor Core FP8, come NVIDIA Hopper H100, introdotta nel 2022, le moltiplicazioni di matrici FP8 raggiungono un throughput doppio rispetto a FP16 o BF16.
E4M3 ed E5M2#
Le due varianti suddividono in modo diverso i sette bit che non rappresentano il segno:
- E4M3: quattro bit di esponente e tre bit di mantissa. Rinuncia ai valori infiniti e mantiene un solo schema NaN per raggiungere un massimo di 448; è adatto ai pesi e alle attivazioni nel passaggio in avanti.
- E5M2: cinque bit di esponente e due bit di mantissa, secondo le convenzioni IEEE 754 per i valori speciali. Raggiunge 57.344 con incrementi più grossolani ed è adatto ai gradienti, le cui magnitudini variano in un intervallo più ampio.
Entrambi i formati azzerano i valori piccoli e limitano quelli grandi, quindi i tensori FP8 di solito includono un fattore di scala che sposta i valori nell'intervallo rappresentabile. La conversione di valori delle dimensioni di un gradiente, con e senza fattore di scala, mostra perché:
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%}")Una conversione diretta in E4M3 arrotonda 100% dei valori a zero; l'intervallo più ampio di E5M2 conserva la maggior parte dei valori con un errore relativo mediano di 6.4% e ne perde 7%; applicando prima un fattore di scala, E4M3 conserva tutti i valori con un errore mediano di 2.2%. PyTorch offre anche float8_e4m3fnuz e float8_e5m2fnuz, le varianti usate dagli acceleratori MI300 di AMD, che eliminano lo zero negativo e modificano il bias dell'esponente, limitando E4M3 a 240. Un modello FP8, quindi, non è automaticamente portabile tra fornitori.
Strategie di scaling#
Un unico fattore di scala per un intero tensore non funziona quando pochi valori anomali determinano il massimo e spingono tutti gli altri verso zero, un fenomeno comune nelle attivazioni dei Transformer. Le ricette differiscono per il livello di granularità dello scaling:
- Scaling ritardato per tensore: Transformer Engine di NVIDIA seleziona il fattore di scala di ogni tensore in base ai valori massimi osservati negli ultimi passaggi di addestramento, senza bisogno di un passaggio aggiuntivo sui dati.
- Scaling a blocchi: DeepSeek-V3 ha applicato lo scaling alle attivazioni per tile di 1 × 128 valori e ai pesi per blocchi di 128 × 128; il suo team ha riferito la prima convalida dell'addestramento FP8 su un modello estremamente grande, da 671 miliardi di parametri.
- MXFP8: il formato di microscaling dell'Open Compute Project condivide un fattore di scala potenza di due ogni 32 valori, e le GPU Blackwell di NVIDIA lo eseguono via hardware.
Le moltiplicazioni di matrici accumulano i risultati con una precisione maggiore, mentre i livelli sensibili o poco costosi, come la normalizzazione, la softmax e i pesi master dell'ottimizzatore, restano in BF16 o FP32. FP8 è quindi una componente di una ricetta a precisione mista.
FP8 nell'addestramento e nell'inferenza#
Per l'addestramento, Transformer Engine di NVIDIA e TorchAO sostituiscono i livelli lineari con versioni FP8, mantenendo i pesi master a precisione maggiore. Per l'inferenza, i motori di serving archiviano in FP8 i pesi del modello e la cache KV degli LLM, dimezzando la memoria rispetto ai formati a 16 bit e lasciando spazio a più richieste simultanee. Anche TensorRT crea motori FP8 per GPU con Tensor Core FP8. Il formato è vantaggioso solo con il supporto hardware: NVIDIA A100 esegue FP16, BF16 e INT8 sui suoi Tensor Core, ma non dispone di unità FP8, mentre le GPU Ada Lovelace, Hopper e Blackwell e la serie MI300 di AMD le supportano.
FP8 si colloca tra i formati vicini:
- FP16 o precisione dimezzata: il doppio dei bit, con 10 bit di mantissa e un intervallo sufficiente per la maggior parte dei casi di inferenza senza fattori di scala per tensore.
- FP4: dimezza ancora il numero di bit e si affida a fattori di scala a grana fine per mantenere la precisione.
- INT8: l'altro formato a 8 bit, con 256 livelli equidistanti anziché la spaziatura basata sull'esponente di FP8; richiede fattori di scala calibrati, ma funziona su molto più hardware, inclusa la maggior parte di CPU e NPU.
Ultralytics YOLO26 adotta INT8 per l'inferenza a 8 bit: l'esportazione con quantize=8 in modalità di esportazione per formati come TensorRT e OpenVINO esegue la quantizzazione del modello post-addestramento, calibrando i fattori di scala su immagini del dataset data; invece, un modello sottoposto a fine-tuning con quantize=8 tramite addestramento consapevole della quantizzazione viene esportato in TensorRT con gli intervalli appresi e non richiede calibrazione.










