anaspro commited on
Commit
823ff18
·
verified ·
1 Parent(s): 167cb1c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -19
app.py CHANGED
@@ -1,17 +1,21 @@
1
- from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
2
  import torch
3
  import gradio as gr
4
  import spaces
5
  from threading import Thread
6
 
 
 
 
 
 
 
 
7
  # ======================================================
8
  # إعدادات الموديل
9
  # ======================================================
10
  MODEL_ID = "unsloth/gemma-3-4b-it-unsloth-bnb-4bit"
11
 
12
- # ======================================================
13
- # البرومبت الافتراضي (متوافق مع أسلوب التدريب)
14
- # ======================================================
15
  SYSTEM_PROMPT = (
16
  "أنت مساعد ذكي تفهم اللهجة العراقية والعربية الفصحى. "
17
  "جاوب على الأسئلة بإيجاز ووضوح، بنفس لغة المستخدم. "
@@ -19,17 +23,30 @@ SYSTEM_PROMPT = (
19
  )
20
 
21
  # ======================================================
22
- # تحميل الموديل (مرة واحدة فقط)
23
  # ======================================================
24
- print("🔄 Loading Gemma 3 4B model...")
25
- tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
26
- model = AutoModelForCausalLM.from_pretrained(
27
- MODEL_ID,
28
- torch_dtype=torch.bfloat16,
29
- device_map="auto",
30
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  model.eval()
32
- print("✅ Model ready!")
33
 
34
 
35
  # ======================================================
@@ -37,7 +54,7 @@ print("✅ Model ready!")
37
  # ======================================================
38
  @spaces.GPU(duration=60)
39
  def chat(message, history):
40
- # تحويل تاريخ المحادثة لصيغة مناسبة
41
  messages = []
42
  for msg in history:
43
  if msg["role"] == "user":
@@ -48,7 +65,7 @@ def chat(message, history):
48
  # نضيف السؤال الحالي مع system prompt
49
  messages.append({"role": "user", "content": f"{SYSTEM_PROMPT}\n\nالسؤال: {message}"})
50
 
51
- # تحويل الرسائل إلى input ids باستخدام chat template الخاص بـ Gemma
52
  input_ids = tokenizer.apply_chat_template(
53
  messages,
54
  return_tensors="pt",
@@ -68,7 +85,7 @@ def chat(message, history):
68
  repetition_penalty=1.15,
69
  )
70
 
71
- # توليد النص في thread منفصل للبث الحي
72
  thread = Thread(target=model.generate, kwargs=generation_kwargs)
73
  thread.start()
74
 
@@ -86,12 +103,12 @@ def chat(message, history):
86
  demo = gr.ChatInterface(
87
  fn=chat,
88
  type="messages",
89
- title="🇮🇶 Gemma 3 4B – Iraqi/Arabic Chat Demo",
90
  description="""
91
  **نموذج Gemma 3 4B Instruct (Unsloth Optimized)**
92
- مدرّب على العربية والفصحى ومهيّأ للحوار باللهجة العراقية.
93
 
94
- 🧠 جرّب:
95
  - "شنو معنى إنكار معقول؟"
96
  - "اشرحلي شنو يعني تصعيد إداري"
97
  - "وضحلي الفرق بين الدليل والعبرة"
 
1
+ from transformers import AutoTokenizer, TextIteratorStreamer
2
  import torch
3
  import gradio as gr
4
  import spaces
5
  from threading import Thread
6
 
7
+ # نحاول استخدام Unsloth إذا متوفر
8
+ try:
9
+ from unsloth import FastLanguageModel
10
+ HAS_UNSLOTH = True
11
+ except ImportError:
12
+ HAS_UNSLOTH = False
13
+
14
  # ======================================================
15
  # إعدادات الموديل
16
  # ======================================================
17
  MODEL_ID = "unsloth/gemma-3-4b-it-unsloth-bnb-4bit"
18
 
 
 
 
19
  SYSTEM_PROMPT = (
20
  "أنت مساعد ذكي تفهم اللهجة العراقية والعربية الفصحى. "
21
  "جاوب على الأسئلة بإيجاز ووضوح، بنفس لغة المستخدم. "
 
23
  )
24
 
25
  # ======================================================
26
+ # تحميل الموديل (مع دعم Unsloth أو Transformers العادي)
27
  # ======================================================
28
+ print("🔄 Loading model:", MODEL_ID)
29
+
30
+ if HAS_UNSLOTH:
31
+ print("🚀 Using Unsloth FastLanguageModel backend")
32
+ model, tokenizer = FastLanguageModel.from_pretrained(
33
+ MODEL_ID,
34
+ dtype=torch.bfloat16,
35
+ load_in_4bit=True,
36
+ device_map="auto",
37
+ )
38
+ else:
39
+ print("⚙️ Using standard Transformers backend")
40
+ from transformers import AutoModelForCausalLM
41
+ model = AutoModelForCausalLM.from_pretrained(
42
+ MODEL_ID,
43
+ torch_dtype=torch.bfloat16,
44
+ device_map="auto",
45
+ )
46
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
47
+
48
  model.eval()
49
+ print("✅ Model ready!\n")
50
 
51
 
52
  # ======================================================
 
54
  # ======================================================
55
  @spaces.GPU(duration=60)
56
  def chat(message, history):
57
+ # تحويل تاريخ المحادثة لصيغة messages
58
  messages = []
59
  for msg in history:
60
  if msg["role"] == "user":
 
65
  # نضيف السؤال الحالي مع system prompt
66
  messages.append({"role": "user", "content": f"{SYSTEM_PROMPT}\n\nالسؤال: {message}"})
67
 
68
+ # تجهيز الإدخال عبر الـ chat template
69
  input_ids = tokenizer.apply_chat_template(
70
  messages,
71
  return_tensors="pt",
 
85
  repetition_penalty=1.15,
86
  )
87
 
88
+ # تشغيل التوليد في Thread منفصل
89
  thread = Thread(target=model.generate, kwargs=generation_kwargs)
90
  thread.start()
91
 
 
103
  demo = gr.ChatInterface(
104
  fn=chat,
105
  type="messages",
106
+ title="🇮🇶 Gemma 3 4B – Iraqi Arabic Chat",
107
  description="""
108
  **نموذج Gemma 3 4B Instruct (Unsloth Optimized)**
109
+ مدرّب على العربية والفصحى ومهيّأ للحوار باللهجة العراقية 🇮🇶
110
 
111
+ 🧠 أمثلة جاهزة:
112
  - "شنو معنى إنكار معقول؟"
113
  - "اشرحلي شنو يعني تصعيد إداري"
114
  - "وضحلي الفرق بين الدليل والعبرة"