PEFT documentation
ShadowPEFT
ShadowPEFT
ShadowPEFT, donmuş bir taban yalnızca-çözücü modeline, omurgayla paralel çalışan hafif, ön eğitilebilir bir gölge ağı ekler. Küçük bir gölge omurgası, başlangıç gölge durumu s^(0) üretir; bu durum daha sonra taban modelin çözücü döngüsünde ilerler: her hedeflenen blokta, taban gizli durumları ile gölge durumu arasındaki fark, blok girdisine geri enjekte edilir (düşük-ranklı bir düzeltme) ve gölge durumu, blok çıktısından hesaplanan kapılı bir artıklı güncelleme ile ileri taşınır. Yalnızca gölge bileşenleri eğitilir; taban model donmuş kalır.
Input
├──► Shadow backbone (small, trainable) ──► s^(0)
└──► Base model (frozen, large)
block_0 ◄── inject(h, s) ─► h_0 ──► update ─► s_1
block_1 ◄── inject(h, s) ─► h_1 ──► update ─► s_2
... (the (hidden, shadow) pair rides the loop together)Uyarlanma, katman uzayında girdiye bağlı bir yörünge (gölge durumu verilerle birlikte evrilir) olduğundan, statik bir ağırlık uzayı farkı değildir; bu nedenle ShadowPEFT taban ağırlıklarına birleştirilemez. merge, merge_adapter veya merge_and_unload çağrıldığında açık bir hata yükseltilir. Transformers dil modelleri için, hafif gölge ağını tek başına model.base_model.unload_shadow() ile elde edebilirsiniz; bu, bağımsız bir DetachedShadowModel döndürür. Diffusers modelleri için bağımsız boşaltma desteklenmez, çünkü tam bir gürültü azaltıcıyı yeniden oluşturmak mimariye özgüdür.
Birden çok adaptör eklemek, set_adapter ile aralarında geçiş yapmak, silmek ve etkinleştirme/devre dışı bırakma işlemleri, diğer PEFT yöntemlerinde olduğu gibi çalışır. Gölge durum, ağ üzerinden tek bir yörünge olduğu için aynı anda yalnızca bir adaptör etkin olabilir.
Gölge omurga, ShadowConfig.shadow_model tarafından kontrol edilen iki şekilde oluşturulabilir:
"mirror"(varsayılan): daha küçük bir gölge omurga otomatik olarak oluşturulur. Dil modelleri, temel mimarinin küçültülmüş bir kopyasını kullanır. Kayıtlı bir arka uca sahip Diffusers mimarileri, seçilen temel ağırlıklardan başlatılan, küçültülmüş bir benzer mimariye sahip model kullanır; arka ucu olmayan uyumlu mimariler ise token bazlı bir MLP'ye geri düşer. Gölge gizli boyutu temelden farklıysa, bu farkı köprüleyen eğitilmiş bir projeksiyon kullanılır.- bir model kimliği veya yerel yol: omurga, daha küçük bir önceden eğitilmiş model olarak yüklenir. Transformers modelleri
AutoModelkullanır; kayıtlı Diffusers arka uçları kendi uyumlu kontrol noktası yükleme işlemlerini tanımlar.
Mimariye duyarlı Diffusers desteği, model sınıfından otomatik olarak seçilir. Flux2 şu anda kayıtlı bir arka uca sahiptir; diğer uyumlu transformer tabanlı Diffusers modelleri genel MLP yedeğini kullanır. Tam bir denoiser'ın yeniden oluşturulması mimariye özgü olduğundan, bağımsız unload_shadow() tüm Diffusers modelleri için desteklenmemeye devam etmektedir.
LoRA tarzı yöntemlere kıyasla ShadowPEFT daha fazla parametre ve hesaplama ekler (paralel bir ağ çalıştırır ve tüm decoder bloklarını sarar), ancak adaptör, merkezi olarak eğitilebilen, görevler arasında yeniden kullanılabilen ve önceden eğitilmiş küçük bir modelden başlatılabilen kendi kendine yeten bir ağdır. İsteğe bağlı bir yardımcı kayıp (auxiliary_loss_weight), görev başlığını başlangıç gölge durumu s^(0) üzerine uygular ve görev kaybına ekler; bu da sökülebilir gölge yolunun görevi kendi başına çözmesini teşvik eder. Neden-sonuç LM için temel çıktı başlığı yeniden kullanılır; standart PEFT mekanizması üzerinden eğitip kaydetmek için "lm_head" öğesini modules_to_save içine dahil edin.
KV önbelleği
ShadowPEFT, dual KV önbelleği ile artımlı çözümlendirmeyi destekler: biri dondurulmuş temel model için, diğeri gölge omurga için. Enjekte/güncelle işlemleri token-yereldir, bu nedenle yeni bir token yalnızca kendi gölge durumu s değerine ihtiyaç duyar; nedensellik, önek temel anahtar/değerlerin (enjeksiyon altında hesaplanan) geçerli kalmasını sağlar. Eşleştirilmiş nesne ShadowCache'tir ve use_cache=True olduğunda past_key_values olarak döndürülür. generate() çağrısına use_cache=True parametresini normalde olduğu gibi iletebilirsiniz.
out = model.generate(input_ids, max_new_tokens=32) # dual KV cache enabled by default
# or explicitly:
out = model.generate(input_ids, use_cache=True, max_new_tokens=32)use_cache=False hâlâ çalışır ve her adımda tam diziyi yeniden işler (hata ayıklama için faydalıdır).
Kullanım
from transformers import AutoModelForCausalLM
from peft import ShadowConfig, get_peft_model
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B")
config = ShadowConfig(r=8, shadow_num_hidden_layers=1, task_type="CAUSAL_LM")
model = get_peft_model(model, config)
model.print_healthcheck()
out = model.generate(input_ids, max_new_tokens=32)Daha küçük bir önceden eğitilmiş modelden gölge omurgayı başlatmak için, kimliğini veya yolunu shadow_model olarak iletin:
config = ShadowConfig(shadow_model="Qwen/Qwen3-0.6B", task_type="CAUSAL_LM")
model = get_peft_model(base_model, config)Gölge yolunun değerlendirilmesi
Varsayılan olarak model çıktısı (logits), gölge uyumlu temel model'dir: gölge düzeltmeleri, her katmanda temel modelin gizli durumlarına enjekte edilir, bu nedenle logits zaten ShadowPEFT'yi yansıtır (karşılaştırma için düz temel modeli almak için model.disable_adapter() kullanın). Yardımcı kayıp, gölge yolunu görevi kendi başına çözmek için ayrıca eğitir.
Transformers dil modeli için bağımsız gölge ağını (ayrılabilir, hafif model — merge_and_unload'ın ShadowPEFT karşılığı) değerlendirmek için unload_shadow() kullanın. Bu yöntem, head(projection(backbone(x))) ifadesini, diğer herhangi bir model gibi değerlendirebileceğiniz normal bir görev modeli olarak döndürür: bir nedensel-LM görevi için üretim yeteneğine sahip bir nedensel LM'dir (generate() ve KV önbellekleme desteklenir) ve bir dizi sınıflandırma görevi için son token'ı havuzlar ve sınıf logitlerini döndürür. Bu yöntemin bir Diffusers modeli için çağrılması NotImplementedError hatası oluşturur.
shadow = model.base_model.unload_shadow() # a DetachedShadowModel (a PreTrainedModel)
shadow.eval()
# causal LM:
out = shadow.generate(input_ids, max_new_tokens=32)
# sequence classification:
logits = shadow(input_ids=input_ids, attention_mask=attention_mask).logits # (batch, num_labels)Varsayılan olarak (copy=False) döndürülen model, modüllerini PEFT modeliyle paylaşır ve dondurulmuş temel giriş gömme katmanlarını paylaşan bir gölge omurga, bunlara bir alt modül olmayan bir referans üzerinden erişir. Bu durum değerlendirme için uygundur, ancak save_pretrained'in gömme tablosu olmadan bir kontrol noktası yazacağı anlamına gelir. Bağımsız modeli kaydetmek veya göndermek istediğinizde copy=True parametresini iletin:
shadow = model.base_model.unload_shadow(copy=True)
shadow.save_pretrained("standalone-shadow")Karma performans değerlendirmesi genel bakış
API
ShadowConfig
sınıf peft.ShadowConfig
< 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 = Falsetarget_modules: list[str] | str | None = Noneexclude_modules: list[str] | str | None = Noner: int = 8shadow_alpha: float = 0.1shadow_dropout: float = 0.2init_weights: bool = Trueshadow_model: str = 'mirror'shadow_num_hidden_layers: int | None = Noneshadow_hidden_size: int | None = Noneshadow_num_attention_heads: int | None = Noneshadow_intermediate_size: int | None = Noneshare_embeddings: bool = Trueupdate_hidden_size: int | None = Noneauxiliary_loss_weight: float = 0.05layers_to_transform: list[int] | int | None = Nonelayers_pattern: list[str] | str | None = Nonemodules_to_save: list[str] | None = None )
Parametreler
- target_modules (
Optional[Union[list[str], str]]) — Gölge mekanizmasıyla sarılacak transformer blokları (doğrusal katmanlar değil, tüm decoder blokları). Modül adlarının bir listesi veya bir regex olabilir, örneğin her decoder bloğunu hedeflemek içinr'.*\.layers\.\d+$'. Varsayılan değeriNone'dir; bu durumda temel modelin tüm decoder blokları sarılır. Sarılan blokların ardışık olması gerektiğini unutmayın, çünkü gölge durumu, ilk sarılan bloktan son sarılan bloğa kadar decoder döngüsü boyunca taşınır. - exclude_modules (
Optional[Union[list[str], str]]) — Gölge mekanizması ile sarılmaması istenen modüllerin adları, bir liste veya regex olarak verilir. Varsayılan değerNone'dir. - r (
int) — Düşük ranlı enjeksiyon darboğazınınW_down/W_uprütbesi. Varsayılan değeri8'dir. - shadow_alpha (
float) — Blok girdisine eklenen enjekte edilen düzeltmenin gücü (Denklem 4). Varsayılan değeri0.1'dir. - shadow_dropout (
float) — Bottleneck'ten (Denklem 3) önce uyumsuzluk sinyaline uygulanan dropout olasılığı. Varsayılan değeri0.2'dir. - init_weights (
bool) — Eğitimin başlangıcında enjeksiyonun bir işe yaramaz (no-op) olması içinW_up'ın sıfır ile başlatılıp başlatılmayacağını belirtir (LoRA'nınB=0sözleşmesini yansıtır). Ne yaptığınızı biliyorsanız bu değeri değiştirmeyin. Varsayılan değerTrue'dur. - shadow_model (
str) — Gölge omurganın (shadow backbone) nasıl inşa edileceğini belirtir."mirror"(varsayılan), taban modelle aynı mimariye sahip ancak daha az/küçük katmanlara sahip taze bir omurga oluşturur (aşağıdakishadow_*geçersiz kılma ayarlarına bakın). Kayıtlı bir Shadow backend kullanan Diffusers mimarileri, azaltılmış bir benzer mimari model kullanır; diğer uyumlu difüzyon dönüştürücüler (diffusion transformers) genel bir token-bazlı MLP'ye geri düşer. Herhangi bir başka dize, bir model kimliği veya yerel yol olarak ele alınır. “projected” Transformers gölge kontrol noktası (model_type == "causal_lm_with_hidden_projection", örn.shadow-llm/Qwen3-0.6B-H8B), önceden eğitilmiş omurgasını, eğitilmiş gölge-gizli (shadow-hidden) -> taban-gizli (base-hidden) projeksiyonu ile birlikte yükler. Açık Diffusers kontrol noktaları kayıtlı bir backend gerektirir; şu anda Flux2 desteklenmektedir. - shadow_num_hidden_layers (
Optional[int]) — Otomatik oluşturulan ("mirror") gölge omurganın derinliği. Flux2 için bu, istenen sayıda çift akış bloğu ve bunun iki katı kadar tek akış bloğu oluşturur; genel Diffusers yedeği için ise kalıntı MLP bloklarının sayısıdır. Varsayılan değeriNone(1katmandır). - shadow_hidden_size (
Optional[int]) — Otomatik oluşturulan gölge omurganın gizli boyutu; taban gizli boyutundan farklı olabilir (bir projeksiyon otomatik olarak eklenir). Mimari arka uçları ek kısıtlamalar getirebilir; Flux2 indirgeleri, taban dikkat başı boyutunu korumak zorundadır. Varsayılan değerNone'dir (taban modelle aynı). - shadow_num_attention_heads (
Optional[int]) — Otomatik oluşturulan gölge omurganın dikkat baş sayısı. Varsayılan değeriNone'dir (temel modelle aynı). Bu seçenek, mimariye duyarlı arka uçlar tarafından kullanılır ancak genel Diffusers MLP yedeği tarafından kullanılmaz. - shadow_intermediate_size (
Optional[int]) — Otomatik oluşturulan gölge omurganın ileri besleme genişliği. Varsayılan olarakNone'dir (genel Diffusers MLP yedeği için gizli boyutuyla aynıdır). - share_embeddings (
bool) — Gölge omurgaya (shadow backbone) kendi gömme tablosu yerine dondurulmuş temel giriş gömmelerini (frozen base input embeddings) (inputs_embedsüzerinden) beslemek için yeniden kullanılacak mı? Varsayılan değerTrue'dür. - update_hidden_size (
Optional[int]) —T(aday) veG(kapı) güncelleme MLP'lerinin gizli genişliği. Varsayılan olarakNone(rkullanılır). - auxiliary_loss_weight (
float) —labelsgeçirildiğinde görev kaybına eklenen yardımcı gölge kaybının (Denklem 8-9)lambdaağırlığı. Difüzion eğitim döngüleri, ayrılmış gürültü giderme kaybı için aynı değeri kullanabilir. Devre dışı bırakmak için0olarak ayarlayın. Varsayılan değer0.05'tir. - layers_to_transform (
Optional[Union[list[int], int]]) — Dönüştürülecek blok indeksleri. Bir liste geçirilirse, gölge mekanizması bu indekslerdeki bloklara uygulanır. Tek bir tamsayı geçirilirse, yalnızca o indekse uygulanır. Varsayılan değerNone'dir (eşleşen her blok dönüştürülür). - layers_pattern (
Optional[Union[list[str], str]]) — Katman deseninin adı, yalnızcalayers_to_transformNone'den farklıysa kullanılır. Bu, decoder bloklarını tutannn.ModuleList'in adıdır (genellikle"layers"veya"h"). Varsayılan değeriNone'dir. - modules_to_save (
Optional[list[str]]) — Son checkpoint'te eğitilebilir olarak ayarlanacak ve kaydedilecek ek modüller (ör."lm_head"veya bir sınıflandırıcı başlığı). Varsayılan değeriNone'dir.
ShadowModel (ShadowPEFT) için yapılandırma sınıfı.
ShadowPEFT, donmuş bir taban yalnızca-çözücü modelini küçük, eğitilebilir paralel bir gölge ağı ile güçlendirir. Gölge omurga, başlangıçta bir gölge durumu s^(0) üretir ve bu durum taban modelin çözücü döngüsünde ilerler: her hedeflenen blokta, taban gizli durumları ile gölge durumu arasındaki fark, blok girdisine geri enjekte edilir (Denk. 2-4) ve gölge durumu, blok çıktısından gelen kapılı bir artıklı güncelleme ile ileri taşınır (Denk. 5-7). Yalnızca gölge bileşenleri eğitilir; taban model donmuş kalır. Uyarlanma, katman uzayında statik bir ağırlık farkı yerine girdiye bağımlı bir yörünge olduğu için ShadowPEFT, taban ağırlıklarına birleştirilemez.
ShadowModel
sınıf peft.ShadowModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )
Önceden eğitilmiş bir transformers modelinden bir ShadowPEFT modeli oluşturur.
ShadowPEFT, donmuş bir taban yalnızca-çözücü modelini küçük, eğitilebilir paralel bir gölge ağıyla güçlendirir. Gölge omurga, taban çözücü döngüsünde ilerleyen başlangıç bir gölge durumu üretir; her hedeflenen blokta, taban gizli durumları ile gölge durumu arasındaki fark bloğa enjekte edilir ve gölge durumu, kapılı bir artıklı güncelleme ile ileri taşınır. Yalnızca gölge bileşenleri eğitilir. Yapılandırma için ShadowConfig'e bakın.
Yöntem, temel ağırlıklara birleştirilemez (uyarlama, statik bir ağırlık farkı değil, girdiye bağımlı bir yörüngedir); bunun yerine bağımsız gölge ağını elde etmek için ShadowModel.unload_shadow() kullanın.
Gölge yolunun kendi görev kaybı, CE(shadow_head(s^(0)), labels) (ağırlıksız; forward ağırlığı uygular).
Kayıp, başlangıç gölge durumu s^(0) üzerinde (gölgelenmiş omurga çıktısı, projeksiyon uygulanmış) hesaplanır — tam olarak bağımsız unload_shadow() modelinin head(projection(backbone(x))) olarak hesapladığı şeydir. Bu, ayrılmış gölge ağının kendi başına kullanılabilir olmasını sağlar; onu s^(L) üzerinde (taban modelin katman başına çıktılara bağımlı olan ve bağımsız olarak var olmayan son durum) eğitmek, ayrılmış modelin eğitilmemiş kalmasına yol açardı.
unload_shadow
< source >( adapter_name: str | None = Nonecopy: bool = False )
Parametreler
- adapter_name (
str, isteğe bağlı) — Gölge ağı boşaltılacak adaptör. Varsayılan olarak etkin adaptördür. - copy (
bool, isteğe bağlı, varsayılanFalse) —Trueise, döndürülen modelin bu modelden bağımsız olması için derin kopya alınır (daha fazla bellek kullanır).False(varsayılan) ise modüller paylaşılır — modülleri klonlamak yerine yeniden kullananmerge_and_unloadile benzerdir. Bir modelde yapılan değişiklik diğerini de etkiler.
Gölge omurgayı (+ başı), temel model olmadan bağımsız bir model olarak döndürür.
merge_and_unload işlevinin ShadowPEFT karşılığı: o işlev, adaptasyonu içine işlenmiş temel modeli geri döndürürken, bu işlev yalnızca yüksek verimlilikli / kenar (edge) çıkarımı için hafif gölge ağını geri döndürür. head(projection(backbone(x))) ifadesini çalıştırır — blok başına güncellemeler temel çıktıları gerektirdiğinden bağımsız olarak var olamazlar. Dil modelleri için sonuç, normal bir nedensel dil modeli gibi davranır (generate() ve KV önbellekleme desteklenir). Diffusers modelleri desteklenmez, çünkü tam bağımsız bir gürültü azaltıcı (denoiser) yeniden oluşturmak her difüzyon mimarisine özgüdür.
Sonucu bir değişkene atayın ve kullanın; copy=False ile modüller bu modelle paylaşılmaya devam eder.
Bağımsız modeli save_pretrained ile kaydetmeyi planlıyorsanız copy=True parametresini geçirin. Donmuş taban giriş gömme katmanlarını paylaşan bir gölge omurga (varsayılan "mirror" kurulumu), bu katmanlara, döndürülen modelin bir alt modülü olmayan bir referans üzerinden erişir; bu nedenle copy=False ile oluşturulan bir kontrol noktasında gömme tablosu eksik kalır. copy=True ise özel bir kopyayı yeniden bağlar ve eksiksiz bir kontrol noktası kaydeder.
ShadowCache
Artımlı ShadowPEFT çözümleme için eşlenmiş KV önbellekleri.
Otomatik regresif üretim, bir taban model önbelleği (gölge enjeksiyonu altında hesaplanan anahtarlar/değerler) ve ayrı bir gölge model önbelleği (s^(0) token'larını tek tek ilerletmek için) gerektirir. Bu, bir Transformers Cache alt sınıfıdır: parti veya dizi yerleşimini etkileyen işlemler (sıfırlama, yeniden sıralama, kırpma, tekrarlama ve seçme) her iki önbelleğe de uygulanırken, dikkat meta verileri ve güncellemeler taban önbelleğe devredilir. Bilinmeyen önbellek öznitelikleri de, mimariye özgü önbellek uygulamalarıyla uyumluluk için taban önbelleğe devredilir.
Wrapper, iki önbelleğin farklı katman yerleşimleri ve gizli boyutlara sahip olabileceği için bilinçli olarak derlenebilir değildir. Tek bir legacy tuple her iki yolu da temsil edemediğinden, legacy tuple dönüşümü desteklenmez. Gölge yarısı, taban forward'den önce açılır ve çıkışta yeniden paketlenir — bkz. ShadowModel kancaları.