PEFT documentation
LoRA
LoRA
LoRA, PEFT yöntemleri arasında en popüler olanlardan biridir ve PEFT ile yeni başlıyorsanız iyi bir başlangıç noktasıdır. Başlangıçta büyük dil modelleri için geliştirilmiştir ancak verimliliği ve etkinliği sayesinde difüzyon modelleri için son derece popüler bir eğitim yöntemidir.
Düşük Sıralı Uyarlaması (LoRA), büyük bir matrisi iki daha küçük düşük sıralı matrise ayıran bir PEFT yöntemidir. Bu, ince ayar gerektiren parametre sayısını önemli ölçüde azaltır.
Makalenin özeti şudur:
Doğal dil işlemenin önemli bir paradigması, genel alan verilerinde büyük ölçekli ön eğitim ve belirli görevlere veya alanlara uyarlamadan oluşur. Daha büyük modelleri ön eğittikçe, tüm model parametrelerini yeniden eğiten tam ince ayar giderek daha az uygulanabilir hale gelir. GPT-3 175B'yi bir örnek olarak ele alalım — her biri 175B parametreye sahip ince ayarlı modelin bağımsız örneklerini dağıtmak son derece pahalıdır. Düşük Sıra Uyarlaması (Low-Rank Adaptation) veya LoRA'yı öneriyoruz; bu yöntem, ön eğitilmiş model ağırlıklarını dondurur ve Transformer mimarisinin her katmanına eğitilebilir sıra ayrıştırma matrisleri enjekte ederek, aşağı akış görevleri için eğitilebilir parametre sayısını büyük ölçüde azaltır. Adam ile ince ayar yapılmış GPT-3 175B ile karşılaştırıldığında, LoRA eğitilebilir parametre sayısını 10.000 kat, GPU bellek gereksinimini ise 3 kat azaltabilir. LoRA, RoBERTa, DeBERTa, GPT-2 ve GPT-3'te model kalitesi açısından ince ayar kadar iyi veya daha iyi performans gösterir; bu durum, daha az eğitilebilir parametreye sahip olmasına, daha yüksek eğitim verimliliğine ve adaptörlerin aksine ek çıkarım gecikmesi olmamasına rağmen geçerlidir. Ayrıca dil modeli uyarlamasında sıra eksikliğine (rank-deficiency) dair ampirik bir inceleme sunarak LoRA'nın etkinliğine ışık tutuyoruz. LoRA'nın PyTorch modelleriyle entegrasyonunu kolaylaştıran bir paket yayınlıyoruz ve RoBERTa, DeBERTa ve GPT-2 için uygulamalarımızı ve model kontrol noktalarımızı bu https URL adresinde sunuyoruz.
LoRA, ağırlık güncellemelerini düşük rütbeli ayrıştırma yoluyla iki daha küçük matrisle (bunlara güncelleme matrisleri) denir) temsil eder. Bu yeni matrisler, genel parametre sayısını düşük tutarken yeni verilere uyum sağlamak için eğitilebilir. Orijinal ağırlık matrisi donmuş kalır ve ek güncelleme almaz. Sonuçları üretmek için orijinal ve ek uyarlama ağırlıkları birleştirilir. Çıkarım gecikmesini ortadan kaldırmak için adaptör ağırlıklarını taban modelle birleştirebilirsiniz.

