PEFT documentation
PaCA: Kısmi Bağlantı Uyarlaması
PaCA: Kısmi Bağlantı Uyarlaması
PaCA (ICLR 2025), eğitim hızını ve aktivasyon belleğini hedefleyen bir PEFT yöntemidir. Her hedeflenmiş önceden eğitilmiş ağırlığın r rastgele seçilen giriş sütununu (“kısmi bağlantılar”) ince ayarlar. Tek eğitilebilir parametreler, bu sütunların güncellemeleridir; LoRA'nın aksine PaCA ek düşük rütbeli matrisler eklemez.
LoRA gibi yöntemler, her ön eğitilmiş katman yanında küçük bir düşük rütbeli dal çalıştırır. Dal az miktarda FLOP gerektirir, ancak ön eğitilmiş katmanla sıralı olarak çalıştırılır ve geriye yayılım (backward pass) için girdi aktivasyonunun kendi kopyasını tutar. PaCA her ikisini de önler:
- Katman başına tek GEMM. Uyarlanan sütunlar, ön eğitilmiş ağırlığın matmul işleminden hemen önce bu ağırlığa yazılır ve hemen sonra geri yüklenir; böylece ileri ve geri yayılım, dondurulmuş taban katmanla birebir aynı şekilde tek bir matmul çalıştırır.
- Kısmi aktivasyonlar. Uyarlanan sütunların gradyanı yalnızca eşleşen
rgiriş kanalına bağlı olduğundan, tam giriş yerine geriye yayılım adımı için yalnızca bu kanallar saklanır.
Sonuç ağırlıkları açısından bir PaCA adaptörü, A matrisi sabit bir sütun seçici olan, r rütbeli bir LoRA adaptörüne eşdeğerdir: W' = W + delta @ S, burada S r sütunu seçer. Bu nedenle, örneğin bir LoRA çıkarım yığınıyla sunulması için, convert_to_lora() aracılığıyla kayıpsız bir şekilde r rütbeli bir LoRA adaptörüne dönüştürülebilir.
PaCA'nın ne zaman kullanılacağı:
- LoRA düzeyinde doğruluk istiyorsunuz ancak daha hızlı ince ayar adımları ve daha düşük aktivasyon belleği gerekiyor, örneğin aynı GPU üzerinde daha uzun dizileri veya daha büyük partileri sığdırmak için.
- Tam olarak temel ağırlıklara birleşen bir adaptör istiyorsunuz (güncelleme düz bir sütun güncellemesidir).
Mevcut kısıtlamalar:
- Yalnızca
nn.Linearkatmanları (kuantize edilmiş doğrusal katmanlar dahil) desteklenir. - PaCA, taban katmanın
forwardfonksiyonunu çağırmak yerine matmul işlemini kendisi yürütür; bu nedenle taban katmana kaydedilen forward hook'ları çağrılmaz (bir uyarı basılır). Hook'ları PaCA katmanına kaydedin. - Karışık adaptör toplamları (
adapter_namesargümanı) desteklenmez. - Parçalı ağırlıklarla eğitim (FSDP, DeepSpeed ZeRO-3) henüz test edilmemiştir.
torch.compiledesteklenir: derleme sırasında sütun değiştirme, matmul ve geri yükleme işlemleri opak özel işlemler (torch.ops.peft.paca_linear_forward/_backward) olarak çalışır, bu nedenle derleyici temel ağırlıkları kopyalamaz. Bunun içintorch.library.custom_op(PyTorch >= 2.4) gereklidir; aksi takdirde acil (eager) uygulama izlenir.paca_alpha / r, sütun güncellemesini ölçekler ve bu nedenle etkili öğrenme hızının bir çarpanı olarak görev yapar.- Çıkarım için adaptörü birleştirin (
merge_and_unload()); birleştirilmemiş forward, her çağrıda sütunları hâlâ içeri ve dışarı değiştirir.
Kullanım
from transformers import AutoModelForCausalLM
from peft import PacaConfig, get_peft_model
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B")
config = PacaConfig(r=16, paca_alpha=16, target_modules="all-linear", random_seed=0)
model = get_peft_model(model, config)
model.print_trainable_parameters()Varsayılan olarak, her hedeflenen katman r rastgele seçilen sütunu ince ayar yapar; makalede, bu, sütunları ağırlık normuna veya birikmiş gradyanlara göre seçmekle aynı performansı göstermiştir. Sütunları kendiniz seçmek için, örneğin başka bir seçim stratejisini denemek veya katman başına farklı bir sütun sayısı kullanmak için paca_indices_pattern parametresini iletin. Anahtarları, LoRA’daki rank_pattern’de olduğu gibi katman adları veya düzenli ifadelerdir:
config = PacaConfig(
r=16,
paca_alpha=16,
target_modules=["q_proj", "v_proj"],
paca_indices_pattern={"layers.0.self_attn.q_proj": [0, 2, 4, 6], "layers.1.self_attn.v_proj": list(range(32))},
)Bir anahtarla eşleşen katmanlar, verilen sütunları ince ayar yapar; hedeflenen diğer tüm katmanlar r rastgele sütun seçer. Ölçekleme, her katmanda yapılandırmanın r değeriyle paca_alpha / r şeklindedir, bu nedenle paca_alpha tüm katmanlar için aynı anlama gelir.
Makalenin özeti şudur:
Daha önceki parametre-verimli ince ayar (PEFT) algoritmaları, tüm modeli eğitmek yerine yalnızca birkaç ek adaptör parametresi eğiterek büyük sinir ağı modellerinin ince ayarındaki bellek kullanımını ve hesaplama maliyetlerini azaltır. Ancak PEFT kaynaklı hesaplama maliyetlerindeki azalma, eğitim süresinde bir azalmaya dönüşmeyebilir; adaptör katmanlarının hesaplama maliyetleri önceden eğitilmiş katmanlardan çok daha düşük olsa da, bu iki katman türünün GPU'larda sıralı olarak işlendiği ve bunun önemli bir gecikme yüküne yol açtığı iyi bilinmektedir. LoRA ve türevleri, çıkarım sırasında düşük rütbeli adaptör matrislerini önceden eğitilmiş ağırlıklarla birleştirerek bu gecikme yükünden kaçınır. Ancak, düşük rütbeli adaptör matrisleri eğitim süresince sürekli güncellenirken önceden eğitilmiş ağırlıkların donmuş kalması gerektiğinden, bu katmanlar eğitim sırasında birleştirilemez. Ayrıca, LoRA ve türevleri aktivasyon belleğini azaltmaz, çünkü ilk düşük rütbeli adaptör matrisi, ağırlık gradyanlarını hesaplamak için önceden eğitilmiş ağırlıklara giren aktivasyonları gerektirir. Bu sorunu hafifletmek için, modelde adaptör katmanları eklemek yerine önceden eğitilmiş ağırlıklar içinde rastgele seçilen kısmi bağlantıları ince ayarlayan Kısmi Bağlantı Adaptasyonu'nu (PaCA) öneriyoruz. PaCA, adaptör ve önceden eğitilmiş katmanların sıralı işlenmesinden kaynaklanan zaman yükünü ortadan kaldırarak eğitim hızını artırmakla kalmaz, aynı zamanda gradyan hesaplama için tam aktivasyonlar yerine yalnızca kısmi aktivasyonların saklanması gerektiğinden aktivasyon belleğini de azaltır. LoRA'ya kıyasla PaCA, MMLU veri setinde ince ayar ve Oasst1 veri setinde talimat ayarı gibi çeşitli ince ayar senaryolarında karşılaştırılabilir doğruluğu korurken eğitim süresini %22 ve toplam bellek kullanımını %16 azaltır. PaCA ayrıca kuantizasyonla birleştirilebilir, bu da LLaMA3.1-70B gibi büyük modellerin ince ayarını mümkün kılar. Ayrıca PaCA, LoRA'ya kıyasla hem NVIDIA A100 GPU hem de INTEL Gaudi2 HPU üzerinde %23 daha uzun dizilerle eğitim yapmayı ve %16 daha yüksek verimlilik sağlamayı mümkün kılar.
Karma performans değerlendirmesi genel bakış
API
PacaConfig
sınıf peft.PacaConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 8paca_alpha: int = 8target_modules: list[str] | str | None = Noneexclude_modules: list[str] | str | None = Nonelayers_to_transform: list[int] | int | None = Nonelayers_pattern: list[str] | str | None = Nonerandom_seed: int | None = Nonepaca_indices_pattern: dict | None = <factory>init_weights: bool = Truemodules_to_save: list[str] | None = None )
Parametreler
- r (
int, isteğe bağlı, varsayılan8) — Her hedeflenen katmanda ince ayarı yapılan giriş sütunlarının (kısmi bağlantılar) sayısı.(out_features, in_features)biçiminde bir ağırlık için PaCA,r * out_featuresparametresini eğitir; bu,rrütbeli bir LoRA adaptörününBmatrisindeki parametre sayısı ile aynıdır.in_featuresdeğerini aşmamalıdır. - paca_alpha (
int, isteğe bağlı, varsayılan8) — Ölçekleme faktörü. Seçilen sütunların güncellemesipaca_alpha / r * deltaşeklindedir.lora_alphagibi, bu da adaptörün etkili öğrenme hızının çarpanı olarak görev yapar. - target_modules (
Union[list[str], str], isteğe bağlı) — PaCA ile değiştirilecek modül adlarının listesi veya modül adlarının regex ifadesi. Örneğin,['q_proj', 'v_proj']veya'.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'. Bu değer'all-linear'olarak belirtilirse, çıktı katmanı hariç tüm lineer modüller seçilir. Yalnızcann.Linearkatmanları desteklenir. - exclude_modules (
Union[list[str], str], isteğe bağlı) — Uyarlamanın (adapter) uygulanmaması istenen modüllerin adları. Bir dize geçirildiğinde, bir regex eşleşmesi yapılır. Bir dize listesi geçirildiğinde, tam bir eşleşme yapılır veya modül adının, geçirilen dizelerden herhangi biriyle sonlanıp sonlanmadığı kontrol edilir. - layers_to_transform (
Union[list[int], int], isteğe bağlı) — Dönüştürülecek katman indeksleri. Bu argüman belirtilirse, PEFT yalnızca bu listede belirtilen katman indekslerini dönüştürür. Tek bir tamsayı geçirilirse, PEFT yalnızca bu indeksteki katmanı dönüştürür. - layers_pattern (
Optional[Union[list[str], str]], isteğe bağlı) — Katman desen adı, yalnızcalayers_to_transformNone'den farklıysa kullanılır. Bu, genellikle'layers'veya'h'olarak adlandırılan modelinnn.ModuleListhedeflenmelidir. - random_seed (
int, isteğe bağlı, varsayılanNone) — Kısmi bağlantıları seçmek için kullanılan tohum. Her katman, bu tohumdan ve katman adından türetilen farklı bir seçim kullanır.Noneise, küresel torch rastgele sayı üreteci kullanılır. Seçilen indeksler her zaman adaptör kontrol noktasında saklanır, bu nedenle eğitilmiş bir adaptörü yüklemek için tohum gerekmez. - paca_indices_pattern (
dict, isteğe bağlı) — Eşleşen katmanlardarrastgele seçilen sütunlar yerine ince ayarı yapılan giriş sütun indekslerine, katman adlarından veya regexp ifadelerinden isteğe bağlı bir eşleme, örneğin{'^model.layers.0.self_attn.q_proj': [0, 2, 4]}. Bu, katman başına farklı sayıda sütuna da olanak tanır. Bir katmanın indeksleri benzersiz olmalı vein_featuresdeğerinden küçük olmalıdır. Ölçekleme, verilen indeks sayısından bağımsız olarak, tüm katmanlarda bu yapılandırmanınrdeğeriylepaca_alpha / rşeklindedir. Hiçbir anahtarla eşleşmeyen hedef katmanlar,rrastgele seçilen sütunları kullanır. - init_weights (
bool, isteğe bağlı, varsayılanTrue) —Trueise, seçilen sütunların güncellemesi sıfıra başlatılır; yani uyarlanmış model, başlatma anında taban modelle aynıdır. Rastgele değerlerle başlatmak içinFalseolarak ayarlayın; bu yalnızca test amaçlıdır. - modules_to_save (
list[str], isteğe bağlı) — Son checkpoint'te eğitilebilir olarak ayarlanacak ve kaydedilecek, PaCA katmanları dışındaki modüllerin listesi. Örneğin, Sınıflandırma (Sequence Classification) veya Token Sınıflandırma görevlerinde, son katmanclassifier/scorerastgele başlatıldığı için eğitilebilir ve kaydedilebilir olmalıdır.
Bu, bir PacaModel yapılandırmasını depolamak için kullanılan yapılandırma sınıfıdır.
PaCA (Partial Connection Adaptation, https://huggingface.co/papers/2503.01905), her hedeflenmiş önceden eğitilmiş ağırlığın r rastgele seçilen giriş sütununu (kısmi bağlantılar) ince ayar yapar. Eğitilebilir tek parametreler, bu sütunların güncellemeleridir; LoRA'nın aksine PaCA ek düşük rütbeli matrisler eklemez. Matris çarpımının hemen öncesinde, uyarlanmış sütunlar önceden eğitilmiş ağırlığa yerleştirilir ve hemen sonrasında geri yüklenir; böylece ileri ve geri yayılımın her biri tek bir GEMM çalıştırır ve geri yayılım için bellekte yalnızca r seçilen giriş kanalları tutulur.
PacaModel
sınıf peft.PacaModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
Parametreler
- model (PreTrainedModel) — Uyarlanacak model.
- config (PacaConfig) — PaCA modelinin yapılandırması.
- adapter_name (
str) — Adaptörün adı, varsayılan olarak"default"'tır. - low_cpu_mem_usage (
bool,optional, defaults toFalse) — Meta cihazda boş adaptör ağırlıkları oluşturur. Yükleme sürecini hızlandırmak için faydalıdır.
Dönüş değeri
torch.nn.Module
PaCA modeli.
Önceden eğitilmiş bir modelden Partial Connection Adaptation (PaCA) modeli oluşturur. Yöntem, https://huggingface.co/papers/2503.01905 adresinde açıklanmıştır.
Örnek:
>>> from transformers import AutoModelForCausalLM
>>> from peft import PacaConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = PacaConfig(r=16, paca_alpha=16, target_modules="all-linear")
>>> model = get_peft_model(base_model, config)Öznitelikler:
- model (PreTrainedModel) — Uyarlanacak model.
- peft_config (PacaConfig): PaCA modelinin yapılandırması.