الوحدة 7 — الضبط الدقيق الاقتصاديّ لنموذج صغير
النموذج الصغير الجاهز يعمل بشكل مقبول، لكنّ الضبط الدقيق (Fine-tuning) على بياناتنا الخاصّة يرفع الأداء بشكل ملحوظ في المهامّ المتخصّصة. المشكلة تاريخيًّا أنّه كان مكلفًا: تعديل جميع مُعامِلات نموذج بـ3 مليارات مُعامِل يتطلّب ذاكرة GPU كبيرة ووقتًا طويلًا.
LoRA (Low-Rank Adaptation) والدورة 19 المخصّصة لها بالتفصيل، غيّرت المعادلة كليًّا.
مبدأ LoRA في دقيقة
بدلًا من تحديث جميع الأوزان في النموذج، LoRA يجمّد الأوزان الأصليّة ويضيف مصفوفتَين صغيرتَين ( من الشكل و من الشكل ، مع صغير جدًّا مثل 8 أو 16). التحديث الفعليّ هو حاصل ضربهما: .
عدد المُعامِلات القابلة للتدريب ينخفض من مليارات إلى بضعة ملايين، بنسبة 0,1 إلى 1% من النموذج الأصليّ. الأثر عمليًّا:
- ذاكرة GPU المطلوبة تنخفض بعامل 10 إلى 20
- وقت التدريب ينخفض بعامل مماثل
- جودة الضبط قريبة جدًّا من الضبط الكامل، غالبًا مطابقة
QLoRA: خطوة أبعد
QLoRA يجمع بين LoRA والتكميم: النموذج الأصليّ يُحمَّل بصيغة 4 بتّات (بلا فقد جودة أثناء التدريب بفضل تقنيات دقيقة)، ومصفوفات LoRA تبقى على 16 بتّة.
نموذج بـ7 مليارات مُعامِل يصبح قابلًا للضبط على GPU بذاكرة 12 غيغابايت فقط، وهو ما يوجد على بطاقة RTX 3060 أو 4060 يبلغ ثمنها عدّة مئات من الدولارات. كسر حاجز اقتصاديّ حقيقيّ.
بيانات بطاقات الدعم: التنسيق
النموذج يتعلّم من أمثلة على الصيغة:
{
"instruction": "صنّف بطاقة الدعم التالية وأعطِ ملخّصًا في جُملة واحدة.",
"input": "لم أستلم طلبي رقم 45123 المُقدَّم منذ عشرة أيّام، وقد وصل إخطار الشحن...",
"output": "الفئة: شحن. الملخّص: عدم استلام طلب رقم 45123 بعد عشرة أيّام رغم إخطار الشحن."
}
المطلوب حجم معقول من الأمثلة: 500 إلى 3000 بطاقة عادةً تكفي لتحسينات ملموسة. أقلّ من 200 يخاطر بفرط تخصيص على الأمثلة، وأكثر من 5000 يعطي فائدة هامشيّة متناقصة على مهمّة تصنيف ضيّقة.
يمكن مضاعفة الأمثلة عبر التقطير بالبيانات الاصطناعيّة (الوحدة 3)، أو عبر توليد صيغ متنوّعة من نفس البطاقة لتعليم النموذج مرونة الصياغة.
دورة تدريب نموذجيّة
على Qwen 2.5 بـ3 مليارات، مع QLoRA (r=16، alpha=32)، على 2000 بطاقة معنونة:
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from transformers import BitsAndBytesConfig
# تحميل النموذج على 4 بتّات
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-3B", quantization_config=bnb_config)
model = prepare_model_for_kbit_training(model)
# إضافة محوّلات LoRA
lora_config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, lora_config)
# تدريب موجز
training_args = TrainingArguments(
output_dir="./qwen-tickets",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=2e-4,
logging_steps=10,
)
trainer = Trainer(model=model, args=training_args, train_dataset=dataset)
trainer.train()
على RTX 3060 بذاكرة 12 غيغا، هذا التدريب يستغرق نحو 45 دقيقة، ويكلّف على GPU سحابيّ مؤجَّر (RunPod، Lambda) حوالي 0,50 دولار.
قياس المكسب
قبل الضبط، وبعده، على نفس مجموعة الاختبار (500 بطاقة محجوزة):
- Qwen 2.5-3B جاهز: 82% دقّة تصنيف، 3,7/5 جودة تلخيص
- Qwen 2.5-3B بعد QLoRA على 2000 بطاقة: 91% دقّة، 4,3/5 جودة تلخيص
- GPT-4 عبر واجهة (مرجع): 93% دقّة، 4,5/5 جودة تلخيص
بنصف دولار وأقلّ من ساعة، سدّت الفجوة من 11 نقطة إلى نقطتين. هذه هي القوّة الاقتصاديّة الحقيقيّة لـLoRA.
تصدير المحوّلات
بعد التدريب، LoRA ينتج محوّلات (adapters) صغيرة الحجم (بضع عشرات من الميغابايت)، منفصلة عن النموذج الأصليّ. يمكن:
- دمجها في النموذج الأصليّ للحصول على ملفّ واحد قابل للتصدير إلى GGUF
- الاحتفاظ بها منفصلة، وتحميلها ديناميكيًّا فوق النموذج الأساس
الخيار الأوّل أفضل للنشر النهائيّ على أجهزة الموظّفين، لأنّه يعطي ملفًّا واحدًا قابلًا للتشغيل بـllama.cpp بلا تعقيد إضافيّ.
البيانات المعنونة الصغيرة (بضع مئات من البطاقات) قابلة للحفظ عن ظهر قلب. راقب دائمًا الأداء على مجموعة تحقّق منفصلة لا يراها النموذج، وتوقّف عندما يبدأ الأداء على التحقّق بالتراجع بينما أداء التدريب يواصل التحسّن.
متى لا نضبط بدقّة
- البيانات قليلة جدًّا (أقلّ من 100 مثال معنون): مطالبة جيّدة مع بضعة أمثلة (Few-shot) أفضل.
- المهمّة تتغيّر أسبوعيًّا (فئات جديدة تُضاف باستمرار): إعادة الضبط تصبح عبئًا تشغيليًّا.
- النموذج الأصليّ يعطي أداءً كافيًا (فوق 90% دون ضبط): مكسب إضافيّ لا يبرّر الجهد.
ال خلاصة
- LoRA يقلّل مُعامِلات التدريب إلى أقلّ من 1% من النموذج، مع جودة قريبة من الضبط الكامل.
- QLoRA يضيف تحميل النموذج على 4 بتّات، فيسمح بضبط نماذج 7 مليارات على GPU متوسّطة.
- 500 إلى 3000 مثال كافية عادةً لضبط دقيق فعّال على مهمّة ضيّقة.
- الكلفة اليوم في حدود الدولار الواحد لدورة ضبط كاملة، وأقلّ من ساعة زمنيّة.
الوحدة التالية: تشغيل النموذج المضبوط محلّيًّا على جهاز الموظّف عبر Ollama أو llama.cpp.