PEFT documentation

AdaLoRA

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

AdaLoRA

AdaLoRA (LoRA التكيفي) هي طريقة لتحسين عدد المعاملات القابلة للتدريب المخصصة لمصفوفات الأوزان والطبقات، على عكس LoRA التي توزع المعاملات بالتساوي عبر جميع الوحدات. يتم تخصيص ميزانية أكبر من المعاملات لمصفوفات الأوزان والطبقات المهمة، بينما تحصل الأقل أهمية على عدد أقل من المعاملات. يمكنك التحكم في الرتبة المتوسطة المطلوبة أو r للمصفوفات، والوحدات التي سيتم تطبيق AdaLoRA عليها باستخدام target_modules. من بين المعاملات المهمة الأخرى التي يجب ضبطها lora_alpha (عامل التوسع)، وmodules_to_save (الوحدات التي سيتم تدريبها وحفظها بخلاف طبقات AdaLoRA). جميع هذه المعاملات - وغيرها - موجودة في AdaLoraConfig.

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

أصبح ضبط النماذج اللغوية الكبيرة المُدرَّبة مسبقًا على المهام الفرعية نموذجًا مهمًا في معالجة اللغة الطبيعية. ومع ذلك، فإن الممارسة الشائعة تقوم بضبط جميع المعاملات في النموذج المُدرَّب مسبقًا، وهو أمر غير عملي عندما يكون هناك عدد كبير من المهام الفرعية. لذلك، تم اقتراح العديد من طرق الضبط لتعلم التحديثات التفاضلية للأوزان المُدرَّبة مسبقًا بطريقة فعالة من حيث المعاملات، مثل الزيادات ذات الرتبة المنخفضة. غالبًا ما توزّع هذه الطرق ميزانية التحديثات التفاضلية بالتساوي عبر جميع مصفوفات الأوزان المُدرَّبة مسبقًا، وتتجاهل الأهمية المتغيرة لمعاملات الأوزان المختلفة. ونتيجة لذلك، يكون أداء الضبط غير مثالي. لسد هذه الفجوة، نقترح AdaLoRA، الذي يوزّع ميزانية المعاملات بين مصفوفات الأوزان بشكل تكيفي وفقًا لدرجة أهميتها. على وجه التحديد، يُمثّل AdaLoRA التحديثات التفاضلية على شكل تحليل القيمة المفردة. يسمح هذا النهج الجديد لنا بقصّ القيم المفردة للتحديثات غير المهمة بفعالية، وهو ما يعني في جوهره تقليل ميزانية معاملاتها مع تجنّب حسابات SVD الدقيقة المكثفة. أجرينا تجارب موسّعة باستخدام عدة نماذج مُدرَّبة مسبقًا في معالجة اللغة الطبيعية، والإجابة على الأسئلة، وتوليد اللغة الطبيعية للتحقق من فعالية AdaLoRA. تُظهر النتائج أن AdaLoRA يُحقق تحسينًا ملحوظًا مقارنةً بالأساسيات، خاصةً في إعدادات الميزانية المنخفضة. كودنا متاح علنًا في https://github.com/QingruZhang/AdaLoRA.

يتميز AdaLoRA بطريقة update_and_allocate() يجب استدعاؤها في كل خطوة تدريب لتحديث ميزانية المعلمات والقناع، وإلا فلن يتم تنفيذ خطوة التكيف. ويتطلب ذلك كتابة حلقة تدريب مخصصة أو إنشاء فئة فرعية من Trainer لدمج هذه الطريقة. كمثال، راجع هذه حلقة التدريب المخصصة.

تدير AdaLoRA ميزانية المعلمات المقدمة من LoRA من خلال تخصيص عدد أكبر من المعلمات - أو بعبارة أخرى، رتبة أعلى r - للمصفوفات الوزنية المهمة التي تتكيف بشكل أفضل مع المهمة، وقصّ تلك الأقل أهمية. يتم التحكم في الرتبة بطريقة مشابهة لتحليل القيم المفردة (SVD). يتم تمثيل ΔW\Delta W بمصفوفتين متعامدتين ومصفوفة قطرية تحتوي على القيم المفردة. تتجنب طريقة التمثيل هذه تطبيق SVD بشكل متكرر، وهو أمر مكلف حسابيًا. بناءً على هذه الطريقة، يتم تعديل رتبة ΔW\Delta W وفقًا لدرجة الأهمية. ΔW\Delta W يتم تقسيمه إلى ثلاثيات، وتُقيَّم كل ثلاثية وفقًا لمساهمتها في أداء النموذج. تُقصّ الثلاثيات ذات درجات الأهمية المنخفضة، وتُحتفظ بالثلاثيات ذات درجات الأهمية العالية للضبط الدقيق.

