PEFT documentation

IA3

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

IA3

يُعدّ IA3 خيارًا ممتازًا عندما تحتاج إلى أصغر حجم ممكن للمُكيّف (adapter) — إذ يستخدم متجهات متعلَّمة بدلاً من مصفوفات منخفضة الرتبة، مما يجعله أحد أكثر الأساليب كفاءةً من حيث عدد المعاملات المتاحة. إذا كان أولويتك هي تقليل بصمة القرص/الذاكرة إلى الحد الأدنى وتسريع التدريب، فإن IA3 مرشح قوي.

IA3 introduces three vectors, lv, lk and lff to scale value, key and feed-forward activations (image source).

المُكيّف المُدمج عبر تثبيط وتضخيم التفعيلات الداخلية، أو IA3، هو أسلوب يضيف ثلاثة متجهات متعلمة لإعادة قياس المفاتيح والقيم في طبقات الانتباه الذاتي والانتباه بين المُشفِّر والمُفكِّك، وكذلك التفعيل الوسيط في الشبكة العصبية الأمامية الموضعية.

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

يتيح التعلّم السياقي بعدد قليل من الأمثلة (ICL) لنماذج اللغة المُدرَّبة مسبقًا أداء مهمة لم تُشاهد من قبل دون أي تدريب قائم على التدرّجات، وذلك عبر إدخال عدد صغير من أمثلة التدريب كجزء من المدخلات. يتسبب ICL في تكاليف حسابية وذاكرة وتخزين كبيرة لأنه يتضمن معالجة جميع أمثلة التدريب في كل مرة يُصدر فيها نموذج التنبؤ. يقدّم الضبط الدقيق الفعّال من حيث المعاملات (PEFT) (مثل وحدات المحوّل، وضبط الموجهات، وطرق التحديث المتناثرة، وغيرها) نموذجًا بديلًا حيث تُدرَّب مجموعة صغيرة من المعاملات لتمكين النموذج من أداء المهمة الجديدة. في هذه الورقة، نقارن بدقة بين ICL بعدد قليل من الأمثلة وPEFT، ونُثبت أن الثاني يوفر دقة أفضل وتكاليف حسابية أقل بكثير. على طول الطريق، نُقدّم طريقة PEFT جديدة تُسمى (IA)^3 تقوم بتوسيع التفعيلات بواسطة متجهات مُتعلَّمة، محققة أداءً أقوى مع إدخال كمية صغيرة نسبيًا فقط من المعاملات الجديدة. كما نقترح وصفة بسيطة مبنية على نموذج T0 تُسمى T-Few يمكن تطبيقها على مهام جديدة دون ضبط أو تعديلات خاصة بالمهمة. نتحقق من فعالية T-Few على مهام غير مرئية تمامًا من خلال تطبيقها على معيار RAFT، محققة أداءً يتجاوز البشر لأول مرة وتتفوق على أحدث التقنيات بنسبة 6% مطلقة. جميع الأكواد المستخدمة في تجاربنا متاحة للعموم.

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

بما أنه يشبه LoRA، فإن IA3 يحمل العديد من المزايا نفسها:

  • يجعل IA3 الضبط الدقيق أكثر كفاءة من خلال تقليل عدد المعلمات القابلة للتدريب بشكل كبير. (في حالة T0، يحتوي نموذج IA3 على حوالي 0.01% فقط من المعلمات القابلة للتدريب، بينما يحتوي حتى LoRA على أكثر من 0.1%)
  • تُحافظ الأوزان المُسبقة التدريب الأصلية على حالة التجميد، مما يعني أنه يمكنك امتلاك عدة نماذج IA3 خفيفة الوزن وقابلة للنقل لمهام مختلفة في المراحل اللاحقة، مبنية على أساسها.
  • أداء النماذج المُحسَّنة باستخدام IA3 مماثل لأداء النماذج المُحسَّنة بالكامل.
  • لا يضيف IA3 أي تأخير في الاستدلال لأن أوزان المحوّل يمكن دمجها مع النموذج الأساسي.

من حيث المبدأ، يمكن تطبيق IA3 على أي مجموعة فرعية من مصفوفات الأوزان في الشبكة العصبية لتقليل عدد المعلمات القابلة للتدريب. ووفقاً لتنفيذ المؤلفين، تُضاف أوزان IA3 إلى طبقات المفتاح والقيمة والطبقات الأمامية (feedforward) في نموذج Transformer. وبشكل أكثر تحديداً، بالنسبة لنماذج transformer، تُضاف أوزان IA3 إلى مخرجات طبقات المفتاح والقيمة، وإلى مدخل الطبقة الأمامية الثانية في كل كتلة transformer.

بناءً على الطبقات المستهدفة لحقن معاملات IA3، يمكن تحديد عدد المعاملات القابلة للتدريب استنادًا إلى حجم مصفوفات الأوزان.

الاستخدام

بالنسبة للنماذج التوليدية ذاتية الرجوع، استهدف k_proj وv_proj وdown_proj — فهذه هي الطبقات التي وجد مؤلفو العمل أنها الأكثر فعالية. اضبط feedforward_modules=["down_proj"] حتى يعرف IA3 أي الوحدات هي طبقات التغذية الأمامية ويمكنه تطبيق التدرج الصحيح.

