PEFT documentation

VeRA: Vektör Tabanlı Rastgele Matris 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

VeRA: Vektör Tabanlı Rastgele Matris Uyarlaması

VeRA, LoRA'ya benzer ancak benzer veya hatta daha iyi performans vaat ederken çok daha az ek parametre gerektiren parametre-verimli ince ayar tekniğidir. Bu nedenle, özellikle parametre bütçesinin çok sınırlı olduğu durumlarda, örneğin çok büyük modellere ölçeklendirirken, son derece faydalıdır. Eğitilebilir parametre sayısındaki azaltma, tüm katmanlar arasında aynı düşük-rang matrislerin paylaşılması ve katman başına yalnızca iki ek vektörün eğitilmesi yoluyla sağlanır.

VeRA'nın çalışma mantığı

LoRA, her uyarlanan katman için iki küçük, düşük rütbeli matris öğrenerek dondurulmuş bir temel modeli günceller. Rütbe, bu matrislerin iç boyutudur ve adaptörün ne kadar kapasiteye sahip olduğunu kontrol eder. LoRA'da, r değerini artırmak veya daha fazla katmanı uyarlama, her uyarlanan katmanın kendi düşük rütbeli matris çiftini öğrenmesi nedeniyle eğitilebilir parametre sayısını hızla artırır.

VeRA, düşük rütbeli uyarlama fikrini korur ancak hangi parametrelerin eğitileceğini değiştirir. Her katman için ayrı düşük rütbeli matrisler öğrenmek yerine VeRA, katmanlar arasında paylaşılan, dondurulmuş ve rastgele başlatılmış bir düşük rütbeli matris çifti olan A ve B kullanır. Her uyarlanmış katman, paylaşılan matrisleri yeniden ölçekleyerek katmana özgü bir güncelleme üretmek için yalnızca vera_lambda_d ve vera_lambda_b olmak üzere iki ölçekleme vektörü öğrenir. vera_lambda_d boyutu r olduğundan, VeRA’nın eğitilebilir parametre sayısı hâlâ r ile ve uyarlanan katman sayısı ile artar. Ancak, büyük A ve B matrisleri her katman için ayrı ayrı öğrenilmek yerine paylaşıldığı ve dondurulduğu için, bu artış LoRA’ya kıyasla çok daha yavaş gerçekleşir.

Bu nedenle VeRA, LoRA'dan daha az eğitilebilir parametre kullanabilir. Makaledeki basitleştirilmiş parametre sayımına göre LoRA, 2 * L_tuned * d_model * r ile ölçeklenir; burada L_tuned uyarlanan katman sayısı, d_model model boyutu ve r rütbedir. VeRA ise büyük düşük rütbeli matrislerin paylaşımlı ve dondurulmuş olması, yalnızca daha küçük katman başına vektörlerin eğitilmesi nedeniyle L_tuned * (d_model + r) ile ölçeklenir.

Adaptör parametrelerini kaydederken, VeraConfig üzerinde save_projection=False ayarlayarak düşük rütbeli matrislerin depolanmasından kaçınılabilir. Bu durumda, bu matrisler projection_prng_key argümanındaki sabit rastgele tohum temelinde yeniden oluşturulur. Bu, kontrol noktasının boyutunu azaltır ancak tüm cihazlarda ve PyTorch’ün tüm gelecekteki sürümlerinde yeniden üretilebilirliği garanti edemeyiz. Yeniden üretilebilirliği sağlamak istiyorsanız, save_projection=True olarak ayarlayın (bu varsayılandır).

Uyarlama katmanlarının farklı şekillerini işlemek için VeRA, her boyut için gerekli en büyük boyutla paylaşılan A ve B matrislerini başlatır. İleri geçiş sırasında, belirli bir katman için A ve B alt matrisleri bu paylaşılan matrislerden dilimlenir ve makalede belirtildiği gibi kullanılır. Örneğin, (100, 20) ve (80, 50) şekillerindeki iki doğrusal katmanı uyarlama işlemi, sırasıyla (rank, 50) ve (100, rank) şekillerinde A ve B matrisleri oluşturur. Ardından, (100, 20) şeklindeki bir katmanı uyarlama için (rank, 20) ve (100, rank) şekillerindeki A ve B alt matrisleri çıkarılır.

VeRA şu anda aşağıdaki kısıta sahiptir:

  • Yalnızca nn.Linear katmanları desteklenir.

Makalenin özeti şudur:

Düşük rütbeli uyarlama (LoRA), büyük dil modellerini ince ayar yaparken eğitilebilir parametre sayısını azaltan popüler bir yöntemdir; ancak daha da büyük modellere ölçeklenirken veya sayısız kullanıcıya veya göreve özel uyarlanmış model dağıtılırken hâlâ ciddi depolama zorluklarıyla karşı karşıyadır. Bu çalışmada, LoRA'ya kıyasla eğitilebilir parametre sayısını önemli ölçüde azaltan ancak aynı performansı koruyan Vektör Tabanlı Rastgele Matris Uyarlama (VeRA) yöntemini sunuyoruz. Bu, tüm katmanlar arasında paylaşılan tek bir düşük rütbeli matris çifti kullanarak ve bunun yerine küçük ölçekleme vektörleri öğrenerek sağlanır. Etkinliğini GLUE ve E2E kıyaslamalarında, görüntü sınıflandırma görevlerinde gösteriyor ve 7B ve 13B dil modellerinin talimat ayarlamasında (instruction-tuning) kullanımını sergiliyoruz.

VeRA'nın ne zaman kullanılacağı

