PEFT documentation

Hafıza Verimli Eğitim

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Hafıza Verimli Eğitim

🤗 PEFT, ince ayarı parametre açısından verimli hale getirir, ancak bellek açısından otomatik olarak verimli hale getirmez. Bu genel bakış, eğitim belleğini azaltmaya yönelik ipuçlarını ve ayrıntılı kılavuzlara bağlantıları derler.

Bellek kullanımınızı azaltmak için daha küçük bir temel model, daha küçük bir parti boyutu veya daha kısa bir dizi uzunluğu seçmenin temellerini her zaman göz önünde bulundurun.

Eğitim belleği genel bakış

Eğitim belleğinin dağılımını, olası karşı önlemler hakkında akıl yürütebilmek için inceleyelim. Örnek olarak Adam optimizatörüyle eğitilmiş büyük bir dil modeli kullanacağız. Tam ince ayar (full fine-tuning) yapılırken belleği işgal eden konumlar şunlardır:

  1. temel model parametreleri: bellek tüketimi, seçilen dtype değerine büyük ölçüde bağlıdır. Parametre başına bit sayısı ne kadar azsa (float16 için 16), bu kadar az bellek yer kaplar. float16 (parametre başına 16 bit/2 bayt) ile bir 1B model yaklaşık olarak 1e9 × 2 byte = 1.863 GiB bellek kullanır.
  2. tüm eğitilebilir temel model parametreleri ×3, gradyanlar için (1×) ve Adam optimizör durumu için (2×), dolayısıyla 5.59GB bellek
  3. katmanlar arasındaki ara aktivasyonlar için bellek, bunlar tahmin etmesi zordur ancak büyük ölçüde kullanılan hesaplama veri türüne ve dizi uzunluğuna / parti boyutuna bağlıdır.

Daha küçük bir temel model kullanmak veya daha küçük bir hesaplama dtype'i kullanmak, tüm noktaları azaltır; daha kısa diziler veya daha küçük topluluklar kullanmak ise ağırlıklı olarak gradyanları ve aktivasyon belleğini etkiler. PEFT yöntemlerini uygulamak, eğitilebilir parametre sayısını azaltır ve bu nedenle hem gradyanları hem de optimizör durumunu önemli ölçüde azaltarak çok fazla bellek tasarrufu sağlar.

Doğru yöntemi seçme

Her PEFT yöntemi eşit derecede inşa edilmemiştir ve bazı formülasyonlar, bellek verimli bir şekilde oluşturulması açısından daha kolaydır. Bellek bütçeniz kısıtlıysa, PEFT yöntem karşılaştırma paketine göz atıp en yüksek hızlandırıcı bellek kullanımına göre filtrelemek mantıklı olacaktır. Ortalama hızlandırıcı bellek kullanımı yöntemler arasında oldukça eşit olabilir, ancak her yöntem aktivasyonlar ve dizi uzunluğu ile eşit derecede ölçeklenmez; bazı yöntemler diğerlerine göre bellek sıçramalarına daha yatkındır.

Dil modelleme başlıkları veya gömme katmanları gibi büyük katmanları hedefleyerek belirli jetonları ince ayar yapmak için eğitilebilir jeton kullanmayı düşünün.

Kantizasyon

Kantizasyon, temel modelin bellek tüketimini azaltmanın en iyi yollarından biridir ve kullanılan kantizasyona bağlı olarak aktivasyon belleğini de azaltır. PEFT yöntemleri toplam parametre sayısının yalnızca küçük bir kısmını oluşturacağından, PEFT varsayılan olarak temel modelden daha yüksek bir hassasiyet kullanır. Bu durum, adaptörlerin kantizasyon yöntemlerinden kaynaklanan bazı kalite kayıplarını azaltmasına da olanak tanıyabilir. PEFT kantizasyon kılavuzunu okuyun.

Derleme

Eğittiğimiz modeller, her biri yeni bir sonuç üreten ve dolayısıyla bellek alanı gerektiren matris çarpımları, toplamlar ve atamalar gibi işlemlerden oluşur. Bu ara sonuçlara gerek duyulmuyorsa bu işlemleri birleştirebilir (fuse) ve bellek tasarrufu sağlayabiliriz. Bu, torch.compile'in sizin için yapabileceği birçok optimizasyondan yalnızca biridir; bu nedenle PEFT torch.compile kılavuzu'na göz atın.

Gradient Checkpointing

Hafızayı hesaplama ile takas edebilir; katmanlar arasında yalnızca her n'inci gradyanı kaydedip kalanını anlık olarak hesaplayabilirsiniz. Daha fazla bilgi için Transformers'ın gradient checkpointing belgesine göz atın.

Diffusers veya Transformers kullanılmadığında, kullandığınız eğitim çerçevesine bağlı olarak kendi gradyan kontrol noktalama mantığınızı uygulamanız gerekebilir.

Parçalı NLL kaybı

Dil modellerini (veya sınıflandırma görevlerini) eğitirken NLLLoss kullanımı çok yaygındır. batch × sequence × vocabulary boyutunda bir matris ayırırsınız. Özellikle uzun diziler veya sözlüklerle bu durum hızla pahalı hale gelebilir.

TRL kullanırken Liger kernel entegrasyonunu ya da Chunked NLLLoss kullanabilirsiniz. İkincisi, maksimum bellek tüketimini sabit tutmak için diziyi 256 boyutunda parçalara böler.

NLL vs. Chunked NLL comparison

Varsayılan parça boyutu ortamınız için en uygun değilse, parça boyutunu nasıl ayarlayacağınız hakkında daha fazla bilgi için orijinal TRL PR'ına bakın.

Update on GitHub