PEFT documentation

PaCA: Kısmi Bağlantı Uyarlaması

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

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 r giriş 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.Linear katmanları (kuantize edilmiş doğrusal katmanlar dahil) desteklenir.
  • PaCA, taban katmanın forward fonksiyonunu ç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_names argümanı) desteklenmez.
  • Parçalı ağırlıklarla eğitim (FSDP, DeepSpeed ZeRO-3) henüz test edilmemiştir.
  • torch.compile desteklenir: 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çin torch.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

< >

( 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ılan 8) — 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_features parametresini eğitir; bu, r rütbeli bir LoRA adaptörünün B matrisindeki parametre sayısı ile aynıdır. in_features değerini aşmamalıdır.
  • paca_alpha (int, isteğe bağlı, varsayılan 8) — Ölçekleme faktörü. Seçilen sütunların güncellemesi paca_alpha / r * delta şeklindedir. lora_alpha gibi, 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ızca nn.Linear katmanları 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ızca layers_to_transform None'den farklıysa kullanılır. Bu, genellikle 'layers' veya 'h' olarak adlandırılan modelin nn.ModuleList hedeflenmelidir.
  • random_seed (int, isteğe bağlı, varsayılan None) — 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. None ise, 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 katmanlarda r rastgele 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ı ve in_features değerinden küçük olmalıdır. Ölçekleme, verilen indeks sayısından bağımsız olarak, tüm katmanlarda bu yapılandırmanın r değeriyle paca_alpha / r şeklindedir. Hiçbir anahtarla eşleşmeyen hedef katmanlar, r rastgele seçilen sütunları kullanır.
  • init_weights (bool, isteğe bağlı, varsayılan True) — True ise, 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çin False olarak 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 katman classifier/score rastgele 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

< >

( 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 to False) — 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:

Update on GitHub