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