Gradient Accumulation
Gradyan biriktirmenin sınırlı GPU belleğinde daha büyük etkin yığın boyutlarını nasıl mümkün kıldığını, pratik PyTorch ve Ultralytics YOLO eğitim rehberliğiyle öğren.
Gradyan biriktirme, tek bir model ağırlığı güncellemesi yapmadan önce mikro gruplar olarak adlandırılan birkaç küçük gruptan gelen gradyanları toplayan bir eğitim tekniğidir. Kullanılabilir GPU belleği tam grubu aynı anda barındıramadığında, daha büyük bir batch boyutuyla eğitim yapmayı yaklaşık olarak taklit eder. Bu sayede model mimarisini değiştirmeden veya girdi çözünürlüğünü azaltmadan, bellek açısından yoğun gradyan inişi uygulanabilir hale gelir.
Gradyan Biriktirme Nasıl Çalışır#
Normal eğitim sırasında her grup üç ana adımı izler: kaybı hesaplamak, gradyanları hesaplamak için geri yayılımı kullanmak ve optimize edicinin model ağırlıklarını güncellemesini sağlamak. Ardından bir sonraki gruptan önce gradyanlar temizlenir.
Gradyan biriktirme, optimize edici güncellemesini geciktirir. Her mikro grup ileri ve geri yayılım gerçekleştirir, ancak gradyanları bellekte kalır ve sonraki mikro gruplardan gelen gradyanlara eklenir. Bu davranış, her parametrenin gradyan alanındaki değerleri biriktiren PyTorch backward işleminin doğal bir sonucudur.
Yapılandırılan biriktirme adımı sayısından sonra:
- Optimize edici model ağırlıklarını günceller.
- Gradyanlar, Optimizer.zero_grad gibi bir işlem kullanılarak sıfırlanır.
- Yeni bir biriktirme penceresi başlar.
Etkin batch boyutu şu şekildedir:
microbatch size x accumulation steps x number of training devices
Örneğin, 8 adım boyunca biriktirilen 4 görüntülük bir mikro grup, tek bir GPU üzerinde yaklaşık 32 görüntülük bir grup gibi davranır. Dört GPU ile küresel etkin batch boyutu 128 olur.
Bellek, Hız ve Öğrenme Üzerindeki Etkiler#
Gradyan biriktirme, ağdan aynı anda yalnızca bir mikro grup geçirildiği için aktivasyonlar için gereken tepe bellek miktarını azaltır. Model parametreleri, gradyanlar veya optimize edici durumu tarafından kullanılan belleği önemli ölçüde azaltmaz.
Ayrıca genellikle eğitimi hızlandırmaz. Sekiz mikro grubun işlenmesi hâlâ sekiz ileri ve geri yayılım geçişi gerektirir ve daha küçük gruplar GPU'yu daha verimsiz kullanabilir. Temel fayda, istenen etkin batch boyutunu sınırlı belleğe sığdırmaktır. İkincil bir fayda, dağıtık eğitim sırasında ortaya çıkabilir; burada uygulamalar, DistributedDataParallel no_sync gibi özellikleri kullanarak biriktirme penceresinin sonuna kadar gradyanları senkronize etmekten kaçınabilir.
Elle yapılan bir uygulama, ortaya çıkan gradyanın toplam yerine ortalamayı temsil etmesi için genellikle her mikro grubun kaybını biriktirme adımı sayısına böler. Üst düzey eğiticiler normalleştirmeyi otomatik olarak gerçekleştirebilir; bu nedenle ek ölçekleme uygulamak hatalı güncellemelere yol açabilir.
Biriktirme, gerçek büyük bir grubu yaklaşık olarak taklit edebilir, ancak sonuçlar her zaman aynı olmaz. Batch normalizasyonu istatistikleri tek tek mikro gruplardan hesaplanırken stokastik işlemler ve kayan nokta işlem sıralaması da farklılıklara neden olabilir. Bu nedenle öğrenme oranının otomatik olarak ölçeklendirilmek yerine doğrulanması gerekebilir.
İlgili Teknikler ve Temel Farklar#
Gradyan biriktirme, diğer bellek veya kararlılık teknikleriyle sık sık karıştırılır:
- Gradyan kontrol noktası oluşturma, geri yayılım sırasında seçilen ileri geçiş işlemlerini yeniden hesaplayarak aktivasyon belleğini azaltır. PyTorch aktivasyon kontrol noktası oluşturma belgeleri, hesaplama ile bellek arasındaki bu dengeyi açıklar. Biriktirme ise büyük bir grubu daha küçük mikro gruplara böler.
- Karma hassasiyet, seçilen işlemleri daha düşük hassiyetli veri türleriyle depolar veya hesaplar. Belleği azaltabilir ve aktarım hızını artırabilir; biriktirme ise optimize edicinin ne sıklıkta güncelleme yaptığını değiştirir. Bu teknikler, doğru otomatik karma hassasiyet biriktirme iş akışı izlenerek birlikte kullanılabilir.
- Gradyan kırpma, olağan dışı büyüklükteki güncellemelerden kaynaklanan kararsızlığı azaltmak için gradyan büyüklüğünü sınırlar. Daha büyük bir etkin batch oluşturmaz. Biriktirmeyle birlikte kullanıldığında kırpma normalde gradyan tamamen biriktirildikten sonra, clip_grad_norm gibi bir işlem kullanılarak gerçekleştirilmelidir.
Gerçek Dünya Uygulamaları#
Yüksek çözünürlüklü tıbbi görüntü segmentasyonunda 12 GB GPU, aynı anda yalnızca iki büyük taramayı sığdırabilir. Gradyanların sekiz mikro grup boyunca biriktirilmesi, küçük anatomik yapıları tanımlamak için gereken çözünürlüğü korurken 16'lık etkin bir batch oluşturur. Bunun karşılığında optimize edici güncellemeleri arasındaki süre uzar.
Havadan nesne algılama 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 yapabilir. Etkin küresel batch 96 görüntüdür. Bu, her cihazı bellek sınırı içinde tutarken çok sayıda küçük araç veya bina içeren sahnelerdeki güncellemeleri kararlı hâle getirebilir. Ekipler bulut deneylerini, veri kümelerini ve eğitim çalıştırmalarını Ultralytics Platform bulut eğitimi üzerinden yönetebilir.
Ultralytics YOLO ile Gradyan Biriktirme#
Ultralytics model eğitim iş akışı, biriktirme davranışını fiziksel batch ve nominal nbs ayarlarından türetir. batch=4 ve nbs=64 ile eğitici, optimize edici güncellemelerini birden fazla mikro grup boyunca erteleyerek nominal batch boyutunu 64 olarak 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, optimize edici adımlarını ve gradyanların temizlenmesini yönetir. Davranışı Ultralytics BaseTrainer başvurusunda belgelenmiştir. Uygulamada güvenilir şekilde sığan en büyük mikro grubu seç, hedeflenen etkin batch boyutunu hesapla 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.









