PEFT documentation
Lily: تكيّف منخفض الرتبة مترابط عبر الطبقات
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
< 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 = 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يجب ألا يقل عن- Suggested values:
2,3, or4(i.e. sharing every 2, 3, or 4 layers). Keepingstride_Alarge (fewer distinct A adapters) and increasingrinstead leads to better performance than the opposite trade-off (smallstride_A, smallr). Settingstride_A=1means 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 setstride_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.
- Suggested values:
- 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 allnum_BB 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 setnum_Bto a similar order astotal_layers / stride_A. Suggested values:total_layers / 2,total_layers / 3, ortotal_layers / 4. Similar tostride_A, prefer smallernum_Bwith largerrover largernum_Bwith smallerr. 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 setnum_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
< 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
المعاملات
- 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.