PEFT documentation

VeRA: تكييف مصفوفة عشوائية مبنية على المتجهات

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

VeRA: تكييف مصفوفة عشوائية مبنية على المتجهات

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

كيف يعمل VeRA

تحديث LoRA نموذج الأساس المجمّد من خلال تعلّم مصفوفتين صغيرتين منخفضة الرتبة لكل طبقة مُكيَّفة. الرتبة هي البُعد الداخلي لهذه المصفوفات، وهي تتحكم في مقدار السعة التي يمتلكها المُكيِّف. في LoRA، يؤدي زيادة r أو تكييف المزيد من الطبقات إلى زيادة عدد المعاملات القابلة للتدريب بسرعة، لأن كل طبقة مُكيَّفة تتعلم زوجها الخاص من المصفوفات منخفضة الرتبة.

يحافظ VeRA على فكرة التكيف ذات الرتبة المنخفضة نفسها، لكنه يغيّر المعايير التي يتم تدريبها. فبدلاً من تعلّم مصفوفات منخفضة الرتبة منفصلة لكل طبقة، يستخدم VeRA زوجاً واحداً مجمّداً من مصفوفات منخفضة الرتبة، A وB، تم تهيئتها عشوائياً ومُشارَك بين الطبقات. كل طبقة مُكيَّفة تتعلّم متجهَي تحجيم فقط، vera_lambda_d وvera_lambda_b، يعيدان تحجيم المصفوفات المشتركة لإنتاج تحديث خاص بالطبقة. وبما أن حجم vera_lambda_d هو r، فإن عدد المعايير القابلة للتدريب في VeRA لا يزال يزداد مع r ومع عدد الطبقات المُكيَّفة. ومع ذلك، ينمو هذا العدد ببطء أكبر بكثير مقارنةً بـ LoRA، لأن المصفوفات الكبيرة A وB مشتركة ومجمّدة بدلاً من أن تُتعلَّم بشكل منفصل لكل طبقة.

ولهذا السبب يمكن لـ VeRA استخدام عدد أقل من المعاملات القابلة للتدريب مقارنةً بـ LoRA. في حساب المعاملات المبسّط الوارد في الورقة البحثية، يتناسب LoRA مع 2 * L_tuned * d_model * r، حيث L_tuned هو عدد الطبقات المُكيَّفة، وd_model هو بُعد النموذج، وr هو الرتبة. أما VeRA فيتناسب مع L_tuned * (d_model + r) لأن المصفوفات الكبيرة منخفضة الرتبة مشتركة ومجمّدة، بينما يتم تدريب المتجهات الأصغر لكل طبقة فقط.

عند حفظ معاملات المُكيّف (adapter)، من الممكن التخلي عن تخزين مصفوفات الرتبة المنخفضة من خلال تعيين save_projection=False على VeraConfig. في هذه الحالة، سيتم استعادة هذه المصفوفات بناءً على البذرة العشوائية الثابتة من معامل projection_prng_key. يقلل هذا من حجم نقطة الحفظ (checkpoint)، لكننا لا نستطيع ضمان قابلية التكرار على جميع الأجهزة ولمختلف الإصدارات المستقبلية من PyTorch. إذا كنت ترغب في ضمان قابلية التكرار، فعيّن save_projection=True (وهو الإعداد الافتراضي).

لمعالجة الأشكال المختلفة للطبقات المُكيَّفة، تُهيّئ VeRA المصفوفات المشتركة A وB بأقصى حجم مطلوب لكل بُعد. أثناء المرور الأمامي، تُستخرج المصفوفات الفرعية A وB لطبقة معينة من هذه المصفوفات المشتركة وتُستخدم كما هو موصوف في الورقة البحثية. على سبيل المثال، تكييف طبقتين خطيتين بأشكال (100, 20) و(80, 50) سيُنشئ مصفوفات A وB بأشكال (rank, 50) و(100, rank) على التوالي. ثم، لتكييف طبقة من الشكل (100, 20)، ستُستخرج مصفوفات فرعية A وB بأشكال (rank, 20) و(100, rank).

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

  • يتم دعم طبقات nn.Linear فقط.

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

تُعدّ التكيّف منخفض الرتبة (LoRA) طريقة شائعة تقلّل من عدد المعاملات القابلة للتدريب عند ضبط نماذج اللغة الكبيرة، لكنها لا تزال تواجه تحديات تخزين حادة عند التوسع إلى نماذج أكبر أو عند نشر العديد من النماذج المُكيَّفة لكل مستخدم أو لكل مهمة. في هذا العمل، نعرض تكيّف المصفوفات العشوائية القائم على المتجهات (VeRA)، الذي يقلّل بشكل كبير من عدد المعاملات القابلة للتدريب مقارنةً بـ LoRA، مع الحفاظ على الأداء نفسه. يحقق ذلك من خلال استخدام زوج واحد من المصفوفات منخفضة الرتبة مشترك عبر جميع الطبقات، وتعلّم متجهات تحجيم صغيرة بدلاً من ذلك. نُظهر فعاليته على معايير GLUE و E2E، ومهام تصنيف الصور، ونُظهر تطبيقه في الضبط التعليمي لنماذج لغة بحجم 7B و 13B.

متى تستخدم VeRA

يُعد VeRA خياراً جيداً عندما:

  • تريد تقليل عدد المعاملات القابلة للتدريب مع الحفاظ على أداء مماثل لأداء LoRA.
  • تحتاج إلى تخزين أو نشر العديد من المحوِّلات (adapters) المخصصة لمهام محددة، حيث تقلل نقاط التفتيش (checkpoints) الأصغر حجمًا من متطلبات التخزين.
  • أنت تقوم بضبط نماذج لغوية ضخمة جداً تحت قيود صارمة على الذاكرة أو الميزانية المعاملاتية.

