PEFT documentation

VB-LoRA: ضبط دقيق فعّال للغاية للمعاملات باستخدام بنوك المتجهات

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

VB-LoRA: ضبط دقيق فعّال للغاية للمعاملات باستخدام بنوك المتجهات

نظرة عامة

VB-LoRA هي تقنية لضبط دقيق فعّال من حيث المعاملات، توسّع LoRA من خلال تعلّم مخطط لمشاركة المعاملات على مستوى دقيق للغاية على مستوى المتجهات الفرعية، مما يحقق كفاءة أعلى بكثير في استخدام المعاملات. وهذا يجعل VB-LoRA مفيدة بشكل خاص في السيناريوهات التي تكون فيها تكاليف التخزين والنقل حرجة. تعمل هذه التقنية عن طريق تفكيك مصفوفات منخفضة الرتبة—من طبقات ووحدات مختلفة مثل K وQ وV وFFN—إلى متجهات فرعية، ثم تتم مشاركتها عالمياً عبر بنك متجهات.

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

مع تزايد اعتماد النماذج اللغوية الكبيرة وتنامي الحاجة إلى تخصيص النموذج لكل مستخدم أو لكل مهمة، فإن طرق الضبط الدقيق الفعّال من حيث المعاملات (PEFT)، مثل التكيف منخفض الرتبة (LoRA) ومتغيراته، تترتب عليها تكاليف تخزين ونقل كبيرة. ولتقليل المعاملات المخزنة بشكل أكبر، نطرح نموذجًا قائمًا على «التقسيم والمشاركة» يكسر حواجز التحليل منخفض الرتبة عبر أبعاد المصفوفات والوحدات والطبقات من خلال مشاركة المعاملات على نطاق عالمي عبر بنك متجهات. كتطبيق عملي لهذا النموذج على LoRA، يركّب VB-LoRA المقترح جميع المصفوفات منخفضة الرتبة في LoRA من بنك متجهات مشترك مع وحدة خلط قابلة للاشتقاق تعتمد على أعلى k عنصر. يحقق VB-LoRA كفاءة قصوى في المعاملات مع الحفاظ على أداء مماثل أو أفضل مقارنةً بأحدث طرق PEFT. تُظهر التجارب الواسعة فعالية VB-LoRA في مهام فهم اللغة الطبيعية، وتوليد اللغة الطبيعية، وضبط التعليمات. عند ضبط نموذج Llama2-13B، يستخدم VB-LoRA 0.4% فقط من المعاملات المخزنة في LoRA، مع تحقيق نتائج متفوقة.

نصائح للاستخدام

  • يستخدم VB-LoRA وحدة top-k متناثرة لتعلم آلية المشاركة. عند حفظ معاملات المُكيّف (adapter)، يمكنك إما حفظ أوزان top-k وفهارسها فقط عن طريق تعيين save_only_topk_weights = True في VBLoRAConfig، أو حفظ جميع القيم اللوجستية القابلة للتدريب عن طريق تعيينها إلى False. يؤدي تفعيل save_only_topk_weights = True إلى تقليل مساحة التخزين بشكل كبير؛ فعلى سبيل المثال، في Llama2-7B، ينخفض حجم ملف التخزين من 308 ميغابايت إلى 2.5 ميغابايت. لاحظ أن النماذج المحفوظة باستخدام save_only_topk_weights = True مخصصة للدمج أو الاستدلال فقط ولا يمكن استخدامها لاستئناف التدريب.

  • يحتوي VB-LoRA على مجموعتين من معاملات التدريب: معاملات بنك المتجهات ومعاملات اللوجيت. في الممارسة العملية، وجدنا أن معاملات اللوجيت تتطلب معدل تعلّم أعلى، بينما تتطلب معاملات بنك المتجهات معدل تعلّم أقل. عند استخدام مُحسِّن AdamW، تكون معدلات التعلّم النموذجية 0.01 للوجيت و0.001 لمعاملات بنك المتجهات.

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

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

VBLoRAConfig

فئة peft.VBLoRAConfig

< >

