PEFT documentation
Kartuşlar
Kartuşlar
Cartridges, parametrik bir KV-cache öneki olarak sıkıştırılmış uzun bağlam temsilini depolayan bir istem öğrenme yöntemidir. Temel fikir, Cartridges: Lightweight and general-purpose long context representations via self-study makalesinden gelir.
Yüksek düzeyde bir genel bakış ve motivasyon için Cartridges: Storing long contexts in tiny caches with self-study blog yazısına bakın.
Cartridges, Prefix Tuning'den Nasıl Farklıdır
Prefix Tuning ve Cartridges, past_key_values (bir önek KV önbelleği) taban modele enjekte edilerek sunulur.
- Prefix Tuning, sanal token gömme değerlerini (ve isteğe bağlı olarak bir MLP projeksiyonunu) öğrenir ve bir KV öneki üretir.
- Cartridge'lar, KV önekini doğrudan öğrenir (
psanal token için katman başına anahtar/değer vektörleri) ve gerçek prefill KV'den (örneğin, bir korpus/sistem isteminin ilkptoken'ı) başlatılmak üzere tasarlanmıştır.
Makale, istikrar için ilk token'ın dikkat çukuru (attention sink) olarak dondurulmasını da önerir (num_frozen_tokens=1 varsayılandır).
Kullanım (çıkarım)
Eğitilmiş bir CARTRIDGE adaptörünü yükleyin ve üretim çalıştırın:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
model_id = "Qwen/Qwen2.5-0.5B-Instruct"
adapter_path = "path/to/cartridge_adapter"
base = AutoModelForCausalLM.from_pretrained(model_id)
model = PeftModel.from_pretrained(base, adapter_path)
tok = AutoTokenizer.from_pretrained(model_id)
if tok.pad_token is None:
tok.pad_token = tok.eos_token
out = model.generate(**tok("Question about the corpus:", return_tensors="pt"), max_new_tokens=64)
print(tok.decode(out[0], skip_special_tokens=True))Eğitimden önce bir kartuş oluşturup başlatmanız gerekiyorsa, aşağıdaki başlatma seçeneklerine bakın.
Başlatma seçenekleri
Makale birkaç pratik başlatma stratejisini tartışır:
- Rastgele KV (varsayılan):
CartridgeConfigoluşturun ve eğitimi başlatın. Bu, KV önekini rastgele başlatır. - Bir istem/kurumun ilk token'larından KV:
initialize_kv_prefix_from_text(model, tokenizer, text=...)kullanın. Bu,textüzerinde bir prefill çalıştırır ve ilknum_virtual_tokensiçin oluşan KV önbelleğini adaptöre kopyalar. - Mevcut bir önbellekten KV: Temel modelin ön doldurma (prefill) işleminden zaten bir
past_key_valuesnesneniz varsa,initialize_kv_prefix_from_past_key_values(model, past_key_values=...)kullanın.
Eğitim
Cartridges makalesi, SELF-STUDY damıtma hedefini önermektedir (donmuş bir taban model öğretmen logitlerini sağlar; CARTRIDGE adaptörü, öğrencinin hedef segment üzerinde öğretmenin bir sonraki token dağılımıyla eşleşmesi için eğitilir).
PEFT, eğitim mantığını çekirdek kütüphanenin dışında tutar; referans iş akışı için https://github.com/huggingface/peft/tree/main/examples/cartridge_self_study adresine bakın.
Örnek betikler, donmuş taban modeli öğretmen ve uyarlanmış modeli öğrenci olarak kullandığından, her ikisi de aynı altta yatan checkpoint'i paylaşır.
Bileşim
Bağımsız olarak eğitilmiş kartuşları tek bir adaptöre birleştirmek için compose_cartridge_adapters(...) kullanın.
API
CartridgeConfig
sınıf peft.CartridgeConfig
< 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 = Falsenum_virtual_tokens: int = Nonetoken_dim: int = Nonenum_transformer_submodules: Optional[int] = Nonenum_attention_heads: Optional[int] = Nonenum_layers: Optional[int] = Nonemodules_to_save: Optional[list[str]] = Nonenum_frozen_tokens: int = 1 )
Parametreler
- num_frozen_tokens (
int, varsayılan 1) — Kartuşun başındaki, dondurulacak (gradyan alınmayacak) önek token sayısı. Cartridges makalesi, istikrar için ilk token'ın dikkat çukuru (attention sink) olarak dondurulmasını önerir (bunu1olarak ayarlayın), çünkü birçok LLM erken token'ları dikkat çukuru olarak kullanır ve bunların değiştirilmesi eğitimi olumsuz etkileyebilir.
KV önbelleği parametreli bir önek adaptörü olan CARTRIDGE için yapılandırma.
Bu, servis edilme biçimi açısından (bir past_key_values olarak) prefix-tuning'e benzer, ancak KV önbelleğini bir MLP projeksiyonu aracılığıyla öğrenmek yerine doğrudan eğitilebilir parametreler olarak saklar.
Başlatma: Cartridges makalesi birden fazla başlatma seçeneğini tartışır. PEFT'de başlatma, adaptör yapılandırmasını oluşturmaktan ayrı bir adımdır:
Rastgele KV başlatma (makale seçeneği 2):
get_peft_model(...)ile adaptörü oluşturun. CARTRIDGE istek kodlayıcı parametreleri PyTorch tarafından rastgele başlatılır.Bir istemin/kurpusun ilk tokenlarından türetilen KV (makale seçeneği 3): temel model üzerinde grad'sız bir prefill çalıştırın ve önbelleğe alınan ilk
num_virtual_tokensKV token'ını adaptöre kopyalayın. PEFT bunun için yardımcı araçlar sağlar (peftveyapeft.tuners.cartridge.utilsiçinden içe aktarılabilir):initialize_kv_prefix_from_text(model, tokenizer, text=...)initialize_kv_prefix_from_past_key_values(model, past_key_values=...)
Zaten düzleştirilmiş bir KV-önek tensörünüz varsa, bunu prompt kodlayıcısının
load_prompt_embeddings(...)yöntemi üzerinden doğrudan yükleyebilirsiniz.
CartridgeEncoder
Parametreli bir önek KV önbelleği.
Parametreler, PrefixEncoder çıktısıyla aynı düzleştirilmiş yerleşimde saklanır: `[num_virtual_tokens, num_layers
- 2 * token_dim]
, wheretoken_dimis per-head hidden size times number of heads (after any GQA adjustment performed by_prepare_prompt_learning_config`).
num_frozen_tokens > 0 ise, ilk num_frozen_tokens sanal token, eğitilemez bir parametre olarak saklanır ve kalan token'lar eğitilebilir.
PEFT tarafından kaydedilen düzleştirilmiş istek gömme değerlerini (prompt_embeddings) yükleyin.
PEFT, prompt-learning adaptörlerini tek bir prompt_embeddings tensörü olarak kaydeder. CARTRIDGE için bu tensörü, self.num_frozen_tokens değerine göre donmuş ve eğitilebilir segmentlere ayırırız.
initialize_kv_prefix_from_past_key_values
peft.initialize_kv_prefix_from_past_key_values
< source >( modeladapter_name: Optional[str] = Nonepast_key_values: Anynum_virtual_tokens: Optional[int] = None )
Mevcut önbelleğe alınmış bir önekten (past_key_values) KV-önek prompt-öğrenme adaptörünü başlatın.
Adaptöre yüklenen istek gömme tensörünü döndürür.
prompt_embeddings_from_past_key_values
peft.prompt_embeddings_from_past_key_values
< source >( past_key_values: Anynum_virtual_tokens: int )
Eski bir past_key_values önbelleğini, PEFT tarafından kaydedilen düzleştirilmiş istek gömme tensörüne dönüştürür.
Çıktı, önek tarzı istem öğrenimi için PeftModel.get_prompt() tarafından beklenen yerleşimle eşleşir: şekil [num_virtual_tokens, num_layers * 2 * token_dim].