THEZYZSTUDIO commited on
Commit
ddb2fb5
·
verified ·
1 Parent(s): 544b77a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +88 -75
app.py CHANGED
@@ -1,105 +1,118 @@
1
  """
2
- THE Z AI Agent - Gemma 4 31B Server (Zero GPU)
3
- ================================================
4
- سيرفر Gradio لتشغيل نموذج google/gemma-4-31B-it على Hugging Face Spaces
5
- باستخدام بنية تحتية Zero GPU (H200 مؤقت لكل استدعاء).
 
 
 
 
 
 
 
 
 
6
  """
7
 
8
  import os
9
- import spaces
 
10
  import gradio as gr
11
- import torch
12
- from transformers import AutoProcessor, AutoModelForMultimodalLM
13
 
14
- MODEL_ID = "google/gemma-4-31B-it"
15
- HF_TOKEN = os.environ.get("HF_TOKEN") # ضعه في Settings > Repository secrets إذا كان النموذج يتطلب موافقة/توكن
16
-
17
- print(f"⏳ جاري تحميل المعالج (processor) لـ {MODEL_ID} ...")
18
- processor = AutoProcessor.from_pretrained(MODEL_ID, token=HF_TOKEN)
19
-
20
- print(f"⏳ جاري تحميل النموذج {MODEL_ID} (bf16) ... قد يأخذ بعض الوقت أول مرة")
21
- model = AutoModelForMultimodalLM.from_pretrained(
22
- MODEL_ID,
23
- dtype=torch.bfloat16,
24
- device_map="auto",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  token=HF_TOKEN,
26
  )
27
- model.eval()
28
  print("✅ النموذج جاهز.")
29
 
30
 
31
- def build_messages(history, system_prompt, enable_thinking):
32
  messages = []
33
  if system_prompt and system_prompt.strip():
34
  messages.append({"role": "system", "content": system_prompt.strip()})
35
-
36
  for turn in history:
37
  role = turn["role"]
38
  content = turn["content"]
39
- if role == "user":
40
- messages.append({"role": "user", "content": [{"type": "text", "text": content}]})
41
- elif role == "assistant":
42
- messages.append({"role": "assistant", "content": content})
43
  return messages
44
 
45
 
46
- @spaces.GPU(duration=120) # مدة تخصيص الـ GPU بالثواني - عدّلها حسب طول الردود المتوقعة
47
  def generate_response(message, history, system_prompt, max_new_tokens, temperature, top_p, top_k, enable_thinking):
48
- # تحويل history (تنسيق Gradio) إلى تنسيق messages
49
- chat_history = []
50
- for h in history:
51
- chat_history.append(h)
52
  chat_history.append({"role": "user", "content": message})
53
 
54
- messages = build_messages(chat_history, system_prompt, enable_thinking)
55
 
56
  if enable_thinking:
57
- # تفعيل التفكير عبر إضافة التوكن الخاص في بداية system prompt
 
58
  if messages and messages[0]["role"] == "system":
59
- messages[0]["content"] = "<|think|>" + messages[0]["content"]
60
  else:
61
- messages.insert(0, {"role": "system", "content": "<|think|>"})
62
-
63
- inputs = processor.apply_chat_template(
64
- messages,
65
- tokenize=True,
66
- return_dict=True,
67
- return_tensors="pt",
68
- add_generation_prompt=True,
69
- ).to(model.device)
70
-
71
- input_len = inputs["input_ids"].shape[-1]
72
-
73
- with torch.no_grad():
74
- outputs = model.generate(
75
- **inputs,
76
- max_new_tokens=int(max_new_tokens),
77
- temperature=float(temperature),
78
- top_p=float(top_p),
79
- top_k=int(top_k),
80
- do_sample=True,
81
- )
82
-
83
- response = processor.decode(outputs[0][input_len:], skip_special_tokens=False)
84
-
85
- try:
86
- parsed = processor.parse_response(response)
87
- # parsed قد يكون dict فيه "thought" و "answer" - نعرض النهائي فقط في الشات
88
- if isinstance(parsed, dict):
89
- final = parsed.get("answer") or parsed.get("content") or response
90
- else:
91
- final = str(parsed)
92
- except Exception:
93
- final = response
94
 
95
- return final
 
 
 
 
 
 
96
 
97
 
98
- with gr.Blocks(title="THE Z AI Agent - Gemma 4 31B", theme=gr.themes.Soft()) as demo:
99
  gr.Markdown(
100
  """
101
- # 🤖 THE Z AI Agent — Gemma 4 31B (Zero GPU)
102
- نموذج **google/gemma-4-31B-it** (30.7B، Dense) يعمل على Hugging Face Zero GPU.
 
 
 
 
103
  """
104
  )
105
 