VeRA şu durumlarda iyi bir seçimdir:

  • LoRA ile karşılaştırılabilir performansı korurken eğitilebilir parametre sayısını en aza indirmek istiyorsunuz.
  • Birçok görev özel adaptörü depolamak veya dağıtmak durumunda olduğunuzda, daha küçük adaptör kontrol noktaları depolama gereksinimlerini azaltır.
  • Sıkı bellek veya parametre bütçeleri altında çok büyük dil modelleri ince ayarı yapıyorsunuz.

VeRA'nın kullanılmaması gereken durumlar

VeRA şu durumlarda en iyi seçenek olmayabilir:

  • Her uyarlama katmanı için bağımsız düşük r'li matrisler gerektirir; bu da öğrenilen adaptör parametrelerinde daha fazla esneklik sağlar.
  • Modeliniz, VeRA şu anda yalnızca lineer katmanları desteklediğinden, nn.Linear dışında modül türlerinin uyarlanmasını gerektirir.
  • Modeliniz, giriş ve çıktı boyutları arasında büyük farklılıklar bulunan uyarlanmış doğrusal katmanlar içerir. VeRA, tüm uyarlanmış katmanlar arasında tek bir projeksiyon matrisi çiftini paylaştığı için, bu matrisler en büyük şekle göre boyutlandırılmalıdır. Katman şekillerinde büyük bir çeşitlilik bulunan modeller (örneğin, transformer yukarı ve aşağı projeksiyon katmanları) bu nedenle paylaşılan projeksiyon matrislerinin aşırı tahsis edilmesini gerektirebilir ve bu durum, VeRA'nın parametre verimliliği avantajının bir kısmını azaltabilir.

Karma performans değerlendirmesi genel bakış

API

VeRAConfig

sınıf peft.VeraConfig

< >

( 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 = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truevera_dropout: float = 0.0d_initial: float = 0.1fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

Parametreler

  • r (int, isteğe bağlı, varsayılan 256) — VeRA parametre boyutu (“rank”). VeRA, LoRA’dan çok daha az parametre kullandığı için (Tablo 1’e bakın) burada LoRA rank değerlerinden daha yüksek değerler seçin.
  • target_modules (Union[List[str], str]) — Vera'nın uygulanacağı modüllerin adları. Yalnızca lineer katmanlar desteklenir.
  • projection_prng_key (int) — Vera PRNG başlatma anahtarı. Yeni modeller için veya bu projeksiyonları içermeyen bir kontrol noktası yüklenirken vera_A ve vera_B'yi başlatmak için kullanılır. Varsayılan değeri 0'dır.
  • save_projection (bool) — Durum sözlüğünde (state dict) katman başına lambda_b / lambda_d ağırlıklarıyla birlikte vera_A / vera_B projeksiyonlarının kaydedilip kaydedilmeyeceğini belirtir. Bu, kontrol noktasının (checkpoint) boyutunu artırır ancak kontrol noktasının tüm sistem yapılandırmalarında yeniden yüklenebileceğini garanti eder. Varsayılan değer True'dür.
  • vera_dropout (float) — Vera katmanları için dropout olasılığı.
  • d_initial (float, isteğe bağlı, varsayılan 0.1) — VeRA parametrelerinin başlatılmasında kullanılan vera_lambda_d vektörü için başlangıç başlatma değeri. Küçük değerler önerilir (<=0.1) (kağıttaki Tablo 6c'ye bakın).
  • fan_in_fan_out (bool) — Değiştirilecek katman ağırlıkları (fan_in, fan_out) biçiminde saklıyorsa bunu True olarak ayarlayın. Örneğin, gpt-2 ağırlıkları (fan_in, fan_out) biçiminde saklayan Conv1D kullanır ve bu nedenle bu değer True olarak ayarlanmalıdır.
  • bias (str) — Vera için sapma türü. ‘none’, ‘all’ veya ‘vera_only’ olabilir. ‘all’ veya ‘vera_only’ seçilirse, ilgili sapmalar eğitim sırasında güncellenir. Bu, adaptörler devre dışı bırakılsa bile, modelin adaptasyon olmadan temel modelin üreteceğiyle aynı çıktıyı üretmeyeceği anlamına gelir.
  • modules_to_save (List[str]) — Vera katmanları dışında, eğitilebilir olarak ayarlanacak ve nihai checkpoint'te kaydedilecek modüllerin listesi.
  • init_weights (bool) — Vera katmanlarının ağırlıklarının varsayılan başlatma yöntemiyle başlatılıp başlatılmayacağını belirtir. Bu ayarı, ne yaptığınızı tam olarak biliyorsanız değiştirin.
  • layers_to_transform (Union[List[int],int]) — Dönüştürülecek katman indeksleri. Bu argüman belirtilirse, Vera dönüşümleri bu listede belirtilen katman indekslerine uygulanır. Tek bir tamsayı geçirilirse, Vera dönüşümleri bu indeksteki katmana uygulanır.
  • layers_pattern (Optional[Union[List[str], str]]) — 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'ini hedeflemelidir.

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

Makale: https://huggingface.co/papers/2310.11454.

VeRAModel

sınıf peft.VeraModel

< >

( 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 (VeraConfig) — Vera 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

Vera modeli.

Önceden eğitilmiş bir transformers modelinden Vektör tabanlı Rastgele Matris Adaptasyonu (Vera) modeli oluşturur.

Örnek:

>>> from transformers import AutoModelForCausalLM
>>> from peft import VeraConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)

Öznitelikler:

Update on GitHub