Transformers documentation
GPU bellek kullanımı
GPU bellek kullanımı
16'lık bir batch boyutu ile karma hassasiyette 4B parametreli bir model eğitmek, yaklaşık 85GB GPU belleği gerektirir. GPU belleğinin ne tarafından işgal edildiğini ve eğitim sırasında gerçekleşen hesaplama işlemlerini anlamak, bellek kullanımınızı nerede azaltabileceğinizi belirlemenize yardımcı olur.
┌─────────────────────────── TENSORS ──────────────────────────────────┐ │ │ │ MODEL WEIGHTS ████████████████████████ 6 bytes/param │ │ (mixed precision) ├── fp16 copy (2B) — forward/backward pass │ │ └── fp32 copy (4B) — stable weight updates │ │ │ │ OPTIMIZER STATES ████████████████████████████████ 8 bytes/param │ │ (Adam) ├── fp32 momentum (4B) │ │ └── fp32 variance (4B) │ │ ↳ quantized Adam (bitsandbytes) → 2 bytes/param │ │ │ │ GRADIENTS ████████████████ 4 bytes/param (fp32) │ │ └── computed in backward pass, per parameter │ │ │ │ ACTIVATIONS ████ varies — batch × seq_len × depth × hidden │ │ (forward cache) └── cached for backward; can OOM even if model │ │ fits (long seqs / large batches) │ │ bf16/fp16 if using mixed precision │ │ │ │ TEMPORARY TENSORS ▓ short-lived (softmax, matmul scratch) │ │ └── peak spikes can cause OOM │ │ │ │ OTHER OVERHEAD ▒ beam search caches, large embedding tables │ └──────────────────────────────────────────────────────────────────────┘
GPU belleği iki tür öğe barındırır: saklanan tensörler ve bunları işleyen işlemler.
Tensörler
Eğitim, depolanması gereken birçok tensör türü gerektirir ve üretir.
Model ağırlıkları GPU üzerinde saklanır. Karmaşıklık hassasiyetli eğitimde, ağırlıkların iki kopyası gerekir: ileri/geri geçiş için fp16'da bir kopya ve kararlı ağırlık güncellemeleri için "ana kopya" olarak fp32'de bir kopya. Bu, parametre başına 6 bayta denk gelir.
Adam gibi optimizer durumları, her parametre için momentum ve varyans olmak üzere iki ek tensor saklar ve her ikisi de fp32'dir. Bu, parametre başına ek 8 bayt demektir.
Parametre başına 2 bayta sıkıştırmak için bitsandbytes kütüphanesindeki Adam'ın kuantize edilmiş sürümü gibi farklı bir optimizör kullanabilirsiniz.
Gradient tensörleri, geri yayılım sırasında her parametre için hesaplanır. Bu, her parametre için 4 bayt olacak şekilde fp32 olarak tutulur.
İleri yönlü aktivasyonlar, ileri geçiş sırasında hesaplanır ve gradyanların hesaplanması için geriye doğru geçişte önbelleğe alınır. Bu aktivasyonların boyutu, parti boyutuna, dizi uzunluğuna, model derinliğine ve gizli katman boyutuna göre değişir. Bu nedenle, modelin kendisi sığsa bile parti boyutu veya dizi uzunluğu GPU belleğini doldurabilir.
softmax ve matris çarpımları gibi işlemler geçici tensörler oluşturur ve her işlem sonrasında bunları serbest bırakır. Tek bir işlemin tepe noktası çok yoğunsa, bellek yetersizliği sorununa yol açan geçici bir sıçrama yaratabilir.
Bazı özellikler kendi ek yüklerini getirir. Örneğin, beam search birden fazla çıktıyı korur ve büyük sözlükler için gömme tabloları çok büyük olabilir.
Ops
Üç ana eğitim işlemi türü vardır.
Matris çarpımları (matmul), lineer katmanlar, QKV projeksiyonları, dikkat çıktı projeksiyonları ve FFN katmanlarını kapsayan ana operasyon türüdür. Ana bellek tüketenler, dizi uzunluğunun karesiyle büyüyen dikkat skor matrisleridir. Uzun dizilerin bu kadar pahalı olmasının nedeni budur ve tam matrisin bellekte somutlaştırılmasını önlemek için farklı dikkat arka uçları mevcuttur.
Softmax ve layer norm gibi azaltma işlemleri, tam bir tensörü okur, bir boyut boyunca istatistik hesaplar ve ardından uygulamak için tensörü tekrar okur. Bu, işlem başına belleğe birden fazla kez erişim gerektirir.
Aktivasyonlar ve dropout gibi eleman bazlı işlemler, bir fonksiyonu her elemana bağımsız olarak uygular ve bellek kullanımları tensör boyutuyla orantılıdır.
Sonraki adımlar
- GPU belleği dolmadan daha büyük bir etkili batch boyutunda eğitim simüle etmenin nasıl yapılacağını öğrenmek için Gradient accumulation rehberine bakın.
- Bazı ara aktivasyonları saklayarak bellek kullanımını nasıl azaltacağınızı öğrenmek için Gradient checkpointing kılavuzuna bakın.
- Daha düşük hassasiyetli veri türlerini kullanarak belleği 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.