apaxray commited on
Commit
cdfaa37
·
verified ·
1 Parent(s): 6769058

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -14
app.py CHANGED
@@ -1,8 +1,10 @@
1
  import os
2
  from transformers import pipeline
3
- from concurrent.futures import ThreadPoolExecutor
4
  from queue import Queue
5
  import openai
 
 
6
 
7
  # تعریف مدل‌ها
8
  MODEL_CONFIG = {
@@ -23,34 +25,54 @@ openai.api_key = os.getenv("OPENAI_API_KEY")
23
  if not openai.api_key:
24
  raise ValueError("OpenAI API key is missing! Set it as 'OPENAI_API_KEY' in environment variables.")
25
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  class MultiModelSystem:
27
  def __init__(self):
28
  """مدیریت مدل‌های مختلف و پردازش موازی وظایف."""
29
  self.models = {}
30
  self.queue = Queue()
31
- self.executor = ThreadPoolExecutor(max_workers=5)
32
  self.load_models()
33
 
34
  def load_models(self):
35
- """بارگذاری مدل‌ها به صورت موازی."""
36
  try:
37
  for task, model_id in MODEL_CONFIG.items():
38
  if model_id == "OpenAI":
39
- self.models[task] = self.load_openai_model()
40
  else:
41
- self.models[task] = pipeline(
42
- task=self.get_task_type(task),
43
- model=model_id,
44
- use_auth_token=TOKEN
45
- )
46
- print(f"Model '{task}' loaded successfully.")
47
  except Exception as e:
48
  print(f"Error loading models: {e}")
49
  raise
50
 
51
- def load_openai_model(self):
52
- """مدل ریاضی OpenAI را بارگذاری کنید."""
53
- return "OpenAI (Math)"
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
  @staticmethod
56
  def get_task_type(task):
@@ -74,17 +96,24 @@ class MultiModelSystem:
74
  if task == "math":
75
  result = self.process_math_task(kwargs.get("text"))
76
  else:
77
- result = self.models[task](**kwargs)
 
 
 
 
78
  self.queue.put(result)
79
  except Exception as e:
80
  print(f"Error processing task '{task}': {e}")
81
  self.queue.put(None)
 
 
82
 
83
  self.executor.submit(task_handler)
84
 
85
  def process_math_task(self, text):
86
  """پردازش ریاضی با OpenAI."""
87
  try:
 
88
  response = openai.Completion.create(
89
  engine="text-davinci-003",
90
  prompt=text,
 
1
  import os
2
  from transformers import pipeline
3
+ from concurrent.futures import ThreadPoolExecutor, as_completed
4
  from queue import Queue
5
  import openai
6
+ import gc
7
+ import psutil
8
 
9
  # تعریف مدل‌ها
10
  MODEL_CONFIG = {
 
25
  if not openai.api_key:
26
  raise ValueError("OpenAI API key is missing! Set it as 'OPENAI_API_KEY' in environment variables.")
27
 
28
+ # محدودیت حافظه (برحسب گیگابایت)
29
+ MEMORY_LIMIT_GB = 15
30
+
31
+ class MemoryManager:
32
+ @staticmethod
33
+ def check_memory_usage():
34
+ """بررسی مصرف حافظه و خروج در صورت تجاوز از محدودیت."""
35
+ process = psutil.Process(os.getpid())
36
+ memory_usage = process.memory_info().rss / (1024**3) # تبدیل به گیگابایت
37
+ if memory_usage > MEMORY_LIMIT_GB:
38
+ raise MemoryError(f"Memory usage exceeded {MEMORY_LIMIT_GB} GB! Current usage: {memory_usage:.2f} GB.")
39
+
40
  class MultiModelSystem:
41
  def __init__(self):
42
  """مدیریت مدل‌های مختلف و پردازش موازی وظایف."""
43
  self.models = {}
44
  self.queue = Queue()
45
+ self.executor = ThreadPoolExecutor(max_workers=3) # محدود کردن وظایف همزمان
46
  self.load_models()
47
 
48
  def load_models(self):
49
+ """بارگذاری مدل‌ها به صورت دینامیک."""
50
  try:
51
  for task, model_id in MODEL_CONFIG.items():
52
  if model_id == "OpenAI":
53
+ self.models[task] = None # مدل OpenAI نیازی به بارگذاری ندارد
54
  else:
55
+ self.models[task] = model_id # ذخیره نام مدل، نه بارگذاری کامل
 
 
 
 
 
56
  except Exception as e:
57
  print(f"Error loading models: {e}")
58
  raise
59
 
60
+ def load_model_for_task(self, task):
61
+ """بارگذاری مدل موردنیاز فقط هنگام درخواست."""
62
+ model_id = self.models.get(task)
63
+ if not model_id:
64
+ return None
65
+ try:
66
+ MemoryManager.check_memory_usage()
67
+ return pipeline(
68
+ task=self.get_task_type(task),
69
+ model=model_id,
70
+ use_auth_token=TOKEN,
71
+ device=0 if psutil.cpu_count(logical=False) > 1 else -1 # استفاده از GPU در صورت وجود
72
+ )
73
+ except Exception as e:
74
+ print(f"Error loading model for task '{task}': {e}")
75
+ return None
76
 
77
  @staticmethod
78
  def get_task_type(task):
 
96
  if task == "math":
97
  result = self.process_math_task(kwargs.get("text"))
98
  else:
99
+ model = self.load_model_for_task(task)
100
+ if model:
101
+ result = model(**kwargs)
102
+ else:
103
+ result = None
104
  self.queue.put(result)
105
  except Exception as e:
106
  print(f"Error processing task '{task}': {e}")
107
  self.queue.put(None)
108
+ finally:
109
+ gc.collect() # آزادسازی حافظه پس از هر وظیفه
110
 
111
  self.executor.submit(task_handler)
112
 
113
  def process_math_task(self, text):
114
  """پردازش ریاضی با OpenAI."""
115
  try:
116
+ MemoryManager.check_memory_usage()
117
  response = openai.Completion.create(
118
  engine="text-davinci-003",
119
  prompt=text,