Gradient Accumulation
Sınırlı GPU belleğinde daha büyük efektif grup boyutlarına nasıl izin verdiğini, pratik PyTorch ve Ultralytics YOLO eğitim rehberliğiyle öğren.
Gradient biriktirme, tek bir model ağırlığı güncellemesi gerçekleştirmeden önce mikrobatch adı verilen birkaç küçük batch'ten gelen gradientleri toplayan bir eğitim tekniğidir. Mevcut GPU belleği tüm batch'i aynı anda tutamadığında, daha büyük bir batch size ile eğitimi yaklaşık olarak taklit eder. Bu, model mimarisini değiştirmeden veya giriş çözünürlüğünü düşürmeden belleğe yoğun gradient descent işlemlerini pratik hale getirir.
Gradient Biriktirme Nasıl Çalışır?#
Normal eğitim sırasında her batch üç ana adımdan geçer: kaybı (loss) hesaplamak, gradientleri hesaplamak için backpropagation kullanmak ve optimizatörün model ağırlıklarını güncellemesine izin vermek. Gradientler daha sonra sonraki batch'ten önce temizlenir.
Gradient biriktirme, optimizatör güncellemesini geciktirir. Her mikrobatch bir ileri ve geri geçiş (forward and backward pass) gerçekleştirir, ancak gradientleri bellekte kalır ve sonraki mikrobatch'lerden gelenlere eklenir. Bu davranış, her parametrenin gradient alanında değerleri biriktiren PyTorch backward operation ile doğal olarak uyumludur.
Yapılandırılan biriktirme adım sayısı tamamlandıktan sonra:
- Optimizatör model ağırlıklarını günceller.
- Gradientler, Optimizer.zero_grad gibi bir işlem kullanılarak sıfırlanır.
- Yeni bir biriktirme penceresi başlar.
Etkili batch boyutu şöyledir:
microbatch size x accumulation steps x number of training devices
Örneğin, 8 adım boyunca biriktirilen 4 görüntülük bir mikrobatch, tek bir GPU'da 32 görüntülük bir batch gibi davranır. Dört GPU ile küresel etkili batch boyutu 128 olur.
Bellek, Hız ve Öğrenme Üzerindeki Etkileri#
Gradient biriktirme, aktivasyonlar için gereken pik belleği azaltır çünkü aynı anda ağdan yalnızca bir mikrobatch geçer. Model parametreleri, gradientler veya optimizatör durumu tarafından kullanılan belleği önemli ölçüde azaltmaz.
Ayrıca genellikle eğitimi hızlandırmaz. Sekiz mikrobatch'i işlemek yine de sekiz ileri ve geri geçiş gerektirir ve daha küçük batch'ler GPU'yu daha az verimli kullanabilir. Temel avantaj, istenen etkili batch'in sınırlı belleğe sığdırılmasıdır. İkincil bir avantaj, uygulamaların DistributedDataParallel no_sync gibi özellikleri kullanarak bir biriktirme penceresinin sonuna kadar gradientleri senkronize etmekten kaçınabileceği distributed training sırasında ortaya çıkabilir.
Manuel bir uygulama, ortaya çıkan gradientin bir toplam yerine ortalamayı temsil etmesi için genellikle her mikrobatch kaybını biriktirme adım sayısı ile böler. Üst düzey eğiticiler (trainers) normalleştirmeyi otomatik olarak yönetebilir, bu nedenle ek ölçeklendirme uygulamak yanlış güncellemelere neden olabilir.
Biriktirme büyük bir batch'i yaklaşık olarak taklit edebilir, ancak sonuçlar her zaman tamamen aynı değildir. Batch normalization statistics bireysel mikrobatch'lerden hesaplanırken, stokastik işlemler ve kayan nokta sıralaması da farklılıklara neden olabilir. Bu nedenle learning rate, otomatik ölçeklendirme yerine doğrulama gerektirebilir.
İlgili Teknikler ve Temel Farklar#
Gradient biriktirme genellikle diğer bellek veya kararlılık teknikleriyle karıştırılır:
- Gradient checkpointing, geri yayılım sırasında seçilen ileri geçiş işlemlerini yeniden hesaplayarak aktivasyon belleğini azaltır. PyTorch activation checkpointing documentation bu hesaplama-bellek takasını açıklar. Biriktirme ise bunun yerine büyük bir batch'i daha küçük mikrobatch'lere böler.
- Mixed precision, seçilen işlemleri daha düşük hassasiyetli veri türleriyle depolar veya hesaplar. Belleği azaltabilir ve verimi artırabilir, biriktirme ise optimizatörün ne sıklıkla güncelleme yaptığını değiştirir. Bu teknikler, doğru automatic mixed precision accumulation workflow izlenerek birleştirilebilir.
- Gradient clipping, olağandışı büyük güncellemelerden kaynaklanan kararsızlığı azaltmak için gradient büyüklüğünü sınırlandırır. Daha büyük etkili bir batch oluşturmaz. Biriktirme ile birleştirildiğinde, clip_grad_norm gibi bir işlem kullanılarak kırpma normalde tüm gradient biriktirildikten sonra gerçekleşmelidir.
Gerçek Dünya Uygulamaları#
Yüksek çözünürlüklü tıbbi görüntü segmentasyonunda, 12 GB'lık bir GPU aynı anda yalnızca iki büyük taramayı sığdırabilir. Sekiz mikrobatch boyunca gradientleri biriktirmek, küçük anatomik yapıları tanımlamak için gereken çözünürlüğü korurken 16'lık etkili bir batch üretir. Buradaki takas, optimizatör güncellemeleri arasındaki sürenin daha uzun olmasıdır.
Havadan nesne tespiti için bir mühendislik ekibi, cihaz başına altı görüntü ve dört biriktirme adımıyla dört GPU üzerinde eğitim alabilir. Etkili küresel batch 96 görüntüdür. Bu, her cihazı kendi bellek sınırları içinde tutarken birçok küçük araç veya bina içeren sahneler için güncellemeleri kararlı hale getirebilir. Ekipler bulut denemelerini, veri kümelerini ve eğitim süreçlerini Ultralytics Platform cloud training aracılığıyla yönetebilir.
Ultralytics YOLO ile Gradient Biriktirme#
Ultralytics model training workflow, biriktirme davranışını fiziksel batch ve nominal nbs ayarlarından türetir. batch=4 ve nbs=64 ile eğitici, birden fazla mikrobatch üzerinde optimizatör güncellemelerini erteleyerek 64'lük nominal bir batch'i hedefler.
from ultralytics import YOLO
# Load a pretrained YOLO26 detection model
model = YOLO("yolo26n.pt")
# Use a small physical batch and a larger nominal batch
results = model.train(
data="coco8.yaml",
epochs=10,
batch=4,
nbs=64,
)Üst düzey eğitici, geri yayılımı, biriktirmeyi, optimizatör adımlarını ve gradient temizlemeyi yönetir. Davranışı Ultralytics BaseTrainer reference belgesinde açıklanmıştır. Uygulamada, güvenilir şekilde sığan en büyük mikrobatch'i seçin, hedeflenen etkili batch'i hesaplayın ve biriktirme adımlarını, öğrenme oranını veya cihaz sayısını değiştirirken doğrulama sonuçlarını karşılaştırın.