متى لا تستخدم VeRA

قد لا يكون VeRA الخيار الأفضل عندما:

  • تتطلب مصفوفات منخفضة الرتبة مستقلة لكل طبقة مُكيَّفة، مما يوفر مرونة أكبر في معاملات المُكيِّف المُتعلَّمة.
  • يتطلب نموذجك تكييف أنواع وحدات أخرى غير nn.Linear، حيث يدعم VeRA حاليًا طبقات خطية فقط.
  • تحتوي نموذجك على طبقات خطية مُكيَّفة بأبعاد مدخلات ومخرجات مختلفة اختلافًا كبيرًا. وبما أن VeRA يشارك زوجًا واحدًا من مصفوفات الإسقاط عبر جميع الطبقات المُكيَّفة، يجب أن تكون هذه المصفوفات مُقاسَة لتناسب أكبر شكل. لذلك، قد تتطلب النماذج التي تتسم بتباين كبير في أشكال الطبقات (مثل طبقات الإسقاط التصاعدي والتنازلي في المحولات) تخصيصًا زائدًا لمصفوفات الإسقاط المشتركة، مما يُقلل من بعض ميزة كفاءة المعلمات التي يوفرها VeRA.

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

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

VeRAConfig

فئة peft.VeraConfig

< >

( 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 = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truevera_dropout: float = 0.0d_initial: float = 0.1fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

المعاملات

  • r (int، اختياري، القيمة الافتراضية 256) — بُعد معامل VeRA (“الرتبة”). اختر قيمًا أعلى من رتب LoRA هنا، لأن VeRA يستخدم عددًا أقل بكثير من المعاملات مقارنةً بـ LoRA (انظر الجدول 1).
  • target_modules (Union[List[str], str]) — أسماء الوحدات التي سيتم تطبيق Vera عليها. يتم دعم الطبقات الخطية فقط.
  • projection_prng_key (int) — مفتاح تهيئة Vera PRNG. يُستخدم لتهيئة vera_A و vera_B للنماذج الجديدة أو عند تحميل نقطة تحقق لم تتضمن هذه الإسقاطات. القيمة الافتراضية هي 0.
  • save_projection (bool) — ما إذا كان سيتم حفظ إسقاطات vera_A / vera_B في قاموس الحالة إلى جانب أوزان lambda_b / lambda_d لكل طبقة. سيؤدي هذا إلى زيادة حجم نقطة الحفظ، لكنه يضمن إمكانية إعادة تحميل نقطة الحفظ على جميع تكوينات النظام. القيمة الافتراضية هي True.
  • vera_dropout (float) — احتمالية الإسقاط (dropout) لطبقات Vera.
  • d_initial (float، اختياري، القيمة الافتراضية 0.1) — القيمة الأولية للتشغيل المتجه vera_lambda_d المستخدم عند تهيئة معاملات VeRA. يُوصى بقيم صغيرة (<=0.1) (انظر الجدول 6c في الورقة البحثية).
  • fan_in_fan_out (bool) — اضبط هذا على True إذا كانت الطبقة التي سيتم استبدالها تخزن الأوزان على شكل (fan_in, fan_out). على سبيل المثال، يستخدم gpt-2 Conv1D الذي يخزن الأوزان على شكل (fan_in, fan_out) وبالتالي يجب ضبط هذا على True.
  • bias (str) — نوع الانحياز (Bias) لـ Vera. يمكن أن يكون ‘none’ أو ‘all’ أو ‘vera_only’. إذا كان ‘all’ أو ‘vera_only’، فسيتم تحديث الانحيازات المقابلة أثناء التدريب. انتبه إلى أن هذا يعني أن النموذج لن ينتج نفس المخرجات التي كان سينتجها النموذج الأساسي دون تكييف، حتى عند تعطيل المكيّفات (adapters).
  • modules_to_save (List[str]) — قائمة بالوحدات، بخلاف طبقات Vera، التي يجب تعيينها كقابلة للتدريب وحفظها في نقطة الفحص النهائية.
  • init_weights (bool) — ما إذا كان سيتم تهيئة أوزان طبقات Vera باستخدام التهيئة الافتراضية. لا تغيّر هذا الإعداد إلا إذا كنت تعرف بالضبط ما تفعله.
  • layers_to_transform (Union[List[int],int]) — مؤشرات الطبقات التي سيتم تحويلها، إذا تم تحديد هذا الحُجج، فسيتم تطبيق تحويلات Vera على مؤشرات الطبقات المحددة في هذه القائمة. إذا تم تمرير عدد صحيح واحد، فسيتم تطبيق تحويلات Vera على الطبقة الموجودة عند هذا المؤشر.
  • layers_pattern (Optional[Union[List[str], str]]) — اسم نمط الطبقة، يُستخدم فقط إذا كان layers_to_transform مختلفاً عن None. يجب أن يستهدف هذا nn.ModuleList الخاص بالنموذج، والذي يُسمى غالباً 'layers' أو 'h'.

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

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

VeRAModel

فئة peft.VeraModel

< >

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

يعيد

torch.nn.Module

نموذج Vera.

ينشئ نموذج Vector-based Random Matrix Adaptation (Vera) من نموذج transformers مُدرَّب مسبقًا.

مثال:

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)

الخصائص:

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