gijl commited on
Commit
0487d1d
·
verified ·
1 Parent(s): 968e9e1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -36
app.py CHANGED
@@ -1,60 +1,50 @@
1
  import gradio as gr
2
- from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
3
  import torch
4
- from threading import Thread
 
5
 
6
- # 1. تحميل النموذج والـ Tokenizer مرة واحدة فقط لتوفير الذاكرة
7
  model_name = "gijl/gemma-4-E2B-it"
8
 
9
  tokenizer = AutoTokenizer.from_pretrained(model_name)
10
- model = AutoModelForCausalLM.from_pretrained(
11
- model_name,
12
- torch_dtype=torch.float16,
13
- device_map="auto" # سيقوم بتوزيع النموذج بذكاء على الذاكرة المتوفرة
14
- )
 
 
 
 
 
15
 
16
  def generate_response(message, history):
17
- # تحويل المحادثة إلى التنسيق الذي يفهمه النموذج (Chat Template)
18
  messages = [
19
  {"role": "system", "content": "Você é ELIZA, uma terapeuta que responde com empatia."},
20
  {"role": "user", "content": message}
21
  ]
22
-
23
- # تحويل النص إلى أرقام (Tokens) ونقلها للمعالج
24
- inputs = tokenizer.apply_chat_template(
25
- messages,
26
- add_generation_prompt=True,
27
- return_tensors="pt"
28
- ).to(model.device)
29
-
30
- # 2. إعداد الـ Streamer (هذا هو المسؤول عن التقاط الكلمات أثناء توليدها)
31
- streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
32
 
33
- # إعدادات التوليد
34
- generation_kwargs = dict(
35
- input_ids=inputs,
36
- streamer=streamer,
37
- max_new_tokens=150,
38
- temperature=0.7,
39
- do_sample=True,
40
- )
41
-
42
- # 3. تشغيل التوليد في مسار منفصل (Thread) لضمان عدم تجميد الواجهة
43
  thread = Thread(target=model.generate, kwargs=generation_kwargs)
44
  thread.start()
45
 
46
- # 4. السطر السحري: البث المباشر باستخدام yield
47
  partial_text = ""
48
  for new_text in streamer:
49
  partial_text += new_text
50
- yield partial_text # يقوم بتحديث النص في الواجهة فور ظهور كل كلمة
51
 
52
- # بناء الواجهة
53
  demo = gr.ChatInterface(
54
  generate_response,
55
- title="ELIZA (Gemma-4 Streaming)",
56
- description="بث مباشر للنصوص مع استهلاك منخفض للذاكرة."
57
  )
58
 
59
- if __name__ == "__main__":
60
- demo.launch()
 
1
  import gradio as gr
2
+ from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, TextIteratorStreamer
3
  import torch
4
+ import os # إعادة المكتبة المحذوفة
5
+ from threading import Thread # ضرورية تقنياً للبث ولا تستهلك ذاكرة
6
 
 
7
  model_name = "gijl/gemma-4-E2B-it"
8
 
9
  tokenizer = AutoTokenizer.from_pretrained(model_name)
10
+
11
+ # تحميل النموذج مرة واحدة فقط (5 جيجابايت تقريباً)
12
+ model = AutoModelForCausalLM.from_pretrained(model_name,
13
+ torch_dtype=torch.float16,
14
+ device_map="auto")
15
+
16
+ # تم التعديل هنا: نمرر model=model وليس model_name لمنع تحميل النموذج مرة ثانية
17
+ pipe = pipeline("text-generation",
18
+ model=model,
19
+ tokenizer=tokenizer)
20
 
21
  def generate_response(message, history):
 
22
  messages = [
23
  {"role": "system", "content": "Você é ELIZA, uma terapeuta que responde com empatia."},
24
  {"role": "user", "content": message}
25
  ]
 
 
 
 
 
 
 
 
 
 
26
 
27
+ # سطر إعداد البث
28
+ streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
29
+
30
+ # تجهيز المدخلات
31
+ inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
32
+
33
+ # تشغيل التوليد في الخلفية
34
+ generation_kwargs = dict(input_ids=inputs, streamer=streamer, max_new_tokens=150, temperature=0.7)
 
 
35
  thread = Thread(target=model.generate, kwargs=generation_kwargs)
36
  thread.start()
37
 
38
+ # سطر تفعيل البث المباشر (The Streaming Line)
39
  partial_text = ""
40
  for new_text in streamer:
41
  partial_text += new_text
42
+ yield partial_text # هذا السطر هو الذي يجعل النص يظهر كلمة بكلمة
43
 
 
44
  demo = gr.ChatInterface(
45
  generate_response,
46
+ title=" (Streaming)",
47
+ description="استهلاك الذاكرة الآن مثالي والبث مفعل."
48
  )
49
 
50
+ demo.launch()