Bu yaklaşımın bir dizi avantajı vardır:
- LoRA, eğitilebilir parametre sayısını önemli ölçüde azaltarak ince ayarı daha verimli hale getirir.
- Orijinal önceden eğitilmiş ağırlıklar dondurulur; bu, üzerine çeşitli aşağı akış görevleri için birden fazla hafif ve taşınabilir LoRA modeli inşa edebileceğiniz anlamına gelir.
- LoRA, diğer parametre-verimli yöntemlerle ortogonaldir ve bunların çoğuyla birleştirilebilir.
- LoRA kullanılarak ince ayar yapılan modellerin performansı, tamamen ince ayar yapılan modellerin performansıyla karşılaştırılabilir düzeydedir.
İlke olarak, LoRA, eğitilebilir parametre sayısını azaltmak için bir sinir ağının ağırlık matrislerinin herhangi bir alt kümesine uygulanabilir. Ancak basitlik ve ek parametre verimliliği için LoRA, Transformer modellerinde genellikle yalnızca dikkat bloklarına uygulanır - diğer katmanları da hedef almak faydalı olabilir. LoRA modelindeki eğitilebilir parametrelerin sonuçlanan sayısı, büyük ölçüde r derecesi ve orijinal ağırlık matrisinin şekli tarafından belirlenen güncelleme matrislerinin boyutuna bağlıdır.
Düşük rütbeli matrisleri farklı kullanım senaryolarını göz önünde bulundurarak başlatabilirsiniz - görev farkındalığı (CorDA, EVA, Astra), daha hızlı yakınsama (PiSSA), kuantizasyonun azaltılması (LoftQ) - bunlardan sadece birkaçı. Farklı başlatma yöntemleri hakkında aşağıdaki bölümden okuyabilirsiniz. Varsayılan başlatma, LoRA'nın bir no-op (etkisiz işlem) olması ve mevcut modelle çok fazla çelişmeden yeni davranışları kademeli olarak öğrenmesidir.
Kullanım
Düşük rütbeli güncelleme matrislerinin boyutu, rütbe veya r tarafından belirlenir. Daha yüksek bir rütbe, modelin eğitilecek daha fazla parametreye sahip olduğu anlamına gelir, ancak aynı zamanda modelin daha fazla öğrenme kapasitesine sahip olduğu anlamına da gelir. Aşağıdaki örnekte, dikkat bloklarının query ve value matrislerini hedef alacaksınız. Ayarlanması gereken diğer önemli parametreler lora_alpha (ölçekleme faktörü), bias (none, all veya yalnızca LoRA bias parametrelerinin mi eğitileceği) ve modules_to_save (LoRA katmanları dışında eğitilecek ve kaydedilecek modüllerdir). Tüm bu parametreler - ve daha fazlası - LoraConfig içinde bulunur.
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=16,
lora_alpha=16,
target_modules=["query", "value"],
lora_dropout=0.1,
bias="none",
modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()Karma performans değerlendirmesi genel bakış
Başlatma
LoRA ağırlıklarının başlatılması, LoraConfig içindeki init_lora_weights parametresi tarafından kontrol edilir. Varsayılan olarak PEFT, LoRA ağırlıklarını A ağırlığı için Kaiming-uniform, B ağırlığı için sıfırlarla başlatır; bu da bir kimlik dönüşümüne (aynı uygulama ile aynı) yol açar.
transformers.Conv1D katmanları için, örneğin GPT-2 projeksiyonları, ağırlıklar nn.Linear yerleşimi yerine (in_features, out_features) olarak saklandığından fan_in_fan_out=True kullanılmalıdır. Desteklenen ağırlık tabanlı başlatıcılar, ayrıştırma için Linear yerleşimini kullanır ve taban ağırlıkları güncellenirken saklanan yerleşimi geri yükler. LoRA-GA’nın "stable" ölçeklemesi de saklama yerleşiminden bağımsız olarak çıktı boyutunu kullanır.
init_lora_weights="gaussian" parametresini de geçmek mümkündür. İsminden de anlaşılacağı üzere bu, A ağırlığını Gauss dağılımı ile, B ağırlığını ise sıfırlarla başlatır (bu, Diffusers'ın LoRA ağırlıklarını başlatma yöntemidir).
from peft import LoraConfig
config = LoraConfig(init_lora_weights="gaussian", ...)init_lora_weights=False olarak ayarlanacak bir seçenek de mevcuttur; bu, hata ayıklama ve test için faydalıdır. Bu seçeneği yalnızca bu durumda kullanmalısınız. Bu seçeneği seçtiğinizde, LoRA ağırlıkları, bir kimlik dönüşümüne sonuç vermeyecek şekilde başlatılır.
from peft import LoraConfig
config = LoraConfig(init_lora_weights=False, ...)Normalized Low-Rank Adaptation (NoRA), LoRA aşağı yönlü projeksiyon matrislerini normalize eder. PEFT, bu normalizasyonu yalnızca LoraConfig içindeki init_lora_weights="nora" parametresiyle başlatma sırasında uygular: rastgele başlatılan LoRA A ağırlığının sütunlarını normalize eder ve LoRA B ağırlığını sıfır olarak başlatır. Her iki matris de eğitilebilir kalır ve temel ağırlıklar değiştirilmez.
Doğrusal bir katman için adaptör ağırlık güncellemesi $\Delta W = sBA$ şeklindedir, burada şeklinde (r, in_features), şeklinde (out_features, r), ve LoRA ölçekleme faktörüdür. NoRA, LoRA doğrusal katmanı tarafından oluşturulan rastgele A ağırlığından başlar ve her sütunu rank boyutu boyunca normalize eder:
B sıfır olduğu için, eğitimden önce adaptör ağırlık güncellemesi sıfırdır. bias="none" ve lora_bias=False kullanıldığında, adaptör başlangıçta temel model çıktısını korur. NoRA, kalibrasyon veri seti veya ağırlık ayrıştırması gerektirmez.
NoRA için önerilen ayar,
lora_alpha'nınr'ye eşit olmasıdır (1:1 alpha/rank oranı), örneğinr=8, lora_alpha=8. Varsayılanuse_rslora=Falseile bu, ölçekleme çarpanını 1 olarak tutar; rank-stabilized LoRA etkinleştirildiğinde bu değerlora_alpha / sqrt(r)olarak değişir.
Aşağıdaki örnek, küçük bir PyTorch modelindeki iki doğrusal katmana NoRA uygular:
from torch import nn
from peft import LoraConfig, get_peft_model
model = nn.Sequential(
nn.Linear(32, 32),
nn.ReLU(),
nn.Linear(32, 16),
)
config = LoraConfig(
r=8,
lora_alpha=8,
target_modules=["0", "2"],
init_lora_weights="nora",
bias="none",
lora_bias=False,
use_rslora=False,
)
model = get_peft_model(model, config)
model.print_healthcheck()Bir Transformers modeli için, target_modules parametresini, modelde bu adlar mevcut olduğunda ["q_proj", "v_proj"] gibi uyarlamak istediğiniz doğrusal katmanların adlarına ayarlayın.
NoRA, mevcut LoRA yapılandırma, eğitim, kaydetme ve yükleme API'lerini kullandığı için ayrı bir NoraConfig veya NoraModel sınıfı yoktur. Ortak yapılandırma ve model API'leri için LoraConfig ve LoraModel belgelerine bakın.
NoRA, torch.nn.Linear hedef modüllerini veya target_parameters ile doğrudan geçirilen nn.Parameter özniteliklerini destekler. Gömme (embedding) ve konvolüsyon katmanları gibi yapılar için desteklenmez.
PiSSA, LoRA adaptörünü başlatmak için birincil tek değerleri ve tek vektörleri kullanır. Bu basit değişiklik, PiSSA'nın LoRA'dan daha hızlı yakınsamasına ve nihayetinde üstün bir performans elde etmesine olanak tanır. Ayrıca PiSSA, QLoRA'ya kıyasla kuantizasyon hatasını azaltarak ek iyileştirmeler sağlar.
Başlatma yöntemini, ön eğitilmiş model üzerinde SVD çalıştırmak için birkaç dakika sürebilen “pissa” olarak yapılandırın:
from peft import LoraConfig
config = LoraConfig(init_lora_weights="pissa", ...)Alternatif olarak, yalnızca birkaç saniye süren hızlı SVD'yi çalıştırın. İterasyon sayısı, hata ile hesaplama süresi arasındaki ödünleşimi belirler:
lora_config = LoraConfig(init_lora_weights="pissa_niter_[number of iters]", ...)PiSSA'yı kullanmaya ilişkin ayrıntılı talimatlar için lütfen bu talimatları izleyin.
MiCA (Minor Component Adaptation), PiSSA'nın bir tamamlayıcısıdır: ana tekil bileşenlerden başlatmak yerine MiCA, ikincil bileşenleri kullanır. Somut olarak, W = U Σ V^T için MiCA, B = U[:, -r:] (en küçük tekil değerlerle ilişkili r sol tekil vektör) ve A = 0 olarak ayarlar. Eğitim sırasında yalnızca A güncellenir; B dondurulur. Temel sezgi, ikincil tekil yönlerin önceden eğitilmiş görev tarafından büyük ölçüde kullanılmadığı ve bu nedenle önceden eğitilmiş yetenekleri korurken yeni bilgi enjekte etmek için daha “plastik” bir alt uzay sunduğudur.
Başlangıçta A == 0 olduğu için adaptör katkısı B · A == 0 olur ve model çıktısı 0. adımda tam olarak korunur — taban ağırlık üzerinde kalan hata çıkarılması gerekmez (PiSSA'nın aksine). Sadece A eğitilebilir olduğundan, r ile eşleşen eğitilebilir parametre sayısı LoRA'nın yaklaşık yarısı kadardır.
from peft import LoraConfig
config = LoraConfig(init_lora_weights="mica", r=16, target_modules=["q_proj", "v_proj"], ...)MiCA şu anda nn.Linear ve nn.Embedding hedef modüllerini destekler. Seçilen rank, lineer katmanlar için r <= min(in_features, out_features) ve gömme katmanları için r <= min(num_embeddings, embedding_dim) koşulunu sağlamalıdır. Ayrıntılı kullanım için bu talimatları inceleyin.
MiCA, esas olarak devam eden ön eğitim / alan uyumlu ön eğitim için tasarlanmıştır. Bu senaryoda, SVD başlatma ve MiCA eğitimi için talimat veya sohbet ayarlı bir kontrol noktası yerine temel modeli kullanın. Eğitimden sonra, adaptörü temel model ağırlıklarına birleştirin ve sonraki talimat/sohbet ayarlaması için başlangıç noktası olarak elde edilen uyarlanmış temel modeli kullanın.
CorDA, öğrenilecek aşağı akış görevinin bağlamına (talimat önizlemeli mod, IPM) veya korunacak dünya bilgisine (bilgi korumalı mod, KPM) yönelik ağırlık ayrıştırmasından, görev farkındalıklı LoRA adaptörleri oluşturur. KPM, ince ayar görevlerinde LoRA'dan daha iyi performans elde etmenin yanı sıra, önceden eğitilmiş dünya bilgisinin felaketçi unutmasını da azaltır. Önceden eğitilmiş bilginin korunması bir endişe konusu değilse, yakınsamayı daha da hızlandırabildiği ve ince ayar performansını artırabildiği için IPM tercih edilir.
Başlatma yöntemini “corda” olarak yapılandırmalı ve kovaryans matrislerini toplamak için IPM veya KPM modunu ve veri setini belirtmelisiniz.
@torch.no_grad()
def run_model():
# Assume `model` and `dataset` is in context...
model.eval()
for batch in dataset:
model(**batch)
corda_config = CordaConfig(
corda_method="kpm",
)
lora_config = LoraConfig(
init_lora_weights="corda",
corda_config=corda_config,
)
preprocess_corda(model, lora_config, run_model=run_model)
peft_model = get_peft_model(model, lora_config)CorDA'yı kullanmaya ilişkin ayrıntılı talimatlar için lütfen bu talimatları izleyin.
Astra, modül çıktı aktivasyonlarının kovaryans matrisinin kuyruk özvektörlerinden, aşağı akış görevine ait küçük bir kalibrasyon veri setinden tahmin edilen görev farkındalıklı LoRA adaptörleri oluşturur. Ön eğitilmiş ağırlık, adaptörü başlatmak için kuyruk özvektörlerinin span ettiği alt uzaya projekte edilir; bu, güncellemeyi aşağı akış görevi için en ilgili aktivasyon alt uzayına kısıtlar ve yakınsamayı hızlandırır.
Başlatma yöntemini “astra” olarak yapılandırmalı, target_modules değerini açıkça belirlemeli ve kovaryans matrislerini toplamak için kalibrasyon veri setini sağlamalısınız.
@torch.no_grad()
def run_model():
# Assume `model` and `dataset` is in context...
model.eval()
for batch in dataset:
model(**batch)
from peft.tuners.lora import AstraConfig, preprocess_astra
astra_config = AstraConfig()
lora_config = LoraConfig(
init_lora_weights="astra",
target_modules=["q_proj", "v_proj"],
astra_config=astra_config,
)
preprocess_astra(model, lora_config, run_model=run_model)
peft_model = get_peft_model(model, lora_config)Astra'yı kullanmaya dair ayrıntılı talimatlar için lütfen bu talimatları izleyin.
OLoRA, LoRA adaptörlerini başlatmak için QR ayrıştırmayı kullanır. OLoRA, modelin temel ağırlıklarını QR ayrıştırmalarının bir kat sayısıyla değiştirir; yani herhangi bir eğitim yapılmadan önce ağırlıkları değiştirir. Bu yaklaşım kararlılığı önemli ölçüde artırır, yakınsama hızını hızlandırır ve nihayetinde üstün performans elde eder.
OLoRA kullanmak için tek bir ek seçenek geçmeniz yeterlidir:
from peft import LoraConfig
config = LoraConfig(init_lora_weights="olora", ...)Daha gelişmiş kullanım için lütfen belgelerimize başvurun.
EVA, her katmanın giriş aktivasyonları üzerinde SVD gerçekleştirir ve LoRA ağırlıklarını başlatmak için sağ tekil vektörleri kullanır. Bu nedenle veri odaklı bir başlatma şemasıdır. Ayrıca EVA, SVD analizinden türetilen “açıklanan varyans oranı” metriğine dayanarak katmanlar arasında rütbeleri uyumlu bir şekilde dağıtır.
init_lora_weights="eva" ayarını yapıp LoraConfig içinde EvaConfig tanımlayarak EVA'yı kullanabilirsiniz:
from peft import LoraConfig, EvaConfig
peft_config = LoraConfig(
init_lora_weights = "eva",
eva_config = EvaConfig(rho = 2.0),
...
)rho parametresi (≥ 1.0), ne kadar yeniden dağıtımın izin verildiğini belirler. rho=1.0 ve r=16 olduğunda, LoRA adaptörleri tam olarak 16 ranga kısıtlanır ve herhangi bir yeniden dağıtımın gerçekleşmesi engellenir. Yeniden dağıtım içeren EVA için önerilen değer 2.0'dır; bu, bir katman için izin verilen maksimum rankın 2r olduğu anlamına gelir.
EVA başlatma işleminin, çok daha hızlı olduğu için bir hızlandırıcıda (ör. CUDA GPU, Intel XPU) yapılması önerilir. EVA için kullanılabilir bellek miktarını optimize etmek için get_peft_model() içinde low_cpu_mem_usage bayrağını kullanabilirsiniz:
peft_model = get_peft_model(model, peft_config, low_cpu_mem_usage=True)Ardından, EVA ağırlıklarını başlatmak için initialize_lora_eva_weights() fonksiyonunu çağırın (çoğu durumda EVA başlatması için kullanılan dataloader, ince ayar için kullanılan dataloader ile aynı olabilir):
initialize_lora_eva_weights(peft_model, dataloader)
EVA, bitsandbytes ile kutudan çıktığı gibi çalışır. Modeli quantization_config ile başlatıp initialize_lora_eva_weights() fonksiyonunu normalde olduğu gibi çağırmanız yeterlidir.
EVA'yı kullanmaya ilişkin daha fazla talimat için lütfen belgelerimize başvurun.
QLoRA eğitimi için temel modeli kuantize ederken, kuantize modellerin eğitiminde performansı iyileştirdiği gösterilen LoftQ başlatma yöntemini kullanmayı düşünün. Temel fikir, LoRA ağırlıklarının kuantizasyon hatasını en aza indirecek şekilde başlatılmasıdır. LoftQ'yi kullanmak için bu talimatları izleyin.
PEFT'nin kuantizasyonla nasıl çalıştığı ve LoftQ'nun nasıl kullanılacağı hakkında daha fazla bilgi için Kuantizasyon kılavuzuna göz atın.
LoraConfig nesnesini başlatmanın bir başka yolu da rank-stabilized LoRA (rsLoRA) yöntemini kullanmaktır. LoRA mimarisi, her ileri geçişte her adaptörü, başlatma sırasında belirlenen ve r derecesine bağlı olan sabit bir skalerle ölçekler. Orijinal uygulamada bu skaler lora_alpha/r olarak verilirken, rsLoRA lora_alpha/math.sqrt(r) kullanır; bu sayede adaptörler kararlı hale gelir ve daha yüksek bir r değerinin kullanılmasından kaynaklanan performans potansiyeli artar.
from peft import LoraConfig
config = LoraConfig(use_rslora=True, ...)LoRA-GA (Low-Rank Adaptation with Gradient Approximation), tahmini gradyanlar üzerinde SVD uygulayarak adaptör ağırlıklarını başlatır; böylece ağırlıklar tam ince ayara (full-finetuning) daha yakın hizalanır ve yakınsama hızlanır.
Bu yöntem, gerçek eğitimin başlamasından önce gradyanları tahmin etmek için bir başlatma işlevi gerektirir:
from peft.tuners.lora import preprocess_loraga
def train_step():
"""Run forward and backward passes for gradient estimation."""
dataloader_iter = iter(grad_dataloader)
for _ in range(N):
batch = next(dataloader_iter)
batch = {k: v.to(device) for k, v in batch.items()}
outputs = model(**batch)
loss = outputs.loss
loss.backward()
preprocess_loraga(model, lora_config, train_step)Kullanım İpuçları
Gradyan Tahmini: LoRA-GA, model başlatılmasından önce bir gradyan tahmini aşaması gerektirir. Küçük sayıda eğitim partisi üzerinde (genellikle 64-128 parti) gradyanları hesaplamak için
preprocess_loraga()işlevini birtrain_stepgeri çağırmasıyla kullanın.Başlatma Stratejileri: LoRA-GA, dört yön stratejisini (
direction) destekler:"ArBr","A2rBr","ArB2r"(varsayılan) ve"random"; ayrıca dört ölçekleme stratejisini (scale) destekler:"stable"(varsayılan),"weight_svd","gd_scale"ve"unit". Varsayılan kombinasyon, yakınsama hızı ve kararlılık arasında en iyi dengeyi sağlar.Temel Ağırlık Değişikliği: Standart LoRA'dan farklı olarak LoRA-GA, başlatma sırasında düşük rütbeli yaklaşımın ölçeklenmiş bir versiyonunu çıkararak temel model ağırlıklarını değiştirir. Bu, tam ince ayar gradyanlarıyla daha iyi hizalanmayı sağlar. Temel ağırlıklar değiştirildiğinden,
save_pretrained()fonksiyonunusave_embedding_layersargümanıyla kullanın veyapath_initial_model_for_weight_conversionparametresini iletin.Hesaplama Aşırı Yükü: Gradyan tahmini, başlatma sırasında küçük bir aşırı yük ekler (genellikle 64 parti için 1-2 dakika), ancak bu, eğitim sırasında daha hızlı yakınsama sayesinde hızla amorti edilir.
Uyumluluk: LoRA-GA tam hassasiyetli ağırlıklar gerektirir ve kuantize modelleri desteklemez. DoRA gibi diğer LoRA varyantlarıyla birleştirilebilir.
Eğitim
Bu bölüm, modele yalnızca düşük rütbeli bir adaptör uygulayıp veri beslemek yerine daha karmaşık eğitim senaryolarının nasıl ele alındığını gösterir.
QLoRA tarzı eğitim
PEFT'teki varsayılan LoRA ayarları, her dikkat bloğunun sorgu ve değer katmanlarına eğitilebilir ağırlıklar ekler. Ancak bir dönüştürücü modelin tüm doğrusal katmanlarına eğitilebilir ağırlıklar ekleyen QLoRA, tamamen ince ayarlanmış bir modelle eşdeğer performans sağlayabilir. QLoRA'da olduğu gibi LoRA'yı tüm doğrusal katmanlara uygulamak için target_modules="all-linear" değerini ayarlayın (mimariye göre değişebilen bireysel modülleri isimle belirtmekten daha kolaydır).
config = LoraConfig(target_modules="all-linear", ...)PEFT adaptörlerine kuantizasyon uygulamak hakkında daha fazla bilgi için kuantizasyon kılavuzuna bakın.
LoRA ile Bellek Verimli Katman Kopyalama
Model performansını iyileştirmek için kullanılan bir yaklaşım, belirli bir boyuttaki önceden eğitilmiş bir modelden daha büyük bir model oluşturmak için modeldeki katmanları kopyalayarak modeli genişletmektir. Örneğin, SOLAR makalesinde açıklandığı gibi 7B'lik bir modelin 10B'lik bir modele çıkarılması. PEFT LoRA, katmanların kopyalanmasının ardından katmanlara bağlanan LoRA adaptörleri kullanılarak ek ince ayar yapılmasını destekleyen, bu tür genişletmeleri bellek verimli bir şekilde destekler. Kopyalanan katmanlar, altta yatan ağırlıkları paylaştıkları için ek bellek gerektirmez; bu nedenle gereken tek ek bellek, adaptör ağırlıkları için olan bellektir. Bu özelliği kullanmak için layer_replication argümanıyla bir yapılandırma oluşturmanız gerekir.
config = LoraConfig(layer_replication=[[0,4], [2,5]], ...)Orijinal modelin 5 katmandan oluştuğunu varsayalım [0, 1, 2 ,3, 4], bu durumda [0, 1, 2, 3, 2, 3, 4] şeklinde dizilmiş 7 katmanlı bir model oluşturulur. Bu, mergekit pass through birleştirme kuralını izler; bu kuralda başlangıç dahil, bitiş hariç demetler olarak belirtilen katman dizileri yığılarak nihai model oluşturulur. Nihai modeldeki her katman, kendine özgü bir LoRA adaptör setine sahip olur.
Fewshot-Metamath-OrcaVicuna-Mistral-10B, bu yöntemle Mistral-7B'nin 10B'ye genişletilmiş hali üzerinde eğitilmiş bir model örneğidir. adapter_config.json, bu yöntemi ince ayar için uygulayan örnek bir LoRA adaptör yapılandırmasını gösterir.
Ranks ve alpha (ölçekleme) üzerinde ince ayarlı kontrol
Varsayılan olarak, LoRA ile hedeflenen tüm katmanlar, LoraConfig içinde belirtilenlere bağlı olarak aynı r rütbesine ve aynı lora_alpha değerine (LoRA ölçeklemesini belirleyen) sahip olur. Ancak bazı durumlarda, farklı katmanlar için farklı değerler belirtmek isteyebilirsiniz. Bu, LoraConfig nesnesine rank_pattern ve alpha_pattern argümanlarını iletilebilir. Bu argümanlar, anahtarın katman adı, değerin ise rütbe/alfa değeri olduğu sözlükler olmalıdır. Anahtarlar düzenli ifadeler (regex) olabilir. rank_pattern ve alpha_pattern içinde açıkça belirtilmeyen tüm LoRA katmanları, varsayılan r ve lora_alpha değerlerini alır.
Örnek olarak, aşağıdaki yapıya sahip bir modele sahip olduğumuzu varsayalım:
>>> print(model)
Outer(
(foo): Linear(...)
(module): Middle(
(foo): Linear(...)
(foobar): Linear(...)
(module): Inner(
(foo): Linear(...)
(barfoo): Linear(...)
)
)
)rank_pattern={"foo": 42}, tüm 3fookatmanıyla eşleşir. Nefoobarne debarfooeşleşir.rank_pattern={"^foo": 42}yalnızca modelinfookatmanıyla eşleşir, ancak nemodule.foone demodule.module.fooile eşleşmez. Bunun nedeni, düzenli ifadelerde^sembolünün “dizinin başı” anlamına gelmesidir ve yalnızcafoo"foo"ile başlar; diğer katman adlarının önekleri vardır.rank_pattern={"^module.foo": 42}aynı nedenden ötürü yalnızcamodule.fooile eşleşir,module.module.fooile eşleşmez.rank_pattern={"module.foo": 42}, hemmodule.foohem demodule.module.fooile eşleşir ancakfooile eşleşmez.rank_pattern={"^foo": 42, "^module.module.foo": 55}sırasıylafoovemodule.module.fooile eşleşir, ancakmodule.fooile eşleşmez.- Eşleşmenin sonunu işaretlemek için
$belirtmenize gerek yoktur, çünkü bu PEFT tarafından otomatik olarak eklenir.
Aynı mantık alpha_pattern için de geçerlidir. Şüphe duyuyorsanız, düzenli ifadelerle uğraşmaya çalışmayın — farklı rank/alpha değerine sahip her modül için ^ önekiyle tam adını iletmeniz yeterlidir.
Uygun hedef modülleri otomatik olarak algıla
peft.helpers.KappaTuneSelector, KappaTune makalesindeki koşul sayısına dayalı hedef seçme stratejisini uygular. Her nn.Linear modülünü tarar; MoE uzman ağırlıklarının füzyonlu 3B nn.Parameter tensörleri olarak saklandığı modellerde (ör. Llama-4, Qwen3-MoE) bu parametreleri de dahil eder, her biri için matris koşul sayısını κ = σ_max / σ_min olarak hesaplar ve en izotropik katmanları (en düşük κ) seçer. Bu izotropik katmanlar, yüksek entropi doğaları sayesinde yeni bilgiyi daha kolay emebildiği için ince ayar için ideal adaylar olarak hizmet eder; bu da uzmanlaşmış, anizotropik katmanların bozulmadan kalmasını sağlayarak sürekli öğrenme sırasında felaketçi unutmayı azaltır.
LoraConfig için en uygun target_modules değerlerini tek satırda almak için peft.helpers.find_kappa_target_modules() işlevini kullanın:
from peft import LoraConfig, get_peft_model
from peft.helpers import find_kappa_target_modules
model = AutoModelForCausalLM.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")
targets = find_kappa_target_modules(model, top_p=0.2)
config = LoraConfig(
target_modules=targets["target_modules"],
target_parameters=targets["target_parameters"] if stable_modules_dic["target_parameters"] else None,
r=64,
lora_alpha=32,
task_type="CAUSAL_LM",
)
peft_model = get_peft_model(model, config)Tam bir örneği burada görebilirsiniz.
nn.Parameter'ı doğrudan hedefleme
Genel olarak, modülü (ör. nn.Linear) hedeflemek için target_modules kullanmalısınız. Ancak bazı durumlarda bu mümkün değildir. Örneğin, HF Transformers'taki birçok mixture of expert (MoE) katmanında nn.Linear yerine nn.Parameter kullanılır. PEFT, LoRA için normalde forward metodunu yazar, ancak nn.Parameter için böyle bir metot yoktur. Bu nedenle, LoRA'yı bu parametreye uygulamak için target_parameters ile hedeflenmesi gerekir. Örnek olarak, Llama4 için şunu iletebilirsiniz: target_parameters=['feed_forward.experts.gate_up_proj', 'feed_forward.experts.down_proj].
Uzman parametrelerine yönelik hedeflendiğinde, PEFT'in önemli bir çalışma zamanı maliyeti ekleyebileceğini unutmayın. Bunun nedeni, yalnızca küçük bir uzman grubunun gerekli olması durumunda bile PEFT'in her zaman her uzman için LoRA katkısını somutlaştırmasıdır. Eğitim sırasında bu durum daha az önemlidir çünkü dizinin ilerleyişi boyunca, uzmanların genellikle büyük bir kısmı en az bir kez etkinleştirilir. Ancak çıkarım sırasında, normalde bir KV önbelleği kullanılır ve bu nedenle yalnızca son token'ı hesaplamamız gerekir; bu da yalnızca küçük bir uzman grubunun etkinleştirildiği anlamına gelir. Dolayısıyla, MoE katmanlarında LoRA kullanımı, çıkarım sırasında önemli bir yavaşlamaya yol açabilir. Bu nedenle, ağırlıkların birleştirilmesi önerilir (model.merge_adapter() veya model = model.merge_and_unload()). Bu işlem PEFT maliyetini ortadan kaldırır.
Bu konunun daha ayrıntılı incelemesi, MoE optimizasyonu için açılan bu pull request'te bulunabilir.
Dikkat Edilmesi Gerekenler
- Şu anda bu argüman, 2 boyutlu veya 3 boyutlu
nn.Parameterhedeflemeye olanak tanır. 3 boyutlu bir parametre durumunda, 0. boyutun uzman (expert) boyutu olduğu varsayılır. target_parameterskullanan birden fazla LoRA adaptörü (model.add_adapterveyamodel.load_adapterile eklenenler) desteklenir, ancak hepsinin aynı parametre kümesini hedeflemesi gerekir.
MoE uzman parametreleri ve vLLM
Transformers'taki bazı MoE modelleri, uzman ağırlıklarını nn.Parameter tensörleri (genellikle 3B) olarak saklar, nn.Linear modülleri olarak değil.
Bu uzmanlara LoRA uygulamak için target_parameters kullanın ve rank_pattern ile katman başına bir rank belirleyin:
num_experts = getattr(model.config, "num_local_experts", None) or model.config.num_experts
effective_r = max(1, r // num_experts)
config = LoraConfig(
r=r,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
target_parameters=[
# Mixtral / Qwen3-MoE / GPT-OSS
"mlp.experts.gate_up_proj",
"mlp.experts.down_proj",
# Llama4
# "feed_forward.experts.gate_up_proj",
# "feed_forward.experts.down_proj",
],
rank_pattern={
"experts.gate_up_proj": effective_r,
"experts.down_proj": effective_r,
},
)Bu, toplam LoRA parametre bütçesini yoğun katmanlarla benzer tutar (bkz. Schulman ve ark. tarafından yazılan LoRA Without Regret). Uzman olmayan modüller varsayılan r sırasını kullanır.
İnce ayarlı modelle hızlandırılmış çıkarım, örneğin v0.11.2 sürümünden itibaren füzyonlu MoE uzman katmanlarını destekleyen vLLM ile mümkündür.
LoRA ile birlikte tokenleri verimli bir şekilde eğitin
PEFT LoRA adaptörleri, trainable_token_indices parametresi ile yeni token eklemeyi destekler. Bu, belirli katmanların ince ayarının yanı sıra diğer tokenların da ayarlanmasına olanak tanır. Yalnızca belirtilen tokenlar eğitilir ve diğer tüm tokenlara dokunulmaz. Bu, tüm gömme matrisinin eğitilmesinin aksine, mevcut token gömmelerinden öğrenilen bağlamı atmadan bellek tasarrufu sağlar. Bu yöntem, altyapıda TrainableTokensModel katmanını kullanır.
# for layer 'embed_tokens'
config = LoraConfig(trainable_token_indices=[idx_1, idx_2, ...], ...)
# specific embedding layer
config = LoraConfig(trainable_token_indices={'emb_tokens': [idx_1, idx_2, ...]}, ...)Aşağıdaki kod parçasında, modele yeni token'lar eklemenin ve bu token'ların modeldeki diğer katmanlarla birlikte nasıl eğitileceğinin gösterilmesini sunuyoruz.
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import get_peft_model, LoraConfig
base_model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1")
# we define our new tokens and add them to the tokenizer as special tokens
special_tokens = ['<|start_think|>', '<|stop_think|>']
tokenizer.add_special_tokens({'additional_special_tokens': special_tokens})
# make room for new tokens in the embedding matrix if it isn't big enough already
base_model.resize_token_embeddings(max(len(tokenizer), base_model.model.embed_tokens.num_embeddings))
# typical LoRA config with `trainable_token_indices` targeting embedding layer `embed_tokens`
# and specifically our new tokens we just added
lora_config = LoraConfig(
target_modules='all-linear',
trainable_token_indices={'embed_tokens': tokenizer.convert_tokens_to_ids(special_tokens)},
)
peft_model = get_peft_model(base_model, lora_config)
# proceed to train the model like normal
[...]Token ağırlıkları, LoRA ağırlıklarıyla birlikte adaptör durum sözlüğünün (adapter state dict) bir parçası olarak kaydedilir. Tam ince ayar (full fine-tuning) ve gömme matrisinin (embedding matrix) kaydedilmesi çok daha büyük bir dosya oluştururdu.
Ne kadar VRAM tasarrufu sağlanabileceğine dair bir fikir vermek için, yukarıdaki örnek üzerinde temel bir karşılaştırma yapıldı: gömme matrisinin tamamen eğitilmesi (modules_to_save=["embed_tokens"]), gömme matrisi için LoRA kullanılması (target_modules=[..., "embed_tokens"], rank 32) ve eğitilebilir token'lar (trainable_token_indices=[...], 6 token):
| Eğitilebilir Jetonlar | LoRA | Tam İnce Ayar | |
|---|---|---|---|
| VRAM | 15.562 MB | 15,581MB | ~16.500 MB |
| Etki | 6 jeton | tüm jetonlar | tüm jetonlar |
Ağırlık bağlama
Birçok nedensel LM, ağırlık bağlama (weight tying) kullanır; bu yöntemde iki veya daha fazla ağırlık aynı temel parametreleri paylaşır. En yaygın durumda, giriş gömme ağırlıkları (embed_tokens) ve çıktı projeksiyon ağırlıkları (lm_head) aynı tensörü paylaşır. Bunun nedeni, parametre sayısını azaltması ve genellikle model kalitesini korumasıdır.
PEFT’nin, ince ayara hedeflenen bu bağlı ağırlıklarla nasıl başa çıktığı her zaman açık değildir. LoRA için, LoraConfig üzerindeki ensure_weight_tying, PEFT’nin bu katmanlar için adaptör tarafındaki güncellemelerin bağlı kalmasını açıkça sağlayıp sağlamayacağını kontrol eder. Uygulamada bu durum modules_to_save, target_modules ve trainable_token_indices değerlerini etkileyebilir. Katmanların adlandırılması söz konusu olduğunda ("embed_tokens", "lm_head") bu mantığın kısmen bir sözleşmeye dayandığını ve bu sözleşmeler kullanılmadığında düzgün çalışmanın garanti edilemeyeceğini unutmayın.
Aşağıdaki tablolar beklenen davranışı özetler.
modules_to_save
| Temel model ağırlıkları bağlı | ensure_weight_tying | LoraConfig şekli | Davranış |
|---|---|---|---|
| Hayır | False | modules_to_save=["embed_tokens"] veya ["lm_head"] | Sadece seçilen katmana ModulesToSaveWrapper ekleyin |
| Hayır | True | modules_to_save=["embed_tokens"] veya ["lm_head"] | Uyarı verin, ardından ModulesToSaveWrapper'ı yalnızca seçilen katmana ekleyin |
| Evet | False | modules_to_save=["embed_tokens"] veya ["lm_head"] | Ayrı olarak ele alın |
| Evet | True | modules_to_save=["embed_tokens"] veya ["lm_head"] | Bağlı katmanları sarmalayın ve sarmalayıcıların bağlı kalmasını sağlayın |
| Hayır | False | modules_to_save=["embed_tokens", "lm_head"] | Ayrı olarak ele alın |
| Hayır | True | modules_to_save=["embed_tokens", "lm_head"] | Uyarı ver, ardından ayrı olarak ele al |
| Evet | False | modules_to_save=["embed_tokens", "lm_head"] | Uyarı ver, ardından ayrı olarak ele al |
| Evet | True | modules_to_save=["embed_tokens", "lm_head"] | ModulesToSaveWrapperları bağlı tutun |
target_modules
| Temel model ağırlıkları bağlı | ensure_weight_tying | LoraConfig şekli | Davranış |
|---|---|---|---|
| Hayır | False | target_modules=["embed_tokens"] veya ["lm_head"] | Sadece seçilen katmana LoRA ekle |
| Hayır | True | target_modules=["embed_tokens"] veya ["lm_head"] | Uyarı verin, ardından LoRA'yı yalnızca seçilen katmana ekleyin |
| Evet | False | target_modules=["embed_tokens"] veya ["lm_head"] | Ayrı olarak ele alın |
| Evet | True | target_modules=["embed_tokens"] veya ["lm_head"] | LoRA adaptörlerini bağlı tutun |
| Hayır | False | target_modules=["embed_tokens", "lm_head"] | Ayrı olarak ele alın |
| Hayır | True | target_modules=["embed_tokens", "lm_head"] | Uyarı ver, ardından ayrı olarak ele al |
| Evet | False | target_modules=["embed_tokens", "lm_head"] | Uyarı ver, ardından ayrı olarak ele al |
| Evet | True | target_modules=["embed_tokens", "lm_head"] | LoRA adaptörlerini bağlı tutun |
trainable_token_indices
Eğitilebilir tokenlar için ek bir karmaşıklık daha vardır: LM başı ve gömlemeler bağlı olsa bile, bir kullanıcı olarak bunlarda farklı tokenları ince ayarlamak isteyebilirim. Aşağıdaki örnek tabloda bu nedenle, aynı tokenların ince ayarı ile farklı tokenların ince ayarı arasında ayrım yapıyoruz.
| Temel model ağırlıkları bağlı | ensure_weight_tying | LoraConfig şekli | Davranış |
|---|---|---|---|
| Hayır | False | trainable_token_indices=[1, 2, 3] | Sadece gömme (embedding) üzerinde eğitilebilir jetonlar |
| Hayır | True | trainable_token_indices=[1, 2, 3] | Uyarı, ardından yalnızca gömmede eğitilebilir jetonlar |
| Evet | False | trainable_token_indices=[1, 2, 3] | Bağlı eğitilebilir jetonlar |
| Evet | True | trainable_token_indices=[1, 2, 3] | Bağlı eğitilebilir jetonlar |
| Hayır | False | trainable_token_indices={"lm_head": [1, 2], "embed_tokens": [1, 2]} | Ayrı olarak ele alın |
| Hayır | True | trainable_token_indices={"lm_head": [1, 2], "embed_tokens": [1, 2]} | Uyarı ver, ardından ayrı olarak ele al |
| Evet | False | trainable_token_indices={"lm_head": [1, 2], "embed_tokens": [1, 2]} | Bağlı eğitilebilir jetonlar |
| Evet | True | trainable_token_indices={"lm_head": [1, 2], "embed_tokens": [1, 2]} | Bağlı eğitilebilir jetonlar |
| Hayır | False | trainable_token_indices={"lm_head": [1, 2], "embed_tokens": [3, 4]} | Ayrı olarak ele alın |
| Hayır | True | trainable_token_indices={"lm_head": [1, 2], "embed_tokens": [3, 4]} | Uyarı ver, ardından ayrı olarak ele al |
| Evet | False | trainable_token_indices={"lm_head": [1, 2], "embed_tokens": [3, 4]} | Ayrı olarak ele alın |
| Evet | True | trainable_token_indices={"lm_head": [1, 2], "embed_tokens": [3, 4]} | Hata |
Kullanıcılar için bu şu anlama gelir:
- Genel olarak, bağlı ağırlıkları ince ayar yapmak ve bağlı kalmalarını sağlamak istiyorsanız
ensure_weight_tying=Trueparametresini iletin. - Eğer temel modelinizin ağırlıkları bağlı değilse,
ensure_weight_tying=Truebağlamayı zorlayamaz ve yalnızca bir uyarı verir. trainable_token_indicesiçin,ensure_weight_tying=Trueolduğunda bağlı katmanların aynı token indekslerini kullanması gerekir.
Optimizatörler
LoRA eğitimi, isteğe bağlı olarak özel amaçlı optimizatörler içerebilir. Şu anda PEFT, LoRA-FA, LoRA+ ve Riemannian-preconditioned LoRA'yı destekler.
LoRA-FA Optimizer
LoRA eğitimi, LoRA-FA makalesinde anlatıldığı gibi LoRA-FA kullanılarak daha etkili ve verimli hale getirilebilir. LoRA-FA, A matrisini sabit tutarak ve yalnızca B matrisini ayarlayarak aktivasyon bellek tüketimini azaltır. Eğitim sırasında, B'nin gradyanı, tam parametre ince ayar gradyanını yaklaşık olarak elde edecek şekilde optimize edilir. Ayrıca, LoRA-FA'nın bellek tüketimi ranga duyarlı değildir (çünkü $A$ aktivasyonunu siler); bu nedenle, bellek tüketimini artırmadan lora rangini büyütüp performansı iyileştirebilir.
from peft import LoraConfig, get_peft_model
from peft.optimizers import create_lorafa_optimizer
from transformers import Trainer, get_cosine_schedule_with_warmup
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")
config = LoraConfig(...)
model = get_peft_model(base_model, config)
optimizer = create_lorafa_optimizer(
model=model,
r=128,
lora_alpha=32,
lr=7e-5,
)
scheduler = get_cosine_schedule_with_warmup(
optimizer,
num_warmup_steps=100,
num_training_steps=1000,
)
trainer = Trainer(
...,
optimizers=(optimizer, scheduler),
)LoRA+ optimize edilmiş LoRA
LoRA eğitimi, A ve B adaptör matrisleri için farklı öğrenme oranları kullanan LoRA+ ile optimize edilebilir; bu yöntem, ince ayar hızını 2 katına kadar ve performansı %1-2 oranında artırdığı gösterilmiştir.
from peft import LoraConfig, get_peft_model
from peft.optimizers import create_loraplus_optimizer
from transformers import Trainer
import bitsandbytes as bnb
base_model = ...
config = LoraConfig(...)
model = get_peft_model(base_model, config)
optimizer = create_loraplus_optimizer(
model=model,
optimizer_cls=bnb.optim.Adam8bit,
lr=5e-5,
loraplus_lr_ratio=16,
)
scheduler = None
...
trainer = Trainer(
...,
optimizers=(optimizer, scheduler),
)Riemann ön koşullu LoRA
LoRA eğitimi, şu makalede anlatıldığı gibi Riemann ön koşullandırıcısı ile iyileştirilebilir: Riemannian Preconditioned LoRA. Her optimizasyon adımında, LoRA matrislerinin ve gradyanları bir ön koşullandırıcı ile çarpılır. Bu ön koşullandırıcı, düşük rütbeli matris manifoldu üzerindeki Riemann (ölçeklenmiş gradyan) yönüne doğru Öklid gradyanını yeniden ölçeklendirir; bu da güncellemeyi daha iyi koşullandırır ve yakınsamayı iyileştirebilir. Ön koşullandırıcı $r \times r$ boyutunda olduğu için, LoRA rütbesine kıyasla bellek ve çalışma süresi maliyeti küçüktür. create_riemannian_optimizer herhangi bir temel optimizör sınıfını (ör. torch.optim.AdamW veya torch.optim.SGD): sarmalar: LoRA dışındaki parametreler temel optimizör tarafından değiştirilmeden güncellenir ve yalnızca nn.Linear-şeklindeki LoRA katmanları (lora_A / lora_B) ön koşullandırılır.
from peft import LoraConfig, get_peft_model
from peft.optimizers import create_riemannian_optimizer
from transformers import Trainer, get_cosine_schedule_with_warmup
import torch
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")
config = LoraConfig(...)
model = get_peft_model(base_model, config)
optimizer = create_riemannian_optimizer(
model=model,
optimizer_cls=torch.optim.AdamW,
lr=5e-5,
reg=1e-2,
)
scheduler = get_cosine_schedule_with_warmup(
optimizer,
num_warmup_steps=100,
num_training_steps=1000,
)
trainer = Trainer(
...,
optimizers=(optimizer, scheduler),
)reg terim, tersine çevrilmeden önce matrisinin köşegenine eklenen bir sönümleme terimidir; bir LoRA faktörü (neredeyse) rütbe eksik olduğunda ön koşullandırıcıyı kararlı hale getirir.
Eğitim Sonrası
Bu bölüm, eğitilmiş adaptörler için olası son işleme yöntemlerini gösterir.
LoRA ağırlıklarını temel modele birleştirin
LoRA, eğitim açısından önemli ölçüde daha küçük ve hızlı olsa da, temel modelin ve LoRA adaptörünün ayrı ayrı yüklenmesi nedeniyle çıkarım sırasında gecikme sorunlarıyla karşılaşabilirsiniz. Gecikmeyi ortadan kaldırmak için adaptör ağırlıklarını temel modelle birleştirmek üzere merge_and_unload() işlevini kullanın. Bu sayede yeni birleştirilen modeli bağımsız bir model olarak kullanabilirsiniz. merge_and_unload() işlevi, adaptör ağırlıklarını bellekte tutmaz.
Aşağıda, LoRA adaptör birleştirme sezgiselini açıklayan bir şema yer almaktadır:

Aşağıdaki kod parçacıklarında bunu PEFT kullanarak nasıl çalıştıracağımızı gösteriyoruz.
from transformers import AutoModelForCausalLM
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
peft_model_id = "alignment-handbook/zephyr-7b-sft-lora"
model = PeftModel.from_pretrained(base_model, peft_model_id)
model = model.merge_and_unload()Dönen modeli bir değişkene atamanız ve onu kullanmanız önemlidir, merge_and_unload() yerinde (in-place) bir işlem değildir. Daha sonra adaptörü birleştirmeyi geri almak veya silip farklı adaptörler yüklemek için ağırlıkların bir kopyasını tutmanız gerekiyorsa, bunun yerine merge_adapter() işlevini kullanmalısınız. Şimdi, temel modele dönmek için unmerge_adapter() işlevini kullanma seçeneğiniz var.
from transformers import AutoModelForCausalLM
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
peft_model_id = "alignment-handbook/zephyr-7b-sft-lora"
model = PeftModel.from_pretrained(base_model, peft_model_id)
model.merge_adapter()
# unmerge the LoRA layers from the base model
model.unmerge_adapter()Kantize edilmiş bir modelde birleştirme işlemi tam olarak tersine çevrilemez: birleştirme işlemi temel ağırlığı yeniden kantize eder ve tekrarlanan birleştirme/geri alma döngüleri yuvarlama hatasının birikmesine neden olabilir. Kantize edilmiş ağırlıklara adaptörlerin birleştirilmesi bölümüne bakın.
Birden fazla adaptör etkinse ve bunlardan yalnızca bazıları birleştiriliyorsa, birleştirilmeyen adaptörler sessizce uygulanmaz. Bu davranış PEFT v1.0'da değişecektir. Yalnızca etkin adaptörlerin bir kısmının birleştirilmesi bölümüne bakın.
weights parametresinde kullanıcı tarafından sağlanan bir ağırlıklandırma şemasına göre birden fazla LoRA'yı yeni bir adaptöre birleştirmek için add_weighted_adapter() fonksiyonu kullanışlıdır. Aşağıda uçtan uca bir örnek bulunmaktadır.
Önce temel modeli yükleyin:
from transformers import AutoModelForCausalLM
from peft import PeftModel
import torch
base_model = AutoModelForCausalLM.from_pretrained(
"mistralai/Mistral-7B-v0.1", dtype=torch.float16, device_map="auto"
)Ardından ilk adaptörü yükleriz:
peft_model_id = "alignment-handbook/zephyr-7b-sft-lora"
model = PeftModel.from_pretrained(base_model, peft_model_id, adapter_name="sft")Ardından farklı bir adaptör yükleyin ve birincisiyle birleştirin:
weighted_adapter_name = "sft-dpo"
model.load_adapter("alignment-handbook/zephyr-7b-dpo-lora", adapter_name="dpo")
model.add_weighted_adapter(
adapters=["sft", "dpo"],
weights=[0.7, 0.3],
adapter_name=weighted_adapter_name,
combination_type="linear"
)
model.set_adapter(weighted_adapter_name)
combination_typeiçin birkaç desteklenen yöntem bulunmaktadır. Daha fazla ayrıntı için belgelere bakın. Veri tipi olaraktorch.float16veyatorch.bfloat16kullanıldığında,combination_typeolarak “svd” desteklenmez.
Şimdi, çıkarım (inference) işlemini gerçekleştirin:
device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1")
prompt = "Hey, are you conscious? Can you talk to me?"
inputs = tokenizer(prompt, return_tensors="pt")
inputs = {k: v.to(device) for k, v in inputs.items()}
with torch.no_grad():
generate_ids = model.generate(**inputs, max_length=30)
outputs = tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
print(outputs)İstila boyutunun azaltılması yoluyla temel model performansının geri kazanılması
LoRA vs Full Fine-tuning: An Illusion of Equivalence makalesi, LoRA eğitiminin ağırlıklara, halihazırda öğrenilmiş ağırlıklarla çok az ortak noktası olan ve öğrenilmiş bilgilerin unutulmasına yol açan ek boyutlar eklediğini savunmaktadır. PEFT, peft.tuners.lora.intruders.reduce_intruder_dimension() içinde önerilen azaltma yöntemini uygular.
Müdahale, yüklü bir LoRA içeren bir PEFT modelini alır ve mevcut adaptörün yanı sıra yüklenen ve artık etkin olan yeni, değiştirilmiş bir adaptör oluşturur.
Örnek kullanım:
from peft.tuners.lora.intruders import reduce_intruder_dimension
peft_model = AutoPeftModelForCausalLM.from_pretrained('hubnemo/llama-3.2b-metamathqa-lora64')
reduce_intruder_dimension(
peft_model,
mitigation_lambda=0.75,
)
peft_model.generate(...)Müdahalenin etkinliğini ayarlamak için kullanılabilecek birkaç hiper-parametre vardır; ancak makalenin 8. Şeklinde de gösterildiği üzere, adaptörün öğrendiği görev doğruluğu ile temel modelin bilgisinin unutulması arasında her zaman bir ödünleşim olacaktır. Müdahale, önceki bilgilerin unutulması üzerindeki etkiyi azaltmak için adaptörden bilgiyi kaldırır; ancak bu da adaptörün öğrendiği görevle ilgili bazı bilgilerin de kaybedildiği anlamına gelir.
Varsayılan değerler, bu iki faktör arasında iyi bir denge sunacak şekilde ayarlanmış olsa da, varsayılanların adaptörünüz, modeliniz ve verileriniz için geçerli olacağı garanti edilemez; bu nedenle, etkiyi ölçmek için bir referans testi (benchmark) hazırlamakta fayda vardır.
Adaptörleri yükle
Adapters, ağırlıkları birleştirilmemiş farklı adapterları denemek için faydalı olan load_adapter() ile önceden eğitilmiş bir modele yüklenebilir. Aktif adapter ağırlıklarını set_adapter() fonksiyonuyla ayarlayın.
from transformers import AutoModelForCausalLM
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
peft_model_id = "alignment-handbook/zephyr-7b-sft-lora"
model = PeftModel.from_pretrained(base_model, peft_model_id)
# load different adapter
model.load_adapter("alignment-handbook/zephyr-7b-dpo-lora", adapter_name="dpo")
# set adapter as active
model.set_adapter("dpo")Temel modeli geri getirmek için tüm LoRA modüllerini yüklemeyi kaldırmak üzere unload() veya adaptörü tamamen silmek üzere delete_adapter() kullanabilirsiniz. unload() yerinde bir işlem değildir; döndürülen modeli bir değişkene atayıp onu kullanmayı unutmayın.
# unload adapter
model = model.unload()
# delete adapter
model.delete_adapter("dpo")Tensor Paralelliği
LoRA, Transformers tarafından sağlanan Tensor Parallelism (TP) özelliğini destekler. Bir temel model tp_plan ile yüklendiğinde, PEFT her hedef modülün TP yapılandırmasını otomatik olarak algılar ve LoRA adaptör ağırlıklarına uygun kancaları ekleyerek bunların tensor-parallel hesaplamaya doğru şekilde katılmasını sağlar.
LoRA için Tensor Parallelism desteği
transformers >= 5.4.0gerektirir. DTensor tabanlı Tensor Parallelism API'sipeft >= 0.21.1vetransformers >= 5.17.0gerektirir.
Kullanım, standart LoRA iş akışıyla aynıdır — PEFT ile sarmalamadan önce temel modeli tp_plan ile yüklemeniz yeterlidir:
from transformers import AutoModelForCausalLM
from peft import get_peft_model, LoraConfig
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B", tp_plan="auto")
lora_config = LoraConfig(r=16, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, lora_config)Kaydetme ve yükleme, save_pretrained / from_pretrained üzerinden normal şekilde çalışır. PEFT, kaydetmeden önce parçalı adaptör ağırlıklarını tam tensörlere geri toplar; bu sayede kontrol noktaları taşınabilir olur ve eğitim sırasında kullanılan cihaz sayısından bağımsızdır.
TP plan olmadan tensor paralelliği uygularsanız, örneğin PyTorch’un parallelize_module ile, PEFT; ağırlığın cihaz ızgarasında "tp" adında bir boyut varsa parçalanmış bir nn.Linear’in LoRA ağırlıklarını yerel parçasına, aksi halde tam katman biçimine (FSDP2’de olduğu gibi) boyutlandırır. PEFT, bu LoRA ağırlıklarına TP kancaları eklemez veya kaydetme sırasında onları bir araya getirmez. TP ızgara boyutunuzun adı farklıysa, PEFT modelini oluşturmadan önce onu ekleyin:
from peft.utils.integrations import TpMeshDimRegistry
TpMeshDimRegistry.register("tp_dim")Çıkarım
Bu bölüm, LoRA ile çıkarım sırasında yapabileceklerinizi, örneğin adaptörün ayrıştırılmasını göstermektedir.
Aktif LoRA (aLoRA)
Aktif LoRA (aLoRA), nedensel LM'ler için mevcut taban model KV önbelleğini yeniden kullanarak daha verimli çıkarım sağlayan düşük rütbeli bir adaptör mimarisidir. Bu yaklaşım, çoğu görev/üretim için taban modele bağımlı olan, ancak zincir içindeki uzmanlaşmış görev(ler)i gerçekleştirmek için aLoRA adaptör(ler)i kullanan çıkarım hatları için en uygunudur. Örneğin, taban modelinin üretilen çıktıları kontrol etmek veya düzeltmek. Bu ayarlarda, çıkarım süreleri bir on kat veya daha fazla hızlandırılabilir. aLoRA hakkında daha fazla bilgi ve birçok örnek kullanım senaryosu için aLoRA makalesine bakın.
Bu teknik, her girdide çağrı dizisinin (alora_invocation_tokens) son oluşumunu tarar (bu, 1 token kadar kısa olabilir). Adaptör ağırlıkları, çağrı dizisinin başlangıcından itibaren tokenlarda etkinleştirilir. Çağrı dizisinden sonraki tüm girdiler de adapte edilir ve üretilen tüm tokenlar adapte edilmiş ağırlıkları kullanır. Önceki tokenlardaki ağırlıklar adapte edilmeden bırakılır; bu da nedensel LM'lerdeki nedensel dikkat maskesi nedeniyle bu tokenların önbelleğinin temel model önbelleğiyle değiştirilebilir olmasını sağlar. Kullanım, standart LoRA ile çok benzerdir. Temel fark, adaptör oluşturulurken çağrı dizisinin belirtilmesi gerektiğidir:
from peft import LoraConfig
config = LoraConfig(alora_invocation_tokens=alora_invocation_tokens, task_type="CAUSAL_LM", ...)alora_invocation_tokens` bir tamsayıl token kimliği listesidir. İstenen bir çağrı dizesi verildiğinde, bu şu şekilde elde edilebilir:
invocation_string = "placeholder"
alora_invocation_tokens = tokenizer.encode(invocation_string, add_special_tokens=False).Tokenizer, taban modelin tokenizer'ıdır. Arama dizimize SOS/EOS token'larını eklememek için (bu büyük olasılıkla aramanın başarısız olmasına neden olur) add_special_tokens=False kullanın.
Notlar
- aLoRA, önbellek yeniden kullanımına odaklanması nedeniyle yalnızca
task_type=CAUSAL_LMgörevlerini destekler. - Ağırlıklar daha az token üzerinde uyarlandığı için, genellikle (her zaman değil) aLoRA, LoRA'dan daha yüksek bir rütbe (
r) gerektirir.r=32iyi bir başlangıç noktası olabilir. - aLoRA ağırlıkları, adaptör ağırlıklarının yalnızca belirli bir token alt kümesine seçici olarak uygulanması nedeniyle tanım gereği temel modele birleştirilemez. Birleştirme denemeleri hata fırlatır.
- Beam search henüz desteklenmiyor.
- Genellikle, temel modelde bulunmayan yeni token'ları tokenizer'a eklemek önerilmez. Bu durum, temel modelin ve adaptör modelin üst üste binen bir bağlam üzerinde çalıştığı hedef kullanım senaryosunu karmaşıklaştırabilir. Bunu, adaptörü eğitmeye başlamadan önce temel modele eğitilebilir token'lar ekleyerek aşabilirsiniz.
Çağrı dizisi seçimi ve SFT tasarımı
alora_invocation_tokens dizisini otomatik olarak eklenmediği için eklemeniz gerekir. Model performansını, önbellek yeniden kullanımını zayıflatmadan en üst düzeye çıkarmak için, adaptör ağırlıklarının uzun girdilerden sonra ancak herhangi bir adaptöre özgü istemcilemenin başlangıcında etkinleştirilmesini öneririz. Herhangi bir modelde olduğu gibi, biçimlendirme eğitim ve test arasında tutarlı olmalıdır.
Aşağıdaki örneği ele alalım: temel modelin bir sohbet şablonu (chat template) vardır ve amaç, adaptörün (adapter) istenen bir çıktı üretmesini sağlamaktır.
- Seçenek 1: Göreve özgü bir istem yoksa, yani girdi
assistantistemine sahip bir sohbet geçmişi ise, sohbet şablonununassistantistemi (ör.<|start_of_role|>assistant<|end_of_role|>) çağrı dizgesi için doğal bir seçimdir. Modelin istemini bulmak için modelin sohbet şablonuna bakın. - Seçenek 2: Adaptörün öğrendiği görevi açıklayan, görev özel bir prompt varsa ve bu prompt, üretimden hemen önce bir
userturu olarak yerleştiriliyorsa, sohbet şablonununuserprompt'u (ör.<|start_of_role|>user<|end_of_role|>) çağrı dizgesi için doğal bir seçimdir.
Bir çağrı dizgesi belirledikten sonra, modelin tokenizer'ını alın ve alora_invocation_tokens'i şu şekilde elde edin
alora_invocation_tokens = tokenizer.encode(invocation_string, add_special_tokens=False).Örnek bir çıkarım kurulumu alora ince ayarı bölümünde yer almaktadır.
Çağrı dizgesi için özel dizeler kullanılıyorsa, sınırda tokenizasyon sorunlarını önlemek için dizgenin başlangıcının ve sonunun özel tokenlar olduğundan emin olun.
Nedenini görmek için, ‘a’, ‘b’, ‘c’ ve ‘ab’'nin tokenizörünüzdeki tokenlar olduğunu (sırasıyla 1, 2, 3, 4 numaralı) hayal edin. Diyelim ki alora_invocation_tokens = [2, 3]. Şimdi girdi dizinizin “abc” olduğunu varsayın. “ab” bir token olduğu için, bu dizi [4,3] olarak tokenize edilir. Bu nedenle, “bc” dizisi içinde bulunmasına rağmen alora_invocation_tokens bulunamaz. Ancak çağrı dizisinin başı ve sonu özel tokenlarsa, özel tokenlar asla diğer karakterlerle aynı tokena dönüştürülmediği için bu hata durumu asla yaşanmaz.
Üretim için önbelleğin (ve yeniden önbelleğin) kullanımı
aLoRA'nın ana amacı, temel model ile aLoRA adaptör modelleri arasındaki KV önbelleğinin çağrı dizisinden önce değiştirilebilir hale getirilmesidir; çünkü temel ve uyarlanmış KV değerleri uyumlu değildir. Özellikle, bir model üretimi sırasında saklanan anahtarlar ve değerler, bağlam jetonları için pahalı ön doldurma işlemlerinden kaçınmak amacıyla sonraki üretimlerde kullanılabilir. Temel model ile aLoRA adaptörleri arasında önbellek paylaşılırken 2 ana desen vardır:
- Temel model bir çıktı üretir ve ardından bir aLoRA adaptörü, devam eden bir üretim yapmak için çağrılır. Örneğin, temel model bir soruyu yanıtlar ve halüsinasyonları tespit etmeye yönelik eğitilmiş bir aLoRA, temel modelin yanıtını kontrol eder.
- Bir aLoRA adaptörü bir çıktı üretmiştir ve temel model veya farklı bir aLoRA adaptörü, orijinal aLoRA ile kısmi bağlam örtüşmesi olan bir devam üretimi için çağrılır. Örneğin, kullanıcı bir sorgu sağlar ve bir aLoRA, sorguyu daha kendi kendine yeterli hale getirmek ve bir RAG sisteminde geri getirmeyi (retrieval) iyileştirmek için yeniden yazar. Ardından, belgeler geri getirilir ve bağlama yüklenir, aLoRA bu belgelerin soruyla ilgili olup olmadığını kontrol eder ve ardından temel model bir yanıt üretir.
Önbellekleme kullanılırken yukarıdaki davranışları göstermek için transformers kütüphanesinden DynamicCache sınıfını kullanıyoruz. Uyarlanmış önbellek değerlerinin temel önbellek değerleriyle karışmamasına dikkat edin. Özellikle, kısmi bağlam örtüşmesi (2. desen) söz konusu olduğunda önbelleğin paylaşılması için ek bir adım gereklidir.
Desen 1: aLoRA'dan önce temel model Burada, temel modelin tüm girdisi ve üretimi, çağrı dizisiyle birlikte aLoRA adaptörüne girdi olarak verilir:
from transformers import DynamicCache
...
cache = DynamicCache()
inputs_base = tokenizer(prompt_base, return_tensors="pt")
# Generate from base model and save cache
with model_alora.disable_adapter():
output = model_alora.generate(inputs_base["input_ids"].to(device),attention_mask=inputs_base["attention_mask"].to(device),past_key_values = cache,return_dict_in_generate=True)
output_text_base = tokenizer.decode(output.sequences[0])
cache = output.past_key_values
# Generate with aLoRA adapter from cache
prompt_alora = output_text + INVOCATION_STRING
inputs_alora = tokenizer(prompt_alora, return_tensors="pt").to(device)
output = model_alora.generate(**inputs_alora, past_key_values=cache)
output_text_alora = tokenizer.decode(output[0])
# Note: cache is now tainted with adapter values and cannot be used in base model from here on!Desen 2: aLoRA üretimi, ardından kısmi bağlam örtüşmesine sahip temel model (veya başka bir aLoRA) Burada, paylaşılan bağlamı temel model kullanarak önceden dolduruyor ve ardından üretiyoruz.
from transformers import DynamicCache
import copy
...
cache = DynamicCache()
inputs_shared = tokenizer(prompt_shared, return_tensors="pt").to(device)
# Prefill from base model and save cache
with model_alora.disable_adapter():
with torch.no_grad():
model_alora(**inputs_shared, past_key_values=cache)
cache_copy = copy.deepcopy(cache)
# Generate from aLoRA using prefilled cache
prompt_alora = prompt_shared + INVOCATION_STRING
inputs_alora = tokenizer(prompt_alora, return_tensors="pt").to(device)
output = model_alora.generate(**inputs_alora, past_key_values=cache)
output_text_alora = tokenizer.decode(output[0])
# Generate from base model using saved cache not tainted by aLoRA KV values
prompt_base = prompt_shared
inputs_base = tokenizer(prompt_base, return_tensors="pt").to(device)
with model_alora.disable_adapter():
output = model_alora.generate(**inputs_base, past_key_values=cache_copy)
output_text_base = tokenizer.decode(output[0])Aynı batch içinde farklı LoRA adaptörleriyle çıkarım
Normalde, PEFT’te her çıkarım partisi aynı adaptör(ler)i kullanmak zorundadır. Bu bazen can sıkıcı olabilir, çünkü farklı LoRA adaptörleriyle kullanılacak örnekler içeren partilerimiz olabilir. Örneğin, İngilizcede iyi çalışan bir temel modele ve bir Fransızca, bir de Almanca için iki ek LoRA adaptöre sahip olabiliriz. Genellikle, partilerimizi her birinin yalnızca dillerden birinin örneklerini içerecek şekilde bölmek zorunda kalırız; farklı dilleri aynı partide birleştiremeyiz.
Neyse ki, adapter_name argümanını kullanarak farklı LoRA adaptörlerini aynı partide birleştirmek mümkündür. Aşağıda, bunun pratikte nasıl çalıştığını gösteren bir örnek sunuyoruz. Önce, temel modeli, İngilizceyi ve iki adaptörü (Fransızca ve Almanca) şu şekilde yükleyelim:
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
model_id = ...
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
# load the LoRA adapter for French
peft_model = PeftModel.from_pretrained(model, <path>, adapter_name="adapter_fr")
# next, load the LoRA adapter for German
peft_model.load_adapter(<path>, adapter_name="adapter_de")Şimdi, üç dilin de yer aldığı bir örnek üzerinde metin üretmek istiyoruz: İlk üç örnek İngilizce, sonraki üç örnek Fransızca ve son üç örnek Almancadır. Her örnek için hangi adaptörün kullanılacağını belirtmek için adapter_names argümanını kullanabiliriz. Temel modelimiz İngilizce için kullanıldığından, bu örnekler için "__base__" özel dizesini kullanıyoruz. Sonraki üç örnek için Fransızca LoRA ince ayarının adaptör adını, bu durumda "adapter_fr" olarak belirtiyoruz. Son üç örnek için ise Almanca LoRA ince ayarının adaptör adını, bu durumda "adapter_de" olarak belirtiyoruz. Bu sayede temel modeli ve iki adaptörü tek bir partide kullanabiliriz.
inputs = tokenizer(
[
"Hello, my dog is cute",
"Hello, my cat is awesome",
"Hello, my fish is great",
"Salut, mon chien est mignon",
"Salut, mon chat est génial",
"Salut, mon poisson est super",
"Hallo, mein Hund ist süß",
"Hallo, meine Katze ist toll",
"Hallo, mein Fisch ist großartig",
],
return_tensors="pt",
padding=True,
)
adapter_names = [
"__base__", "__base__", "__base__",
"adapter_fr", "adapter_fr", "adapter_fr",
"adapter_de", "adapter_de", "adapter_de",
]
output = peft_model.generate(**inputs, adapter_names=adapter_names, max_new_tokens=20)Burada sıranın önemi olmadığını, yani yukarıdaki örnekteki gibi batch içindeki örneklerin adapter'a göre gruplandırılmasının gerekmediğini belirtelim. Tek yapmamız gereken, adapter_names argümanının örneklerle doğru şekilde hizalanmasını sağlamaktır.
Ayrıca, aynı yaklaşım, sınıflandırma görevleri için özel başlıklar gibi belirli sinir ağı katmanlarının farklı LoRA adaptörleri arasında kaydedilip yeniden kullanılmasına olanak tanıyan modules_to_save özelliğiyle de çalışır.
Dikkat Edilmesi Gerekenler
Bu özelliğin kullanılması bazı dezavantajlar taşır, bunlar şunlardır:
- Sadece çıkarım için çalışır, eğitim için değil.
with model.disable_adapter()bağlamı kullanılarak adaptörlerin devre dışı bırakılması,adapter_namesparametresine göre önceliklidir.- Bazı adaptör ağırlıkları
merge_adapteryöntemi kullanılarak temel ağırlıklarla birleştirildiyseadapter_namesparametresini geçemezsiniz. Lütfen öncemodel.unmerge_adapter()çağrısını yaparak tüm adaptörleri birleştirmeden (unmerge) çıkarın. Dikkat edin,adapter_namesdışında yalnızca etkin adaptörlerin bir kısmını birleştirmek de benzer bir uyarı gerektirir. - Açık nedenlerle, bu,
merge_and_unload()çağrıldıktan sonra kullanılamaz; çünkü bu durumda tüm LoRA adaptörleri temel ağırlıklarla birleştirilir. - Bu özellik şu anda DoRA ile çalışmıyor, bu özelliği kullanmak istiyorsanız
LoraConfigiçindeuse_dora=Falseolarak ayarlayın. modules_to_saveözelliği şu anda yalnızcaLinear,Embedding,Conv2dveConv1dtüründeki katmanlar için desteklenmektedir.- Çıkarım için beklenen bir ek maliyet vardır
adapter_names, özellikle bir toplamdaki farklı adaptör sayısı yüksekse. Bunun nedeni, toplama boyutunun fiilen adaptör başına örnek sayısına indirgenmesidir. Çalışma zamanı performansı en önceliğinizse, şunları deneyin:- Toplu işlem boyutunu artırın.
- Aynı batch içinde çok sayıda farklı adapter bulunmasından kaçınmaya çalışın, homojen batch'leri tercih edin. Bu, aynı adapter'a sahip örnekleri tamponlamayla ve yalnızca küçük bir avuç farklı adapter ile çıkarım yaparak sağlanabilir.
- Farklı adaptörlerin büyük bir sayısıyla çalışmak üzere özel olarak tasarlanmış LoRAX, punica veya S-LoRA gibi alternatif uygulamalara göz atın.
LoRA Uyarlayıcılarını Birleştirme ve Yeniden Kullanma
Arrow
Arrow, Polytropon'a benzer şekilde belirli bir görevi çözmek için birden fazla önceden eğitilmiş, görev özelinde LoRA adaptörünü birleştirmek üzere tasarlanmış modüler bir yönlendirme algoritmasıdır; ancak ince ayar gerektirmez. Tüm adaptörleri körü körüne birleştirmek yerine Arrow, gradyansız, token bazlı uzman karışımı (MoE) yönlendirme mekanizmasını sunar. Çıkarım sırasında, her LoRA için SVD ayrıştırmasından en üst sağ tekil vektörü çıkararak bir prototip hesaplar. Ardından her token temsilinin bu prototiplerle kosinüs benzerliği üzerinden karşılaştırılmasıyla yönlendirme katsayıları elde edilir. Tokenlar, en alakalı üst-k LoRA adaptörüne atanır, katsayılar softmax ile normalize edilir ve çıktıları doğrusal olarak birleştirilir. Bu, mevcut LoRA modüllerinin yeni görevler için etkili bir şekilde yeniden kullanılmasını sağlar ve daha güçlü sıfır atış genelleme yeteneğine yol açar.
PEFT'te Arrow, [`ArrowConfig]andcreate_arrow_model. You can also configure parameters such astop_k(the number of LoRA adapters combined per token),router_temperature(the softmax temperature applied to the routing coefficients), andrng_seed` (for reproducibility).
from peft import create_arrow_model, ArrowConfig
from transformers import AutoModelForCausalLM
# Loading the model
base_model = AutoModelForCausalLM.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
# Creating the Arrow config
arrow_config = ArrowConfig(
top_k=3,
router_temperature=1.0,
rng_seed=42,
)
# The LoRA adapters below were trained on a clustered FLAN dataset.
# Task clustering was performed using the Model-Based Clustering (MBC) method,
# as described in the Arrow paper.
# While one could train a separate LoRA for each task and let Arrow route tokens among them,
# training LoRAs on clusters of tasks instead provides an indirect optimization for
# transfer across the multi-task dataset.
task_specific_adapter_paths = [
f"TahaBa/phi3-mini-clustered-flan/ts_expert_{i}" for i in range(10)
]
# Creating the Arrow model
model = create_arrow_model(
base_model=base_model,
task_specific_adapter_paths=task_specific_adapter_paths,
arrow_config=arrow_config,
)
# Now the forward path could be called on this model, like a normal PeftModel.Ayrıca, create_arrow_model çağrısından sonra adaptörler ekleyebilir veya kaldırabilirsiniz; örneğin yeni bir adaptör ince ayar yapmak veya gereksiz birini atmak için. Adaptörler yerleştirildikten sonra, Arrow kullanmak için çıkarım sırasında "arrow_router" bileşenini etkinleştirebilirsiniz. Dikkat edin, create_arrow_model sonrasında yeni bir LoRA adaptörü eklediyseniz ve bunu ince ayarlamak istiyorsanız, create_arrow_model içinde "arrow_router" varsayılan olarak etkinleştirildiğinden, yeni adaptörü açıkça etkin olarak belirlemeniz gerekir.
from trl import SFTTrainer, SFTConfig
# Adding a new adapter and activating it
model.add_adapter(adapter_name='new_adapter')
model.set_adapter('new_adapter')
# Now the model could be trained along the `new_adapter`.
trainer = SFTTrainer(
model=model,
args=SFTConfig(...),
...
)
# Once the training is done, you can activate `arrow_router` and use it in inference
model.set_adapter('arrow_router') # Model is ready to be used at inference time nowGenKnowSub
GenKnowSub, Arrow'u, yönlendirme öncesinde görev özel LoRA adaptörlerini arındırarak güçlendirir. Temel fikir, inkâr yoluyla unutma ilkesine dayalı olarak LoRA uzayında kodlanmış genel bilgiyi çıkarmaktır; böylece görev adaptörleri daha izole hale gelir ve görevle ilgili sinyallere odaklanır. Somut olarak GenKnowSub, genel (görev özel olmayan) bir LoRA adaptörü kümesinden düşük boyutlu bir “genel” alt uzay tahmin eder ve Arrow'un token bazlı yönlendirmesi öncesinde bu bileşeni her görev adaptörünün LoRA güncellemesinden çıkarır. Bu, genellikle birçok görev adaptörünün birleştirildiğinde kompozisyonelliği iyileştirir ve girişimi azaltır.
PEFT’de GenKnowSub’u etkinleştirmek için use_gks=True değerini ArrowConfig içinde ayarlayın ve create_arrow_model içinde general_adapter_paths parametresini sağlayın:
from peft import create_arrow_model, ArrowConfig
from transformers import AutoModelForCausalLM
# Loading the model
base_model = AutoModelForCausalLM.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
# Creating the Arrow config
arrow_config = ArrowConfig(
top_k=3,
router_temperature=1.0,
use_gks=True,
rng_seed=42,
)
# Path to task-specific, trained on flan clustered dataset (as we explained before.)
task_specific_adapter_paths = [
f"TahaBa/phi3-mini-clustered-flan/ts_expert_{i}" for i in range(10)
]
# These general adapters are trained on English, German, and French Wikipedia dataset,
# with causal language modelling objective, each pair like: (507 token tsentence, 5 token completion), and the loss computed on the completion
general_adapter_paths = [
"TahaBa/phi3-mini-general-adapters/cluster0_batch16_prop1.0_langen/checkpoint-17",
"TahaBa/phi3-mini-general-adapters/cluster0_batch16_prop1.0_langfr/checkpoint-35",
"TahaBa/phi3-mini-general-adapters/cluster0_batch16_prop1.0_langger/checkpoint-17"
]
# Creating the Arrow model
model = create_arrow_model(
base_model=base_model,
task_specific_adapter_paths=task_specific_adapter_paths,
general_adapter_paths=general_adapter_paths,
arrow_config=arrow_config,
)
# Now the forward path could be called on this model, like a normal PeftModel.Genel bilgiyi kodlamak için GenKnowSub, yönlendirme başlamadan önce, sağlanan genel adaptörlerin ortalamasını her görev özel adaptöründen bir kez çıkarır. Ayrıca, create_arrow_model çağrıldıktan sonra adaptör eklemenin veya kaldırmanın (Arrow bölümünde açıklandığı gibi) bu durumda da desteklenmeye devam ettiği unutulmamalıdır.
Arrow + GenKnowSub kullanırken dikkat edilmesi gerekenler:
Tüm LoRA adaptörleri (görev özel ve genel) aynı
rankvetarget_modulesdeğerlerini paylaşmalıdır.Bu ayarlar arasındaki herhangi bir tutarsızlık,
create_arrow_modeliçinde bir hata oluşturur.Görev adaptörleri arasında farklı ölçekleme faktörlerinin (
lora_alpha) kullanılması desteklenir — Arrow bunları otomatik olarak işler.Dinamik yönlendirme davranışı nedeniyle
"arrow_router"'ın birleştirilmesi desteklenmez.create_arrow_model içinde görev adaptörleri
task_iolarak, genel adaptörler isegks_jolarak yüklenir (buradaivejindekslerdir). İşlev,target_modules,rankve adaptörlerinLinearmı yoksaLinear4bitkatmanlarına mı uygulandığı tutarlılığını sağlar. Ardından"arrow_router"modülünü ekler ve etkinleştirir. Bu sürecin özelleştirilmesi,create_arrow_modelişlevinin yeniden tanımlanmasını gerektirir.Bu uygulama, 4-bit kuantizasyonla (bitsandbytes aracılığıyla) uyumludur:
from transformers import AutoModelForCausalLM, BitsAndBytesConfig import torch # Quantisation config bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=False, ) # Loading the model base_model = AutoModelForCausalLM.from_pretrained( "microsoft/Phi-3-mini-4k-instruct", dtype=torch.bfloat16, device_map="auto", quantization_config=bnb_config, ) # Now call create_arrow_model() as we explained before.
API
LoraConfig
sınıf peft.LoraConfig
< 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 = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonelora_alpha: int = 8lora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: Literal['none', 'all', 'lora_only'] = 'none'use_rslora: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_lora_weights: bool | Literal['gaussian', 'eva', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'corda', 'astra', 'loftq', 'orthogonal', 'mica', 'nora'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: Optional[dict] = <factory>alpha_pattern: Optional[dict] = <factory>megatron_config: Optional[dict] = Nonemegatron_core: Optional[str] = 'megatron.core'trainable_token_indices: Optional[Union[list[int], dict[str, list[int]]]] = Noneloftq_config: Union[LoftQConfig, dict] = <factory>eva_config: Optional[EvaConfig] = Nonecorda_config: Optional[CordaConfig] = Noneastra_config: Optional[AstraConfig] = Nonelora_ga_config: Optional[LoraGAConfig] = Noneuse_dora: bool = Falsevelora_config: Optional[Union[VeloraConfig, dict]] = Nonealora_invocation_tokens: Optional[list[int]] = Noneuse_qalora: bool = Falseqalora_group_size: int = 16monteclora_config: Optional[MontecloraConfig] = Nonelayer_replication: Optional[list[tuple[int, int]]] = Noneruntime_config: LoraRuntimeConfig = <factory>lora_bias: bool = Falsetarget_parameters: Optional[list[str]] = Noneuse_bdlora: Optional[BdLoraConfig] = Nonearrow_config: Optional[ArrowConfig] = Nonekasa_config: Optional[KasaConfig] = Noneensure_weight_tying: bool = False )
Parametreler
- r (
int) — Lora dikkat boyutu (“rank”). - target_modules (
Optional[Union[List[str], str]]) — Uyarlamanın (adapter) uygulanacağı modüllerin adları. Bu alan 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. 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. Bu alan ‘all-linear’ olarak belirtilirse, tüm linear/Conv1D modülleri seçilir (model bir PreTrainedModel ise, çıktı katmanı hariç tutulur). Bu alan belirtilmezse, modüller model mimarisine göre seçilir. Mimari bilinmiyorsa bir hata oluşturulur — bu durumda, hedef modülleri manuel olarak belirtmelisiniz. Hiçbir modülü hedef almamak için (yanitarget_parametersuygulamak istediğiniz için)target_modules=[]olarak ayarlayın. - 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. - lora_alpha (
int) — Lora ölçeklendirme için alfa parametresi. - lora_dropout (
float) — Lora katmanları için 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 saklayanConv1Dkullanır ve bu nedenle bu değerTrueolarak ayarlanmalıdır. - bias (
str) — LoRA için bias türü. ‘none’, ‘all’ veya ‘lora_only’ olabilir. ‘all’ veya ‘lora_only’ seçilirse, ilgili bias değerleri eğitim sırasında güncellenir. Bunun, adaptörler devre dışı bırakıldığında bile modelin, adaptasyon olmadan temel modelin üreteceğiyle aynı çıktıyı üretmeyeceği anlamına geldiğini unutmayın. - use_rslora (
bool) — True olarak ayarlandığında, daha iyi çalıştığı kanıtlandığı için adaptör ölçekleme katsayısınılora_alpha/math.sqrt(r)olarak ayarlayan Rank-Stabilized LoRA kullanılır. Aksi haldelora_alpha/rorijinal varsayılan değeri kullanılır. - modules_to_save (
List[str]) — Son kontrol noktasında kaydedilecek ve eğitilebilir olarak ayarlanacak, adaptör katmanları dışındaki modüllerin listesi. - init_lora_weights (
bool|Literal["gaussian", "eva", "olora", "pissa", "pissa_niter_[number of iters]", "corda", "astra", "loftq", "orthogonal", "mica", "nora"]) — Uyarlama katmanlarının ağırlıklarının nasıl başlatılacağı. True (varsayılan) geçirildiğinde, Microsoft'un referans uygulamasındaki varsayılan başlatma yapılır ve LoRA B ağırlığı 0 olarak ayarlanır. Bu, ek eğitim yapılmadığı sürece LoRA uyarlama biriminin hiçbir iş yapmadığı (no-op) anlamına gelir. Başlatma False olarak ayarlandığında, LoRA A ve B rastgele başlatılır; bu da eğitimden önce LoRA'nın no-op olmadığı anlamına gelir ve bu ayar hata ayıklama amaçlıdır. 'gaussian' geçirildiğinde, doğrusal ve katmanlar için LoRA rütbesine göre ölçeklendirilmiş Gauss başlatması yapılır. Pass'loftq'LoftQ başlatmasını kullanmak için.'eva'sonucunda Açıklanan Varyans Uyarlaması (Explained Variance Adaptation). EVA, katman giriş aktivasyonlarının SVD'sine dayalı olarak LoRA'yı başlatır ve ince ayar verilerine uyum sağlama yeteneği sayesinde SOTA performans elde eder. Pass'olora'OLoRA başlatmasını kullanmak için. Passing'pissa'sonucunda https://huggingface.co/papers/2404.02948’ Başlık Tekil Değerler ve Tekil Vektörler Uyarlaması (PiSSA) başlatması yapılır; bu yöntem LoRA'dan daha hızlı yakınsar ve nihayetinde üstün performans elde eder. Ayrıca PiSSA, QLoRA'ya kıyasla kuantizasyon hatasını azaltarak ek iyileştirmeler sağlar. 'pissa_niter_[number of iters]' geçirildiğinde, Fast-SVD tabanlı PiSSA başlatması başlatılır; burada [number of iters], FSVD için yapılacak alt uzay yinelemelerinin sayısını belirtir ve negatif olmayan bir tam sayı olmalıdır. [number of iters] 16 olarak ayarlandığında, 7B'lik bir modelin başlatması saniyeler içinde tamamlanabilir ve eğitim etkisi SVD kullanımıyla yaklaşık olarak eşdeğerdir. 'corda' geçirildiğinde, Instruction-Previewed Mode'da PiSSA'dan bile daha hızlı yakınsayan ve Knowledge-Preserved Mode'da LoRA'dan daha iyi dünya bilgisi koruyan Context-Oriented Decomposition Adaptation başlatması yapılır. 'astra' geçirildiğinde, taban ağırlığı küçük bir kalibrasyon veri setinden tahmin edilen çıktı aktivasyonlarının öz uzayına yansıtan Activation-Space Tail-Eigenvector Low-Rank Adaptation başlatması yapılır. "orthogonal" geçirildiğinde, LoRA A ve B dik (orthogonal) olarak başlatılır; bu, "olora"ya benzer ancak taban ağırlıkları değiştirilmez (r'nin çift olması gerekir, şu an için yalnızca doğrusal katmanlar desteklenir). "mica" geçirildiğinde, B'yi taban ağırlığın en küçük tekil değerlerle ilişkili r sol tekil vektörlerinden başlatan, A'yı sıfır olarak ayarlayan ve eğitim sırasında B'yi donduran (yalnızca A güncellenir) Minor Component Adaptation (MiCA) başlatması yapılır. Şu an için doğrusal ve gömme (embedding) katmanları desteklenir. "nora" geçirildiğinde, rastgele başlatılan LoRA A ağırlığının her sütununu birim L2 normuna normalize eden ve LoRA B ağırlığını sıfır olarak ayarlayan Normalized Low-Rank Adaptation (NoRA) başlatması yapılır. Normalizasyon yalnızca başlatma sırasında uygulanır; taban ağırlıkları değiştirilmez ve hem A hem de B eğitilebilir kalır. Önerilen ayar, 1:1 oranını ve 1 ölçekleme çarpanını koruyan lora_alpha'nın r'ye eşit olduğu ve use_rslora=False olduğu durumdur. Şu an için doğrusal katmanlar ve target_parameters ile hedeflenen nn.Parameters desteklenir.Principal Singular values and Singular vectors Adaptation (PiSSA), LoRA'dan daha hızlı yakınsayan ve nihayetinde üstün performans elde eden bir yöntemdir. Ayrıca PiSSA, QLoRA'ya kıyasla kuantizasyon hatasını azaltarak ek iyileştirmeler sağlar.
'pissa_niter_[number of iters]'parametresinin geçirilmesi, Fast-SVD tabanlı PiSSA başlatmasını başlatır; burada[number of iters], FSVD için gerçekleştirilecek alt uzay yinelemelerinin sayısını belirtir ve negatif olmayan bir tam sayı olmalıdır.[number of iters]16 olarak ayarlandığında, 7B'lik bir modelin başlatması saniyeler içinde tamamlanabilir ve eğitim etkisi SVD kullanımıyla yaklaşık olarak eşdeğerdir.'corda'parametresinin geçirilmesi, Context-Oriented Decomposition Adaptation başlatmasını sonuçlandırır; bu yöntem, Instruction-Previewed Mode'da PiSSA'dan bile daha hızlı yakınsar ve Knowledge-Preserved Mode'da LoRA'ya kıyasla dünya bilgisini daha iyi korur.'astra'parametresinin geçirilmesi, Activation-Space Tail-Eigenvector Low-Rank Adaptation başlatmasını sonuçlandırır; bu yöntem, taban ağırlığı, küçük bir kalibrasyon veri setinden tahmin edilen çıktı aktivasyonlarının öz uzayına yansıtır."orthogonal"parametresinin geçirilmesi, LoRA A ve B'nin ortogonal olarak başlatılmasını sağlar; bu,"olora"'ya benzer, ancak taban ağırlıkları değiştirilmez (r'in çift olması gerekir, şu an için yalnızca doğrusal katmanlar desteklenir)."mica"parametresinin geçirilmesi, Minor Component Adaptation (MiCA) başlatmasını sonuçlandırır; bu yöntem, B'yi taban ağırlığının en küçük öz değerleriyle ilişkili r sol öz vektörlerinden başlatır, A'yı sıfıra ayarlar ve eğitim sırasında B'yi dondurur; yalnızca A güncellenir. Şu an için doğrusal ve gömme katmanları desteklenir."nora"parametresinin geçirilmesi, Normalized Low-Rank Adaptation (NoRA) başlatmasını sonuçlandırır; bu yöntem, rastgele başlatılan LoRA A ağırlığının her sütununu birim L2 normuna normalize eder ve LoRA B ağırlığını sıfıra ayarlar. Normalizasyon yalnızca başlatma sırasında uygulanır; taban ağırlıkları değiştirilmez ve hem A hem de B eğitilebilir kalır. Önerilen ayar,lora_alpha'ınr'ye eşit olması veuse_rslora=Falseolmasıdır; bu, 1:1 oranını ve 1 ölçekleme çarpanını korur. Şu an için doğrusal katmanlar vetarget_parametersile hedeflenennn.Parameter'ler desteklenir. - 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. - rank_pattern (
dict) —rile belirtilen varsayılan rank'ten farklı rank'lara sahip katman adlarının veya regexp ifadelerinin eşlemesi. Örneğin,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}. - alpha_pattern (
dict) — Varsayılanlora_alphaile belirtilen alfa değerinden farklı olan alfaların, katman adlarına veya regexp ifadelere eşlenmesi. Örneğin,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}. - megatron_config (
Optional[dict]) — Megatron için TransformerConfig argümanları. LoRA’nın paralel lineer katmanını oluşturmak için kullanılır. Bunu şu şekilde alabilirsiniz:core_transformer_config_from_args(get_args()), bu iki fonksiyon Megatron’dan gelir. Argümanlar, Megatron’un TransformerConfig’ini başlatmak için kullanılacaktır. LoRA’yı megatron’un ColumnParallelLinear ve RowParallelLinear katmanlarına uygulamak istediğinizde bu parametreyi belirtmeniz gerekir. - megatron_core (
Optional[str]) — Kullanılacak Megatron çekirdek modülü, varsayılan olarak"megatron.core"'dir. - trainable_token_indices (
Optional[Union[List[int], dict[str, List[int]]]]) —peft.TrainableTokensModelyöntemiyle tüm gömme matrisinin yeniden eğitilmesini gerektirmeden, seçici olarak ince ayar yapmak istediğiniz token indekslerini belirtmenizi sağlar. Token indekslerini iki şekilde belirleyebilirsiniz. Ya, modelin giriş gömme katmanını (veya bulunamazsaembed_tokens) hedefleyen bir indeks listesi belirtirsiniz. Ya da, anahtarın gömme modülünün adı ve değerlerin token indeksleri listesi olduğu bir sözlük belirtirsiniz, örneğin{'embed_tokens': [0, 1, ...]}. FSDP ile eğitimin, düzensizrequires_gradsorunlarını önlemek içinuse_orig_params=Truegerektirdiğini unutmayın. - loftq_config (
Optional[LoftQConfig]) — LoftQ yapılandırması. Bu değer None değilse, LoftQ, omurga ağırlıklarını (backbone weights) nicelleştirmek (quantize) ve Lora katmanlarını başlatmak için kullanılacaktır. Ayrıcainit_lora_weights='loftq'parametresini de iletin. Bu durumda, LoftQ modelin kendisini nicelleştireceği için nicelleştirilmiş bir model iletmemeniz gerektiğini unutmayın. LoftQ yalnızca doğrusal katmanlara uygulanır; bunlar arasındatarget_parametersüzerinden hedeflenenler de dahildir. Gömme (embedding) ve konvolüsyonel katmanlar desteklenmez ve bunun yerine varsayılan LoRA başlatması kullanılır.nn.MultiheadAttentionkatmanları desteklenmez ve bir hata oluşturur. - eva_config (
Optional[EvaConfig]) — EVA yapılandırması. En azından dataset argümanının ayarlanması gerekir (ince ayarlama için kullanılan dataset ile aynı dataset kullanın). - corda_config (
Optional[CordaConfig]) — CorDA yapılandırması. Bu değer None değilse, CorDA, adapter katmanlarını oluşturmak için kullanılacaktır. Ayrıcainit_lora_weights='corda'parametresini de iletin. - astra_config (
Optional[AstraConfig]) — Astra yapılandırması. Bu değer None değilse, Astra, adaptör katmanlarını oluşturmak için kullanılacaktır. Ayrıca bu durumdainit_lora_weights='astra'parametresini de iletin veget_peft_modelçağrısından öncepreprocess_astraişlevini çağırın. - lora_ga_config (
Optional[LoraGAConfig]) — LoRA-GA yapılandırması. Bu değer iletildiğinde, adaptör katmanlarını başlatmak için LoRA-GA kullanılır. Bu durumda ayrıcainit_lora_weights='lora_ga'değerini de ayarlayın. - use_dora (
bool) — ‘Weight-Decomposed Low-Rank Adaptation’ (DoRA) özelliğini etkinleştirir. Bu teknik, ağırlık güncellemelerini büyüklük ve yön olmak üzere iki parçaya ayırır. Yön, normal LoRA tarafından ele alınırken, büyüklük ayrı bir öğrenilebilir parametre tarafından yönetilir. Bu, özellikle düşük ranklarda LoRA’nın performansını iyileştirebilir. Şu anda DoRA yalnızca linear ve Conv2D katmanlarını destekler. DoRA, saf LoRA’ya kıyasla daha büyük bir ek yük getirir, bu nedenle çıkarım için ağırlıkların birleştirilmesi önerilir. Daha fazla bilgi için bkz. https://huggingface.co/papers/2402.09353. - velora_config (
Optional[VeloraConfig]) — Bir VeloraConfig sağlayarak VeLoRA'yı etkinleştirir. VeLoRA, tam giriş aktivasyonları yerine sıkıştırılmış aktivasyonları saklayan özel bir geriye yayılım (backward pass) geçişi, LoRA A projeksiyonu için kullanılır. - kasa_config (
Optional[KasaConfig]) — KasaConfig sağlayarak KaSA'yı (Knowledge-aware Singular-value Adaptation) etkinleştirir. KaSA, dondurulmuş temel ağırlığınren küçük tekil bileşenlerini tek seferlik bir SVD ile kısaltır ve LoRA A ile B faktörleri arasında tekil değerlerden oluşan öğrenilebilir bir çapraz yerleştirir. Şu anda yalnızca doğrusal katmanlar desteklenmektedir. - alora_invocation_tokens (
List[int]) — None değilse, ‘Activated LoRA’ (aLoRA) etkinleştirilir ve alora_invocation_tokens, adaptörün tokenize edilmiş çağrı dizgesidir (tüm model girdi dizgilerinde bulunmalıdır). Bu teknik, adaptör ağırlıklarını yalnızca alora_invocation_tokens sırasında ve sonrasında gelen tokenlarda seçici olarak etkinleştirir. CausalLM içinde kullanıldığında, çağrıdan önceki KV önbelleğinin, baz modelin (ve bu şekilde çalışan diğer aLoRA adaptörlerinin) KV önbelleğiyle değiştirilebilir olduğu anlamına gelir. Sonuç olarak, baz model çıkarımı ile adaptör çıkarımı arasında geçiş içeren çıkarım hatlarında (ör. ajan tabanlı hatlar, örnekler için makaleye bakın), prefill işlemlerinin saklanması sayesinde (LoRA'ya kıyasla) önemli tasarruflar elde edilir. Paylaşılan bağlamın uzunluğuna bağlı olarak, vLLM üzerinde adaptör çıkarım hızında bir büyüklük mertebesi veya daha fazla hızlanma görülebilir. Not: Ağırlıkların seçici uygulanması nedeniyle birleştirme (merging) mümkün değildir. - use_qalora (
bool) — Şu an için yalnızca GPTQ'te uygulanmıştır. Quantization-Aware Low-Rank Adaptation (QALoRA) özelliğini etkinleştirir. Bu teknik, kuantize modellerin performansını artırmak için kuantizasyon farkında eğitimi LoRA ile birleştirir. Bu, özellikle düşük rütbeli durumlarda LoRA'nın performansını iyileştirebilir. Şu anda QALoRA yalnızca doğrusal katmanları destekler. - qalora_group_size (
int) — QALoRA birleştirme (pooling) işlemi için grup boyutu parametresi, boyut azaltma çarpanını kontrol eder. Girdi boyutları bu boyuttaki gruplara birleştirilerek hesaplama maliyeti düşürülür. Daha yüksek değerler daha fazla sıkıştırma sağlar ancak model kalitesini düşürebilir. Bu parametre, birleştirilmiş tek bir özellik oluşturmak için ortalama alınacak orijinal özellik sayısını belirler. Yalnızcause_qalora=Trueolduğunda kullanılır. - monteclora_config (
Optional[MontecloraConfig]) — Monteclora (Monte Carlo Low-Rank Adaptation) yapılandırması. Geçirildiğinde, Monteclora, LoRA adaptörlerinin üzerine varyasyonel Monte Carlo örneklemesi eklemek için kullanılacaktır. Bireysel hiperparametrelerle ilgili ayrıntılar içinMontecloraConfigsınıfına bakın. - layer_replication (
List[Tuple[int, int]]) — Belirtilen aralıklara göre orijinal model katmanlarını yığımlayarak yeni bir katman yığını oluşturun. Bu, temel model ağırlıklarını çoğaltmadan modeli genişletmeye (veya küçültmeye) olanak tanır. Yeni katmanların her birine ayrı LoRA adaptörleri bağlanacaktır. - runtime_config (
LoraRuntimeConfig) — Çalışma zamanı yapılandırmaları (kaydedilmez veya geri yüklenmez). - lora_bias (
bool) — Varsayılan değeriFalse'dir. LoRA B parametresi için sapma (bias) teriminin etkinleştirilip etkinleştirilmeyeceğini belirtir. Genellikle bu özellik devre dışı bırakılmalıdır. Bu parametrenin ana kullanım senaryosu, LoRA ağırlıklarının tamamen ince ayarlanmış parametrelerden çıkarılmış olması ve bu parametrelerin sapma değerlerinin dikkate alınabilmesidir. - target_parameters (
List[str], isteğe bağlı) — LoRA ile değiştirilecek parametre adlarının listesi. Bu argüman, parametre adının geçirilmesi gerektiği dışındatarget_modulesile benzer şekilde davranır. Genel olarak, modülü hedeflemek içintarget_moduleskullanmanız önerilir (ör.nn.Linear). Ancak bazı durumlarda bu mümkün değildir. Örneğin, HF Transformers'taki birçok mixture of expert (MoE) katmanında,nn.Linearyerine birnn.Parameterkullanılır. PEFT, LoRA için genellikleforwardmetodunu yazar, ancaknn.Parameteriçin böyle bir metot yoktur. Dolayısıyla, LoRA'nın bu parametreye uygulanabilmesi içintarget_parametersile hedeflenmesi gerekir. Örnek olarak, Llama4 için şunu geçebilirsiniz:target_parameters=['feed_forward.experts.gate_up_proj', 'feed_forward.experts.down_proj]. Regex eşleştirme için dize geçmek henüz uygulanmamıştır. Dikkat edin, model derlendiğinde vetarget_parameterskullanıldığında, yeniden derleme ve/veya grafik kırılmaları beklenir. İkisini aynı anda kullanmamanız önerilir. - use_bdlora (
Optional[BdLoraConfig]) — BdLoraConfig sağlayarak BD-LoRA (Block-Diagonal LoRA) etkinleştirilir. Bu teknik, dağıtık ortamlarda iletişim maliyetlerini ortadan kaldırarak daha hızlı çoklu-LoRA sunumu için LoRA-A veya LoRA-B faktörlerinde blok-çapraz matrisler kullanır. - arrow_config (
Optional[ArrowConfig]) — Modelde arrow yönlendirmesini uygulamak için gerekli yapılandırma. - ensure_weight_tying (
bool, isteğe bağlı) — peft başlatma işleminden sonra ağırlıkların bağlanıp bağlanmayacağı. Bu, bağlı katmanlara eklenen adaptörlerin de bağlı kalmasını sağlar. Bu özellik yalnızcamodules_to_savevetarget_modulesüzerinden geçirilen katmanlar için geçerlidir.
Bu, bir LoraModel yapılandırmasını depolamak için kullanılan yapılandırma sınıfıdır.
Uyarlama modelinizin yapılandırmasını bir sözlük olarak döndürür. Çalışma zamanı yapılandırmalarını kaldırır.
LoraModel
sınıf peft.LoraModel
< 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 (LoraConfig) — Lora 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
Lora modeli.
Önceden eğitilmiş bir transformers modelinden Low Rank Adapter (LoRA) modeli oluşturur.
Yöntem, https://huggingface.co/papers/2106.09685 adresinde ayrıntılı olarak açıklanmıştır.
Örnek:
>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import LoraConfig, get_peft_model
>>> config = LoraConfig(
... task_type="SEQ_2_SEQ_LM",
... r=8,
... lora_alpha=32,
... target_modules=["q", "v"],
... lora_dropout=0.01,
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> lora_model = get_peft_model(model, config)>>> import torch
>>> import transformers
>>> from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
>>> rank = ...
>>> target_modules = ["q_proj", "k_proj", "v_proj", "out_proj", "fc_in", "fc_out", "wte"]
>>> config = LoraConfig(
... r=4, lora_alpha=16, target_modules=target_modules, lora_dropout=0.1, bias="none", task_type="CAUSAL_LM"
... )
>>> quantization_config = transformers.BitsAndBytesConfig(load_in_8bit=True)
>>> tokenizer = transformers.AutoTokenizer.from_pretrained(
... "kakaobrain/kogpt",
... revision="KoGPT6B-ryan1.5b-float16", # or float32 version: revision=KoGPT6B-ryan1.5b
... bos_token="[BOS]",
... eos_token="[EOS]",
... unk_token="[UNK]",
... pad_token="[PAD]",
... mask_token="[MASK]",
... )
>>> model = transformers.GPTJForCausalLM.from_pretrained(
... "kakaobrain/kogpt",
... revision="KoGPT6B-ryan1.5b-float16", # or float32 version: revision=KoGPT6B-ryan1.5b
... pad_token_id=tokenizer.eos_token_id,
... use_cache=False,
... device_map={"": rank},
... torch_dtype=torch.float16,
... quantization_config=quantization_config,
... )
>>> model = prepare_model_for_kbit_training(model)
>>> lora_model = get_peft_model(model, config)Öznitelikler:
- model (PreTrainedModel) — Uyarlanacak model.
- peft_config (LoraConfig): Lora modelinin yapılandırması.
add_weighted_adapter
< source >( adapters: list[str]weights: list[float]adapter_name: strcombination_type: Literal['svd', 'linear', 'cat', 'ties', 'ties_svd', 'dare_ties', 'dare_linear', 'dare_ties_svd', 'dare_linear_svd', 'magnitude_prune', 'magnitude_prune_svd'] = 'svd'svd_rank: int | None = Nonesvd_clamp: int | None = Nonesvd_full_matrices: bool = Truesvd_driver: str | None = Nonedensity: float | None = Nonemajority_sign_method: Literal['total', 'frequency'] = 'total' )
Parametreler
- adapters (
list) — List of adapter names to be merged. - weights (
list) — List of weights for each adapter. Weights can be positive or negative, allowing for both addition and subtraction of adapter effects. - adapter_name (
str) — Yeni adaptörün adı. - combination_type (
str) — Birleştirme türü, [svd,linear,cat,ties,ties_svd,dare_ties,dare_linear,dare_ties_svd,dare_linear_svd,magnitude_prune,magnitude_prune_svd] değerlerinden biri olabilir.catcombination_type kullanıldığında, sonuç adaptörünün rütbesi, tüm adaptörlerin rütbe toplamına eşittir (karışık adaptör çok büyük olabilir ve OOM hatalarına yol açabilir).catvesvdhassas yöntemlerdir ve size iyi bir doğruluk sağlar;linearise verimlidir ancak çok kaba bir yaklaşımdır ve mümkünse kaçınılmalıdır. - svd_rank (
int, isteğe bağlı) — svd için çıktı adaptörünün rütbesi. None verilirse, birleştirilen adaptörlerin maksimum rütbesi kullanılır. - svd_clamp (
float, isteğe bağlı) — SVD ayrıştırma çıktısını sınırlamak için bir çeyreklik eşiği. None sağlanırsa sınırlama yapılmaz. Varsayılan değeri None'dir. - svd_full_matrices (
bool, isteğe bağlı) — Tam veya indirgenmiş SVD'nin hesaplanıp hesaplanmayacağını ve dolayısıyla döndürülen U ve Vh tensörlerinin şeklini kontrol eder. Varsayılan değeri True'dur. - svd_driver (
str, isteğe bağlı) — Kullanılacak cuSOLVER yönteminin adı. Bu anahtar kelime argümanı yalnızca CUDA üzerinde birleştirme yapılırken çalışır. [None,gesvd,gesvdj,gesvda] değerlerinden biri olabilir. Daha fazla bilgi içintorch.linalg.svdbelgelerine bakın. Varsayılan değeri None'dır. - density (
float, isteğe bağlı) — 0 ile 1 arasında bir değer. 0, tüm değerlerin budandığını; 1 ise hiçbir değerin budanmadığını ifade eder. [ties,ties_svd,dare_ties,dare_linear,dare_ties_svd,dare_linear_svd,magnintude_prune,magnitude_prune_svd] ile birlikte kullanılmalıdır. - majority_sign_method (
str) — İşaret değerlerinin büyüklüğünü almak için kullanılacak yöntem; [“total”, “frequency”] değerlerinden biri olmalıdır. [ties,ties_svd,dare_ties,dare_ties_svd] ile birlikte kullanılmalıdır.
Bu yöntem, verilen adaptörleri verilen ağırlıklarla birleştirerek yeni bir adaptör ekler.
cat combination_type kullanırken, sonuçta oluşan adaptörün rank değerinin tüm adaptörlerin rank değerlerinin toplamına eşit olacağını bilmelisiniz. Bu nedenle karışık adaptörün çok büyük hale gelmesi ve OOM hatalarına yol açması mümkündür.
subtract_mutated_init
< source >( output_state_dict: dict[str, torch.Tensor]adapter_name: strkwargs = None )
Bu fonksiyon, output_state_dict içindeki PiSSA/CorDA/OLoRA adaptörünün parametrelerini adapter_name içindeki PiSSA/CorDA/OLoRA başlangıç değerleriyle karşılaştırarak PiSSA/CorDA/OLoRA güncellemelerini hesaplayabilir ve böylece PiSSA/CorDA/OLoRA'yı LoRA'ya dönüştürebilir.
PiSSA gibi yöntemler, eğitim için modelin taban ağırlıklarının bir kısmını kaldırır ve bu nedenle kolayca değiştirilemezler. Ancak hem başlangıç ön-eğitim hem de eğitim sonrası ağırlıkları biliyorsanız, \Delta W değerini hesaplayıp bunu bir LoRA adaptörü olarak kullanabilirsiniz.
Hesaplama adımları:
- (PiSSA başlatma)
- (PiSSA eğitim sonrası)
- (LoRA için dW türetimi
Yardımcı
ArrowConfig
sınıf peft.ArrowConfig
< source >( top_k: int = 3router_temperature: float = 1.0use_gks: bool = Falserng_seed: Optional[int] = None )
Bu, Arrow ve GenKnowSub algoritması için yapılandırmayı depolamak üzere kullanılan alt yapılandırma sınıfıdır. Arrow, ’https://huggingface.co/papers/2405.11157’ makalesinde önerilen, yeni görevleri çözmek için eğitilmiş LoRA modüllerini birleştirmek üzere tasarlanmış bir yönlendirme algoritmasıdır. GenKnowSub ise Arrow aracılığıyla birleştirilmeden önce eğitilmiş modüller üzerinde yapılan bir iyileştirmedir ve ’https://aclanthology.org/2025.acl-short.54/’ makalesinde tanıtılmıştır.
LoftQ
replace_lora_weights_loftq
peft.replace_lora_weights_loftq
< source >( peft_modelmodel_path: Optional[str] = Noneadapter_name: str = 'default'callback: Optional[Callable[[torch.nn.Module, str], bool]] = None )
Parametreler
- peft_model (
PeftModel) — Ağırlıklarının değiştirileceği model. LoRA katmanlarına sahip, kuantize edilmiş bir PEFT modeli olmalıdır. - model_path (
Optional[str]) — Model safetensors dosyasının yolu. Model bir Hugging Face modeli ise bu, modelin config dosyasından çıkarılır. Aksi takdirde, bu yolun sağlanması gerekir. - adapter_name (
str) — Ağırlıkları değiştirilecek adaptörün adı. Varsayılan adaptör adı “default”tur. - callback (
Optional[Callable[[PeftModel, str], bool]]) — Her modül değiştirildikten sonra çağrılacak bir geri çağrı (callback) işlevi. Geri çağrı işlevi, girdi olarak modeli ve mevcut modülün adını almalı ve değiştirilmenin korunup korunmayacağını gösteren bir boole değer döndürmelidir. Geri çağrı False döndürürse, değiştirme işlemi geri alınır. Bu, LoftQ başlatılmasının modelin kuantizasyon hatasını gerçekten azalttığını doğrulamak için çok faydalı olabilir. Örnek olarak, bu geri çağrı, verilen girdi için logitler üretebilir ve bunları aynı girdiye sahip orijinal, kuantize edilmemiş modelin logitleriyle karşılaştırabilir ve yalnızca bir iyileşme varsaTruedöndürebilir. Bu, açgözlü bir optimizasyon olduğu için, bu işlevin birden fazla kez çağrılmasının kademeli iyileşmeler sağladığı görülebilir.
bitsandbytes ile kuantize edilmiş bir modelin LoRA ağırlıklarını, LoftQ tekniğini kullanarak değiştirin.
Değiştirme, yerel olarak saklanan safetensors model dosyasından kuantize edilmemiş ağırlıkların yüklenmesi ve orijinal ile kuantize edilmiş ağırlıklar arasındaki kuantizasyon hatasının en aza indirilmesini sağlayacak şekilde LoRA ağırlıklarının başlatılmasıyla anlık olarak yapılır.
Pickle ile tembel yükleme (lazy loading) mümkün olmadığından, normal PyTorch checkpoint dosyaları desteklenemez.
Model boyutuna bağlı olarak, bu fonksiyonu çağırmanın tamamlanması biraz zaman alabilir.
LoftQConfig
sınıf peft.LoftQConfig
< source >( loftq_bits: int = 4loftq_iter: int = 1 )
Bu, bir LoraModel yapılandırmasını depolamak için kullanılan alt yapılandırma sınıfıdır.
Eva
EvaConfig
sınıf peft.EvaConfig
< source >( rho: float = 2.0tau: float = 0.99use_label_mask: bool = Truelabel_mask_value: int = -100whiten: bool = Falseadjust_scaling_factors: bool = True )
Parametreler
- rho (
float) — EVA yeniden dağıtımı için Rho değeri (>= 1.0). Bir katman için maksimum rank, lora_r * rho'dur. Varsayılan değer 2.0'dır, bu da bir katman için izin verilen maksimum rank'ın 2r olduğu anlamına gelir. rho değerini artırmak, rank'ların katmanlar arasında daha yüksek bir derecede yeniden dağıtılmasına olanak tanır. Bazı önceden eğitilmiş modeller, rank yeniden dağıtımına karşı daha hassas olabilir. Bu nedenle, performans beklenenden düşükse rho=1.0 (yeniden dağıtım yok) denemek faydalı olabilir. - tau (
float) — Erken durdurma için kosinüs benzerliği eşiği. Ardışık iki SVD adımındaki sağ tekil vektörlerin kosinüs benzerliğini karşılaştırır. Kosinüs benzerliği bu eşiğin üzerindeyse SVD tekrarı durdurulur. Varsayılan değer 0.99'dur. - use_label_mask (
bool) — EVA başlatma işlemi için etiket maskesi kullanın. Bu, SVD hesabı için label=label_mask_value olan konumların yok sayıldığı anlamına gelir. Çoğu durumda use_label_mask=True olarak ayarlamak tercih edilir ve özellikle çok turlu sohbetler için son derece faydalı olabilir. Varsayılan değer True'dur. Etiket maskesine göre öğeleri filtrelemek bazen küçük bir parti boyutuna ve bunun sonucunda SVD hesabında kararsızlıklara yol açabilir. Parti öğelerinin büyük bir kısmının filtrelenmesi gereken durumlarda use_label_mask=False olarak ayarlayın. - label_mask_value (
int) — use_label_mask=True ise, yok sayılacak token'ları maskelemek için aranacak değer. Varsayılan değer -100'dür. - whiten (
bool) — Tekil vektörlere beyazlatma uygulayın. Varsayılan değer False'tur. Beyazlatmanın, EVA'nın görme alanında faydalı olduğu gösterilmiştir. - adjust_scaling_factors (
bool) — Rank yeniden dağıtımından sonra LoRA ölçekleme katsayılarını ayarlar. Bu değeri True olarak ayarlamak, ölçekleme katsayılarının tüm LoRA gradyanlarının rank'ından bağımsız olarak aynı ölçeğe sahip olmasını sağlayacak şekilde ayarlandığı anlamına gelir. Varsayılan değer True'dur.
Bu, EVA ile veri odaklı bir başlatma için yapılandırmayı depolamak üzere kullanılan alt yapılandırma sınıfıdır. EVA, Explained Variance Adaptation makalesinde tanıtılmıştır.
initialize_lora_eva_weights
peft.initialize_lora_eva_weights
< source >( model: Moduledataloader: collections.abc.Iterable | None = Noneeva_state_dict: dict | None = Noneforward_fn: collections.abc.Callable | None = <function forward_fn_dict at 0x7fadfac44d50>prepare_model_inputs_fn: collections.abc.Callable | None = <function prepare_model_inputs_fn_language_modeling at 0x7fadfac44b40>prepare_layer_inputs_fn: collections.abc.Callable | dict[str, collections.abc.Callable] | None = <function prepare_layer_inputs_fn_language_modeling at 0x7fadfac44ca0>adapter_name: str = 'default'gather_distributed_inputs: bool = Trueshow_progress_bar: bool = True ) → model (torch.nn.Module)
Parametreler
- model (PeftModel) — SVD'nin hesaplanacağı peft modeli.
- dataloader (Optional[Iterable]) — İleri geçiş için kullanılacak veri yükleyici. None ise, eva_state_dict sağlanmalıdır.
- eva_state_dict (Optional[dict]) —
Modelin içine yüklenecek state_dict. None ise, bir dataloader sağlanması gerekir ve state_dict
get_eva_state_dictkullanılarak hesaplanır. - forward_fn (Callable) —
İleri geçiş için kullanılacak ileri fonksiyon. İki argüman alır:
modelveinputs. Varsayılan davranışreturn model(**inputs)'tir - prepare_model_inputs_fn (Optional[Callable]) —
Bu fonksiyon, model girdilerini ve peft_config değerini alır ve çıktıyı
prepare_layer_inputs_fnfonksiyonuna iletir. Orijinal model girdilerine dayanarak SVD hesaplama girdisini değiştirmek için kullanılabilir. Örneğin dil modellemede, dikkat maskesi (attention mask) hangi indekslerin dolgu (padding) jetonları olduğunu ve SVD için kullanılmaması gerektiğini belirlemek için kullanılır. Burada tanımlanan herhangi bir fonksiyon iki argüman bekler:model_inputvepeft_config. Varsayılan olarakpeft.tuners.lora.eva.prepare_model_inputs_fn_language_modelingkullanılır. - prepare_layer_inputs_fn (Union[Callable, Dict[str, Callable], None]) —
Bu fonksiyon, katman girdilerini, model girdilerini (potansiyel olarak
prepare_model_inputs_fntarafından değiştirilmiş) ve katmanın adını alır ve o belirli katman için SVD kullanılmak üzere girdileri döndürür. Burada tanımlanan herhangi bir özel fonksiyon üç argüman bekler:layer_input,model_inputvelayer_nameve 2 boyutlu bir tensör döndürmelidir. Varsayılan mantık peft.tuners.lora.eva.prepare_layer_inputs_fn_language_modeling içinde bulunur ve dil modelleme için çalışır. Bu durumda model_inputs, SVD için hangi indekslerin kullanılacağını belirlemek için kullanılan maskedir (prepare_model_inputs_fn_language_modelingtarafından oluşturulur). - adapter_name (str) — Ağırlıkların başlatılacağı adaptörün adı.
- gather_distributed_inputs (bool) — Katman girdilerinin tüm ranklardan toplanıp toplanmayacağı. Varsayılan değer True'dur; dağıtık bir ortamda bu, SVD hesabı için katman girdilerinin tüm ranklardan toplanacağı anlamına gelir. Dağıtık olmayan ortamlarda bu argüman yok sayılır. Dağıtık bir ortamda dağıtık olmayan bir dataloader kullanıyorsanız bunu False olarak ayarlayın.
- show_progress_bar (bool) — İlerleme çubuğunun gösterilip gösterilmeyeceğini belirtir. Varsayılan değer True'dur.
Dönüş değeri
model (torch.nn.Module)
İlk değerleri atanmış LoRA ağırlıklarına sahip model.
LoRA katmanlarının ağırlıklarını EVA yöntemiyle başlatın.
Bu fonksiyon, LoRA katmanlarının ağırlıklarını EVA yöntemiyle başlatır. Her adaptör katmanı için SVD hesaplar ve ağırlıkları buna göre günceller.
get_eva_state_dict
peft.get_eva_state_dict
< source >( model: Moduledataloader: Iterablepeft_config: peft.tuners.lora.config.LoraConfig | None = Noneforward_fn: collections.abc.Callable | None = <function forward_fn_dict at 0x7fadfac44d50>prepare_model_inputs_fn: collections.abc.Callable | None = <function prepare_model_inputs_fn_language_modeling at 0x7fadfac44b40>prepare_layer_inputs_fn: collections.abc.Callable | dict[str, collections.abc.Callable] | None = <function prepare_layer_inputs_fn_language_modeling at 0x7fadfac44ca0>adapter_name: str = 'default'gather_distributed_inputs: bool = Trueshow_progress_bar: bool = True ) → eva_state_dict (dict)
Parametreler
- model (torch.nn.Module) — SVD'nin hesaplanacağı model. PeftModel olmak zorunda değildir.
- dataloader (Iterable) — İleri geçiş için kullanılacak veri yükleyici.
- peft_config (Optional[LoraConfig]) —
LoRA katmanları için yapılandırma.
modelbir PeftModel değilse yalnızca bu durumda gereklidir. - forward_fn (Callable) —
İleri geçiş için kullanılacak ileri fonksiyon. İki argüman alır:
modelveinputs. Varsayılan davranışreturn model(**inputs)'tir - prepare_model_inputs_fn (Optional[Callable]) —
Bu fonksiyon, model girdilerini ve peft_config değerini alır ve çıktıyı
prepare_layer_inputs_fnfonksiyonuna iletir. Orijinal model girdilerine dayanarak SVD hesaplama girdisini değiştirmek için kullanılabilir. Örneğin dil modellemede, dikkat maskesi (attention mask) hangi indekslerin dolgu (padding) jetonları olduğunu ve SVD için kullanılmaması gerektiğini belirlemek için kullanılır. Burada tanımlanan herhangi bir fonksiyon iki argüman bekler:model_inputvepeft_config. Varsayılan olarakpeft.tuners.lora.eva.prepare_model_inputs_fn_language_modelingkullanılır. - prepare_layer_inputs_fn (Union[Callable, Dict[str, Callable], None]) —
Bu fonksiyon, katman girdilerini, model girdilerini (potansiyel olarak
prepare_model_inputs_fntarafından değiştirilmiş) ve katmanın adını alır ve o belirli katman için SVD kullanılmak üzere girdileri döndürür. Burada tanımlanan herhangi bir özel fonksiyon üç argüman bekler:layer_input,model_inputvelayer_nameve 2 boyutlu bir tensör döndürmelidir. Varsayılan mantık peft.tuners.lora.eva.prepare_layer_inputs_fn_language_modeling içinde bulunur ve dil modelleme için çalışır. Bu durumda model_inputs, SVD için hangi indekslerin kullanılacağını belirlemek için kullanılan maskedir (prepare_model_inputs_fn_language_modelingtarafından oluşturulur). - adapter_name (str) — SVD'nin hesaplanacağı adaptörün adı.
- gather_distributed_inputs (bool) — Katman girdilerinin tüm ranklardan toplanıp toplanmayacağı. Varsayılan değer True'dur; dağıtık bir ortamda bu, SVD hesabı için katman girdilerinin tüm ranklardan toplanacağı anlamına gelir. Dağıtık olmayan ortamlarda bu argüman yok sayılır. Dağıtık bir ortamda dağıtık olmayan bir dataloader kullanıyorsanız bunu False olarak ayarlayın.
- show_progress_bar (bool) — İlerleme çubuğunun gösterilip gösterilmeyeceğini belirtir. Varsayılan değer True'dur.
Dönüş değeri
eva_state_dict (dict)
Her katman için SVD bileşenlerini içeren durum sözlüğü.
Modeldeki her katman için SVD'yi hesaplayın.
Bu fonksiyon, modeldeki her katman için Tek Değer Ayrıştırmayı (SVD) hesaplar. SVD bileşenlerini hesaplamak için artımlı PCA yöntemini kullanır. Fonksiyon, hesaplanan bileşenlerin yakınsamasını kosinüs benzerliği kullanarak da kontrol eder. Her katman için rütbe dağılımı, açıklanan varyans oranına göre belirlenir.
LoraGAConfig
sınıf peft.LoraGAConfig
< source >( direction: Literal['ArBr', 'A2rBr', 'ArB2r', 'random'] = 'ArB2r'scale: Literal['stable', 'weight_svd', 'gd_scale', 'unit'] = 'stable'stable_gamma: int = 16 )
Parametreler
- direction (
Literal["ArBr", "A2rBr", "ArB2r", "random"]) — Gradyan SVD bileşenlerinin lora_A ve lora_B matrislerine dağıtılması için strateji.- “ArBr”: Alternatif indeksler (A tek, B çift alır)
- “A2rBr”: A, [r:2r] indekslerini; B, [:r] indekslerini alır
- “ArB2r”: A, [:r] indekslerini alır, B ise [r:2r] indekslerini alır (önerilen)
- “random”: Endekslerin rastgele seçimi Varsayılan: “ArB2r”
- scale (
Literal["stable", "weight_svd", "gd_scale", "unit"]) — Adapter başlatma için ölçekleme stratejisi.- “stable”: gamma parametresi ile kararlı ölçekleme
- “weight_svd”: Ağırlık matrisinin tek değerlerine (singular values) dayalı ölçek
- “gd_scale”: Gradyan inişine dayalı ölçekleme
- “unit”: Ek ölçekleme yok Varsayılan: “stable”
- stable_gamma (
int) — Stabil ölçeklendirme yöntemi için Gamma parametresi. Varsayılan: 16
Bu, LoRA-GA başlatma yapılandırmasını depolamak için alt yapılandırma sınıfıdır.
LoRA-GA (Gradient Approximation ile Düşük Rütbeli Uyarlaması), başlangıçta gradyan bilgilerini kullanarak başlangıç adaptör ağırlıklarını tam ince ayar gradyanlarının yönüyle hizalar ve böylece daha hızlı yakınsama (2-4 kat hızlanma) sağlar.
Referans: https://arxiv.org/abs/2407.05000
Yardımcılar
peft.tuners.lora.loraga.estimate_gradients
< source >( model: Modulelora_config: LoraConfigtrain_step: Callable )
LoRA-GA başlatması için gradyanları tahmin edin.
Bu fonksiyon, gradyan hesaplamasını yalnızca hedef modül ağırlıklarında etkinleştirir ve train_step geri çağrılmasını çalıştırır. Bu, gradyanları küresel olarak etkinleştirmekten daha bellek verimlidir.
peft.preprocess_loraga
< source >( model: Modulelora_config: LoraConfigtrain_step: Callablecache_file: str | None = None )
Parametreler
- model (
nn.Module) — Model to preprocess. - lora_config (
LoraConfig) — Modelin Lora yapılandırması.lora_config.lora_ga_configayarlanmalıdır. - train_step (
Callable[[], None]) — Gradyan tahmini çalıştırmak için çağrılacak geri bildirim. Genellikle bu geri bildirimde modelin ileri ve geri geçişlerini çalıştırmalısınız. Gradyanlar, bu geri bildirim içindeki tüm çağrılar boyunca biriktirilir. - cache_file (
Optional[str]) — Gradyanları kaydetmek/yüklemek için isteğe bağlı önbellek dosyası yolu. Sağlanırsa ve dosya mevcutsa, gradyanlar önbellekten yüklenecektir. Aksi takdirde, gradyanlar tahmin edilecek ve bu yola kaydedilecektir.
…
Her doğrusal katman için, gradyanlar sağlanan train_step geri çağrılmasının çalıştırılmasıyla tahmin edilir. Bu gradyanlar daha sonra modüllere eklenir ve başlatma sırasında kullanılır.
Tamamlandığında, her hedef modül için aşağıdaki alanlar ayarlanır:
_peft_loraga_grad (torch.Tensor):
Ağırlık matrisi için birikimli gradyan.
İstirahat Boyut Azaltma
peft.tuners.lora.intruders.reduce_intruder_dimension
< source >( peft_modelold_adapter_name = 'default'new_adapter_name = 'intruder_reduced'top_k = 10threshold_epsilon = 0.5mitigation_lambda = 0.75logging_sink = <built-in function print> )
Parametreler
- peft_model —
old_adapter_nameiçinde belirtilen adla yüklü bir LoRA adaptöre sahip PEFT modeli. Şu anda karma modeller desteklenmemektedir. - top_k (varsayılan — 10) İstila eden algılama için en üst k boyutu dikkate alınır. Değer ne kadar büyükse, istila eden algılama analizinde o kadar çok boyut dikkate alınır (ve o kadar çok yanlış pozitif olabilir). Temel ağırlıklar ile adaptör ağırlıkları arasındaki kosinüs benzerliği üzerinde, boyutun etkisine göre yaklaşık olarak sıralanmış (tekil değer ayrıştırması tarafından belirlenen) bir şekilde çalışır, bu nedenle 10 olan bir top-k, en “önemli” 10 boyuta bakar.
- threshold_epsilon (varsayılan — 0.5) Temel ağırlık ile adaptör ağırlığı arasındaki kosinüs benzerliğinin istilacı olarak kabul edileceği eşik değeri. Makaleye göre, istilacı boyutlar, önceden eğitilmiş tekil vektörlerle neredeyse sıfıra yakın mutlak kosinüs benzerliği gösterir. Bu değer ne kadar düşükse, o kadar az potansiyel istilacı boyut tanımlanır. Değer ne kadar yüksekse, o kadar çok potansiyel yanlış pozitif, istilacı olarak değerlendirilir.
- mitigation_lambda (varsayılan — 0.75) Uygulayıcının (adapter) delta ağırlığından çıkarılan istilacı boyutların göreli oranı. Değer ne kadar yüksekse, istilacı boyutun o kadar büyük bir kısmı çıkarılır ancak o kadar çok bilgi kaybedilir. Takas (trade-off) analizi için makaledeki Şekil 8'e başvurun.
- logging_sink (varsayılan — print) Müdahale süreci hakkında bilgi yazdıran işlev. Hiçbir çıktı istemiyorsanız None olarak ayarlayın.
https://huggingface.co/papers/2410.21228 (“LoRA vs Full Fine-tuning: An Illusion of Equivalence”) makalesine dayalı istilacı boyut azaltma.
Bu yöntem, eğitilmiş düşük r'li adaptörlerin son işlenmesi yoluyla önceki bilgilerin kurtarılmasını (yani unutmanın azaltılmasını) sağlar. Bunun bir maliyeti vardır: görev doğruluğu düşer. migration_lambda değerini ayarlayarak bu iki faktör arasında denge kurulabilir.
Müdahale tamamlandıktan sonra, new_adapter_name içindeki adla adlandırılmış yeni bir adaptör oluşturulur ve bu adaptör aynı zamanda aktif adaptör olarak ayarlanır. Dolayısıyla müdahale edilmiş model üzerinde çıkarım, değiştirilmiş adaptörü kullanır. Orijinal adaptöre geri dönmek için peft_model.set_adapter(<old_adapter_name>) komutunu kullanabilirsiniz.
Şu anda bu yöntemin diğer delta-ağırlık yöntemlerine genelleştirilip genelleştirilemediği net olmadığından yalnızca LoRA desteklenmektedir.