PEFT documentation
إعدادات ونماذج PEFT
إعدادات ونماذج PEFT
إن الحجم الهائل للنماذج المُسبقة التدريب الكبيرة اليوم - والتي تحتوي عادةً على مليارات المعاملات - يُشكّل تحديًا كبيرًا في التدريب، لأنها تتطلب مساحة تخزين أكبر وقوة حوسبة أكبر لإجراء جميع تلك الحسابات. ستحتاج إلى الوصول إلى وحدات معالجة رسومية (GPUs) أو وحدات معالجة توتال (TPUs) قوية لتدريب هذه النماذج المُسبقة التدريب الكبيرة، وهو أمر مكلف، وغير متاح على نطاق واسع للجميع، وغير صديق للبيئة، وغير عملي إلى حد كبير. تعالج طرق PEFT العديد من هذه التحديات. هناك عدة أنواع من طرق PEFT (التلميح الناعم، تحليل المصفوفات، المحوِّلات)، لكنها جميعًا تركز على الشيء نفسه، وهو تقليل عدد المعاملات القابلة للتدريب. وهذا يجعل تدريب النماذج الكبيرة وتخزينها على الأجهزة الاستهلاكية أكثر سهولة.
صُممت مكتبة PEFT لمساعدتك على تدريب النماذج الكبيرة بسرعة على وحدات معالجة رسومية مجانية أو منخفضة التكلفة، وفي هذا الشرح التعليمي ستتعلم كيفية إعداد تكوين لتطبيق طريقة PEFT على نموذج أساسي مُدرَّب مسبقًا لأغراض التدريب. بمجرد إعداد تكوين PEFT، يمكنك استخدام أي إطار عمل للتدريب تفضله (فئة Trainer في Transformers، أو Accelerate، أو حلقة تدريب مخصصة باستخدام PyTorch).
إعدادات PEFT
تعرف على المزيد حول المعاملات التي يمكنك تكوينها لكل طريقة من طرق PEFT في صفحة مرجع الواجهة البرمجية الخاصة بها.
تُخزّن التهيئة (Configuration) المعاملات المهمة التي تحدد كيفية تطبيق طريقة PEFT معينة.
على سبيل المثال، راجع LoraConfig التالي لتطبيق LoRA وPromptEncoderConfig لتطبيق p-tuning (هذه ملفات الإعداد مُسلسلة مسبقًا بصيغة JSON). عند تحميل مُكيّف PEFT، يُنصح بالتحقق من وجود ملف adapter_config.json مرتبط به، وهو أمر إلزامي.
{
"base_model_name_or_path": "facebook/opt-350m", #base model to apply LoRA to
"bias": "none",
"fan_in_fan_out": false,
"inference_mode": true,
"init_lora_weights": true,
"layers_pattern": null,
"layers_to_transform": null,
"lora_alpha": 32,
"lora_dropout": 0.05,
"modules_to_save": null,
"peft_type": "LORA", #PEFT method type
"r": 16,
"revision": null,
"target_modules": [
"q_proj", #model modules to apply LoRA to (query and value projection layers)
"v_proj"
],
"task_type": "CAUSAL_LM" #type of task to train model on
}يمكنك إنشاء إعداداتك الخاصة للتدريب عن طريق تهيئة LoraConfig.
from peft import LoraConfig, TaskType
lora_config = LoraConfig(
r=16,
target_modules=["q_proj", "v_proj"],
task_type=TaskType.CAUSAL_LM,
lora_alpha=32,
lora_dropout=0.05
){
"base_model_name_or_path": "roberta-large", #base model to apply p-tuning to
"encoder_dropout": 0.0,
"encoder_hidden_size": 128,
"encoder_num_layers": 2,
"encoder_reparameterization_type": "MLP",
"inference_mode": true,
"num_attention_heads": 16,
"num_layers": 24,
"num_transformer_submodules": 1,
"num_virtual_tokens": 20,
"peft_type": "P_TUNING", #PEFT method type
"task_type": "SEQ_CLS", #type of task to train model on
"token_dim": 1024
}يمكنك إنشاء إعداداتك الخاصة للتدريب عن طريق تهيئة PromptEncoderConfig.
from peft import PromptEncoderConfig, TaskType
p_tuning_config = PromptEncoderConfig(
encoder_reparameterization_type="MLP",
encoder_hidden_size=128,
num_attention_heads=16,
num_layers=24,
num_transformer_submodules=1,
num_virtual_tokens=20,
token_dim=1024,
task_type=TaskType.SEQ_CLS
)نماذج PEFT
بمجرد حصولك على إعداد PEFT، يمكنك الآن تطبيقه على أي نموذج مُدرَّب مسبقًا لإنشاء PeftModel. اختر من بين أي من أحدث النماذج في مكتبة Transformers، أو نموذج مخصص، وحتى معماريات تحويلية جديدة وغير مدعومة.
في هذا الشرح، حمّل نموذج facebook/opt-350m الأساسي لإجراء الضبط الدقيق.
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")استخدم دالة get_peft_model() لإنشاء PeftModel من النموذج الأساسي facebook/opt-350m وإعدادات lora_config التي أنشأتها سابقًا.
from peft import get_peft_model
lora_model = get_peft_model(model, lora_config)
lora_model.print_healthcheck()عند استدعاء get_peft_model()، يتم تعديل النموذج الأساسي in-place. وهذا يعني أنه عند استدعاء get_peft_model() على نموذج تم تعديله بنفس الطريقة مسبقًا، سيُعدَّل هذا النموذج بشكل إضافي. لذلك، إذا كنت ترغب في تعديل تكوين PEFT الخاص بك بعد استدعاء
get_peft_model()من قبل، فستحتاج أولاً إلى تفريغ النموذج باستخدام unload() ثم استدعاءget_peft_model()بالتكوين الجديد. أو يمكنك إعادة تهيئة النموذج للتأكد من حالة جديدة وغير معدلة قبل تطبيق تكوين PEFT جديد.
الآن يمكنك تدريب PeftModel باستخدام إطار التدريب المفضل لديك! بعد التدريب، يمكنك حفظ نموذجك محليًا باستخدام save_pretrained() أو رفعه إلى Hub باستخدام الطريقة push_to_hub.
# save locally
lora_model.save_pretrained("your-name/opt-350m-lora")
# push to Hub
lora_model.push_to_hub("your-name/opt-350m-lora")لتحميل PeftModel للاستدلال، ستحتاج إلى تقديم PeftConfig المستخدم لإنشائه والنموذج الأساسي الذي تم تدريبه منه.
from peft import PeftModel, PeftConfig
config = PeftConfig.from_pretrained("ybelkada/opt-350m-lora")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path)
lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora")بشكل افتراضي، يتم ضبط PeftModel للاستدلال، ولكن إذا كنت ترغب في تدريب المُكيّف أكثر، يمكنك ضبط
is_trainable=True.lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora", is_trainable=True)
تُعدّ طريقة PeftModel.from_pretrained() الأكثر مرونةً لتحميل PeftModel لأنها لا تتأثر بإطار العمل المستخدم للنموذج (Transformers أو timm أو نموذج PyTorch عام). أما الفئات الأخرى، مثل AutoPeftModel، فهي مجرد غلاف مريح حول PeftModel الأساسي، وتُسهّل تحميل نماذج PEFT مباشرةً من Hub أو محليًا حيث تُخزَّن أوزان PEFT.
from peft import AutoPeftModelForCausalLM
lora_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")اطّلع على مرجع واجهة AutoPeftModel للتعرف على المزيد حول فئات AutoPeftModel.
الخطوات التالية
باستخدام PeftConfig المناسب، يمكنك تطبيقه على أي نموذج مُدرَّب مسبقًا لإنشاء PeftModel وتدريب نماذج كبيرة وقوية بشكل أسرع على وحدات معالجة الرسوميات المتاحة مجانًا! لمعرفة المزيد حول تكوينات ونماذج PEFT، قد يكون الدليل التالي مفيدًا:
- تعلّم كيفية تكوين طريقة PEFT للنماذج التي ليست من Transformers في دليل العمل مع نماذج مخصصة.