Spaces:
Sleeping
Sleeping
File size: 5,029 Bytes
7da6612 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
import os
from pathlib import Path
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
import pandas as pd
from datasets import Dataset
import json
import psutil
import time
from datetime import datetime
import onnx
import onnxruntime
from functools import lru_cache
import logging
from typing import Dict, List, Optional
class BankingModel:
def __init__(self):
# تنظیم لاگر
self._setup_logging()
# ساخت پوشهها
self.base_dir = Path.cwd()
self.dirs = {
'model': self.base_dir / "trained_model",
'data': self.base_dir / "data",
'logs': self.base_dir / "logs",
'backup': self.base_dir / "backups",
'cache': self.base_dir / "cache",
'reports': self.base_dir / "reports"
}
for dir_path in self.dirs.values():
dir_path.mkdir(exist_ok=True)
# تنظیمات مدل برای CPU
self.model_name = "meta-llama/Llama-2-13b-chat-hf"
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
# بهینهسازی برای CPU
self.model = AutoModelForCausalLM.from_pretrained(
self.model_name,
device_map='cpu',
torch_dtype=torch.float32,
low_cpu_mem_usage=True
)
# تنظیمات LoRA
self._setup_lora()
# مقداردهی کش
self.response_cache = {}
# شروع مانیتورینگ
self.start_monitoring()
def _setup_logging(self):
"""راهاندازی سیستم لاگینگ"""
logging.basicConfig(
filename=f'logs/model_{datetime.now().strftime("%Y%m%d")}.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
self.logger = logging.getLogger(__name__)
def _setup_lora(self):
"""تنظیم LoRA برای CPU"""
self.lora_config = LoraConfig(
r=8, # کاهش برای CPU
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
self.model = get_peft_model(self.model, self.lora_config)
@lru_cache(maxsize=1000)
def cached_predict(self, text: str) -> str:
"""پیشبینی با استفاده از کش"""
return self.predict(text)
def create_backup(self):
"""ایجاد نسخه پشتیبان"""
backup_time = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = self.dirs['backup'] / f"model_backup_{backup_time}"
self.save_model(backup_path)
self.logger.info(f"Backup created at {backup_path}")
def monitor_resources(self) -> Dict:
"""مانیتورینگ منابع سیستم"""
cpu_percent = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory()
return {
'cpu_usage': cpu_percent,
'memory_used': memory.percent,
'memory_available': memory.available / (1024 * 1024 * 1024) # GB
}
def start_monitoring(self):
"""شروع مانیتورینگ مداوم"""
self.monitoring_data = []
self.monitoring_start_time = time.time()
def log_performance(self, input_text: str, response: str, response_time: float):
"""ثبت عملکرد مدل"""
performance_data = {
'timestamp': datetime.now().isoformat(),
'input_length': len(input_text),
'response_length': len(response),
'response_time': response_time,
'resources': self.monitor_resources()
}
with open(self.dirs['reports'] / 'performance.jsonl', 'a') as f:
f.write(json.dumps(performance_data) + '\n')
def export_to_onnx(self):
"""تبدیل مدل به ONNX برای اجرای سریعتر"""
dummy_input = self.tokenizer("test input", return_tensors="pt")
onnx_path = self.dirs['model'] / "model.onnx"
torch.onnx.export(
self.model,
(dummy_input['input_ids'],),
onnx_path,
opset_version=12,
input_names=['input_ids'],
output_names=['output']
)
self.logger.info(f"Model exported to ONNX at {onnx_path}")
def generate_report(self) -> Dict:
"""تولید گزارش عملکرد"""
with open(self.dirs['reports'] / 'performance.jsonl', 'r') as f:
data = [json.loads(line) for line in f]
return {
'total_requests': len(data),
'avg_response_time': sum(d['response_time'] for d in
|