PEFT documentation
OFT
OFT

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
< 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 = 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ükrdeğerleri, daha az eğitilebilir parametreye sahip daha seyreltik güncelleme matrisleri sonucunu verir.rveyaoft_block_sizeparametrelerinden yalnızca birini belirleyebilirsiniz, ikisini aynı anda belirleyemezsiniz; çünkür×oft_block_size= katman boyutu. Basitlik adına,rveyaoft_block_sizeparametrelerinden birini belirlemenize ve diğerinin çıkarılmasına izin veriyoruz. Varsayılan olarakr = 0olarak ayarlanmıştır; daha iyi açıklık için kullanıcınınoft_block_sizeparametresini ayarlaması önerilir. - oft_block_size (
int) — Farklı katmanlar boyunca OFT blok boyutu. Daha büyük biroft_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 hemrhem deoft_block_size'yi belirtemezsiniz; yalnızca bunlardan birini belirtebilirsiniz. Basitlik adına,rveyaoft_block_size'den birini belirtmenize ve diğerinin çıkarılmasına izin veriyoruz. Varsayılan değeroft_block_size = 32olarak 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
Trueolarak ayarlamayı öneririz, ancak yaklaşık hata nedeniyle performans biraz daha düşük olabilir. İhtiyaçlarınıza göre her iki ayarı (TrueveFalse) test edin. Varsayılan değerFalse'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ızcalayers_to_transformNone'den farklıysa kullanılır. Bu, genellikle'layers'veya'h'olarak adlandırılan modelinnn.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ızcacoftTrue olarak ayarlanırsa etkilidir. - block_share (
bool) — OFT parametrelerinin bloklar arasında paylaşılıp paylaşılmayacağı. Varsayılan olarakFalse'tir.
Bu, bir OFTModel yapılandırmasını depolamak için kullanılan yapılandırma sınıfıdır.
check_kwargs
< source >( **kwargs )
Yapılandırma için kwargs'ların geçerli olup olmadığını kontrol edin.
OFTModel
sınıf peft.OFTModel
< 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) — 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 toFalse) — 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ı.