PEFT documentation
الخرطوش
الخرطوش
تُعدّ الكرتريدجات (Cartridges) طريقة لتعلم الأوامر (prompt-learning) تخزّن تمثيلاً مضغوطاً للسياق الطويل كبادئة (prefix) لمخزن KV-cache مُعاملات (parameterized). تستمد الفكرة الأساسية من ورقة Cartridges: Lightweight and general-purpose long context representations via self-study.
لمراجعة عامة على مستوى عالٍ وللمعرفة بدوافع هذا النهج، راجع منشور المدونة Cartridges: Storing long contexts in tiny caches with self-study.
كيف تختلف الكراتريدج عن ضبط البادئة
يتم تقديم كل من Prefix Tuning و Cartridges عن طريق حقن past_key_values (ذاكرة تخزين KV بادئة) في النموذج الأساسي.
- يتعلّم Prefix Tuning تضمينات الرموز الافتراضية (وإسقاط MLP اختياريًا) وينتج بادئة KV.
- تتعلم الخرطوشات بادئة KV نفسها مباشرةً (متجهات المفتاح/القيمة لكل طبقة لـ
pرموز افتراضية)، وهي مصممة لتُهيأ من بادئة KV حقيقية (على سبيل المثال، أولpرموز من مجموعة بيانات/موجّه نظام).
توصي الورقة أيضاً بتجميد الرمز الأول كحوض انتباه من أجل الاستقرار (الافتراضي هو num_frozen_tokens=1).
الاستخدام (الاستدلال)
I cannot translate this text because it is not a block of a web page in the specified light markup format. It is a plain sentence. Please provide the text with the appropriate tags (e.g., , ) so I can translate it according to your instructions.
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))إذا كنت بحاجة إلى إنشاء cartridge وتهيئته قبل التدريب، فراجع خيارات التهيئة أدناه.
خيارات التهيئة
تناقش الورقة بعض استراتيجيات التهيئة العملية:
- KV عشوائي (الافتراضي): أنشئ
CartridgeConfigوابدأ التدريب. يقوم هذا بتبديل بادئة KV بشكل عشوائي. - KV من الرموز الأولى في الموجه/المجموعة: استخدم
initialize_kv_prefix_from_text(model, tokenizer, text=...). يؤدي هذا إلى تنفيذ prefill علىtextثم نسخ ذاكرة KV الناتجة لأولnum_virtual_tokensإلى المُكيّف. - KV من ذاكرة مؤقتة موجودة مسبقًا: استخدم
initialize_kv_prefix_from_past_key_values(model, past_key_values=...)إذا كان لديك بالفعل كائنpast_key_valuesمن عملية التعبئة المسبقة لنموذج أساسي.
التدريب
تقترح ورقة Cartridges هدف تقطير ذاتي التعلّم (حيث يوفر النموذج الأساسي المجمّد قيم التنبؤات التعليمية، ويُدرَّب مُكيّف CARTRIDGE بحيث يطابق النموذج الطالب توزيع الرمز التالي للمعلم على المقطع المستهدف).
يُبقي PEFT منطق التدريب خارج المكتبة الأساسية؛ راجع https://github.com/huggingface/peft/tree/main/examples/cartridge_self_study للحصول على سير عمل مرجعي.
تستخدم سكربتات المثال النموذج الأساسي المجمّد كمعلم والنموذج المُكيّف كطالب، لذا يتشاركان نفس نقطة الفحص الأساسية.
التركيب
لدمج الوحدات المستقلة المدربة في مُكيّف واحد، استخدم compose_cartridge_adapters(...).
واجهة برمجة التطبيقات
CartridgeConfig
فئة 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 )
المعاملات
- num_frozen_tokens (
int، القيمة الافتراضية 1) — عدد رموز البداية في بداية الخراطوش التي يجب إبقاؤها مجمّدة (بدون تدرّجات). يوصي مقال Cartridges بتجميد الرمز الأول كحوض انتباه من أجل الاستقرار (اضبط هذا على1)، إذ تستخدم العديد من نماذج اللغة الكبيرة الرموز المبكرة كحواضن انتباه، وقد يؤدي تغييرها إلى الإضرار بالتدريب.
إعدادات CARTRIDGE، وهو مُكيّف بادئة مُعتمد على معاملات ذاكرة KV.
يُشبه هذا الأسلوب طريقة التقديم في prefix-tuning (حيث يُقدَّم على شكل past_key_values)، لكنه يخزّن ذاكرة KV مباشرةً كمعاملات قابلة للتدريب بدلاً من تعلّمها عبر إسقاط MLP.
التهيئة: يتناول مقال Cartridges عدة خيارات للتهيئة. في PEFT، تُعدّ التهيئة خطوة منفصلة عن إنشاء إعداد المُكيّف:
تهيئة عشوائية لـ KV (الخيار 2 في الورقة): أنشئ المُكيّف عبر
get_peft_model(...). يتم تهيئة معاملات مُشفّر المُوجّه الخاص بـ CARTRIDGE بشكل عشوائي بواسطة PyTorch.مشتقات KV من الرموز الأولى في الموجه/المجموعة (الخيار 3 في الورقة): نفّذ عملية تعبئة مسبقة بدون تدرّج على النموذج الأساسي وانسخ أول
num_virtual_tokensمن رموز KV المخزّنة المؤقتًا إلى المُكيّف. يوفر PEFT أدوات لهذا الغرض (قابلة للاستيراد منpeftأو منpeft.tuners.cartridge.utils):initialize_kv_prefix_from_text(model, tokenizer, text=...)initialize_kv_prefix_from_past_key_values(model, past_key_values=...)
إذا كان لديك بالفعل متجه KV-prefix مسطّح، يمكنك تحميله مباشرةً عبر طريقة
load_prompt_embeddings(...)الخاصة بترميز الموجه.
CartridgeEncoder
ذاكرة تخزين KV بادئة مُعتمدة على المعلمات.
تُخزَّن المعاملات في نفس التخطيط المسطّح كإخراج PrefixEncoder: `[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، تُخزَّن الرموز الافتراضية الأولى num_frozen_tokens كمعامل غير قابل للتدريب، بينما تكون الرموز المتبقية قابلة للتدريب.
حمّل تمثيلات الموجه المسطّحة التي حفظها PEFT (prompt_embeddings).
يحفظ PEFT مُكيّفات تعلّم المُوجِّهات كمُتجه واحد باسم prompt_embeddings. أما في CARTRIDGE، فنُقسّم ذلك المُتجه إلى مقاطع مجمّدة وقابلة للتدريب وفقاً لـself.num_frozen_tokens.
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 )
تهيئة مُكيّف تعلّم بادئة KV من بادئة مخزّنة مسبقًا (past_key_values).
يعيد متجه تضمينات الاستعلام الذي تم تحميله في المُكيّف.
prompt_embeddings_from_past_key_values
peft.prompt_embeddings_from_past_key_values
< source >( past_key_values: Anynum_virtual_tokens: int )
تحويل كاش past_key_values (القديم) إلى متجه تضمينات الموجه المسطّح الذي يحفظه PEFT.
يتطابق المخرج مع التخطيط المتوقع بواسطة PeftModel.get_prompt() لتعلم المحفزات بنمط البادئة: الشكل [num_virtual_tokens, num_layers * 2 * token_dim].