( 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 = 4num_vectors: int = 256vector_length: int = 256topk: int = 2target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonesave_only_topk_weights: bool = Falsevblora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_vector_bank_bound: float = 0.02init_logits_std: float = 0.1layers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

المعاملات

  • r (int) — رتبة المصفوفات التزايدية.
  • num_vectors (int) — عدد المتجهات في بنك المتجهات. استخدم قيمًا أعلى عندما يزداد حجم النموذج.
  • vector_length (int) — طول المتجهات في بنك المتجهات. يجب أن يكون طول المتجهات قابلاً للقسمة على البُعد الخفي للنموذج.
  • topk (int) — قيمة K لاختيار أعلى K. زيادة قيمة K تزيد من حجم النموذج المحفوظ. عملياً، إعداد K=2 يوفر عادةً أفضل أداء وكفاءة في المعلمات. لمزيد من التفاصيل، راجع المناقشة في الورقة البحثية.
  • target_modules (Union[List[str], str]) — أسماء الوحدات التي سيتم تطبيق المُكيّف عليها. إذا تم تحديد هذا، فسيتم استبدال الوحدات التي تحمل الأسماء المحددة فقط. عند تمرير نص، سيتم إجراء مطابقة باستخدام تعبير نمطي. عند تمرير قائمة من النصوص، سيتم إجراء مطابقة دقيقة أو يتم التحقق مما إذا كان اسم الوحدة ينتهي بأي من النصوص الممررة. إذا تم تحديده على أنه ‘all-linear’، فسيتم اختيار جميع وحدات الخطي/Conv1D، باستثناء طبقة الإخراج. إذا لم يتم تحديده، فسيتم اختيار الوحدات وفقًا لبنية النموذج. إذا لم تكن البنية معروفة، فسيتم رفع خطأ — في هذه الحالة، يجب عليك تحديد الوحدات المستهدفة يدويًا.
  • exclude_modules (Optional[Union[List[str], str]]) — أسماء الوحدات التي لا يُطبَّق عليها المُكيّف. عند تمرير نص، يتم إجراء مطابقة باستخدام تعبير نمطي. عند تمرير قائمة من النصوص، يتم إجراء مطابقة دقيقة أو يُتحقق مما إذا كان اسم الوحدة ينتهي بأي من النصوص المُمرَّرة.
  • save_only_topk_weights (bool) — ما إذا كان سيتم حفظ أوزان topk فقط. يؤدي تعيين save_only_topk_weights = True إلى تقليل مساحة التخزين بشكل كبير. ومع ذلك، يمكن استخدام النماذج المحفوظة في هذا الوضع للدمج أو الاستدلال فقط، وليس لاستئناف التدريب.
  • vblora_dropout (float) — احتمالية الإسقاط لطبقات VBLoRA.
  • fan_in_fan_out (bool) — اضبط هذا على True إذا كانت الطبقة التي سيتم استبدالها تخزن الأوزان على شكل (fan_in, fan_out). على سبيل المثال، يستخدم gpt-2 Conv1D الذي يخزن الأوزان على شكل (fan_in, fan_out) وبالتالي يجب ضبط هذا على True.
  • bias (str) — نوع الانحياز لـ VBLoRA. يمكن أن يكون ‘none’ أو ‘all’ أو ‘vblora_only’. إذا كان ‘all’ أو ‘vblora_only’، فسيتم تحديث الانحيازات المقابلة أثناء التدريب. انتبه إلى أن هذا يعني أن النموذج لن ينتج نفس المخرجات التي كان سينتجها النموذج الأساسي دون تكييف، حتى عند تعطيل المحولات.
  • modules_to_save (List[str]) — قائمة بالوحدات، بخلاف طبقات VBLoRA، التي يجب تعيينها قابلة للتدريب وحفظها في نقطة الفحص النهائية.
  • init_vector_bank_bound (float) — يتم تهيئة بنك المتجهات بتوزيع منتظم بين -init_vector_bank_bound و init_vector_bank_bound. تجنّب تهيئة بنك المتجهات بأصفار كاملة لمنع تدرجات صفرية. عادةً ما تكون قيمة صغيرة، مثل 0.02، فعّالة. قد يؤدي التهيئة بقيمة كبيرة إلى عدم استقرار التدريب.
  • init_logits_std (float) — تُهيّأ القيم (logits) بتوزيع طبيعي انحرافه المعياري init_logits_std. القيمة الافتراضية هي 0.1.
  • layers_to_transform (Union[List[int],int]) — فهارس الطبقات المراد تحويلها. إذا تم تمرير قائمة من الأعداد الصحيحة، فسيتم تطبيق المُكيّف على فهارس الطبقات المحددة في هذه القائمة. أما إذا تم تمرير عدد صحيح واحد، فسيتم تطبيق التحويلات على الطبقة الموجودة عند هذا الفهرس.
  • layers_pattern (Optional[Union[List[str], str]]) — اسم نمط الطبقة، يُستخدم فقط إذا كان layers_to_transform مختلفاً عن None. يجب أن يستهدف هذا nn.ModuleList الخاص بالنموذج، والذي يُسمى غالباً 'layers' أو 'h'.

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

الورقة: https://huggingface.co/papers/2405.15179

VBLoRAModel

فئة peft.VBLoRAModel

< >

( 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 (PreTrainedModel) — النموذج الذي سيتم تكييفه.
  • config (VBLoRAConfig) — إعدادات نموذج VBLoRA.
  • adapter_name (str) — اسم المُكيّف، القيمة الافتراضية هي "default".
  • low_cpu_mem_usage (bool, optional, defaults to False) — إنشاء أوزان مُكيّف فارغة على جهاز meta. مفيد لتسريع عملية التحميل.

يعيد

torch.nn.Module

نموذج VBLoRA.

ينشئ نموذج VBLoRA من نموذج transformers مُدرَّب مسبقًا.

يُوصف هذا الأسلوب بالتفصيل في https://huggingface.co/papers/2405.15179.

مثال:

>>> from transformers import AutoModelForCausalLM
>>> from peft import VBLoRAConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VBLoRAConfig(
...     task_type="SEQ_CLS",
...     r=4,
...     target_modules=["fc1", "fc2", "k_proj", "out_proj", "q_proj", "v_proj"],
...     num_vectors=60,
...     vector_length=256,
...     save_only_topk_weights=True,
... )
>>> model = get_peft_model(base_model, config)

الخصائص:

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

get_nb_savable_parameters

< >

( adapter = 'default' )

يعيد عدد معاملات VB-LoRA القابلة للحفظ وغيرها من المعاملات القابلة للحفظ.

print_savable_parameters

< >

( )

يطبع عدد معاملات VB-LoRA القابلة للحفظ وإجمالي المعاملات القابلة للحفظ.

Update on GitHub