فاین‌تیون مدل زبانی با QLoRA روی یک GPU

فاین‌تیون مدل زبانی با QLoRA روی یک GPU

جدول محتوا 👇

فاین‌تیون کامل یک مدل زبانی ۸ میلیارد پارامتری به چند GPU گران‌قیمت نیاز دارد. QLoRA این معادله را تغییر داد: مدل پایه را با دقت ۴ بیتی در حافظه نگه می‌دارد و فقط لایه‌های کوچک اضافه را آموزش می‌دهد؛ در نتیجه همان کار روی یک GPU با حافظه متوسط ممکن می‌شود. در این راهنما فاین‌تیون مدل زبانی با QLoRA را از تصمیم «آیا اصلاً فاین‌تیون لازم است؟» تا آماده‌سازی داده، آموزش، ارزیابی و استقرار در Ollama توضیح می‌دهیم.

کی فاین‌تیون لازم است؟

فاین‌تیون برای تغییر رفتار مدل مناسب است، نه افزودن دانش:

  • قالب خروجی ثابت (مثلاً JSON با ساختار مشخص).
  • لحن و سبک نگارش برند یا پاسخ‌های پشتیبانی.
  • وظایف تخصصی تکراری: دسته‌بندی تیکت‌ها، استخراج اطلاعات از اسناد، خلاصه‌سازی با قالب ثابت.
  • بهبود عملکرد یک مدل کوچک در یک وظیفه خاص تا جایگزین مدل بزرگ‌تر و گران‌تر شود.

اگر هدف پاسخ به پرسش‌ها از روی اسناد است، RAG مناسب‌تر است. همچنین پیش از فاین‌تیون، مهندسی پرامپت و چند مثال در پرامپت را امتحان کنید. مقایسه کلی در استنتاج یا فاین‌تیون.

LoRA و QLoRA چطور کار می‌کنند؟

  • LoRA: وزن‌های اصلی مدل ثابت می‌مانند و کنار برخی لایه‌ها، ماتریس‌های کوچک کم‌رتبه (Adapter) اضافه و فقط همان‌ها آموزش داده می‌شوند. تعداد پارامترهای قابل آموزش معمولاً کمتر از یک درصد مدل است.
  • QLoRA: علاوه بر LoRA، مدل پایه با کوانتیزاسیون ۴ بیتی (NF4) بارگذاری می‌شود و حافظه لازم چند برابر کمتر می‌شود؛ با افت کیفیت ناچیز در بیشتر وظایف.

خروجی آموزش یک Adapter چندده تا چندصد مگابایتی است که روی مدل پایه اعمال می‌شود. آشنایی با کوانتیزاسیون در کوانتیزاسیون LLM.

سخت‌افزار لازم

اندازه مدل VRAM تقریبی برای QLoRA
۱ تا ۴ میلیارد پارامتر ۸ تا ۱۲ گیگابایت
۷ تا ۹ میلیارد پارامتر ۱۲ تا ۲۴ گیگابایت
۱۳ تا ۱۴ میلیارد پارامتر ۲۴ گیگابایت به بالا
۳۰ تا ۷۰ میلیارد پارامتر ۴۸ تا ۸۰ گیگابایت یا چند GPU

طول دنباله (Sequence Length) و اندازه Batch مصرف حافظه را به‌شدت تغییر می‌دهند. ابزارهایی مثل Unsloth مصرف حافظه و زمان آموزش را بیشتر کاهش می‌دهند. انتخاب GPU در بهترین GPU برای LLM.

آماده‌سازی داده

کیفیت داده تعیین‌کننده‌ترین عامل است. چند صد تا چند هزار نمونه باکیفیت معمولاً از ده‌ها هزار نمونه شلوغ بهتر است. قالب رایج، مکالمه در فایل JSONL:

{"messages": [
  {"role": "system", "content": "تو دستیار پشتیبانی تراست هاست هستی."},
  {"role": "user", "content": "سایتم خطای ۵۰۲ می‌دهد."},
  {"role": "assistant", "content": "خطای ۵۰۲ یعنی وب‌سرور از سرویس پشت خود پاسخ نگرفته..."}
]}
  • نمونه‌ها باید دقیقاً همان رفتاری را نشان دهند که از مدل می‌خواهید.
  • تنوع پرسش‌ها را حفظ کنید و نمونه‌های تکراری را حذف کنید.
  • اطلاعات شخصی و محرمانه را از داده حذف یا ناشناس کنید.
  • ۵ تا ۱۰ درصد داده را برای ارزیابی کنار بگذارید و در آموزش استفاده نکنید.
  • برای فارسی، حروف و نیم‌فاصله‌ها را یکدست کنید.

آموزش با Transformers، PEFT و TRL

python3 -m venv ft && source ft/bin/activate
pip install torch transformers peft trl bitsandbytes datasets accelerate
import torch
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig
from trl import SFTTrainer, SFTConfig

base = "Qwen/Qwen2.5-7B-Instruct"
bnb = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4",
                         bnb_4bit_compute_dtype=torch.bfloat16,
                         bnb_4bit_use_double_quant=True)
