PEFT documentation

Lily: تكيّف منخفض الرتبة مترابط عبر الطبقات

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Lily: تكيّف منخفض الرتبة مترابط عبر الطبقات

Lily هي تقنية ضبط دقيق فعّالة من حيث المعاملات تُدخل مشاركة الأوزان عبر الطبقات لمصفوفات المحوِّلات. بدلاً من تعلُّم زوج AB مستقل لكل طبقة كما في LoRA، يستخدم Lily محوِّلات A مشتركة محلياً (حيث يُشارك كل A عبر كتلة من stride_A طبقات متتالية) وخبراء B مشتركين عالمياً (حيث يُشارك حوض صغير من num_B محوِّلات B عبر جميع الطبقات). في كل تمريرة أمامية، يحسب موجِّه خفيف يعتمد على البيانات تركيبة مرجّحة بدالة softmax للخبراء B لإنتاج B الفعّال لتلك الطبقة والمدخل.

يمكن لهذا المشاركة أن تقلل العدد الإجمالي لمصفوفات المُكيِّف من 2N (في LoRA القياسي) إلى N / stride_A + num_B، مما يُحرر ميزانية المعاملات لاستخدام رتبة أكبر بكثير r — عادةً 2×–4× مما ستستخدمه في LoRA. تزيد الرتبة الأعلى والتوصيلية الأفضل بين المكونات من الرتبة الفعلية لتحديث الأوزان ΔW = A × combined_B، مما يؤدي إلى أداء تكيُّف أفضل.

بما أن تركيبة B هي معتمدة على البيانات (تتبع أوزان الموجّه على التفعيلات المدخلة وقت التشغيل)، فإن merge وunmerge غير مدعومتين. إذا كان دمج الأوزان مطلوبًا لنشرك، ففكر في استخدام طرق أخرى مثل LoRA بدلاً من ذلك.

تخضع ليلي حاليًا للقيود الإضافية التالية:

  • يتم دعم طبقات nn.Linear فقط.
  • لا يتم دعم الطبقات المُكمّاة.

إذا لم تكن هذه القيود مناسبة لحالتك، فكّر في استخدام طرق أخرى بدلاً منها.

ملخص الورقة البحثية هو:

تُعدّ التكيّف منخفض الرتبة (LoRA) طريقةً واسعة الاستخدام للتكيّف الفعال من حيث المعاملات (PEFT) تتعلّم تحديثات الأوزان ΔW = AB للأوزان المُسبقة التدريب W عبر مُكيّفات منخفضة الرتبة A و B. وعلى الرغم من أن LoRA يضمن كفاءة الأجهزة، فإن تحديثات الأوزان منخفضة الرتبة تحدّ من أداء التكيّف. في هذه الورقة، نقترح التكيّف منخفض الرتبة المترابط عبر الطبقات (Lily)، وهو أسلوب PEFT جديد يُدخل إطارًا مترابطًا يضمّ خبراء A مشتركين محليًا وخبراء B مشتركين عالميًا. تُزيل هذه البنية أزواج AB المكررة لكل طبقة، مما يتيح تحقيق رتبة أعلى لـ ΔW بعدد مساوٍ أو أقل من المعاملات. لتعزيز القدرة التعبيرية، نستخدم موجّهات تعتمد على البيانات لتحديد الترابط بين A و B، مما يمنع خبراء B من التقارب نحو السلوك نفسه ويحسّن القدرة التمثيلية عبر المجالات. تُظهر التجارب عبر الأنماط والأبنية وأحجام النماذج الأداء والكفاءة المتفوقين لـ Lily.

نظرة عامة على الاختبارات

واجهة برمجة التطبيقات

LilyConfig

فئة peft.LilyConfig

< >

( 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 = 32stride_A: int = 1num_B: int = 2scaling: float = 1.0target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Noneinit_weights: bool = True )

