PEFT documentation

Lily: Katmanlar Arası Düşük Sıralı Bağlantılı Uyarlanma

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

Lily: Katmanlar Arası Düşük Sıralı Bağlantılı Uyarlanma

Lily, adapter matrisleri için katmanlar arası ağırlık paylaşımı tanıtan parametre-verimli ince ayar tekniğidir. LoRA'daki gibi her katman için bağımsız bir AB çifti öğrenmek yerine Lily, yerel olarak paylaşılan A adapter'ları (her A, stride_A ardışık katmandan oluşan bir blok boyunca paylaşılır) ve global olarak paylaşılan B uzmanları (küçük bir num_B B adapter havuzu tüm katmanlar arasında paylaşılır) kullanır. Her ileri geçişte, hafif bir veri-bağımlı yönlendirici, o katman ve girdi için geçerli B'yi üretmek üzere B uzmanlarının softmax-ağırlıklı bir kombinasyonunu hesaplar.

Bu paylaşım, toplam adaptör matrisi sayısını 2N (standart LoRA) değerinden N / stride_A + num_B değerine düşürerek, parametre bütçesini çok daha büyük bir r rütbesi kullanmak için serbest bırakır — genellikle LoRA'da kullanacağınızın 2×–4× kadarı. Daha yüksek rütbe ve daha iyi iç bağlantılılık, ağırlık güncellemesinin ΔW = A × combined_B etkin rütbesini artırarak daha iyi uyarlama performansı sağlar.

B kombinasyonu veriye bağımlı olduğu için (router ağırlıkları çalışma zamanında girdi aktivasyonlarına bağlıdır), merge ve unmerge desteklenmez. Dağıtımınız için ağırlık birleştirme gerekiyorsa, bunun yerine LoRA gibi diğer yöntemleri düşünün.

Lily şu anda aşağıdaki ek kısıtlamalara sahiptir:

  • Yalnızca nn.Linear katmanları desteklenir.
  • Kantize katmanlar desteklenmez.

Bu kısıtlamalar kullanım senaryonuza uygun değilse, bunun yerine başka yöntemleri düşünün.

Makalenin özeti şudur:

Düşük rütbeli uyarlama (LoRA), önceden eğitilmiş ağırlıklar W için düşük rütbeli adaptörler A ve B aracılığıyla ağırlık güncellemeleri ΔW = AB öğrenen, yaygın olarak kullanılan parametre-verimli ince ayar (PEFT) yöntemidir. LoRA donanım verimliliğini garanti etse de, düşük rütbeli ağırlık güncellemeleri uyarlama performansını sınırlar. Bu makalede, katmanlar arası düşük rütbeli iç içe geçmiş uyarlama (Lily) adını verdiğimiz, yerel olarak paylaşılan A ve küresel olarak paylaşılan B uzmanlarına sahip iç içe geçmiş bir çerçeve tanıtan yeni bir PEFT yöntemi öneriyoruz. Bu yapı, katman başına tekrarlayan AB çiftlerini ortadan kaldırarak eşit veya daha az parametre ile daha yüksek rütbeli ΔW'ye olanak tanır. İfade gücünü artırmak için A-B bağlantılarını belirlemek için veriye bağımlı yönlendiriciler kullanıyoruz; bu sayede B uzmanlarının aynı davranışa yakınsaması engelleniyor ve alanlar arası temsil gücü iyileştiriliyor. Modallıklar, mimariler ve model boyutları üzerindeki deneyler, Lily'in üstün performansını ve verimliliğini göstermektedir.

Karma performans değerlendirmesi genel bakış

API

LilyConfig

sınıf peft.LilyConfig

< >

( 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 = 32stride_A: int = 1num_B: int = 2scaling: float = 1.0target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Noneinit_weights: bool = True )

