این یک قالب کلی برای Fine-tuning مدلهای زبانی مانند Gemma و LLaMA است که برای هر پروژهای قابل استفاده است.
finetune_template.ipynb: نوتبوک اصلی قالبtrain.json: نمونه فایل دیتاست (فرمت شما ممکن است متفاوت باشد)
برای شروع یک پروژه جدید، فایل finetune_template.ipynb را کپی کنید:
cp finetune_template.ipynb my_project_finetune.ipynbسلول اول نوتبوک را باز کنید و تنظیمات را مطابق پروژه خود تغییر دهید:
PROJECT_CONFIG = {
"project_name": "my-finetuned-model", # ✏️ نام پروژه
"model_name": "google/gemma-2-2b-it", # ✏️ مدل مورد نظر
"dataset_file": "train.json", # ✏️ نام فایل دیتاست
"prompt_field": "prompt", # ✏️ نام فیلد ورودی در JSON
"completion_field": "completion", # ✏️ نام فیلد خروجی در JSON
# ...
}مهمترین بخش! تابع format_instruction را در سلول 4 مطابق با نیاز پروژه خود بنویسید.
def format_instruction(sample):
instruction = f"""<start_of_turn>user
Translate the following text from English to Persian:
{sample['english']}
<end_of_turn>
<start_of_turn>model
{sample['persian']}<end_of_turn>"""
return instructiondef format_instruction(sample):
instruction = f"""<start_of_turn>user
Context: {sample['context']}
Question: {sample['question']}
<end_of_turn>
<start_of_turn>model
{sample['answer']}<end_of_turn>"""
return instructiondef format_instruction(sample):
instruction = f"""<start_of_turn>user
Classify the sentiment of the following text as Positive, Negative, or Neutral:
{sample['text']}
<end_of_turn>
<start_of_turn>model
{sample['sentiment']}<end_of_turn>"""
return instructiondef format_instruction(sample):
entities = json.dumps(sample['entities'], ensure_ascii=False)
instruction = f"""<start_of_turn>user
Extract all named entities (Person, Location, Organization) from the following text:
{sample['text']}
<end_of_turn>
<start_of_turn>model
{entities}<end_of_turn>"""
return instructiondef format_instruction(sample):
instruction = f"""<start_of_turn>user
Summarize the following text in 2-3 sentences:
{sample['long_text']}
<end_of_turn>
<start_of_turn>model
{sample['summary']}<end_of_turn>"""
return instructiondef format_instruction(sample):
instruction = f"""<start_of_turn>user
Write a Python function based on this description:
{sample['description']}
<end_of_turn>
<start_of_turn>model
```python
{sample['code']}
```<end_of_turn>"""
return instructionتابع test_model در سلول 14 را هم مطابق با format_instruction تغییر دهید تا بتوانید مدل را تست کنید.
سلولها را به ترتیب اجرا کنید:
- ✅ تنظیمات پروژه
- ✅ نصب کتابخانهها
- ✅ بارگذاری دیتاست
- ✅ تنظیم format
- ✅ بارگذاری مدل
- ✅ Training
- ✅ تست
[
{
"prompt": "سوال یا درخواست",
"completion": "پاسخ یا خروجی"
}
][
{
"instruction": "دستورالعمل کلی",
"input": "ورودی خاص",
"output": "خروجی مورد انتظار"
}
][
{
"messages": [
{"role": "user", "content": "پیام کاربر"},
{"role": "assistant", "content": "پاسخ دستیار"}
]
}
][
{
"input": "متن ورودی",
"output": {
"field1": "value1",
"field2": "value2",
"nested": {
"key": "value"
}
}
}
]| وظیفه | مدل توصیه شده | دلیل |
|---|---|---|
| Translation | Gemma 2B / 9B | قابلیت خوب برای چند زبانه |
| Question Answering | Gemma 2B / LLaMA 7B | فهم متن و استدلال |
| Classification | Gemma 270M / 2B | کافی برای وظایف ساده |
| Code Generation | Gemma 9B / LLaMA 7B | نیاز به دقت بالا |
| Summarization | Gemma 2B | تعادل خوب |
| Chat/Dialogue | Gemma 2B-IT / 9B-IT | بهینه برای مکالمه |
نکته: مدلهای -it (instruction-tuned) برای وظایف instruction-following بهینه شدهاند.
{
"num_epochs": 5,
"batch_size": 2,
"learning_rate": 3e-4,
"lora_r": 16,
}{
"num_epochs": 3,
"batch_size": 4,
"learning_rate": 2e-4,
"lora_r": 32,
}{
"num_epochs": 2,
"batch_size": 8,
"learning_rate": 1e-4,
"lora_r": 64,
}# راهحل 1: کاهش batch size
"batch_size": 1,
# راهحل 2: افزایش gradient accumulation
"gradient_accumulation_steps": 8,
# راهحل 3: مدل کوچکتر
"model_name": "google/gemma-2-270m-it",# تست با دیتاست کوچکتر
data = data[:100]
# کاهش epoch
"num_epochs": 1,# افزایش epoch
"num_epochs": 5,
# افزایش LoRA rank
"lora_r": 32,
# کاهش learning rate
"learning_rate": 1e-4,
# بررسی کیفیت دیتاست# در text generation:
repetition_penalty=1.5, # افزایش از 1.2
# کاهش temperature
temperature=0.5, # کاهش از 0.7- تست دستی: چند نمونه تصادفی را تست کنید
- Evaluation set: از 10% دیتاست برای ارزیابی استفاده کنید
- Metrics:
- برای Classification: Accuracy, F1-Score
- برای Generation: BLEU, ROUGE (برای ترجمه و خلاصهسازی)
- برای QA: Exact Match, F1
from sklearn.metrics import accuracy_score, f1_score
# برای classification
predictions = []
ground_truth = []
for sample in test_data:
pred = test_model(sample['input'])
predictions.append(pred)
ground_truth.append(sample['output'])
accuracy = accuracy_score(ground_truth, predictions)
f1 = f1_score(ground_truth, predictions, average='weighted')
print(f"Accuracy: {accuracy:.2%}")
print(f"F1-Score: {f1:.2%}")1. آمادهسازی دیتاست
↓
2. تست با 10% دیتاست و 1 epoch
↓
3. بررسی خروجی و تنظیم prompt
↓
4. Training با 50% دیتاست و 2 epoch
↓
5. ارزیابی و تنظیم hyperparameters
↓
6. Training نهایی با کل دیتاست
↓
7. تست کامل و دیپلوی
- همیشه با دیتاست کوچک شروع کنید
- فرمت prompt را با دقت طراحی کنید
- نمونههای متنوع در دیتاست داشته باشید
- مدل را با ورودیهای مختلف تست کنید
- مدل را قبل از Training ذخیره کنید
- از version control (git) استفاده کنید
- بلافاصله با کل دیتاست شروع نکنید
- hyperparameters را همزمان تغییر ندهید
- دیتاست نامتعادل نداشته باشید
- prompt را بیش از حد پیچیده نکنید
- فراموش نکنید که مدل را evaluate کنید
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
model = AutoPeftModelForCausalLM.from_pretrained("./finetuned-model-final")
tokenizer = AutoTokenizer.from_pretrained("./finetuned-model-final")from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/predict', methods=['POST'])
def predict():
data = request.json
result = generator(data['input'])
return jsonify({'output': result})
app.run(host='0.0.0.0', port=5000)import gradio as gr
def predict(text):
return test_model(text)
demo = gr.Interface(fn=predict, inputs="text", outputs="text")
demo.launch()اگر مشکلی داشتید:
- راهنمای رفع مشکلات در نوتبوک را بخوانید
- نسخه کتابخانهها را بررسی کنید
- GPU را بررسی کنید
- مدل کوچکتر را امتحان کنید
موفق باشید! 🚀