PEFT documentation

OFT

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

OFT

Controlling Text-to-Image Diffusion by Orthogonal Finetuning

Orthogonal Finetuning (OFT) ve OFTv2, metinden görüntüye difüzyon modellerini uyarlamak için geliştirilen bir yöntemdir. Ön eğitilmiş ağırlık matrislerini ortogonal matrisiyle yeniden parametrik hale getirerek ön eğitilmiş modeldeki bilgiyi korumak üzere çalışır. Parametre sayısını azaltmak için OFT, ortogonal matriste blok diyagonal bir yapı tanıtır. Yöntem, öncelikli olarak ön eğitilmiş bir modelin üretken performansını ince ayarlanmış modelde korumaya odaklanır. Sinirler arasındaki semantik bilgiyi daha iyi yakaladığı için, bir katmandaki tüm çiftli sinirler arasında aynı kosinüs benzerliğini (hiperküresel enerji) korumaya çalışır. Bu, OFT'nin konuyu korumada daha yetkin olduğu ve kontrollü üretim için daha uygun olduğu anlamına gelir (ControlNet'e benzer şekilde).

Makalenin özeti şudur:

Büyük metinden görüntüye difüzyon modelleri, metin istemlerinden fotogerçekçi görüntüler üretmede etkileyici yeteneklere sahiptir. Bu güçlü modelleri farklı aşağı akış görevlerini gerçekleştirmek için etkili bir şekilde yönlendirmenin veya kontrol etmenin nasıl yapılacağı önemli bir açık problem haline gelmektedir. Bu zorluğu ele almak için, metinden görüntüye difüzyon modellerini aşağı akış görevlerine uyarlamak üzere ilkeli bir ince ayar yöntemi olan Ortogonal İnce Ayar (OFT) sunuyoruz. Mevcut yöntemlerin aksine OFT, birim hiperküredeki nöron çift ilişkisini karakterize eden hiperküresel enerjiyi kanıtlanabilir şekilde koruyabilir. Bu özelliğin, metinden görüntüye difüzyon modellerinin anlamsal üretim yeteneğini korumak için kritik olduğunu tespit ettik. İnce ayar kararlılığını iyileştirmek için, hiperküreye ek bir yarıçap kısıtı uygulayan Kısıtlı Ortogonal İnce Ayar (COFT) yöntemini öneriyoruz. Özellikle, iki önemli metinden görüntüye ince ayar görevini ele alıyoruz: bir konunun birkaç görüntüsü ve bir metin istemi verildiğinde konuya özgü görüntüler üretmeyi hedefleyen konu odaklı üretim ve modelin ek kontrol sinyalleri almasını sağlamayı hedefleyen kontrol edilebilir üretim. Deneyler, OFT çerçevemizin üretim kalitesi ve yakınsama hızı açısından mevcut yöntemlerden üstün olduğunu göstermektedir.

OFT, nöronlar için bir ortogonal dönüşüm öğrenerek aralarındaki kosinüs benzerliğini değiştirmeden tutar ve böylece hipersferik enerjiyi korur; bu da daha önce öğrenilen bilgilerin daha az unutulmasına yol açabilir. Uygulamada bu, ortogonal bir matrisin ön eğitilmiş ağırlık matrisiyle çarpımını almayı ifade eder. Ancak parametre verimliliği için ortogonal matris, r sıralı bloklara sahip bir blok diyagonal matris olarak temsil edilir. LoRA, eğitilebilir parametre sayısını düşük sıralı yapılarla azaltırken, OFT bu sayıyı seyrek bir blok diyagonal matris yapısıyla azaltır.

Karma performans değerlendirmesi genel bakış

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

LoRA'ya benzer şekilde, OFT tarafından öğrenilen ağırlıklar, [~OFTModel.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.

OFT Örnek Kullanımı

SFT, PPO veya DPO için TRL ile kuantize edilmiş ince ayar için OFT kullanmak için aşağıdaki taslağı izleyin:

from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from trl import SFTTrainer
from peft import OFTConfig

if use_quantization:
    bnb_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_quant_type="nf4",
        bnb_4bit_compute_dtype=torch.bfloat16,
        bnb_4bit_use_double_quant=True,
        bnb_4bit_quant_storage=torch.bfloat16,
    )

model = AutoModelForCausalLM.from_pretrained(
    "model_name",
    quantization_config=bnb_config
)
tokenizer = AutoTokenizer.from_pretrained("model_name")

# Configure OFT
peft_config = OFTConfig(
    oft_block_size=32,
    use_cayley_neumann=True,
    target_modules="all-linear",
    bias="none",
    task_type="CAUSAL_LM"
)

trainer = SFTTrainer(
    model=model,
    train_dataset=ds['train'],
    peft_config=peft_config,
    processing_class=tokenizer,
    args=training_arguments,
    data_collator=collator,
)

trainer.train()

API

OFTConfig

sınıf peft.OFTConfig

< >

( 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 = 0oft_block_size: int = 32module_dropout: float = 0.0target_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falsebias: Literal['none', 'all', 'oft_only'] = 'none'exclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = Nonecoft: bool = Falseeps: float = 6e-05block_share: bool = Falseuse_cayley_neumann: bool = Truenum_cayley_neumann_terms: int = 5 )