Parametreler

  • r (int) — Lily’nin rütbesi. Her adaptörün iç gizli boyutunu ve A @ B ağırlık güncellemesinin rütbesini belirler. Lily’de adaptör sayısı genellikle LoRA’dan daha az olduğundan, her adaptörün daha fazla kapasite taşıması gerekir; bu nedenle LoRA’da normalde kullanacağınız rütbenin 2x, 3x veya 4x’i kadar daha büyük bir r değeri kullanılması önerilir. Eğitilebilir parametrelerin toplam sayısı r * (total_layers / stride_A + num_B) ile ölçeklendiğinden, stride_A değerini büyük tutarak ve num_B değerini küçük tutarak r değerini artırmak önerilen ödünleşimdir.
  • stride_A (int) — The number of consecutive layers that share one A adapter. For example, if stride_A=4, every 4 adjacent layers share the same A adapter, resulting in total_layers / stride_A distinct A adapters in total. The A adapter compresses the input into a low-rank representation of size r. stride_A should be no less than
    1. Önerilen değerler: 2, 3 veya 4 (yani her 2, 3 veya 4 katmanı paylaşma). stride_A değerini büyük tutmak (daha az farklı A adaptörü) ve bunun yerine r değerini artırmak, tam tersi ödünleşimden (küçük stride_A, küçük r) daha iyi performans sağlar. stride_A=1 olarak ayarlamak, her katmanın kendi A adaptörüne sahip olduğu anlamına gelir. NOT: A paylaşımı, her hedefin içinde gerçekleşir (aynı hedef son ekine sahip katmanlar). Örneğin, ['q_proj', 'v_proj'] hedef_modules değerleri varsa ve stride_A=2 olarak ayarlarsanız, her 2 komşu q_proj katmanı bir A adaptörü paylaşır ve her 2 komşu v_proj katmanı başka bir A adaptörü paylaşır; ancak q_proj ve v_proj katmanları farklı son eklerine sahip oldukları için birbirleriyle A adaptörü paylaşmaz.
  • num_B (int) — Paylaşılan B adaptörlerinin sayısı. A adaptörlerinin aksine (katmanlara göre gruplanan), tüm B adaptörleri tüm katmanlar arasında küresel olarak paylaşılmaktadır. Her ileri geçişte, bir yönlendirici (router), tüm num_B B adaptörlerinin ağırlıklı bir kombinasyonunu (softmax-normalize edilmiş ağırlıklar kullanarak) hesaplayarak tek bir birleşik B adaptörü oluşturur; bu adaptör de düşük rütbeli temsilin (low-rank representation) orijinal boyuta geri yansıtılmasını sağlar. num_B'ün, total_layers / stride_A ile benzer bir büyüklükte ayarlanması önerilir. Önerilen değerler: total_layers / 2, total_layers / 3 veya total_layers / 4. stride_A'de olduğu gibi, küçük r değerine sahip büyük num_B yerine, büyük r değerine sahip küçük num_B tercih edilmelidir. NOT: Yönlendiriciyi (router) eğitmek için en az 2 B adaptörüne (yani num_B >= 2) ihtiyaç vardır, çünkü yönlendirici B adaptörlerinin ağırlıklı kombinasyonunu hesaplamayı öğrenir. NOT: B paylaşımı her hedefin (aynı hedef son ekine sahip katmanlar) içinde gerçekleşir. Örneğin, ['q_proj', 'v_proj'] hedef_modülleri (target_modules) ve num_B=4 ayarladıysanız, tüm q_proj katmanları arasında paylaşılan 4 B adaptörü ve tüm v_proj katmanları arasında paylaşılan başka 4 B adaptörü olacaktır; ancak q_proj ve v_proj katmanları farklı son eklerine sahip oldukları için birbirleriyle B adaptörü paylaşmaz.
  • target_modules (Union[List[str], str], isteğe bağlı) — Lily'nin uygulanacağı modüllerin adları. Modül adı dizelerinin bir listesi (ör. ['q_proj', 'v_proj']) veya bir regex deseni (ör. '.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$') olabilir. Belirtilmezse, Lily tüm desteklenen lineer katmanlara uygulanır.
  • scaling (float) — Donmuş ağırlığın ileri geçişine eklenmeden önce birleşik adaptör çıktısına (scaling * A @ combined_B) uygulanan skaler çarpan. LoRA'nın aksine Lily, alpha / r formülasyonunu kullanmaz; bunun yerine scaling doğrudan bir çarpan olarak kullanılır. Bu tasarım, log ölçeğinde değerler üzerinde tarama yapmayı (ör. 0.01, 0.1, 1.0, 10.0) kolaylaştırır. Optimal değer görevden göreve değişir ve bir hiperparametre olarak ele alınmalıdır. 1.0 ile başlamanızı öneririz.
  • modules_to_save (List[str], isteğe bağlı) — Lily katmanları dışında, eğitilebilir olarak ayarlanacak ve nihai checkpoint'te kaydedilecek 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 olmalı ve kaydedilmelidir.
  • 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ı) — 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 deseni adı, yalnızca layers_to_transform None'den farklıysa ve katman deseni ortak katman desenlerinde yer almıyorsa kullanılır. Bu, genellikle 'layers' veya 'h' olarak adlandırılan modelin nn.ModuleList bileşenini hedeflemelidir.
  • init_weights (bool) — Lily adaptör ağırlıklarının varsayılan başlatma şeması kullanılarak başlatılıp başlatılmayacağını belirtir: A matrisleri Kaiming uniform ile, B matrisleri ise sıfır ile başlatılır; bu sayede eğitim başlangıcında adaptör çıktısı sıfır olur ve ön eğitilmiş modele müdahale etmez. Belirli bir nedeniniz olmadıkça bu değerin True olarak bırakılması şiddetle önerilir.

Bu, bir LilyModel yapılandırmasını depolamak için kullanılan yapılandırma sınıfıdır.

LilyModel

sınıf peft.LilyModel

< >

( 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 (torch.nn.Module) — Uyarlanacak model.
  • config (LilyConfig) — Lily modelinin yapılandırması.
  • adapter_name (str) — Adaptörün adı, varsayılan olarak "default"'tır.

Dönüş değeri

torch.nn.Module

Lily PEFT modeli.

Önceden eğitilmiş bir transformers modelinden Low-Rank Interconnected Adaptation Across Layers (Lily) modeli oluşturur.

Yöntem, https://arxiv.org/abs/2407.09946 adresinde ayrıntılı olarak açıklanmıştır.

Öznitelikler:

Update on GitHub