@@ -112,17 +125,17 @@ with gr.Blocks(title="THE Z AI Agent - Gemma 4 31B", theme=gr.themes.Soft()) as
112
  enable_thinking = gr.Checkbox(label="تفعيل وضع التفكير (Thinking Mode)", value=False)
113
  max_new_tokens = gr.Slider(64, 4096, value=1024, step=64, label="أقصى عدد للتوكنز الجديدة")
114
  temperature = gr.Slider(0.1, 2.0, value=1.0, step=0.05, label="Temperature")
115
- top_p = gr.Slider(0.1, 1.0, value=0.95, step=0.05, label="top_p")
116
- top_k = gr.Slider(1, 128, value=64, step=1, label="top_k")
117
 
118
  chatbot = gr.ChatInterface(
119
  fn=generate_response,
120
  type="messages",
121
  additional_inputs=[system_prompt, max_new_tokens, temperature, top_p, top_k, enable_thinking],
122
  examples=[
123
- ["اشرح لي مبدأ نسبية آينشتاين ببساطة", "أنت مساعد ذكي ومفيد. أجب دائماً بوضوح ودقة.", 1024, 1.0, 0.95, 64, False],
124
- ["اكتب لي دالة بايثون لترتيب قائمة", "أنت مساعد ذكي ومفيد. أجب دائماً بوضوح ودقة.", 1024, 1.0, 0.95, 64, False],
125
- ["لخص لي فوائد الرياضة اليومية", "أنت مساعد ذكي ومفيد. أجب دائماً بوضوح ودقة.", 1024, 1.0, 0.95, 64, False],
126
  ],
127
  )
128
 
 
1
  """
2
+ THE Z AI Agent - DeepSeek-V4-Flash Server (CPU / RAM only)
3
+ ============================================================
4
+ سيرفر Gradio لتشغيل نموذج DeepSeek-V4-Flash (GGUF، UD-IQ1_S)
5
+ على المعالج (CPU) باستخدام الرام فقط - بدون GPU.
6
+
7
+ ⚠️ تحذير مهم بخصوص الموارد:
8
+ - الملف يوزن ~82.5GB على القرص (Disk) - خاصك Persistent Storage
9
+ على الأقل "Medium" (150GB) من Settings > Persistent storage.
10
+ - الاستهلاك الفعلي للرام أثناء التشغيل (نموذج + KV cache) يقدر
11
+ يوصل لحدود قريبة من الرام المتاحة عندك (104GB) - راقب استهلاك
12
+ الرام من لوحة التحكم وقلل n_ctx إذا صرا OOM.
13
+ - السرعة بطيئة نسبياً (توكنات قليلة/الثانية) لأن التشغيل بالكامل
14
+ على المعالج بلا GPU، والنموذج ضخم (284B params / 13B activated).
15
  """
16
 
17
  import os
18
+ import multiprocessing
19
+ from llama_cpp import Llama
20
  import gradio as gr
 
 
21
 
22
+ # ------------------------------------------------------------------
23
+ # إعدادات النموذج
24
+ # ------------------------------------------------------------------
25
+ MODEL_REPO = "unsloth/DeepSeek-V4-Flash-GGUF"
26
+ # نمط اسم الملف يطابق كل شاردات UD-IQ1_S (llama_cpp كيدمجهم تلقائياً)
27
+ MODEL_FILE_PATTERN = "*UD-IQ1_S*.gguf"
28
+
29
+ # مسار التخزين الدائم على Hugging Face Spaces (Persistent Storage)
30
+ # تأكد أن عندك Persistent Storage مفعّل (Medium 150GB على الأقل)
31
+ CACHE_DIR = os.environ.get("MODEL_CACHE_DIR", "/data/models")
32
+ os.makedirs(CACHE_DIR, exist_ok=True)
33
+
34
+ HF_TOKEN = os.environ.get("HF_TOKEN") # ضعه في Settings > Repository secrets
35
+
36
+ # عدد الأنوية المتاحة للمعالج (خليها تلقائية حسب السيرفر)
37
+ N_THREADS = int(os.environ.get("N_THREADS", multiprocessing.cpu_count()))
38
+
39
+ # سياق أصغر نسبياً لتقليل استهلاك الرام (KV cache) - عدّله حسب الحاجة
40
+ N_CTX = int(os.environ.get("N_CTX", 8192))
41
+
42
+ print(f"⏳ جاري تحميل/تحضير النموذج {MODEL_REPO} ({MODEL_FILE_PATTERN}) ...")
43
+ print(f" مسار التخزين: {CACHE_DIR}")
44
+ print(f" عدد الأنوية (threads): {N_THREADS}")
45
+ print(f" حجم السياق (n_ctx): {N_CTX}")
46
+ print(" ⚠️ التحميل الأول قد يأخذ وقتاً طويلاً (~82.5GB) ...")
47
+
48
+ llm = Llama.from_pretrained(
49
+ repo_id=MODEL_REPO,
50
+ filename=MODEL_FILE_PATTERN,
51
+ cache_dir=CACHE_DIR,
52
+ local_dir=CACHE_DIR,
53
+ n_ctx=N_CTX,
54
+ n_threads=N_THREADS,
55
+ n_gpu_layers=0, # 0 = تشغيل كامل على CPU/RAM بدون GPU
56
+ use_mmap=True, # يقلل استهلاك الرام الفعلي عبر memory-mapping
57
+ use_mlock=False, # لا تقفل الرام بالكامل (يترك مجال للنظام)
58
+ verbose=False,
59
  token=HF_TOKEN,
60
  )
 
