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

ستُظهر لك هذه الجولة السريعة الميزات الرئيسية لـ PEFT وكيفية تدريب نماذج كبيرة أو تشغيل الاستدلال عليها، وهي نماذج يصعب الوصول إليها عادةً على الأجهزة الاستهلاكية.
إعداد PEFT والنموذج
بالنسبة لأي طريقة PEFT، ستحتاج إلى إنشاء تكوين يحتوي على جميع المعلمات التي تحدد كيفية تطبيق طريقة PEFT، والأهم من ذلك تحديد طبقات النموذج الموجودة التي يجب استهدافها بمعلمات قابلة للتدريب. بمجرد إعداد التكوين، مرّره إلى دالة get_peft_model() مع النموذج الأساسي لإنشاء PeftModel قابل للتدريب.
لنستخدم LoRA كمثال، لكننا سنناقش فقط المعلمات المشتركة - فقد ترغب في استخدام إحدى العديد من طرق PEFT الأخرى. عادةً ما يتضمن التكوين ما يلي:
target_modules: الوحدات من النموذج الأساسي التي يجب تكييفهاtask_type(الافتراضي:None، راجع أنواعTaskTypeالمتاحة): طبيعة المهمة المُدرَّبة؛ إذا تم تقديمه فقد يساعد في حفظ الطبقات ذات الصلة تلقائيًا إلى جانب أوزان المُكيّف (adapter) أو يحذّرك من عدم التوافقinference_mode(الافتراضي:False): ما إذا كنت تستخدم النموذج للاستدلال أم لا
يعتمد على طريقة PEFT التي تختارها، ستضيف معاملات محددة تحدد، على سبيل المثال، حجم مصفوفات التحديث. إليك مثالاً على إعداد قد تصادفه في التطبيقات العملية:
from peft import LoraConfig, TaskType
peft_config = LoraConfig(target_modules=["q_proj"], task_type=TaskType.CAUSAL_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)راجع دليل التهيئة لمزيد من التفاصيل حول كيفية عمل تهيئة PEFT في الخلفية.
بمجرد إعداد LoraConfig، أنشئ PeftModel باستخدام الدالة get_peft_model(). تستقبل هذه الدالة نموذجًا أساسيًا - يمكنك (لكن ليس من الضروري) تحميله من مكتبة Transformers - بالإضافة إلى LoraConfig الذي يحتوي على المعلمات الخاصة بكيفية تكوين النموذج للتدريب باستخدام LoRA.
حمّل النموذج الأساسي الذي تريد ضبطه.
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B")الآن، غلّف النموذج الأساسي وpeft_config باستخدام دالة get_peft_model() لإنشاء PeftModel.
تعني عملية التغليف أن PEFT يستبدل الطبقات المستهدفة (وهنا: جميع طبقات q_proj) بطبقة مخصصة للمُكيّف (adapter) من نوع الطبقة المستهدفة. وبما أننا نتعامل مع طبقات خطية، فستكون في هذه الحالة طبقة lora.Linear. ملاحظة أن هذه التغييرات تتم في الموقع (in-place) لتوفير الذاكرة، لذا فإن نموذجك الأساسي أصبح معدّلًا الآن.
لاحظ أننا حددنا q_proj فقط، لكننا في الواقع نستهدف جميع طبقات model.layers[:].self_attn.q_proj. والسبب في ذلك أن PEFT يبحث عن لاحقات متطابقة افتراضيًا. مرر نصًا يحتوي على تعبير نمطي إذا كنت ترغب في استهداف أنماط طبقات أكثر تعقيدًا.


