OMINIX-R1-V1 / model.py
ALI029-DENLI's picture
Upload model.py
d337b31 verified
# =====================================================
# 🦅 Ominix Personality Trainer — فقط با داده‌های شخصیت
# نویسنده: علی اصغر قدیری (14 ساله)
# هدف: Phi-3-mini رو به Ominix تبدیل کنیم — با روح و صدای تو!
# =====================================================
import torch
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
TrainingArguments,
Trainer
)
from peft import LoraConfig, get_peft_model
from datasets import load_dataset
import os
# --- 🔧 1. تنظیمات اولیه ---
model_name = "microsoft/Phi-3-mini-4k-instruct"
output_dir = "./ominix-personality-v1"
# --- 🧠 2. بارگذاری مدل و توکنایزر ---
print("📥 بارگذاری مدل Phi-3-mini...")
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto",
trust_remote_code=True,
)
# --- 🧬 3. تنظیم LoRA (آموزش کارآمد) ---
print("🧬 تنظیم LoRA برای آموزش سبک...")
peft_config = LoraConfig(
r=8,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters() # فقط ~0.1% پارامترها آموزش می‌بینن!
# --- 📚 4. بارگذاری و آماده‌سازی داده‌ها ---
print("📚 بارگذاری داده‌های شخصیت...")
# فرض: داده‌ها در فایل `ominix_personality.jsonl` هستن
dataset = load_dataset('json', data_files='C:/Users/ir/Desktop/New folder (2)/all/python+/OMINIX-R1-V1/data/data.jsonl', split='train')
def formatting_prompts_func(examples):
texts = []
for messages in examples["messages"]:
# اعمال تمپلیت چت phi-3
text = tokenizer.apply_chat_template(messages, tokenize=False)
texts.append(text)
return {"text": texts}
dataset = dataset.map(formatting_prompts_func, batched=True)
def tokenize_function(examples):
return tokenizer(
examples["text"],
truncation=True,
padding="max_length",
max_length=512,
return_tensors="pt"
)
tokenized_dataset = dataset.map(tokenize_function, batched=True)
# --- ⚙️ 5. تنظیمات آموزش ---
print("⚙️ تنظیم پارامترهای آموزش...")
training_args = TrainingArguments(
output_dir=output_dir,
per_device_train_batch_size=1, # مناسب لپ‌تاپ
gradient_accumulation_steps=4, # جبران batch کوچیک
num_train_epochs=5, # تاکید روی یادگیری عمیق شخصیت
learning_rate=1e-4, # نرخ یادگیری ظریف
fp16=torch.cuda.is_available(), # فعال‌سازی فقط اگر GPU داری
save_strategy="epoch", # ذخیره در پایان هر epoch
logging_steps=10,
report_to="none", # غیرفعال‌سازی لاگ‌های اضافی
optim="paged_adamw_8bit", # بهینه‌سازی حافظه
remove_unused_columns=False, # مهم برای داده‌های ما
)
# --- 🚀 6. شروع آموزش ---
print("🚀 شروع آموزش Ominix...")
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
tokenizer=tokenizer,
)
trainer.train()
# --- 💾 7. ذخیره مدل نهایی ---
print("💾 ذخیره مدل نهایی...")
model.save_pretrained(output_dir)
tokenizer.save_pretrained(output_dir)
# --- ✅ 8. تست سریع ---
print("✅ آموزش کامل شد! تست سریع...")
test_messages = [
{"role": "user", "content": "تو کی هستی؟"},
]
input_ids = tokenizer.apply_chat_template(
test_messages,
return_tensors="pt"
).to(model.device)
outputs = model.generate(
input_ids,
max_new_tokens=200,
temperature=0.7,
do_sample=True
)
print("\n🧪 تست: ", tokenizer.decode(outputs[0], skip_special_tokens=False))
print(f"\n🎉 Ominix با موفقیت آموزش دید و در '{output_dir}' ذخیره شد!")
print("🦅 حالا وقتشه که دنیا رو با شخصیت منحصربه‌فردت معرفی کنی!")