PEFT documentation

RandLora: ضبط دقيق فعّال من حيث المعاملات بدرجات كاملة للنماذج الكبيرة

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

RandLora: ضبط دقيق فعّال من حيث المعاملات بدرجات كاملة للنماذج الكبيرة

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

يُظهر RandLora فرقًا جديرًا بالملاحظة، فخلافاً لخوارزميات PEFT المشابهة لـ LoRA، فإن زيادة الرتب الأساسية العشوائية في RandLora تزيد من عدد المعاملات القابلة للتدريب. وبما أن حاصل ضرب عدد القواعد في رتبة القواعد ثابت في RandLora، فإن تقليل الرتبة سيزيد من عدد القواعد العشوائية، وبالتالي عدد القواعد القطرية القابلة للتدريب الخاصة بكل قاعدة.

بما أن تقليل رتبة القواعد العشوائية في RandLora يؤدي إلى زيادة عددها، فقد يصبح تدريب RandLora أبطأ من LoRA في حالات الرتب الصغيرة جدًا، حيث أن الرتب الأقل من 4 عادةً ما تؤدي إلى زيادة كبيرة في وقت التدريب. ومع ذلك، لا يؤثر ذلك على الاستدلال، إذ يمكن دمج محولات RandLora في مصفوفات الأوزان المُدرَّبة مسبقًا.

يدعم RandLora أيضًا التدريب باستخدام قواعد عشوائية متناثرة ثلاثية القيم (تحتوي فقط على -1 و 0 و 1). هذه القواعد كما وردت في Bingham et al. و Ping et al. ويمكن نظريًا استخدامها لتقليل متطلبات الحساب من خلال إجراء عمليات تجميع بدلاً من ضرب المصفوفات لإنشاء تحديث الأوزان. هذا غير مدعوم حاليًا. على الرغم من أنه لا يقلل من الحساب حاليًا، إلا أن استخدام قواعد عشوائية متناثرة في RandLora يمكن أن يقلل من الإفراط في التخصيص في بعض الحالات. للمستخدمين المهتمين باستخدام قواعد ثلاثية متناثرة، يُوصى بالخيار sparse بدلاً من الخيار very_sparse الذي قد يقلل من الأداء.

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

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

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

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

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

أظهرت تقنية التكيف منخفض الرتبة (LoRA) ومتغيراتها نتائج مبهرة في تقليل عدد المعاملات القابلة للتدريب ومتطلبات الذاكرة للشبكات التحويلية الكبيرة مع الحفاظ على أداء الضبط الدقيق. ومع ذلك، فإن الطبيعة منخفضة الرتبة لتحديث الأوزان تحدّ بشكل جوهري من قدرة التمثيل للنماذج المُضَبَطة بدقة، مما قد يُقوّض الأداء في المهام المعقدة. وهذا يثير سؤالاً حاسماً: عند ملاحظة فجوة أداء بين LoRA والضبط الدقيق القياسي، هل السبب هو تقليل عدد المعاملات القابلة للتدريب أم نقص الرتبة؟ تهدف هذه الورقة إلى الإجابة عن هذا السؤال من خلال تقديم RandLora، وهي طريقة فعّالة من حيث المعاملات تُجري تحديثات كاملة الرتبة باستخدام تركيبات خطية متعلمة من مصفوفات عشوائية غير قابلة للتدريب ومنخفضة الرتبة. تحدّ طريقتنا من عدد المعاملات القابلة للتدريب عن طريق تقييد التحسين على مصفوفات تحجيم قطرية تُطبَّق على المصفوفات العشوائية الثابتة. وهذا يتيح لنا التغلب بفعالية على قيود الرتبة المنخفضة مع الحفاظ على كفاءة المعاملات والذاكرة أثناء التدريب. من خلال تجارب شاملة عبر معايير الرؤية واللغة ومعايير الرؤية-اللغة، نقيّم بشكل منهجي قيود LoRA وطرق الأساس العشوائي الحالية. تكشف نتائجنا أن التحديثات كاملة الرتبة مفيدة بشكل فردي في مهام الرؤية واللغة، بل هي أكثر فائدة في مهام الرؤية-اللغة، حيث تقلل RandLora بشكل كبير---وتُزيل أحيانًا---الفجوة في الأداء بين الضبط الدقيق القياسي وLoRA، مما يُثبت فعاليتها.

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

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

RandLoraConfig

فئة peft.RandLoraConfig

< >

( 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 = 32target_modules: list[str] | str | None = Noneprojection_prng_key: int = 0save_projection: bool = Truesparse: bool = Falsevery_sparse: bool = Falserandlora_dropout: float = 0.0fan_in_fan_out: bool = Falserandlora_alpha: int = 640bias: str = 'none'modules_to_save: list[str] | None = Noneinit_weights: bool = Truelayers_to_transform: list[int] | int | None = Nonelayers_pattern: str | None = None )

