فهم ميزة LoRA
يتضمن الضبط التقليدي تحديث جميع المعلمات في نموذج تم تدريبه مسبقاً. بالنسبة للنموذج الذي يحتوي على مليارات المعلمات، يتطلب ذلك ذاكرة فيديو (VRAM) كبيرة ويؤدي إلى إنشاء ملف نموذج ضخم لكل تكيف مع مجال معين. تقوم LoRA بتقريب تحديثات الأوزان من خلال إدخال مصفوفات تحلل منخفضة الرتبة قابلة للتدريب في كل طبقة من طبقات المحول (Transformer). بدلاً من تخزين تيرابايت من الأوزان المحدثة، تقوم فقط بتخزين مصفوفات تكيف صغيرة، غالباً ما تكون بحجم بضع مئات من الميجابايت فقط. لا يقلل هذا النهج من استخدام الذاكرة فحسب، بل يسرع أيضاً أوقات التدريب بشكل كبير، مما يجعله متاحاً للمطورين الأفراد والفرق متوسطة الحجم.إعداد بيئة العمل
قبل الغوص في الكود، تأكد من تثبيت المكتبات اللازمة. ستحتاج إلى PyTorch و`transformers` و`peft` (التكيف منخفض الرتبة الفعال في المعلمات). يُوصى بشدة باستخدام وحدة معالجة رسومات (GPU) بسعة ذاكرة فيديو لا تقل عن 24 جيجابايت للمعالجة الفعالة، على الرغم من أن تقنيات مثل bitsandbytes تسمح لك بالعمل على أجهزة أصغر.أولاً، دعنا نقوم بتحميل نموذج أساسي وتطبيق إعدادات LoRA. فيما يلي مقتطف برمجي بلغة Python يوضح كيفية تهيئة النموذج باستخدام الكمية الثمانية الأبعاد (8-bit quantization) وتحديد رتب LoRA.
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
import torch
# Load model directly
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3-8b-instruct")
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3-8b-instruct",
device_map="auto",
quantization_config=quantization_config,
use_cache=False,
)
# Define LoRA configuration
lora_config = LoraConfig(
r=8, # Rank of the update matrix
lora_alpha=32,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()