BFloat16 Nedir?
BFloat16 (Brain Float16), Google'ın TPU'ları için geliştirdiği 16 bitlik kayan nokta sayı formatıdır. IEEE 754 Float32 formatının üst 16 bitini koruyarak oluşturulmuştur: 1 işaret + 8 üs + 7 mantis biti. Bu yapı, standart Float16'nın (1 işaret + 5 üs + 10 mantis) aksine Float32 ile özdeş dinamik aralığı (yaklaşık 10^-38 ile 10^38) sunar. 7 bitlik mantis alanı Float32'nin 23 bitine kıyasla hassasiyeti düşürse de, derin öğrenme gradyanlarının doğası gereği gürültülü olduğu göz önüne alındığında bu kayıp pratikte önemsizdir.
Sayı Formatları Karşılaştırması
🔵 Float32 (FP32)
1 işaret + 8 üs + 23 mantis = 32 bit. En yüksek hassasiyet ve dinamik aralık. Ağırlık güncellemeleri ve kritik hesaplamalar için referans format. Bellek maliyeti en yüksek.
🟢 BFloat16 (BF16)
1 işaret + 8 üs + 7 mantis = 16 bit. Float32 ile aynı dinamik aralık, yarı bellek. Taşma/altaşma riski düşük. Büyük dil modeli eğitiminin fiilî standardı.
🟡 Float16 (FP16)
1 işaret + 5 üs + 10 mantis = 16 bit. Daha yüksek hassasiyet ama daha dar dinamik aralık. Gradyan taşması riski mevcut; loss scaling tekniği gerektirir. NVIDIA Volta'da önerilirdi.
🔴 FP8 (E4M3 / E5M2)
8 bit kayan nokta, H100 ve Blackwell GPU'larında yerel destek. BFloat16'dan 2× daha küçük; bellek ve bant genişliği tasarrufu daha yüksek. Hassasiyet kaybı yönetimi için özel kalibrasyon gerekir.
Mixed-Precision Eğitim: Nasıl Çalışır?
Karma hassasiyetli (mixed-precision) eğitim, BFloat16'nın bellek avantajını Float32'nin sayısal kararlılığıyla birleştirir. Akış şu şekilde işler: (1) İleri geçiş (forward pass) — aktivasyonlar BFloat16 ile hesaplanır. (2) Kayıp hesaplama — düşük hassasiyetli format yeterlidir. (3) Geri geçiş (backward pass) — gradyanlar BFloat16'da hesaplanır. (4) Ağırlık güncellemesi — optimizer (Adam, SGD) ağırlıkları Float32 master copy'de tutar ve günceller. Bu yaklaşım bellek tüketimini yaklaşık yarıya indirir, bellek bant genişliği gereksinimini azaltır ve CUDA Tensor Cores'un BF16 hızlandırmasından yararlanır. PyTorch'ta `torch.autocast('cuda', dtype=torch.bfloat16)` ile tek satırda etkinleştirilir.
Donanım Desteği ve LLM Ekosistemi
BFloat16 için yerel donanım desteği 2020-2021 itibarıyla yaygınlaştı. NVIDIA Ampere (A100) mimarisi, BF16 Tensor Core'larıyla teorik olarak FP32'nin 2×'i iş hacmi sunar; Hopper (H100) bu oranı 4×'e çıkardı. Google TPU v2 ve sonrası, AMD CDNA (MI250X+) ve Intel Gaudi2 de BF16 yerel desteği içermektedir. Ekosistem açısından GPT-3, PaLM, LLaMA-1/2/3 ve Mistral gibi önemli büyük dil modelleri BFloat16 ile eğitilmiştir. Hugging Face Transformers, `model.to(torch.bfloat16)` çağrısıyla BF16 çıkarımını destekler. vLLM ve TGI (Text Generation Inference) gibi üretim çıkarım çerçeveleri de BF16'yı varsayılan olarak kullanır.
BFloat16'nın Sınırları ve FP8'e Geçiş
BFloat16'nın 7 bitlik mantis alanı, bazı hassasiyet gerektiren uygulamalarda — özellikle bilimsel hesaplama ve sayısal optimizasyon — yeterli olmayabilir. Bu durumda Float32 veya TF32 (NVIDIA'nın 19 bitlik formatı) tercih edilir. 2023-2024 itibarıyla FP8 formatı gündeme gelmiştir: H100 GPU'larında E4M3 ve E5M2 varyantlarıyla BFloat16'dan 2× daha küçük gösterim sunar. Ancak FP8 ile eğitim, hassasiyet kayıplarını yönetmek için aktivasyon ölçeklendirme (activation scaling) ve kalibrasyon adımları gerektirir. Mevcut trendde BFloat16, eğitimde ağırlık ana kopyası için hâlâ yaygın olup FP8 çıkarım hızlandırmasıyla tamamlayıcı biçimde kullanılmaktadır.
Sık Sorulan Sorular
- check_circle BFloat16 mi Float16 mi kullanmalıyım?: Büyük dil modelleri ve genel derin öğrenme eğitimi için BFloat16 tercih edilir: daha geniş dinamik aralık, taşma riski yok, loss scaling gerektirmez. Float16 yalnızca eski NVIDIA GPU'larında (Volta, Turing) donanım hızlandırması için ya da belirli operasyon hassasiyeti gerektiğinde tercih edilir. A100 veya daha yeni GPU varsa BFloat16 açık kazanan.
- check_circle PyTorch'ta BFloat16 nasıl kullanılır?: `torch.autocast('cuda', dtype=torch.bfloat16)` ile ileri geçiş otomatik olarak BF16'ya alınır. Manuel dönüşüm için `model.to(torch.bfloat16)` veya tensör seviyesinde `tensor.to(torch.bfloat16)` kullanılır. Hugging Face modellerinde `model = AutoModel.from_pretrained(name, torch_dtype=torch.bfloat16)` yeterlidir.
- check_circle BFloat16 çıkarımı eğitimden daha güvenli mi?: Evet. Çıkarım sırasında ağırlıklar sabit olduğundan sayısal kararlılık eğitime kıyasla çok daha az kritiktir. BFloat16 çıkarımı; bellek tüketimini yarıya indirir, daha büyük batch boyutlarına olanak tanır ve gecikmeyi azaltır. Hassasiyet kaybı üretim sistemlerinde genellikle algılanamaz düzeydedir.
- check_circle TF32 nedir, BFloat16 ile farkı nedir?: TF32 (TensorFloat-32), NVIDIA'nın Ampere ile tanıttığı 19 bitlik özel formattır: 1 işaret + 8 üs + 10 mantis. Float32 ile aynı bellek boyutunu kullanır ama Tensor Core'larda 8× daha hızlı çalışır. Bellekte değil hesaplamada etkindir; BFloat16 ise hem bellekte hem hesaplamada 16 bittir. İkisi tamamlayıcıdır: PyTorch varsayılan olarak FP32 matris işlemlerini TF32 ile hızlandırır, BFloat16 ise açık cast gerektirir.
- check_circle FP8 BFloat16'nın yerini alacak mı?: Kısa vadede hayır. FP8 özellikle çıkarım hızlandırması için büyük potansiyel sunar, ancak eğitimde kalibrasyon karmaşıklığı hâlâ ciddi bir engel. 2024-2025 pratiğinde en yaygın yaklaşım şudur: eğitim BF16, çıkarım FP8 (H100 varsa) veya BF16. BFloat16 en az 3-5 yıl daha ana akım eğitim ve çıkarım formatı olmaya devam edecektir.