model = AutoModelForCausalLM.from_pretrained(base, quantization_config=bnb, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(base)

data = load_dataset("json", data_files={"train": "train.jsonl", "eval": "eval.jsonl"})
lora = LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05,
                  target_modules="all-linear", task_type="CAUSAL_LM")
args = SFTConfig(output_dir="out", num_train_epochs=2, learning_rate=2e-4,
                 per_device_train_batch_size=2, gradient_accumulation_steps=8,
                 gradient_checkpointing=True, bf16=True, logging_steps=10,
                 eval_strategy="steps", eval_steps=100, save_steps=100)
trainer = SFTTrainer(model=model, args=args, train_dataset=data["train"],
                     eval_dataset=data["eval"], peft_config=lora,
                     processing_class=tokenizer)
trainer.train()
trainer.save_model("out/adapter")

نام برخی پارامترها بین نسخه‌های TRL تغییر کرده است؛ با مستندات نسخه نصب‌شده تطبیق دهید. آموزش طولانی را در tmux یا به‌صورت سرویس اجرا کنید تا با قطع SSH متوقف نشود. مدل پایه را با مجوز مناسب برای کاربرد خود انتخاب کنید؛ نکات دریافت مدل در اجرای مدل‌های Hugging Face.

تنظیمات مهم

  • r و lora_alpha: رتبه Adapter؛ ۸ تا ۳۲ برای بیشتر کارها کافی است. alpha معمولاً دو برابر r.
  • learning_rate: حدود 1e-۴ تا 2e-۴ برای QLoRA. نرخ بالا باعث فراموشی توانایی‌های عمومی مدل می‌شود.
  • تعداد Epoch: ۱ تا ۳. اگر Loss ارزیابی بالا رفت در حالی که Loss آموزش پایین می‌آید، مدل در حال حفظ کردن داده (Overfitting) است.
  • اندازه Batch مؤثر: حاصل‌ضرب batch_size در gradient_accumulation_steps؛ با Batch کوچک و انباشت گرادیان، حافظه کمتری مصرف می‌شود.
  • قالب گفتگو: همان Chat Template مدل پایه را استفاده کنید؛ عدم تطابق، کیفیت را خراب می‌کند.

ارزیابی

  1. خروجی مدل فاین‌تیون‌شده و مدل پایه را روی داده ارزیابی کنار هم مقایسه کنید.
  2. برای وظایف ساختاریافته (دسته‌بندی، استخراج)، معیار عددی مثل دقت یا درصد JSON معتبر بسازید.
  3. برای پاسخ‌های متنی، بازبینی انسانی یا ارزیابی با یک مدل قوی‌تر را به کار ببرید.
  4. چند پرسش عمومی هم بپرسید تا مطمئن شوید توانایی‌های پایه مدل از بین نرفته است.

ادغام و استقرار

برای سرو با vLLM، Adapter را می‌توان جداگانه بارگذاری کرد؛ حتی چند Adapter روی یک مدل پایه. برای Ollama، ابتدا Adapter را با مدل پایه (با دقت کامل، نه ۴ بیتی) ادغام کنید:

from peft import AutoPeftModelForCausalLM
m = AutoPeftModelForCausalLM.from_pretrained("out/adapter", torch_dtype="bfloat16")
m = m.merge_and_unload()
m.save_pretrained("merged")

سپس مدل ادغام‌شده را با ابزارهای llama.cpp به GGUF تبدیل و کوانتیزه کنید و با یک Modelfile در Ollama بسازید. مقایسه ابزارهای سرو در Ollama یا vLLM و ارائه به برنامه‌ها در ساخت API سازگار با OpenAI.

سوالات متداول

چقدر داده لازم است؟

برای تغییر قالب یا لحن، چند صد نمونه باکیفیت اغلب کافی است. وظایف پیچیده‌تر به چند هزار نمونه نیاز دارند. کیفیت و یکدستی از تعداد مهم‌تر است.

آموزش چقدر طول می‌کشد؟

برای مدل ۷ تا ۸ میلیاردی و چند هزار نمونه، روی یک GPU مناسب معمولاً از کمتر از یک ساعت تا چند ساعت.

آیا می‌توانم دانش اسناد شرکت را با فاین‌تیون به مدل یاد بدهم؟

تا حدی، اما غیرقابل اعتماد است و مدل جزئیات را اشتباه یا ساختگی بیان می‌کند. برای دانش، RAG را استفاده کنید و فاین‌تیون را برای رفتار نگه دارید.

مدل پایه فارسی خوب کدام است؟

مدل‌های چندزبانه جدید مثل Qwen، Gemma و Llama فارسی را در سطوح مختلف پشتیبانی می‌کنند. چند مدل را روی وظیفه خودتان پیش از فاین‌تیون مقایسه کنید.

GPU برای فاین‌تیون

سرورهای GPU تراست هاست با VRAM مناسب برای فاین‌تیون QLoRA و سرو مدل‌های سفارشی در دیتاسنتر داخل کشور آماده‌اند.

سرور مجازی ابری تراست هاست

مشاوره تراست‌هاست​

با متخصصان و کارشناسان به صورت رایگان!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *