Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -14,13 +14,6 @@ from supabase import create_client, Client
|
|
| 14 |
from PIL import Image
|
| 15 |
|
| 16 |
import torch
|
| 17 |
-
from transformers import (
|
| 18 |
-
Qwen2_5_VLForConditionalGeneration,
|
| 19 |
-
AutoProcessor,
|
| 20 |
-
TextIteratorStreamer
|
| 21 |
-
)
|
| 22 |
-
from qwen_vl_utils import process_vision_info
|
| 23 |
-
from faster_whisper import WhisperModel
|
| 24 |
|
| 25 |
app = FastAPI()
|
| 26 |
|
|
@@ -36,14 +29,27 @@ model_error_message = ""
|
|
| 36 |
model = None
|
| 37 |
processor = None
|
| 38 |
whisper_model = None
|
|
|
|
|
|
|
| 39 |
|
| 40 |
def load_models_in_background():
|
| 41 |
-
"""تحميل النموذج في
|
| 42 |
-
global model, processor, whisper_model, model_status, model_error_message
|
| 43 |
try:
|
| 44 |
-
print(f"جاري ت
|
| 45 |
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
|
| 48 |
MODEL_ID,
|
| 49 |
torch_dtype="auto",
|
|
@@ -63,7 +69,7 @@ def load_models_in_background():
|
|
| 63 |
model_error_message = str(e)
|
| 64 |
print(f"خطأ أثناء تحميل النموذج على GPU: {e}")
|
| 65 |
|
| 66 |
-
# إطلاق التحميل في
|
| 67 |
threading.Thread(target=load_models_in_background, daemon=True).start()
|
| 68 |
|
| 69 |
# ---------------------------------------------------------
|
|
@@ -144,10 +150,10 @@ async def chat_endpoint(
|
|
| 144 |
image_file: Optional[UploadFile] = File(None),
|
| 145 |
audio_file: Optional[UploadFile] = File(None)
|
| 146 |
):
|
| 147 |
-
if not model or not processor:
|
| 148 |
raise HTTPException(
|
| 149 |
status_code=500,
|
| 150 |
-
detail=f"النموذج جاري تحميله
|
| 151 |
)
|
| 152 |
|
| 153 |
user_text = message
|
|
@@ -252,7 +258,7 @@ async def chat_endpoint(
|
|
| 252 |
|
| 253 |
# 7. التجهيز والبث الحي
|
| 254 |
text_prompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
|
| 255 |
-
image_inputs, video_inputs =
|
| 256 |
|
| 257 |
inputs = processor(
|
| 258 |
text=[text_prompt],
|
|
@@ -262,7 +268,7 @@ async def chat_endpoint(
|
|
| 262 |
return_tensors="pt"
|
| 263 |
).to(DEVICE)
|
| 264 |
|
| 265 |
-
streamer =
|
| 266 |
generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=2048)
|
| 267 |
|
| 268 |
thread = Thread(target=model.generate, kwargs=generation_kwargs)
|
|
|
|
| 14 |
from PIL import Image
|
| 15 |
|
| 16 |
import torch
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
app = FastAPI()
|
| 19 |
|
|
|
|
| 29 |
model = None
|
| 30 |
processor = None
|
| 31 |
whisper_model = None
|
| 32 |
+
process_vision_info_fn = None
|
| 33 |
+
TextIteratorStreamer_cls = None
|
| 34 |
|
| 35 |
def load_models_in_background():
|
| 36 |
+
"""تحميل المستلزمات والنموذج في خيط خلفي آمن لمنع توقف السيرفر"""
|
| 37 |
+
global model, processor, whisper_model, process_vision_info_fn, TextIteratorStreamer_cls, model_status, model_error_message
|
| 38 |
try:
|
| 39 |
+
print(f"جاري استيراد مكتبات الذكاء الاصطناعي وتجهيز {MODEL_ID} على A100 GPU ({DEVICE})...")
|
| 40 |
|
| 41 |
+
from transformers import (
|
| 42 |
+
Qwen2_5_VLForConditionalGeneration,
|
| 43 |
+
AutoProcessor,
|
| 44 |
+
TextIteratorStreamer
|
| 45 |
+
)
|
| 46 |
+
from qwen_vl_utils import process_vision_info
|
| 47 |
+
from faster_whisper import WhisperModel
|
| 48 |
+
|
| 49 |
+
process_vision_info_fn = process_vision_info
|
| 50 |
+
TextIteratorStreamer_cls = TextIteratorStreamer
|
| 51 |
+
|
| 52 |
+
# تحميل Qwen 2.5-VL 32B AWQ بطريقة صحيحة ومجربة
|
| 53 |
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
|
| 54 |
MODEL_ID,
|
| 55 |
torch_dtype="auto",
|
|
|
|
| 69 |
model_error_message = str(e)
|
| 70 |
print(f"خطأ أثناء تحميل النموذج على GPU: {e}")
|
| 71 |
|
| 72 |
+
# إطلاق التحميل التفرعي في الخلفية فور تشغيل التطبيق
|
| 73 |
threading.Thread(target=load_models_in_background, daemon=True).start()
|
| 74 |
|
| 75 |
# ---------------------------------------------------------
|
|
|
|
| 150 |
image_file: Optional[UploadFile] = File(None),
|
| 151 |
audio_file: Optional[UploadFile] = File(None)
|
| 152 |
):
|
| 153 |
+
if not model or not processor or not TextIteratorStreamer_cls or not process_vision_info_fn:
|
| 154 |
raise HTTPException(
|
| 155 |
status_code=500,
|
| 156 |
+
detail=f"النموذج جاري تحميله في الذاكرة. الحالة: '{model_status}'. الخطأ إن وجد: {model_error_message}"
|
| 157 |
)
|
| 158 |
|
| 159 |
user_text = message
|
|
|
|
| 258 |
|
| 259 |
# 7. التجهيز والبث الحي
|
| 260 |
text_prompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
|
| 261 |
+
image_inputs, video_inputs = process_vision_info_fn(messages)
|
| 262 |
|
| 263 |
inputs = processor(
|
| 264 |
text=[text_prompt],
|
|
|
|
| 268 |
return_tensors="pt"
|
| 269 |
).to(DEVICE)
|
| 270 |
|
| 271 |
+
streamer = TextIteratorStreamer_cls(processor.tokenizer, skip_prompt=True, skip_special_tokens=True)
|
| 272 |
generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=2048)
|
| 273 |
|
| 274 |
thread = Thread(target=model.generate, kwargs=generation_kwargs)
|