PEFT documentation
UniLoRA
UniLoRA
Uni-LoRA هو أسلوب PEFT يشارك بنك متجهات قابل للتدريب ومضغوط عبر أوزان محوّلات الرتبة المنخفضة. بدلاً من تعلّم كل عنصر في مصفوفة LoRA بشكل مستقل، يحدد UniLoRA إسقاطاً حتمياً للعناصر إلى قيم مشتركة theta_d ويتعلم المعلمات المشتركة المستخدمة في تحديث المحوّل.
البدء السريع
from peft import UniLoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B")
config = UniLoraConfig(
r=32,
theta_d_length=256,
proj_seed=42,
target_modules=["q_proj", "v_proj"],
unilora_dropout=0.0,
init_weights=True,
task_type="CAUSAL_LM",
)
peft_model = get_peft_model(model, config)
peft_model.print_healthcheck()المعلمات المهمة
r يتحكم في بُعد مُكيّف الرتبة المنخفضة. تزيد القيم الأكبر من سعة المُكيّف واستخدام الذاكرة.
يتحكم theta_d_length في طول بنك متجهات UniLoRA المشتركة. وهذا هو التخزين القابل للتدريب الرئيسي الذي تشاركه إدخالات المُكيِّف المُسقط.
يتحكم proj_seed في توليد الفهارس الحتمية للتحويلات الثابتة إلى theta_d. يؤدي إعادة استخدام البذرة والإعداد نفسيهما إلى إمكانية إعادة إنتاج فهارس المُكيِّفات المولَّدة.
target_modules يحدد الوحدات التي تستقبل محولات UniLoRA. استخدم لاحقات الوحدات مثل ["q_proj", "v_proj"]، أو نص regex، أو "all-linear" عندما تدعمه بنية النموذج.
unilora_dropout يطبّق إسقاط (dropout) داخل طبقات مُكيّف UniLoRA أثناء التدريب.
يتحكم init_weights في تهيئة معاملات UniLoRA. اضبطه على False للحفاظ على تهيئة عشوائية لـtheta_d عندما تحتاج إلى إدارة التهيئة يدويًا.
يتحكم save_indices في ما إذا كانت نقاط الحفظ الخاصة بـ UniLoRA تحفظ متجهات الفهرس والمقياس المولّدة معًا إلى جانب
المعاملات المشتركة theta_d. يُبقي تعطيل هذا الخيار نقاط الحفظ أصغر حجمًا ويعيد توليد الفهارس من proj_seed؛ بينما يجعل تفعيلها المُكيّفات المحفوظة مستقلة عن أي تغييرات مستقبلية في توليد الفهارس.
نظرة عامة على الاختبارات
واجهة برمجة التطبيقات
UniLoraConfig
فئة peft.UniLoraConfig
< source >( 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 = 4proj_seed: int = 42theta_d_length: int = 256target_modules: list[str] | str | None = Noneunilora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: list[str] | None = Noneinit_theta_d_bound: float = 0.02init_weights: bool = Truesave_indices: bool = Falselayers_to_transform: list[int] | int | None = Nonelayers_pattern: list[str] | str | None = None )
المعاملات
- r (
int) — رتبة التكيف منخفض الرتبة. يتحكم هذا في السعة التعبيرية لتحديث UniLora. - proj_seed (
int) — البذرة العشوائية المستخدمة لتوليد إسناد الفهرس الثابت. يضمن ذلك قابلية إعادة الإنتاج عبر التشغيلات. - theta_d_length (
int) — طول متجه UniLora المشتركtheta_d. - target_modules (
Union[list[str], str], اختياري) — أسماء أو أنماط الوحدات التي تُطبَّق عليها مُكيِّفات UniLora.- إذا تم توفير سلسلة نصية، يتم اعتبارها تعبيرًا نمطيًا.
- إذا تم تقديم قائمة، يتم مطابقة الوحدات بالاسم الدقيق أو باللاحقة.
- تُطبّق القيمة الخاصة ‘all-linear’ UniLora على جميع طبقات Linear / Conv1D باستثناء طبقة الإخراج. إذا لم يتم تحديد الوحدات، فستُستنتج من بنية النموذج. وسيُستدعى خطأ إذا كانت البنية غير مدعومة.
- unilora_dropout (
float) — احتمالية Dropout المطبقة داخل طبقات UniLora. - fan_in_fan_out (
bool) — ما إذا كانت الطبقة المستبدلة تخزّن الأوزان في صيغة (fan_in, fan_out). يجب ضبط هذا الخيار على True للنماذج مثل GPT-2 التي تستخدم طبقات Conv1D. - bias (
str) — يحدد مصطلحات الانحياز القابلة للتدريب:- none: لا يتم تحديث أي معاملات انحياز
- ‘all’: يتم تحديث جميع معاملات الانحياز
- ‘unilora_only’: يتم تحديث الانحيازات داخل طبقات UniLora فقط ملاحظة: تفعيل تحديث الانحيازات يغيّر مخرجات النموذج حتى عند تعطيل المُكيّفات.
- modules_to_save (
list[str]، اختياري) — وحدات إضافية (خارج طبقات UniLora) يجب أن تبقى قابلة للتدريب وتُحفظ في نقطة الفحص النهائية. يُستخدم هذا بشكل شائع لرؤوس محددة للمهام مثل المصنّفات. - init_theta_d_bound (
float) — حد التهيئة لبنك متجهات UniLora. يتم أخذ عينات من المتجهات بشكل منتظم من [-init_theta_d_bound, init_theta_d_bound]. يتم تجنّب التهيئة بالصفر لمنع تضاؤل التدرجات. يُوصى بقيم صغيرة (مثل 0.02) لتحقيق تدريب مستقر. - init_weights (
bool) — ما إذا كان سيتم تهيئةtheta_dباستخدام التهيئة الافتراضية لـ UniLora. إذا تم ضبطه علىFalse، فإنtheta_dيحتفظ بتحيز عشوائي. - save_indices (
bool) — ما إذا كان سيتم حفظ فهارس UniLora المولّدة ومخازن المقاييس (scale buffers) إلى جانبtheta_d. يؤدي هذا إلى زيادة حجم نقطة الحفظ (checkpoint)، لكنه يجعل المحوِّلات (adapters) المحفوظة مستقلة عن أي تغييرات مستقبلية في روتين توليد الفهارس. - layers_to_transform (
Union[list[int], int], اختياري) — فهارس طبقات التحويل التي يُطبَّق عليها UniLora. إذا تم تحديدها، فسيتم تعديل هذه الطبقات فقط. هذا الخيار صالح فقط عندما يكونtarget_modulesقائمة. - layers_pattern (
Union[list[str], str]، اختياري) — نمط مخصص لأسماء الطبقات يُستخدم معlayers_to_transformعندما لا يتبع النموذج معايير التسمية القياسية للطبقات. يكون هذا الخيار صالحًا فقط عندما يكونtarget_modulesقائمة.
فئة التهيئة لمُكيّفات UniLora.
تعرف هذه الفئة جميع المعلمات الفائقة المطلوبة لتبني طبقات UniLora وتطبيقها ضمن إطار عمل PEFT. تم تصميم الإعداد بشكل مقصود ليكون بسيطاً، ولا يتضمن سوى المعلمات التي تُستخدم فعلياً في تطبيق UniLora الحالي.
مرجع: Uni-LoRA: متجه واحد هو كل ما تحتاجه https://arxiv.org/abs/2506.00799
UniLoraModel
فئة peft.UniLoraModel
< source >( modelconfigadapter_namelow_cpu_mem_usage: bool = Falsestate_dict: dict[str, torch.Tensor] | None = None )
ينشئ مُكيّف UniLora حول نموذج مُدرَّب مسبقًا.
سندلّ فهارس theta_d حتمية على مساحة معاملات UniLora المسطحة.
يُنتج np.random.choice(np.arange(theta_d_length), size=lora_param_count) عينةً مستقلةً لكل موضع، مما قد يؤدي إلى عدم استخدام بعض إدخالات theta_d في المُكيِّفات الأصغر حجماً. أما UniLora فتستخدم بدلاً من ذلك إسناداً حتمياً متوازناً: يظهر كل فهرس إما floor(D / d) أو ceil(D / d) مرات، حيث D هو عدد معاملات LoRA المُسطَّحة وd هو theta_d_length. يحافظ هذا على استقرار تطبيع كل فهرس على حدة، مع خلط الإسناد ما يزال باستخدام proj_seed.