تُغلَّف طبقة النموذج الأساسي وتُحفظ دون تدريب، بينما تُضاف أوزان جديدة قابلة للتدريب وتُدمج. إن كيفية هيكلة هذه الأوزان الجديدة ودمجها مع أوزان النموذج الأساسي تُشكّل جزءًا كبيرًا مما يميّز طرق PEFT المختلفة عن بعضها البعض.
قبل بدء التدريب، نفّذ فحص صحة للتأكد من حالة المُكيّف وفحص عدد المعاملات القابلة للتدريب.
from peft import get_peft_model, LoraConfig
peft_config = LoraConfig() # or your other PEFT method of choice
peft_model = get_peft_model(model, peft_config)
peft_model.print_healthcheck()يتضمن فحص الصحة نسبة المعاملات القابلة للتدريب إلى جانب حالة المُكيّف، وإعدادات النموذج، والبيئة.
تشغيل فحص الحالة
استخدم print_healthcheck() لتحديد الحالات المشبوهة، مثل المُكيِّفات المدمجة أو غير المتسقة، وإنشاء تقرير مختصر لتقديمه ضمن بلاغ الخطأ.
peft_model.print_healthcheck()
يجب أن يعرض هذا شيئاً ما على النحو التالي:
PEFT healthcheck
Model:
ID: meta-llama/Llama-3.2-1B, type: LlamaForCausalLM, adapters: default (LORA)
Environment:
peft: 0.21.0, transformers: 5.18.0.dev0, torch: 2.14.0+cu130, Python: 3.13.9
Runtime:
training: True, devices: cpu, dtypes: bfloat16=1,235,814,400, float32=851,968, gradient checkpointing: False
Parameters:
trainable: 851,968, total: 1,236,666,368, percent trainable: 0.0689%, adapter layers: 32
State:
adapter is enabled: True, active: default, merged: none
Layer types:
default:
lora.Linear=32قد تتغير مخرجات الطباعة، لذا لا تحاول تحليلها. للاستخدام البرمجي، استدعِ healthcheck() بدلاً من ذلك، حيث تُرجع نفس المعلومات كقاموس قابل للتسلسل بصيغة JSON.
هذا كل شيء 🎉! الآن يمكنك تدريب النموذج باستخدام Trainer في Transformers، أو Accelerate، أو أي حلقة تدريب مخصصة في PyTorch.
على سبيل المثال، لتدريب النموذج باستخدام فئة Trainer، قم بإعداد فئة TrainingArguments مع بعض معاملات التدريب الفائقة.
training_args = TrainingArguments(
output_dir="your-name/meta-llama/my-llama3.2-adapter",
learning_rate=1e-3,
per_device_train_batch_size=32,
per_device_eval_batch_size=32,
num_train_epochs=2,
weight_decay=0.01,
eval_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
)مرّر النموذج، وحجج التدريب، ومجموعة البيانات، ومُرمّز الرموز، وأي مكوّن آخر ضروري إلى Trainer، ثم استدعِ train لبدء التدريب.
trainer = Trainer(
model=peft_model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"],
data_collator=data_collator,
compute_metrics=compute_metrics,
)
trainer.train()حفظ النموذج
بعد انتهاء تدريب نموذجك، يمكنك حفظ النموذج في مجلد باستخدام الدالة save_pretrained().
peft_model.save_pretrained("output_dir")You can also save your model to the Hub (make sure you’re logged in to your Hugging Face account first) with the push_to_hub function.
from huggingface_hub import notebook_login
notebook_login()
peft_model.push_to_hub("your-name/my-llama3.2-adapter")تقوم الطريقتان معًا بحفظ أوزان PEFT الإضافية التي تم تدريبها فقط، مما يجعل التخزين والنقل والتحميل فائق الكفاءة. على سبيل المثال، يحتوي نموذج facebook/opt-350m المدرَّب باستخدام LoRA على ملفين فقط: adapter_config.json وadapter_model.safetensors. يبلغ حجم ملف adapter_model.safetensors 6.3 ميغابايت فقط!
الاستدلال
اطّلع على مرجع واجهة AutoPeftModel للحصول على قائمة كاملة بالفئات المتاحة من
AutoPeftModel.
يمكنك بسهولة تحميل أي نموذج مدرّب باستخدام PEFT للاستدلال باستخدام فئة AutoPeftModel وطريقة from_pretrained:
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
peft_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
peft_model = peft_model.to(device)
peft_model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
outputs = peft_model.generate(input_ids=inputs["input_ids"].to(peft_model.device), max_new_tokens=50)
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])
"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."بالنسبة إلى مهام أخرى غير مدعومة صراحةً عبر فئة AutoPeftModelFor - مثل التعرف التلقائي على الكلام - يمكنك ما زال استخدام فئة AutoPeftModel الأساسية لتحميل نموذج للمهمة.
from peft import AutoPeftModel
peft_model = AutoPeftModel.from_pretrained("smangrul/openai-whisper-large-v2-LORA-colab")أكثر طريقة عامة لتحميل مُكيّف PEFT مُدرَّب على نموذج هي استخدام from_pretrained():
from transformers import AutoPeftModelForCausalLM
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/llama3.2-1B")
peft_model = PeftModel.from_pretrained(base_model, "my-user/my-llama-adapter") # you can also pass a directory instead of a hub pathعدة محولات
يدعم PEFT تثبيت عدة محوِّلات (من النوع نفسه، وفي هذا المستند سيكون ذلك LoRA) فوق نموذج أساسي. عند استدعاء get_peft_model يوجد محوِّل واحد فقط باسم "default" لكن يمكنك إضافة أي عدد من المحوِّلات الإضافية التي تريدها عن طريق استدعاء peft_model.add_adapter(adapter_name=...).
يعمل هذا لأن الطبقة المغلّفة تمتلك في الواقع مجموعة فريدة من الأوزان القابلة للتدريب لكل اسم مُكيّف (adapter). لا يكون كل مُكيّف نشطًا وقابلًا للتدريب افتراضيًا. يجب عليك تفعيل المُكيّفات صراحةً بالاسم قبل أن تصبح نشطة. يتيح لك ذلك التبديل السريع بين المُكيّفات حيث تكون المعرفة الخاصة بالمهمة مطلوبة، أو تقديم حالات استخدام مختلفة فوق نموذج واحد.

تذكر فقط استدعاء peft_model.set_adapter(<adapter_name>) أولاً لتفعيل المُكيّف.
مثال سريع:
peft_model.add_adapter(adapter_name='new_adapter')
peft_model.set_adapter('new_adapter')الخطوات التالية
الآن وقد اطلعت على كيفية تدريب نموذج باستخدام إحدى طرق PEFT، نشجعك على تجربة بعض الطرق الأخرى مثل prompt tuning. الخطوات مشابهة جداً لتلك المعروضة في quicktour:
- جهّز PeftConfig لطريقة PEFT، مثل LoraConfig أو أي تكوين آخر (انظر نظرة عامة على الطريقة)
- استخدم طريقة get_peft_model() لإنشاء PeftModel من التكوين والنموذج الأساسي
ثم يمكنك تدريبه بالطريقة التي تفضلها! لتحميل نموذج PEFT للاستدلال، يمكنك استخدام فئة AutoPeftModel.
لا تتردد في الاطلاع أيضًا على أدلة المهام إذا كنت مهتمًا بتدريب نموذج باستخدام طريقة PEFT أخرى لمهمة محددة مثل التقسيم الدلالي، والتعرف التلقائي متعدد اللغات على الكلام، وDreamBooth، وتصنيف الرموز، وغيرها.
Update on GitHub