Mixed Precision
Karma hassasiyetli eğitim, bellek kullanımını ve eğitim süresini azaltmak için sinir ağlarını 16 bitlik matematik ve FP32 ana ağırlıklarla eğitir. Kayıp ölçekleme, BF16 ve AMP'yi ele alır.
Karma hassasiyet, bir sinir ağının matematiksel işlemlerinin çoğunu FP16 (yarı hassasiyet) veya BF16 gibi 16 bitlik bir kayan nokta biçiminde çalıştırırken, model ağırlıklarının 32 bitlik (FP32) ana kopyasını koruyan ve sayısal açıdan hassas işlemleri FP32'de yürüten bir eğitim tekniğidir. 16 bitlik değerler, FP32'ye kıyasla belleğin ve bant genişliğinin yarısını kullanır; modern GPU'larda bulunan Tensor Core'lar da bu değerleri çok daha hızlı çarpar. Böylece karma hassasiyet, FP32 doğruluğunu korurken eğitimi kısaltır ve belleğe daha büyük yığın boyutlarının sığmasını sağlar. Micikevicius ve diğerlerinin 2018'de açıkladığı; FP32 ana ağırlıkları, FP16 aritmetiğini ve kayıp ölçeklemeyi bir araya getiren yöntem, derin öğrenme çerçevelerinin artık Otomatik Karma Hassasiyet (AMP) olarak otomatikleştirdiği yöntemdir.
Karma Hassasiyet Nasıl Çalışır#
16 bitlik eğitimde geri yayılımın ve ağırlık güncellemelerinin FP32 eğitimindeki doğrulukla eşleşmesini üç unsur sağlar:
- FP32 Ana Ağırlıkları: Optimizasyon algoritması her güncellemeyi ağırlıkların FP32 kopyasına uygular. FP16 yalnızca yaklaşık üç anlamlı ondalık basamağı koruduğundan, doğrudan FP16 ağırlığına eklenen küçük bir güncelleme genellikle yuvarlama nedeniyle kaybolur.
- İşlem Başına Hassasiyet: Autocast bağlamı, en büyük hız artışını Tensor Core'lardan aldıkları için matris çarpımlarını ve evrişimleri 16 bitte çalıştırır; indirgemeleri, softmax'ı ve kaybı ise FP32'de tutar.
- Kayıp Ölçekleme: FP16, yaklaşık 6 × 10⁻⁸ değerinden küçük büyüklükleri gösteremez; bu nedenle birçok küçük gradyan alt taşmayla sıfıra yuvarlanır. Geri yayılımdan önce kaybı bir ölçek faktörüyle çarpmak her gradyanı FP16 aralığına taşır; ağırlık güncellemesinden önce gradyanlar aynı faktöre bölünür.
PyTorch AMP içinde, torch.autocast işlem başına tür dönüşümünü, GradScaler ise kayıp ölçeklemeyi yönetir:
import torch
from torch import nn
# Use FP16 on an NVIDIA GPU and BF16 on CPU
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float16 if device == "cuda" else torch.bfloat16
model = nn.Linear(512, 10).to(device) # master weights stay in FP32
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
scaler = torch.amp.GradScaler(device, enabled=dtype == torch.float16) # loss scaling for FP16 only
x = torch.randn(64, 512, device=device)
with torch.autocast(device_type=device, dtype=dtype):
out = model(x) # the matrix multiply runs in 16-bit
loss = out.float().pow(2).mean()
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
print(f"Output: {out.dtype}, weights: {model.weight.dtype}, gradients: {model.weight.grad.dtype}")CPU'da bu kod parçası katman çıktısı için torch.bfloat16, ağırlıklar ve gradyanları için torch.float32 yazdırır; NVIDIA GPU'da çıktı torch.float16 olur. Tek bir eğitim adımında 16 bitlik matematik ve FP32 ana ağırlıkları birlikte bulunur.
PyTorch'un GradScaler özelliği ölçeği dinamik olarak ayarlar. 65,536 ile başlar, ölçeklenmiş gradyanlar inf veya NaN değerleri içerdiğinde ölçeği yarıya indirip adımı atlar; taşma olmadan art arda 2,000 adım tamamlandığında ölçeği ikiye katlar. Böylece faktör, gradyanların taştığı eşiğin hemen altında dengelenir.
FP16, BF16 ve Daha Düşük Hassiyetler#
FP16, üstel kısım için 5, anlamlı kısım için 10 bit kullanır; bu nedenle hassastır, ancak 65,504'ün üzerinde taşar. BF16, FP32'nin 8 üstel bitini koruyarak yaklaşık 3.4 × 10³⁸'e kadar aynı aralığı kapsar; yalnızca 7 anlamlı biti olduğundan, daha kaba yuvarlama pahasına kayıp ölçeklemeye ihtiyaç duymaz. BF16, Ampere neslinden itibaren NVIDIA GPU'larda, Google TPU'larında ve yakın tarihli birçok CPU'da çalışır; büyük dil modelleri için yaygın eğitim biçimidir. Aynı yaklaşım, NVIDIA'nın Transformer Engine aracılığıyla Hopper ve Blackwell GPU'larda FP8 biçimlerine, Blackwell'de ise NVFP4 gibi FP4 biçimlerine uzanır.
Uygulamada Karma Hassasiyet#
AMP ile ilgili temel pratik risk, 16 bitlik hesaplamalarda NaN kayıplar üreten bir model veya GPU'dur. Ultralytics YOLO26 eğitimi AMP'yi varsayılan olarak etkinleştirir ve amp=True ile CUDA GPU'larda bir YOLO26n modelinin FP32 ve AMP tahminlerini önce karşılaştırır; sonuçlar uyuşmazsa veya GPU, GTX 16 serisi gibi AMP altında NaN kayıplar ürettiği bilinen bir seriye aitse FP32'ye döner. amp="bf16" ayarı, kayıp ölçekleme kapalıyken BF16 autocast'i etkinleştirir.
Karma hassasiyet, eğitimin bellek veya zamanla sınırlı olduğu her yerde yaygın biçimde kullanılır. Otonom araçlar geliştiren ekipler, milyonlarca yüksek çözünürlüklü kare üzerinde nesne algılama modelleri eğitir; etkinleştirme belleğinin yarıya inmesi daha büyük görüntü ve yığın boyutlarına olanak tanır. Tıbbi görüntü analizinde 3B BT ve MRI hacimleri çoğunlukla FP32'de GPU belleğine sığmaz; 16 bitlik etkinleştirmeler, bütün hacimler üzerinde segmentasyon modellerinin eğitilmesini mümkün kılar.
Karma Hassasiyet ve İlgili Kavramlar#
- Model Kuantizasyonu: Kuantizasyon, eğitilmiş bir modeli daha hızlı çıkarım için INT8 gibi düşük hassasiyetli tamsayılara dönüştürür; karma hassasiyet ise eğitimi hızlandırır ve kayan noktalı ağırlıkları korur.
- Kuantizasyon Farkındalıklı Eğitim: QAT, INT8 dağıtımından sonra modelin doğruluğunu koruması için eğitim sırasında tamsayı yuvarlamasını taklit eder.
- Yarı Hassasiyet: Yarı hassasiyet, FP16 sayı biçiminin kendisini ifade eder; karma hassasiyet ise bu biçimi FP32 ile birleştiren eğitim tekniğidir. FP32 ana ağırlıkları veya kayıp ölçekleme olmadan yalnızca FP16 ile eğitim yapmak, küçük güncellemeleri yuvarlamayla, küçük gradyanları da alt taşmayla kaybettirir ve çoğu zaman yakınsamayı engeller.










