PEFT documentation

BOFT

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

BOFT

Orthogonal Butterfly (BOFT), temel modellerin ince ayarı için tasarlanmış genel bir yöntemdir. Cooley-Tukey hızlı Fourier dönüşümünden ilham alarak ince ayar paradigminin — Orthogonal Finetuning (OFT) — parametre verimliliğini artırır; büyük görünümlü dönüştürücüler, büyük dil modelleri ve metinden görüntüye difüzyon modelleri dahil olmak üzere farklı temel modellerin ince ayarında olumlu sonuçlar gösterir.

Makalenin özeti şudur:

Büyük temel modeller giderek yaygınlaşırken, bunları sıfırdan eğitmek son derece maliyetlidir. Bu nedenle, bu güçlü modelleri aşağı akış görevlerine verimli bir şekilde uyarlamak giderek daha önemli hale gelmektedir. Bu makalede, aşağı akış görevi uyarlama için ilkesel bir ince ayar paradigması olan Ortogonal İnce Ayar (OFT) üzerine çalışıyoruz. İyi bir genellenebilirlik göstermesine rağmen, OFT, ortogonal matrislerin yüksek boyutluluğu nedeniyle hâlâ oldukça büyük sayıda eğitilebilir parametre kullanmaktadır. Bunu ele almak için, OFT'yi bir bilgi iletimi perspektifinden incelemeye başlıyor ve daha iyi parametre verimliliği sağlayan birkaç temel gerekliliği belirliyoruz. Cooley-Tukey hızlı Fourier dönüşümü algoritmasının verimli bilgi iletimini nasıl mümkün kıldığından ilham alarak, kelebek yapıları kullanan verimli bir ortogonal parametrelendirme öneriyoruz. Bu parametrelendirmeyi OFT'ye uygulayarak, Orthogonal Butterfly (BOFT) olarak adlandırılan yeni bir parametre-verimli ince ayar yöntemi oluşturuyoruz. OFT'yi özel bir durum olarak kapsayarak, BOFT genel bir ortogonal ince ayar çerçevesi sunuyor. Son olarak, büyük görünümlü dönüştürücülerin, büyük dil modellerinin ve metinden görüntüye difüzyon modellerinin görünümlü ve dil alanındaki çeşitli aşağı akış görevlerine uyarlanmasına yönelik kapsamlı bir ampirik çalışma yürütüyoruz.

BOFT, standart OFT'ye kıyasla çok daha parametre verimli olmasının yanı sıra, önceden eğitilmiş bir modelin üretken yeteneklerini korumaya odaklanır. OFT gibi BOFT de, önceden eğitilmiş ağırlık matrisine ortogonal bir dönüşüm uygulayarak bir katmandaki tüm çiftli nöronlar arasındaki aynı kosinüs benzerliğini (hiperküresel enerji) korur ve bu sayede nöronlar arasındaki anlamsal ilişkilerin korunmasını sağlar.