لمهمة تصنيف التسلسل، يمكن تهيئة إعداد IA3 لنموذج Llama على النحو التالي:

from peft import IA3Config, TaskType, get_peft_model
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M")
peft_config = IA3Config(
    task_type=TaskType.CAUSAL_LM,
    target_modules=["k_proj", "v_proj", "down_proj"],
    feedforward_modules=["down_proj"],
)
model = get_peft_model(model, peft_config)
model.print_healthcheck()

متى تستخدم IA3 مقابل LoRA

يُعدّ IA3 فعّالاً بشكل خاص عندما تحتاج إلى أصغر محوِّلات ممكنة للنشر في بيئات محدودة التخزين، أو عندما ترغب في تقارب سريع مع عدد أقل من المعاملات القابلة للتدريب. قد يكون LoRA تفضيلاً أفضل عندما تحتاج إلى منظومة أوسع من متغيرات LoRA (مثل DoRA وQLORA وغيرها)، أو عندما تريد النهج الأكثر اختباراً على نطاق واسع مع دعم مجتمعي واسع.

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

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

IA3Config

فئة peft.IA3Config

< >

( 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 = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonefeedforward_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_ia3_weights: bool = True )

المعاملات

  • target_modules (Optional[Union[List[str], str]]) — أسماء الوحدات التي سيتم تطبيق المُكيّف عليها. إذا تم تحديد هذا، فسيتم استبدال الوحدات التي تحمل الأسماء المحددة فقط. عند تمرير نص، سيتم إجراء مطابقة باستخدام تعبير نمطي. عند تمرير قائمة من النصوص، سيتم إجراء مطابقة دقيقة أو يتم التحقق مما إذا كان اسم الوحدة ينتهي بأي من النصوص الممررة. إذا تم تحديده على أنه ‘all-linear’، فسيتم اختيار جميع وحدات linear/Conv1D، باستثناء طبقة الإخراج. إذا لم يتم تحديده، فسيتم اختيار الوحدات وفقًا لبنية النموذج. إذا لم تكن البنية معروفة، فسيتم رفع خطأ — في هذه الحالة، يجب عليك تحديد الوحدات المستهدفة يدويًا.
  • exclude_modules (Optional[Union[List[str], str]]) — أسماء الوحدات التي لا يُطبَّق عليها المُكيّف. عند تمرير نص، يتم إجراء مطابقة باستخدام تعبير نمطي. عند تمرير قائمة من النصوص، يتم إجراء مطابقة دقيقة أو يُتحقق مما إذا كان اسم الوحدة ينتهي بأي من النصوص المُمرَّرة.
  • feedforward_modules (Optional[Union[List[str], str]]) — أسماء الوحدات التي سيتم التعامل معها كوحود تقدّمية، كما في الورقة الأصلية. ستُضرب متجهات (IA)³ في مدخل هذه الوحدات، بدلاً من مخرجها. يجب أن يكون feedforward_modules اسماً أو مجموعة فرعية من الأسماء الموجودة في target_modules.
  • fan_in_fan_out (bool) — اضبط هذا على True إذا كانت الطبقة التي سيتم استبدالها تخزن الأوزان على شكل (fan_in, fan_out). على سبيل المثال، يستخدم gpt-2 Conv1D الذي يخزن الأوزان على شكل (fan_in, fan_out) وبالتالي يجب ضبط هذا على True.
  • modules_to_save (Optional[List[str]]) — قائمة بالوحدات، بخلاف طبقات (IA)³، التي يجب تعيينها قابلة للتدريب وحفظها في نقطة الفحص النهائية.
  • init_ia3_weights (bool) — ما إذا كان سيتم تهيئة المتجهات في طبقات (IA)³، والافتراضي هو True. يُنصح بعدم تعيين هذا إلى False.

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

IA3Model

فئة peft.IA3Model

< >

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

يعيد

torch.nn.Module

نموذج (IA)^3.

ينشئ نموذج Infused Adapter by Inhibiting and Amplifying Inner Activations ((IA)^3) من نموذج transformers مُدرَّب مسبقًا. تم وصف الطريقة بالتفصيل في https://huggingface.co/papers/2205.05638

مثال:

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

>>> config = IA3Config(
...     peft_type="IA3",
...     task_type="SEQ_2_SEQ_LM",
...     target_modules=["k", "v", "w0"],
...     feedforward_modules=["w0"],
... )

>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> ia3_model = get_peft_model(model, config)

الخصائص:

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

add_weighted_adapter

< >

( adapters: list[str]weights: list[float]adapter_name: str )

المعاملات

  • adapters (list) — قائمة بأسماء المُكيِّفات التي سيتم دمجها.
  • weights (list) — قائمة بالأوزان الخاصة بكل مُكيّف.
  • adapter_name (str) — اسم المُكيّف الجديد.

تضيف هذه الطريقة مُكيِّفًا جديدًا من خلال دمج المُكيِّفات المُعطاة مع الأوزان المُعطاة.

Update on GitHub