Transformers documentation
Gradient checkpointing
Gradient checkpointing
İleri geçiş, geriye doğru geçişte yeniden kullanılmak üzere genellikle tüm ara aktivasyonları önbelleğe alır. Ancak aktivasyonlar, parti boyutu ve dizi uzunluğuyla orantılı olarak büyür. Gradyan noktalama (gradient checkpointing) yalnızca belirli aktivasyonları saklar ve kalanları atar. Bu, geriye doğru geçişin bazı aktivasyonları ihtiyaç duyuldukça anlık olarak yeniden hesaplamasını zorunlu kılar.
Normal training: Forward: [L1]→[L2]→[L3]→[L4] (save ALL activations) Backward: ←uses cached activations everywhere Gradient checkpointing: Forward: [L1]→[L2]→[L3]→[L4] (save only at checkpoints, discard the rest) Backward: ←reaches L2, recomputes L2→L3 from scratch, uses it, discards it
Eğitim, geriye yayılımın atılan aktivasyonları yeniden hesaplaması nedeniyle genellikle daha yavaştır, ancak checkpointing aktivasyon belleğini azaltır.
Etkinleştirmek için gradient_checkpointing=True olarak ayarlayın.
Bellek kullanımını daha da azaltmak için gradient accumulation ile kullanın.
from transformers import TrainingArguments
args = TrainingArguments(
...,
gradient_checkpointing=True,
)Kısmi denetim noktası
Tam gradyan checkpointing, checkpointlenebilir her katmanı yeniden hesaplar. Çalışmanızda biraz bellek payı varsa, hız için bellek tasarrufunun bir kısmından vazgeçerek daha az katman checkpointleyin.
every_n_layers parametresini gradient_checkpointing_enable() fonksiyonuna geçirerek checkpoint aralığını seçebilirsiniz.
every_n_layers=2
Forward: input -> [L1] -> [L2] -> [L3] -> [L4] -> [L5] -> [L6]
CP keep CP keep CP keep
Backward: output <- [L6] <- [L5] <- [L4] <- [L3] <- [L2] <- [L1]
keep rerun keep rerun keep rerunevery_n_layers=2 ile ilk katman ve ondan sonraki her ikinci katman checkpoint edilir. Checkpoint edilen katmanlar, ileri geçiş sırasında aktivasyonlarını atar ve geriye doğru geçiş sırasında bunları yeniden hesaplar; diğer katmanlar ise aktivasyonlarını bellekte tutar.
model.gradient_checkpointing_enable(every_n_layers=2)Varsayılan değer olan every_n_layers=1, her katmanı kontrol noktası olarak kaydeder. Daha büyük değerler, ilk katmanı ve ardından her n katmanı kontrol noktası olarak kaydeder; diğer katmanların aktivasyonları bellekte tutulur. Örneğin, every_n_layers=2 1, 3, 5 ve devamı katmanlarını kontrol noktası olarak kaydeder. Yalnızca GradientCheckpointingLayer'dan türeyen modüller sayılır. Gradyan kontrol noktası destekleyen diğer modüller etkin kalmaya devam eder.
Trainer ile kısmi gradyan denetleme noktası kullanmak için gradient_checkpointing_kwargs içinde every_n_layers değerini ayarlayın.
from transformers import TrainingArguments
args = TrainingArguments(
...,
gradient_checkpointing=True,
gradient_checkpointing_kwargs={"every_n_layers": 4},
)
Kaydedilen aktivasyonların aktarılması
Gradient checkpointing, checkpoint'lenen her katman için bir aktivasyonu GPU'da tutar. Uzun dizi uzunluklarında bu, önemli miktarda bellek tüketebilir (yaklaşık olarak layers x sequence x hidden x bytes_per_element). Bu aktivasyonları cihazdan ana belleğe (host) kopyalama maliyetiyle ileri geçişte ve ana bellekten cihaza kopyalama maliyetiyle geriye doğru geçişte, sabitlenmiş ana bellekte (pinned host memory) tutmak için offload parametresini ayarlayın.
from transformers import TrainingArguments
args = TrainingArguments(
...,
gradient_checkpointing=True,
gradient_checkpointing_kwargs={"offload": True},
)Her iki kopya da hesaplama akışında (compute stream) çalıştığından, bu yöntem daha yavaş bir adım karşılığında bellek sağlar. Bir çalıştırma başka türlü sığmıyorsa buna başvurun, hızlandırmak için değil.
Sonraki adımlar
- Eğitim sırasında GPU'daki bellek kullanımını neyin tetiklediğini anlamak için GPU bellek kullanımı belgesini okuyun.
- Daha düşük hassasiyetli veri türlerini kullanarak belleği daha da azaltmanın ve eğitimi hızlandırmanın nasıl yapılacağını öğrenmek için Mixed precision training kılavuzuna göz atın.
- Özel füzyonlu çekirdeklerle eğitimi nasıl hızlandıracağınızı öğrenmek için Kernels rehberine bakın.