FP8
FP8, belleği 16 bitlik biçimlere kıyasla yarıya indiren ve desteklenen GPU'larda matris verimini ikiye katlayan, E4M3 ve E5M2 çeşitlerine sahip 8 bitlik bir kayan nokta biçimidir.
FP8, sinir ağlarını 16 bitlik biçimlerin yarısı kadar bellek ve veri aktarımıyla eğitmek ve çalıştırmak için kullanılan 8 bitlik bir kayan nokta sayı biçimidir. Her kayan nokta türünde olduğu gibi her değerin bir işaret biti, aralığı belirleyen üs bitleri ve hassasiyeti belirleyen anlamlı basamak bitleri vardır; ancak toplamda yalnızca sekiz bit bulunduğundan her ikisinden de büyük ölçüde ödün verir. NVIDIA, Arm ve Intel'den mühendisler iki standart sürüm olan E4M3 ve E5M2'yi Eylül 2022 tarihli FP8 Formats for Deep Learning makalesinde tanımladı ve bu biçimlerle 175 milyar parametreye kadar dil modellerinin eğitimini doğruladı. NVIDIA'nın 2022'de tanıttığı Hopper H100 gibi FP8 Tensor Core'lara sahip GPU'larda, FP8 matris çarpımları FP16 veya BF16 biçimlerinin iki katı verimle çalışır.
E4M3 ve E5M2#
İki sürüm, işaret biti dışındaki yedi biti farklı biçimde böler:
- E4M3: Dört üs biti ve üç anlamlı basamak biti kullanır. Sonsuzluk değerlerinden vazgeçer ve en yüksek 448 değerine ulaşmak için tek bir NaN desenini korur; ileri geçişteki ağırlıklar ve aktivasyonlar için uygundur.
- E5M2: Özel değerler için IEEE 754 kurallarını izleyerek beş üs biti ve iki anlamlı basamak biti kullanır. Daha kaba adımlarla 57.344 değerine ulaşır ve büyüklükleri daha geniş aralıkta değişen gradyanlar için uygundur.
Her iki biçim de küçük değerleri sıfıra dönüştürür ve büyük değerleri kırpar; bu nedenle FP8 tensörleri genellikle değerlerini temsil edilebilir aralığa kaydıran bir ölçekleme faktörü taşır. Gradyan boyutundaki değerleri bu faktör olmadan ve faktörle dönüştürmek, bunun nedenini gösterir:
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%}")E4M3'e doğrudan dönüştürme, değerlerin 100% kısmını sıfıra yuvarlar. E5M2'nin daha geniş aralığı, değerlerin çoğunu 6.4% medyan göreli hatayla korur ve 7% kadarını kaybeder. Önce ölçekleme yapmaksa E4M3'ün tüm değerleri 2.2% medyan hatayla korumasını sağlar. PyTorch, AMD'nin MI300 hızlandırıcılarında kullandığı float8_e4m3fnuz ve float8_e5m2fnuz biçimlerini de sağlar. Bu biçimler eksi sıfırı kaldırır, üs yanlılığını kaydırır ve E4M3'ü 240 ile sınırlar. Bu nedenle bir FP8 modelinin farklı üreticiler arasında taşınabilirliği kendiliğinden garanti edilmez.
Ölçekleme Stratejileri#
Tüm tensör için tek bir ölçek, maksimum değeri belirleyip diğer her şeyi sıfıra doğru iten birkaç aykırı değer olduğunda yetersiz kalır; bu durum Transformer aktivasyonlarında yaygındır. Ölçekleme ayrıntı düzeyine göre yöntemler farklılık gösterir:
- Tensör başına gecikmeli ölçekleme: NVIDIA'nın Transformer Engine'i her tensörün ölçeğini son eğitim adımlarında görülen en yüksek değerlerden seçer; böylece veriler üzerinde fazladan geçiş gerekmez.
- Blok ölçekleme: DeepSeek-V3, aktivasyonları 1 × 128 değerlik kutucuklar ve ağırlıkları 128 × 128 bloklar hâlinde ölçekledi. Ekip, 671 milyar parametreli son derece büyük bir modelde FP8 eğitimini doğrulayan ilk çalışma olduğunu bildirdi.
- MXFP8: Open Compute Project'in mikro ölçekleme biçimi, her 32 değerde bir ikinin kuvveti cinsinden tek bir ölçek paylaşır; NVIDIA'nın Blackwell GPU'ları bu biçimi donanım düzeyinde çalıştırır.
Matris çarpımları sonuçlarını daha yüksek hassasiyetle biriktirir. Normalleştirme, softmax ve iyileştiricinin ana ağırlıkları gibi hassas veya düşük maliyetli katmanlar BF16 ya da FP32 biçiminde kalır. Bu nedenle FP8, bir karma hassasiyet reçetesinin yalnızca bir parçasıdır.
Eğitim ve Çıkarımda FP8#
Eğitim için NVIDIA'nın Transformer Engine ve TorchAO araçları, ana ağırlıkları daha yüksek hassasiyette tutarken doğrusal katmanları FP8 sürümleriyle değiştirir. Çıkarım için sunum motorları, model ağırlıklarını ve büyük dil modellerinin KV önbelleğini FP8 biçiminde depolar. Böylece 16 bitlik biçimlere kıyasla bellek kullanımı yarıya iner ve eşzamanlı daha fazla isteğe yer açılır. TensorRT de FP8 Tensor Core'lu GPU'lar için FP8 motorları oluşturur. Biçimin fayda sağlaması için donanım desteği gerekir: NVIDIA A100, Tensor Core'larında FP16, BF16 ve INT8 çalıştırır ancak FP8 birimleri içermez; Ada Lovelace, Hopper ve Blackwell GPU'ları ile AMD'nin MI300 serisi ise FP8'i destekler.
FP8, yakınındaki biçimlerin arasında yer alır:
- FP16 veya yarı hassasiyet: İki katı bit kullanır; 10 anlamlı basamak biti vardır ve çoğu çıkarım işlemi için tensör başına ölçek gerektirmeyen yeterli bir aralık sunar.
- FP4: Bit sayısını bir kez daha yarıya indirir ve doğruluğu korumak için ayrıntılı blok ölçeklerine dayanır.
- INT8: FP8'in üs temelli aralıkları yerine eşit aralıklı 256 düzey kullanan diğer 8 bitlik biçimdir. Kalibre edilmiş ölçeklere ihtiyaç duyar ancak çoğu CPU ve NPU dâhil çok daha fazla donanımda çalışır.
Ultralytics YOLO26, 8 bitlik çıkarım için INT8 yolunu izler: quantize=8 kullanılarak dışa aktarma modunda TensorRT ve OpenVINO gibi biçimlere dışa aktarım yapıldığında, data veri kümesindeki görüntüler üzerinden ölçekleri kalibre eden eğitim sonrası model nicemlemesi gerçekleştirilir; buna karşılık, quantize=8 kullanılarak nicemlemeye duyarlı eğitim yoluyla ince ayarlanmış bir model, öğrendiği aralıklarla TensorRT'ye aktarılır ve kalibrasyon gerektirmez.