المعاملات

  • r (int) — رتبة Lily. تحدد البُعد الداخلي المخفي لكل مُكيّف (adapter) ورتبة تحديث الأوزان A @ B. في Lily، بما أن عدد المُكيّفات يكون عادةً أصغر مما هو عليه في LoRA، فإن كل مُكيّف يحتاج إلى سعة أكبر، لذا يُوصى باستخدام قيمة أكبر لـr مقارنةً بـLoRA — عادةً 2x أو 3x أو 4x من رتبة LoRA التي كنتَ ستستخدمها عادةً. يتناسب العدد الإجمالي للمعاملات القابلة للتدريب مع r * (total_layers / stride_A + num_B)، لذا فإن زيادة r مع الإبقاء على stride_A كبيرًا وnum_B صغيرًا هو التوازن الموصى به.
  • stride_A (int) — عدد الطبقات المتتالية التي تتشارك مُكيّف A واحدًا. على سبيل المثال، إذا كان stride_A=4, كل 4 طبقات متجاورة تتشارك نفس مُكيّف A، مما يؤدي إلى total_layers / stride_A مُكيّفات A مميزة في المجمل. يقوم مُكيّف A بضغط المدخلات إلى تمثيل منخفض الرتبة بحجم r. stride_A يجب ألا يقل عن
    1. Suggested values: 2, 3, or 4 (i.e. sharing every 2, 3, or 4 layers). Keeping stride_A large (fewer distinct A adapters) and increasing r instead leads to better performance than the opposite trade-off (small stride_A, small r). Setting stride_A=1 means every layer has its own A adapter. NOTE: the A sharing happens within each target (layers with the same target suffix). For example, if your target_modules are ['q_proj', 'v_proj'] and you set stride_A=2, then every 2 adjacent q_proj layers will share an A adapter, and every 2 adjacent v_proj layers will share another A adapter, but the q_proj and v_proj layers will not share A adapters with each other since they have different suffixes.
  • num_B (int) — The number of shared B adapters. Unlike A adapters (which are grouped by layer), all B adapters are shared globally across every layer. For each forward pass, a router computes a weighted combination of all num_B B adapters (using softmax-normalized weights) to produce a single combined B adapter, which then projects the low-rank representation back to the original dimension. It is recommended to set num_B to a similar order as total_layers / stride_A. Suggested values: total_layers / 2, total_layers / 3, or total_layers / 4. Similar to stride_A, prefer smaller num_B with larger r over larger num_B with smaller r. NOTE: to train the router, you need at least 2 B adapters (i.e. num_B >= 2), since the router learns to compute a weighted combination of the B adapters. NOTE: the B sharing happens within each target (layers with the same target suffix). For example, if your target_modules are ['q_proj', 'v_proj'] and you set num_B=4, then there will be 4 B adapters shared across all q_proj layers, and another 4 B adapters shared across all v_proj layers, but the q_proj and v_proj layers will not share B adapters with each other since they have different suffixes.
  • target_modules (Union[List[str], str]، اختياري) — أسماء الوحدات التي سيتم تطبيق Lily عليها. يمكن أن تكون قائمة من أسماء الوحدات (مثل ['q_proj', 'v_proj']) أو نمطًا منتظمًا (مثل '.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'). إذا لم يتم تحديد ذلك، فسيتم تطبيق Lily على جميع طبقات linear المدعومة.
  • scaling (float) — عامل مضاعف قياسي يُطبَّق على مخرج المُكيِّف المُدمج (scaling * A @ combined_B) قبل إضافته إلى مسار التقدُّم للأوزان المُجمَّدة. على عكس LoRA، لا تستخدم Lily صياغة alpha / r؛ بل scaling هو مُضاعِف مباشر. هذا التصميم يجعل من السهل إجراء مسح للقيم على مقياس لوغاريتمي (مثل 0.01، 0.1، 1.0، 10.0). القيمة المثلى تعتمد على المهمة ويجب معالجتها ك معامل فائق. ننصح بالبدء بقيمة 1.0.
  • modules_to_save (List[str]، اختياري) — قائمة بالوحدات غير طبقات Lily التي يجب تعيينها كقابلة للتدريب وحفظها في نقطة الفحص النهائية. على سبيل المثال، في مهام تصنيف التسلسل أو تصنيف الرموز، تكون الطبقة النهائية classifier/score مهيأة عشوائياً وبالتالي تحتاج إلى أن تكون قابلة للتدريب ومحفوظة.
  • exclude_modules (Union[List[str], str]، اختياري) — أسماء الوحدات التي لا يُطبَّق عليها المُكيّف. عند تمرير نص، يتم إجراء مطابقة باستخدام تعبير نمطي. عند تمرير قائمة من النصوص، يتم إجراء مطابقة دقيقة أو يُتحقق مما إذا كان اسم الوحدة ينتهي بأي من النصوص المُمرَّرة.
  • layers_to_transform (Union[list[int], int], اختياري) — فهارس الطبقات التي سيتم تحويلها، إذا تم تحديد هذا الحُجج، فإن PEFT سيحوّل فقط فهارس الطبقات المحددة داخل هذه القائمة. إذا تم تمرير عدد صحيح واحد، فإن PEFT سيحوّل فقط الطبقة الموجودة عند هذا الفهرس.
  • layers_pattern (Optional[Union[List[str], str]]، اختياري) — اسم نمط الطبقة، يُستخدم فقط إذا كان layers_to_transform مختلفًا عن None وإذا لم يكن نمط الطبقة ضمن أنماط الطبقات الشائعة. يجب أن يستهدف هذا nn.ModuleList الخاص بالنموذج، والذي يُسمى غالبًا 'layers' أو 'h'.
  • init_weights (bool) — ما إذا كان سيتم تهيئة أوزات مُكيّف Lily باستخدام مخطط التهيئة الافتراضي: تُهيَّأ مصفوفات A باستخدام Kaiming uniform، وتُهيَّأ مصفوفات B إلى الصفر، مما يضمن أن يكون ناتج المُكيّف صفراً في بداية التدريب ولا يُحدث اضطراباً في النموذج المُدرَّب مسبقاً. يُوصى بشدة بإبقاء هذا الخيار True ما لم يكن لديك سبب محدد لتغييره.

هذه هي فئة الإعدادات لتخزين إعدادات LilyModel.

LilyModel

class peft.LilyModel

< >

( 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

المعاملات

  • model (torch.nn.Module) — النموذج الذي سيتم تكييفه.
  • config (LilyConfig) — إعدادات نموذج Lily.
  • adapter_name (str) — اسم المُكيّف، القيمة الافتراضية هي "default".

يعيد

torch.nn.Module

نموذج Lily PEFT.

ينشئ نموذج Low-Rank Interconnected Adaptation Across Layers (Lily) من نموذج transformers مُدرَّب مسبقًا.

يُوصف هذا الأسلوب بالتفصيل في https://arxiv.org/abs/2407.09946.

الخصائص:

  • model (PreTrainedModel) — النموذج الذي سيتم تكييفه.
  • peft_config (LilyConfig): إعدادات نموذج Lily.
Update on GitHub