PEFT documentation
Lily: Katmanlar Arası Düşük Sıralı Bağlantılı Uyarlanma
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.Linearkatmanları 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
< 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 = 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 veA @ Bağı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ütbenin2x,3xveya4x’i kadar daha büyük birrdeğeri kullanılması önerilir. Eğitilebilir parametrelerin toplam sayısır * (total_layers / stride_A + num_B)ile ölçeklendiğinden,stride_Adeğerini büyük tutarak venum_Bdeğerini küçük tutarakrdeğerini artırmak önerilen ödünleşimdir. - stride_A (
int) — The number of consecutive layers that share one A adapter. For example, ifstride_A=4, every 4 adjacent layers share the same A adapter, resulting intotal_layers / stride_Adistinct A adapters in total. The A adapter compresses the input into a low-rank representation of sizer.stride_Ashould be no less than- Önerilen değerler:
2,3veya4(yani her 2, 3 veya 4 katmanı paylaşma).stride_Adeğerini büyük tutmak (daha az farklı A adaptörü) ve bunun yerinerdeğerini artırmak, tam tersi ödünleşimden (küçükstride_A, küçükr) daha iyi performans sağlar.stride_A=1olarak 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 vestride_A=2olarak 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.
- Önerilen değerler:
- 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ümnum_BB 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_Aile benzer bir büyüklükte ayarlanması önerilir. Önerilen değerler:total_layers / 2,total_layers / 3veyatotal_layers / 4.stride_A'de olduğu gibi, küçükrdeğerine sahip büyüknum_Byerine, büyükrdeğerine sahip küçüknum_Btercih edilmelidir. NOT: Yönlendiriciyi (router) eğitmek için en az 2 B adaptörüne (yaninum_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) venum_B=4ayarladı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 / rformülasyonunu kullanmaz; bunun yerinescalingdoğ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.0ile 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 katmanclassifier/scorerastgele 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ızcalayers_to_transformNone'den farklıysa ve katman deseni ortak katman desenlerinde yer almıyorsa kullanılır. Bu, genellikle'layers'veya'h'olarak adlandırılan modelinnn.ModuleListbileş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ğerinTrueolarak 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
< 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 (
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:
- model (PreTrainedModel) — Uyarlanacak model.
- peft_config (LilyConfig): Lily modelinin yapılandırması.