gijl commited on
Commit
968e9e1
·
verified ·
1 Parent(s): 4e023f7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -22
app.py CHANGED
@@ -1,54 +1,59 @@
1
  import gradio as gr
2
- from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, TextIteratorStreamer
3
  import torch
4
  from threading import Thread
5
 
 
6
  model_name = "gijl/gemma-4-E2B-it"
7
 
8
  tokenizer = AutoTokenizer.from_pretrained(model_name)
9
- model = AutoModelForCausalLM.from_pretrained(model_name,
10
- torch_dtype=torch.float16,
11
- device_map="auto")
12
-
13
- # إبقاء الـ pipeline كما هو أو استخدامه مباشرة
14
- pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
15
 
16
  def generate_response(message, history):
17
- # إعداد مدخلات المحادثة
18
  messages = [
19
- {"role": "system", "content": "Você é ELIZA, uma terapeuta que responde com empatia e faz perguntas para entender melhor o paciente."},
20
  {"role": "user", "content": message}
21
  ]
22
 
23
- # 1. إعداد الـ Streamer
24
- streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True)
25
-
26
- # 2. إعداد إعدادات التوليد
27
- # ملاحظة: تم استخدام tokenizer.apply_chat_template لتحويل الرسائل لتنسيق يفهمه النموذج
28
- inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
29
-
 
 
 
 
30
  generation_kwargs = dict(
31
  input_ids=inputs,
32
  streamer=streamer,
33
  max_new_tokens=150,
34
  temperature=0.7,
35
- do_sample=True
36
  )
37
 
38
- # 3. تشغيل التوليد في Thread منفصل لكي لا يتجمد التطبيق أثناء البث
39
  thread = Thread(target=model.generate, kwargs=generation_kwargs)
40
  thread.start()
41
 
42
- # 4. البث المباشر: الـ yield هي السر هنا!
43
  partial_text = ""
44
  for new_text in streamer:
45
  partial_text += new_text
46
- yield partial_text # يرسل النص قطعة قطعة للواجهة
47
 
 
48
  demo = gr.ChatInterface(
49
  generate_response,
50
- title="ELIZA (com LLM Streaming)",
51
- description="Compartilhe seus pensamentos e ELIZA irá ajudar você a refletir sobre eles."
52
  )
53
 
54
  if __name__ == "__main__":
 
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__":