Blok köşegenli ortogonal bir matris kullanmak yerine BOFT, ortogonal dönüşümü sparse kelebek matrislerinin (ilk olarak Cooley–Tukey FFT'de tanıtılan) bir çarpımı olarak faktörize eder. OFT'nin, girdileri yalnızca her blok içinde karıştıran blok köşegenli dönmelerinin aksine, kelebek yapısı her girdinin her çıktıyı etkileyebileceğini garanti eder ve yalnızca O(d log d) parametreyle yoğun bir bağlantı oluşturur. Bu faktörizasyon, OFT'ye kıyasla parametre sayısını (hesaplama süresinin pahasına) dramatik bir şekilde azaltırken ifade gücünü korur.

Uygulamada, BOFT her önceden eğitilmiş ağırlık matrisini kelebek yapılı ortogonal çarpanlardan oluşan bir diziyle çarparak verimli ve ifade gücü yüksek nöron rotasyonlarını mümkün kılar. Bu durum, BOFT'yu kontrollü üretim ve önceden eğitilmiş modelin konu temsilini korumanın kritik olduğu görevler için uygun hale getirirken, aynı zamanda daha düşük bellek ve hesaplama maliyetiyle daha büyük modellere ölçeklenmesini sağlar.

BOFT, bir sinir ağındaki ağırlık matrislerinin herhangi bir alt kümesine uygulanarak eğitilebilir parametre sayısını azaltmak için kullanılabilir. BOFT parametrelerinin enjekte edileceği hedef katmanlar verildiğinde, eğitilebilir parametre sayısı, ağırlık matrislerinin boyutuna göre belirlenebilir.

Karma performans değerlendirmesi genel bakış

BOFT ağırlıklarını temel modele birleştirin

LoRA'ya benzer şekilde, BOFT tarafından öğrenilen ağırlıklar, [~BOFTModel.merge_and_unload() işlevi kullanılarak önceden eğitilmiş ağırlık matrislerine entegre edilebilir. Bu işlev, adaptör ağırlıklarını temel modelle birleştirir ve bu sayede yeni birleştirilmiş modelin bağımsız bir model olarak etkin bir şekilde kullanılmasını sağlar.

Bu, eğitim sırasında ortogonal ağırlık matrisinin (yukarıdaki şemadaki R) ve önceden eğitilmiş ağırlık matrislerinin ayrı olması nedeniyle işe yarar. Ancak eğitim tamamlandığında, bu ağırlıklar aslında eşdeğer yeni bir ağırlık matrisine birleştirilebilir (çarptırılabilir).

BOFT Örnek Kullanım

BOFT yönteminin çeşitli aşağı akış görevlerine uygulanmasına dair bir örnek için lütfen aşağıdaki kılavuzlara başvurun:

BOFT ile bir modelin nasıl ince ayar yapılacağına dair aşağıdaki adım adım kılavuzlara göz atın:

Görsel sınıflandırma görevi için DinoV2 modeli için BOFT yapılandırması şu şekilde başlatılabilir:

import transformers
from transformers import AutoModelForSeq2SeqLM, BOFTConfig
from peft import BOFTConfig, get_peft_model

config = BOFTConfig(
    boft_block_size=4,
    boft_n_butterfly_factor=2,
    target_modules=["query", "value", "key", "output.dense", "mlp.fc1", "mlp.fc2"],
    boft_dropout=0.1,
    bias="boft_only",
    modules_to_save=["classifier"],
)

model = transformers.Dinov2ForImageClassification.from_pretrained(
    "facebook/dinov2-large",
    num_labels=100,
)

boft_model = get_peft_model(model, config)

API

BOFTConfig

sınıf peft.BOFTConfig

< >

( 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 = Falseboft_block_size: int = 4boft_block_num: int = 0boft_n_butterfly_factor: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneboft_dropout: float = 0.0fan_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

  • boft_block_size (int) — Farklı katmanlar boyunca BOFT matris bloğu boyutu, int olarak ifade edilir. Daha büyük blok boyutları, daha fazla eğitilebilir parametreye sahip daha yoğun güncelleme matrisleri sonuçlanır. boft_block_size değerini, katmanların girdi boyutuna (in_features) bölünebilir olacak şekilde seçin, örneğin 4, 8, 16. Ayrıca, katmanın girdi boyutuna eşit olması gerektiği için boft_block_size veya boft_block_num değerlerinden yalnızca birini belirtin; ikisini aynı anda belirtmeyin veya ikisini de 0 olarak bırakmayın, çünkü boft_block_size x boft_block_num katmanın girdi boyutuna eşit olmalıdır.
  • boft_block_num (int) — Enjekte edilen katman başına BOFT bloğu sayısı. Daha büyük boft_block_num değerleri, daha az eğitilebilir parametreye sahip daha seyreltik güncelleme matrisleri sonuçlanır. Not, boft_block_num değerini, katmanların girdi boyutuna (in_features) bölünebilir olacak şekilde seçin, örneğin 4, 8, 16. boft_block_size veya boft_block_num değerlerinden yalnızca birini belirtin; ikisini aynı anda belirtmeyin veya ikisini de 0 olarak bırakmayın, çünkü boft_block_size x boft_block_num katmanın girdi boyutuna eşit olmalıdır.
  • boft_n_butterfly_factor (int) — Farklı katmanlar boyunca kelebek faktörlerinin sayısı. boft_n_butterfly_factor=1 için BOFT, standart OFT ile aynıdır; boft_n_butterfly_factor=2 için OFT'nin etkin blok boyutu iki katına çıkar ve blok sayısı yarıya iner.
  • target_modules (Union[List[str],str]) — Adaptörün uygulanacağı modüllerin adları.
  • exclude_modules (Optional[Union[List[str], str]]) — 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.
  • boft_dropout (float) — LoRA'daki dropout katmanına benzer şekilde, eğitim sırasında OFT bloklarını kimlik olarak ayarlayarak çarpımsal dropout olasılığı.
  • 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) — Bias type for BOFT. Can be ‘none’, ‘all’ or ‘boft_only’. If ‘all’ or ‘boft_only’, the corresponding biases will be updated during training. Be aware that this means that, even when disabling the adapters, the model will not produce the same output as the base model would have without adaptation.
  • modules_to_save (List[str]) — BOFT katmanları dışında, eğitilebilir olarak ayarlanacak ve nihai checkpoint'te kaydedilecek modüllerin listesi
  • layers_to_transform (Union[List[int],int]) — Dönüştürülecek katman indeksleri. Bu argüman belirtilirse, BOFT dönüşümleri bu listede belirtilen katman indekslerine uygulanır. Tek bir tamsayı geçirilirse, BOFT 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 ve katman deseni ortak katman desenlerinde yer almıyorsa kullanılır. Bu, genellikle 'layers' veya 'h' olarak adlandırılan modelin nn.ModuleList'ini hedeflemelidir.

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

BOFTModel

sınıf peft.BOFTModel

< >

( 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 (transformers.PreTrainedModel) — Uyarlanacak model.
  • config (BOFTConfig) — BOFT 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

BOFT modeli.

Önceden eğitilmiş bir transformers modelinden BOFT ve OFT modeli oluşturur. Makale: https://huggingface.co/papers/2311.06243 https://huggingface.co/papers/2306.07280

Örnek:

>>> import transformers
>>> from peft import BOFTConfig, get_peft_model

>>> config = BOFTConfig(
...     boft_block_size=8,
...     boft_n_butterfly_factor=1,
...     target_modules=["query", "value", "key", "output.dense", "mlp.fc1", "mlp.fc2"],
...     boft_dropout=0.1,
...     bias="boft_only",
...     modules_to_save=["classifier"],
... )

>>> model = transformers.Dinov2ForImageClassification.from_pretrained(
...     "facebook/dinov2-large",
...     num_labels=100,
... )
>>> boft_model = get_peft_model(model, config)

Öznitelikler:

Update on GitHub