المعاملات

  • r (int، اختياري، القيمة الافتراضية 32) — بعد رتبة الأساس العشوائي في RandLora. على عكس Lora، فإن هذا المعامل يتناسب عكسياً مع عدد المعاملات القابلة للتدريب، فخفضه يزيد من عدد المعاملات القابلة للتدريب.
  • target_modules (Union[list[str], str]) — أسماء الوحدات التي سيتم تطبيق RandLora عليها. يتم دعم الطبقات الخطية فقط.
  • projection_prng_key (int) — مفتاح تهيئة PRNG الخاص بـ RandLora. يُستخدم لتوليد basis_A وbasis_B للنماذج الجديدة أو عند تحميل نقطة تحقق (checkpoint) لم تتضمن هذه الإسقاطات. القيمة الافتراضية هي 0.
  • save_projection (bool) — ما إذا كان سيتم حفظ الأساس العشوائي العام basis_A / basis_B في state dict إلى جانب مصفوفات lambda / gamma القطرية لكل طبقة. سيؤدي هذا إلى زيادة حجم نقطة الحفظ (checkpoint)، لكنه يضمن إمكانية إعادة تحميل نقطة الحفظ على جميع تكوينات النظام. القيمة الافتراضية هي True.
  • sparse (bool) — ما إذا كان سيتم استخدام قواعد عشوائية متناثرة كما هو موصوف في ورقة RandLora. القواعد هي قواعد ثلاثية متناثرة (تحتوي فقط على -1 و 0 و 1) حيث تكون احتمالية الإسناد 1/6 لكل من -1 و 1، و 2/3 للقيمة 0. تهدف هذه المصفوفات المتناثرة إلى أن تُستخدم في المستقبل لحسابات خالية من ضرب المصفوفات، راجع https://huggingface.co/papers/2406.02528v1 التنفيذ الحالي هو إثبات مفهوم فقط، حيث لا يُستفاد من التناثر لتحسين السرعة أو استهلاك الذاكرة. استخدام المصفوفات المتناثرة عادةً لا يقلل الأداء، بل قد يساعد حتى في تقليل الإفراط في التخصيص. القيمة الافتراضية هي False.
  • very_sparse (bool) — ما إذا كان سيتم استخدام قواعد عشوائية شديدة التناثر كما هو موصوف في ورقة RandLora. القواعد شديدة التناثر هي قواعد ثلاثية التناثر (تحتوي فقط على -1 و 0 و 1) بالنسبة لمصفوفة بأصغر بُعد d، حيث تكون احتمالية الإسناد 1/√D للقيم -1 و 1 و 1- 2/√D للقيمة 0. استخدام هذه المصفوفات المتناثرة يمكن أن يقلل من الإفراط في التكيّف أكثر من البدائل sparse، لكنه سيؤدي على الأرجح إلى انخفاض الأداء كنتيجة لذلك. استخدمه بحذر. القيمة الافتراضية هي False.
  • randlora_dropout (float) — احتمالية الإسقاط (dropout) لطبقات RandLora.
  • randlora_alpha (float) — معامل التوسيع لطبقات RandLora، وغالبًا ما يكون 20 ضعف الرتبة. نظرًا لأن معامل randlora_alpha كبير افتراضيًا، فقد يؤدي ذلك إلى عدم استقرار عددي، خاصة عندما تكون معدلات التعلم مرتفعة. إذا كان التدريب غير مستقر، ففكّر في تقليل معدل التعلم أو معامل randlora_alpha.
  • fan_in_fan_out (bool) — اضبط هذا على True إذا كانت الطبقة التي سيتم استبدالها تخزن الأوزان على شكل (fan_in, fan_out). على سبيل المثال، يستخدم gpt-2 Conv1D الذي يخزن الأوزان على شكل (fan_in, fan_out) وبالتالي يجب ضبط هذا على True.
  • bias (str) — نوع الانحياز. يمكن أن يكون ‘none’ أو ‘all’ أو ‘randlora_only’. إذا كان ‘all’ أو ‘randlora_only’، فسيتم تحديث الانحيازات المقابلة أثناء التدريب. انتبه إلى أن هذا يعني أن النموذج لن ينتج نفس المخرجات التي كان سينتجها النموذج الأساسي دون تكييف، حتى عند تعطيل المحوِّلات.
  • modules_to_save (list[str]) — قائمة بالوحدات، بخلاف طبقات RandLora، التي يجب تعيينها قابلة للتدريب وحفظها في نقطة الفحص النهائية.
  • init_weights (bool) — ما إذا كان سيتم تهيئة أوزان طبقات RandLora باستخدام التهيئة الافتراضية. لا تغيّر هذا الإعداد إلا إذا كنت تعرف بالضبط ما تفعله.
  • layers_to_transform (Union[list[int],int]) — فهارس الطبقات المراد تحويلها، إذا تم تحديد هذا الحُجج، فسيُطبّق تحويلات RandLora على فهارس الطبقات المحددة في هذه القائمة. إذا تم تمرير عدد صحيح واحد، فسيُطبّق تحويلات RandLora على الطبقة الموجودة عند هذا الفهرس.
  • layers_pattern (str) — اسم نمط الطبقة، يُستخدم فقط إذا كان layers_to_transform مختلفًا عن None وإذا لم يكن نمط الطبقة ضمن أنماط الطبقات الشائعة.

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

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

RandLoraModel

فئة peft.RandLoraModel

< >

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

يعيد

torch.nn.Module

نموذج RandLora.

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

مثال:

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

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

الخصائص:

Update on GitHub