يتضمن التدريب باستخدام AdaLoRA ثلاث مراحل: مرحلة التهيئة، ومرحلة تخصيص الميزانية، والمرحلة النهائية. في مرحلة التهيئة، لا يُطبَّق تخصيص الميزانية، وبالتالي لا يتم تعديل الرتب. خلال مرحلة تخصيص الميزانية، يُطبَّق العملية الموصوفة أعلاه، وتُعاد توزيع الرتب وفقًا لميزانية محددة، بهدف منح المكيّفات (adapters) الأكثر أهمية رتبًا أعلى، والطبقات الأقل أهمية رتبًا أقل. عند الوصول إلى المرحلة النهائية، يكون تخصيص الميزانية قد انتهى، وتُعاد توزيع الرتب، لكن قد نواصل التدريب لبعض الوقت باستخدام الرتب المعاد توزيعها لتحسين الأداء بشكل أكبر.

مساهماتكم مرحّب بها: تحتاج هذه القسم إلى توضيح.

غير واضح كيفية قياس الأهمية. كما أن الشرح مكرر إلى حد ما ويمكن أن يستفيد من التجميع. راجع هنا لمعرفة كيفية المساهمة.

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

الاستخدام

from peft import AdaLoraConfig, get_peft_model

config = AdaLoraConfig(
    r=8,
    init_r=12,
    tinit=200,
    tfinal=1000,
    deltaT=10,
    target_modules=["query", "value"],
    modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()

[... training code ...]

model.update_and_allocate(step_idx)

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

AdaLoraConfig

فئة peft.AdaLoraConfig

< >

( 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 = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonelora_alpha: int = 8lora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: Literal['none', 'all', 'lora_only'] = 'none'use_rslora: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_lora_weights: bool | Literal['gaussian', 'eva', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'corda', 'astra', 'loftq', 'orthogonal', 'mica', 'nora'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: dict | None = Nonealpha_pattern: Optional[dict] = <factory>megatron_config: Optional[dict] = Nonemegatron_core: Optional[str] = 'megatron.core'trainable_token_indices: Optional[Union[list[int], dict[str, list[int]]]] = Noneloftq_config: Union[LoftQConfig, dict] = <factory>eva_config: Optional[EvaConfig] = Nonecorda_config: Optional[CordaConfig] = Noneastra_config: Optional[AstraConfig] = Nonelora_ga_config: Optional[LoraGAConfig] = Noneuse_dora: bool = Falsevelora_config: Optional[Union[VeloraConfig, dict]] = Nonealora_invocation_tokens: Optional[list[int]] = Noneuse_qalora: bool = Falseqalora_group_size: int = 16monteclora_config: Optional[MontecloraConfig] = Nonelayer_replication: Optional[list[tuple[int, int]]] = Noneruntime_config: LoraRuntimeConfig = <factory>lora_bias: bool = Falsetarget_parameters: Optional[list[str]] = Noneuse_bdlora: Optional[BdLoraConfig] = Nonearrow_config: Optional[ArrowConfig] = Nonekasa_config: Optional[KasaConfig] = Noneensure_weight_tying: bool = Falsetarget_r: int = 8init_r: int = 12tinit: int = 0tfinal: int = 0deltaT: int = 1beta1: float = 0.85beta2: float = 0.85orth_reg_weight: float = 0.5total_step: int | None = None )

المعاملات

  • target_r (int) — متوسط الرتبة المستهدف للمصفوفة التزايدية.
  • init_r (int) — الرتبة الأولية لكل مصفوفة تزايدية.
  • tinit (int) — عدد خطوات الإحماء في مرحلة الضبط الدقيق الأولية.
  • tfinal (int) — عدد خطوات الضبط الدقيق النهائي.
  • deltaT (int) — الفترة الزمنية بين تخصيصين للميزانية.
  • beta1 (float) — معامل الضبط (Hyperparameter) الخاص بـ EMA لتنعيم الحساسية.
  • beta2 (float) — معامل الضبط الخاص بـ EMA لقياس عدم اليقين.
  • orth_reg_weight (float) — معامل التنظيم المتعامد.
  • total_step (int) — إجمالي خطوات التدريب التي يجب تحديدها قبل بدء التدريب.
  • rank_pattern (list) — الرتبة المخصصة لكل مصفوفة أوزان بواسطة RankAllocator.

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

يتضمن AdaLoRA ثلاث مراحل يحددها tinit وtfinal وtotal_step.

يمكن فهم المرحلة الأولية كخطوة لتدريب المسارات (adapters) مسبقًا بحيث، عند تقليل رتبتها، تكون هناك بعض المعلومات المشفرة مسبقًا يمكن تقليلها بدلاً من المصفوفات العشوائية. تُعرَّف هذه المرحلة من خلال تقديم tinit.

بعد انتهاء المرحلة الأولية (حيث مرّت tinit خطوات) وقبل بدء المرحلة النهائية، تُقلّل AdaLoRA الميزانية المخصصة لرتبة كل طبقة مع كل خطوة. هنا يحدث خفض الرتبة. وتستمر هذه العملية حتى بلوغ total_step - tfinal خطوة.

المرحلة الأخيرة، التي تبدأ عند بلوغ total_step - tfinal خطوة، لا تعدّل رتب الطبقات بعد الآن، بل تعيد ضبط الطبقات ذات الرتبة المخفضة الناتجة عن المرحلة السابقة.

مثال عملي: tinit يساوي 10، وtfinal يساوي 20، وtotal_step يساوي 100. نقضي 10 خطوات في التدريب المسبق دون تقليل للرتبة لأن ميزانيتنا ثابتة (مرحلة init)، ثم نقضي 80 (100-20) خطوة في مرحلة التقليل حيث تنخفض ميزانيتنا تدريجياً خطوة بخطوة، وأخيراً 20 خطوة في مرحلة الضبط الدقيق النهائي دون تقليل.

AdaLoraModel

فئة peft.AdaLoraModel

< >

( modelconfigadapter_name**kwargs ) → torch.nn.Module

المعاملات

  • model (transformers.PreTrainedModel) — النموذج الذي سيتم تكييفه.
  • config (AdaLoraConfig) — إعدادات نموذج AdaLora.
  • adapter_name (str) — اسم المُكيّف، القيمة الافتراضية هي "default".
  • low_cpu_mem_usage (bool, optional, defaults to False) — إنشاء أوزان مُكيّف فارغة على جهاز meta. مفيد لتسريع عملية التحميل.

يعيد

torch.nn.Module

نموذج AdaLora.

ينشئ نموذج AdaLoRA (LoRA التكيفي) من نموذج transformers مُدرَّب مسبقًا. الورقة البحثية: https://openreview.net/forum?id=lq62uWRJjiY

مثال:

>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import AdaLoraConfig, get_peft_model

>>> config = AdaLoraConfig(
...     peft_type="ADALORA",
...     task_type="SEQ_2_SEQ_LM",
...     init_r=12,
...     lora_alpha=32,
...     target_modules=["q", "v"],
...     lora_dropout=0.01,
...     total_step=1000,
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> adalora_model = get_peft_model(model, config)

الخصائص:

add_weighted_adapter

< >

( *args**kwargs )

لا تدعم هذه الطريقة AdaLoRA، استخدم LoRA بدلاً منها.

update_and_allocate

< >

( global_step )

المعاملات

  • global_step (int) — خطوة التدريب الحالية، تُستخدم لحساب ميزانية adalora.

تحديث هذه الطريقة ميزانية Adalora والقناع.

يجب استدعاء هذا في كل خطوة تدريب بعد loss.backward() وقبل zero_grad().

يتم التعامل مع tinit وtfinal وdeltaT داخل الطريقة.

مثال:

>>> loss = model(**input).loss
>>> loss.backward()
>>> optimizer.step()
>>> model.base_model.update_and_allocate(i_step)
>>> optimizer.zero_grad()
Update on GitHub