61
  print("✅ النموذج جاهز.")
62
 
63
 
64
+ def build_messages(history, system_prompt):
65
  messages = []
66
  if system_prompt and system_prompt.strip():
67
  messages.append({"role": "system", "content": system_prompt.strip()})
 
68
  for turn in history:
69
  role = turn["role"]
70
  content = turn["content"]
71
+ messages.append({"role": role, "content": content})
 
 
 
72
  return messages
73
 
74
 
 
75
  def generate_response(message, history, system_prompt, max_new_tokens, temperature, top_p, top_k, enable_thinking):
76
+ chat_history = list(history) if history else []
 
 
 
77
  chat_history.append({"role": "user", "content": message})
78
 
79
+ messages = build_messages(chat_history, system_prompt)
80
 
81
  if enable_thinking:
82
+ # تفعيل وضع التفكير عبر التعليمات النظامية (حسب Chat template ديال DeepSeek-V4)
83
+ think_instruction = "قم بالتفكير خطوة بخطوة قبل الإجابة النهائية."
84
  if messages and messages[0]["role"] == "system":
85
+ messages[0]["content"] = think_instruction + "\n" + messages[0]["content"]
86
  else:
87
+ messages.insert(0, {"role": "system", "content": think_instruction})
88
+
89
+ stream = llm.create_chat_completion(
90
+ messages=messages,
91
+ max_tokens=int(max_new_tokens),
92
+ temperature=float(temperature),
93
+ top_p=float(top_p),
94
+ top_k=int(top_k),
95
+ stream=True,
96
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
 
98
+ partial = ""
99
+ for chunk in stream:
100
+ delta = chunk["choices"][0]["delta"]
101
+ piece = delta.get("content", "")
102
+ if piece:
103
+ partial += piece
104
+ yield partial
105
 
106
 
107
+ with gr.Blocks(title="THE Z AI Agent - DeepSeek-V4-Flash", theme=gr.themes.Soft()) as demo:
108
  gr.Markdown(
109
  """
110
+ # 🤖 THE Z AI Agent — DeepSeek-V4-Flash (CPU / RAM)
111
+ نموذج **DeepSeek-V4-Flash** (284B، MoE، 13B activated، GGUF UD-IQ1_S)
112
+ يعمل بالكامل على المعالج (CPU) باستخدام الرام - بدون GPU.
113
+
114
+ ⚠️ ملاحظة: التشغيل على الرام فقط لهذا الحجم من النماذج يكون **بطيء نسبياً**
115
+ وقد يحتاج ثوانٍ للتوكن الواحد. راقب استهلاك الرام من لوحة تحكم الـ Space.
116
  """
117
  )
118
 
 
125
  enable_thinking = gr.Checkbox(label="تفعيل وضع التفكير (Thinking Mode)", value=False)
126
  max_new_tokens = gr.Slider(64, 4096, value=1024, step=64, label="أقصى عدد للتوكنز الجديدة")
127
  temperature = gr.Slider(0.1, 2.0, value=1.0, step=0.05, label="Temperature")
128
+ top_p = gr.Slider(0.1, 1.0, value=1.0, step=0.05, label="top_p")
129
+ top_k = gr.Slider(0, 128, value=0, step=1, label="top_k")
130
 
131
  chatbot = gr.ChatInterface(
132
  fn=generate_response,
133
  type="messages",
134
  additional_inputs=[system_prompt, max_new_tokens, temperature, top_p, top_k, enable_thinking],
135
  examples=[
136
+ ["اشرح لي مبدأ نسبية آينشتاين ببساطة", "أنت مساعد ذكي ومفيد. أجب دائماً بوضوح ودقة.", 1024, 1.0, 1.0, 0, False],
137
+ ["اكتب لي دالة بايثون لترتيب قائمة", "أنت مساعد ذكي ومفيد. أجب دائماً بوضوح ودقة.", 1024, 1.0, 1.0, 0, False],
138
+ ["لخص لي فوائد الرياضة اليومية", "أنت مساعد ذكي ومفيد. أجب دائماً بوضوح ودقة.", 1024, 1.0, 1.0, 0, False],
139
  ],
140
  )
141