Parametreler

  • r (int) — OFT rank, enjekte edilen katman başına OFT bloğu sayısı. Daha büyük r değerleri, daha az eğitilebilir parametreye sahip daha seyreltik güncelleme matrisleri sonucunu verir. r veya oft_block_size parametrelerinden yalnızca birini belirleyebilirsiniz, ikisini aynı anda belirleyemezsiniz; çünkü r × oft_block_size = katman boyutu. Basitlik adına, r veya oft_block_size parametrelerinden birini belirlemenize ve diğerinin çıkarılmasına izin veriyoruz. Varsayılan olarak r = 0 olarak ayarlanmıştır; daha iyi açıklık için kullanıcının oft_block_size parametresini ayarlaması önerilir.
  • oft_block_size (int) — Farklı katmanlar boyunca OFT blok boyutu. Daha büyük bir oft_block_size, daha fazla eğitilebilir parametreye sahip daha yoğun güncelleme matrisleri sonucunu verir. oft_block_size'ün katmanın giriş boyutuna (in_features) bölünebilir olmasını sağlayın, örneğin 4, 8, 16. r × oft_block_size = katman boyutu olduğu için, aynı anda hem r hem de oft_block_size'yi belirtemezsiniz; yalnızca bunlardan birini belirtebilirsiniz. Basitlik adına, r veya oft_block_size'den birini belirtmenize ve diğerinin çıkarılmasına izin veriyoruz. Varsayılan değer oft_block_size = 32 olarak ayarlanmıştır.
  • use_cayley_neumann (bool) — Cayley-Neumann parametrisasyonunun (verimli ancak yaklaşık) yoksa standart Cayley parametrisasyonunun (matris tersi nedeniyle hesaplama açısından pahalı olan kesin) kullanılacağını belirtir. Daha iyi verimlilik için True olarak ayarlamayı öneririz, ancak yaklaşık hata nedeniyle performans biraz daha düşük olabilir. İhtiyaçlarınıza göre her iki ayarı (True ve False) test edin. Varsayılan değer False'tür.
  • module_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ığı.
  • target_modules (Optional[Union[list[str], str]]) — Uyarlamanın (adapter) uygulanacağı modüllerin adları. Bu parametre belirtilirse, yalnızca belirtilen adlara sahip modüller değiştirilir. Bir dize (string) geçirildiğinde, bir regex eşleşmesi yapılır. Dizelerden oluşan bir liste 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. Bu parametre ‘all-linear’ olarak belirtilirse, çıktı katmanı hariç tüm lineer modüller seçilir. Bu parametre belirtilmezse, modüller model mimarisine göre seçilir. Mimari bilinmiyorsa bir hata oluşturulur — bu durumda, hedef modülleri manuel olarak belirtmelisiniz.
  • 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.
  • bias (str) — Bias type for OFT. Can be ‘none’, ‘all’ or ‘oft_only’. If ‘all’ or ‘oft_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.
  • 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.
  • init_weights (bool) — OFT ağırlıklarının başlatılmasının yapılıp yapılmayacağı.
  • layers_to_transform (Union[List[int], int]) — Dönüştürülecek katman indeksleri. Bir int listesi geçirilirse, adaptör bu listede belirtilen katman indekslerine uygulanır. Tek bir tamsayı geçirilirse, dönüşümler 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.
  • modules_to_save (List[str]) — Son kontrol noktasında kaydedilecek ve eğitilebilir olarak ayarlanacak, adaptör katmanları dışındaki modüllerin listesi.
  • coft (bool) — OFT'nin kısıtlı varyantının kullanılıp kullanılmayacağını belirtir, varsayılan olarak kapalıdır.
  • eps (float) — COFT'nin kontrol gücü. Dönme özgürlüğü. Yalnızca coft True olarak ayarlanırsa etkilidir.
  • block_share (bool) — OFT parametrelerinin bloklar arasında paylaşılıp paylaşılmayacağı. Varsayılan olarak False'tir.

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

check_kwargs

< >

( **kwargs )

Parametreler

  • kwargs (ek anahtar kelime argümanları, isteğe bağlı) — Çocuk sınıfının başlatılmasına iletilen ek anahtar kelime argümanları.

Yapılandırma için kwargs'ların geçerli olup olmadığını kontrol edin.

OFTModel

sınıf peft.OFTModel

< >

( 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) — Adaptör ayarlayıcı katmanlarının bağlanacağı model.
  • config (OFTConfig) — OFT 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

OFT modeli.

Önceden eğitilmiş bir modelden Orthogonal Finetuning modeli oluşturur. Yöntem https://huggingface.co/papers/2306.07280 adresinde açıklanmıştır.

Örnek:

>>> from diffusers import StableDiffusionPipeline
>>> from peft import OFTConfig, get_peft_model

>>> config_te = OFTConfig(
...     oft_block_size=32,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     module_dropout=0.0,
...     init_weights=True,
... )
>>> config_unet = OFTConfig(
...     oft_block_size=32,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     module_dropout=0.0,
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = get_peft_model(model.text_encoder, config_te)
>>> model.unet = get_peft_model(model.unet, config_unet)

Öznitelikler:

  • model (~torch.nn.Module) — Uyarlanacak model.
  • peft_config (OFTConfig): OFT modelinin yapılandırması.
Update on GitHub