درک مزیت LoRA
تنظیم دقیق سنتی شامل بهروزرسانی تمام پارامترها در یک مدل از پیش آموزشدیده است. برای مدلی با میلیاردها پارامتر، این کار به VRAM قابل توجهی نیاز دارد و منجر به ایجاد یک فایل مدل عظیم برای هر تطبیق حوزه میشود. LoRA این بهروزرسانیهای وزن را با معرفی ماتریسهای تجزیه رتبه پایین قابل آموزش در هر لایه از ترانسفورمر تقریب میزند. به جای ذخیره ترابایتها وزنهای بهروزشده، شما تنها ماتریسهای تطبیق کوچک را ذخیره میکنید که اغلب تنها چند صد مگابایت حجم دارند. این رویکرد نه تنها استفاده از حافظه را کاهش میدهد، بلکه زمانهای آموزش را به طور قابل توجهی نیز سرعت میبخشد و آن را برای توسعهدهندگان فردی و تیمهای متوسط در دسترس میسازد.آمادهسازی محیط شما
قبل از غرق شدن در کد، مطمئن شوید که کتابخانههای ضروری نصب شدهاند. شما به PyTorch، `transformers` و `peft` (تنظیم دقیق کارآمد از نظر پارامترها) نیاز دارید. به شدت توصیه میشود از یک GPU با حداقل ۲۴ گیگابایت VRAM برای پردازش کارآمد استفاده کنید، اگرچه تکنیکهایی مانند bitsandbytes به شما امکان میدهند روی سختافزار کوچکتر نیز اجرا کنید.ابتدا، بیایید یک مدل پایه را بارگذاری کرده و پیکربندی LoRA را اعمال کنیم. در زیر یک قطعه کد پایتون آورده شده است که نحوه مقداردهی اولیه مدل با کوانتیزاسیون ۸ بیتی و تعیین رتبههای 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()