ONYX-APP commited on
Commit
9aa5cfd
·
verified ·
1 Parent(s): 60c253b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -79
app.py CHANGED
@@ -1,84 +1,57 @@
1
- import os
2
- import torch
3
  import gradio as gr
4
- import kagglehub
5
- import ctranslate2
6
- import transformers
7
- from threading import Thread
8
-
9
- # 🚀 الحل الجذري حسب تعليمات كاجل الجديدة
10
- os.environ["KAGGLE_API_TOKEN"] = "KGAT_e7d58c8edc599a3341c98d2f1295795f"
11
-
12
- # 🚀 تسريع CPU لأقصى حد
13
- torch.set_num_threads(os.cpu_count())
14
-
15
- print("--- 📥 Downloading Model from Kaggle ---")
16
- try:
17
- model_path = kagglehub.model_download("ruicompany/onyx-gpt2large/transformers/1gb-stable")
18
- print(f"--- ✅ Success! Model Path: {model_path} ---")
19
- except Exception as e:
20
- print(f"--- ❌ Download Failed: {e} ---")
21
- model_path = kagglehub.model_download("ruicompany/onyx-gpt2large/transformers/default")
22
-
23
- # 🛠 تحويل الموديل لصيغة CTranslate2
24
- ct2_model_path = "onyx_ct2_model"
25
- if not os.path.exists(ct2_model_path):
26
- print("--- ⚙️ Converting model to CTranslate2 format (int8) ---")
27
- converter = ctranslate2.converters.TransformersConverter(model_path)
28
- # تحديث الـ compute_type لـ int8 ليتناسب مع الـ CPU ويختفي الـ Warning
29
- converter.convert(ct2_model_path, quantization="int8", force=True)
30
-
31
- # تحميل الـ Tokenizer والـ Generator
32
- tokenizer = transformers.AutoTokenizer.from_pretrained(model_path)
33
- generator = ctranslate2.Generator(ct2_model_path, device="cpu")
34
-
35
- def chat_onyx(message, history):
36
- # تقليص الذاكرة لسرعة الاستجابة
37
- recent_history = history[-3:] if len(history) > 3 else history
38
- prompt = ""
39
-
40
- # 🛠 الحل الجذري لتنسيق Gradio الجديد
41
- for msg in recent_history:
42
- # بالنسخ الجديدة msg بكون قاموس فيه role و content
43
- role = msg["role"]
44
- content = msg["content"]
45
- if role == "user":
46
- prompt += f"User: {content}\n"
47
- elif role == "assistant":
48
- prompt += f"Assistant: {content}\n"
49
-
50
- prompt += f"User: {message}\nAssistant:"
51
 
52
- # تحويل النص لـ Tokens
53
- tokens = tokenizer.convert_ids_to_tokens(tokenizer.encode(prompt))
54
-
55
- # الـ Streaming باستخدام CTranslate2 مع ضبط التكرار
56
- step_results = generator.generate_tokens(
57
- tokens,
58
- max_length=100,
59
- sampling_topk=20,
60
- sampling_temperature=0.7,
61
- repetition_penalty=1.2, # لمنع تكرار الكلام
62
- end_token=tokenizer.eos_token
 
 
 
 
 
 
 
 
 
 
63
  )
64
-
65
- partial_text = ""
66
- for result in step_results:
67
- word = tokenizer.decode([result.token_id])
68
-
69
- # فحص لمنع الموديل من تخيل حوار كامل (Stopping Criteria)
70
- if "User:" in word or "Assistant:" in word or "\n" in word:
71
- break
72
-
73
- partial_text += word
74
- yield partial_text.strip()
75
-
76
- # واجهة Gradio
77
- with gr.Blocks() as demo: # شلنا الثيم من هون لتجنب التنبيه
78
- gr.Markdown("# 💎 ONYX AI - Turbo CTranslate2 Mode")
79
- gr.Markdown(f"**Eng. Rawan**, ONYX is now optimized and stable.")
80
- gr.ChatInterface(fn=chat_onyx)
 
 
 
 
 
 
 
81
 
82
  if __name__ == "__main__":
83
- # نقلنا الثيم لهون حسب تعليمات Gradio 6.0
84
- demo.launch(theme=gr.themes.Soft())
 
1
+ import os # [تعديل] استيراد مكتبة os لقراءة التوكن بأمان من إعدادات السبيس
2
+ import spaces
3
  import gradio as gr
4
+ from transformers import AutoModelForCausalLM, AutoTokenizer
5
+ from transformers import TextIteratorStreamer
6
+ from threading import Thread
7
+ import torch
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
+ model_id = "google/gemma-4-E2B-it"
10
+ print("Loading model natively...")
11
+
12
+ # [تعديل] قراءة التوكن بأمان من متغيرات البيئة بدل كتابته بالمكشوف
13
+ hf_token = os.getenv("HF_TOKEN")
14
+
15
+ tokenizer = AutoTokenizer.from_pretrained(model_id, token=hf_token)
16
+ model = AutoModelForCausalLM.from_pretrained(
17
+ model_id,
18
+ torch_dtype=torch.bfloat16,
19
+ device_map="auto",
20
+ token=hf_token # [تعديل] تمرير التوكن بأمان عند تحميل الموديل
21
+ )
22
+
23
+ @spaces.GPU
24
+ def predict(message, history):
25
+ messages = [{"role": "user", "content": message}]
26
+ text = tokenizer.apply_chat_template(
27
+ messages,
28
+ tokenize=False,
29
+ add_generation_prompt=True
30
  )
31
+ model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
32
+ streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
33
+ generation_kwargs = dict(
34
+ **model_inputs,
35
+ max_new_tokens=256,
36
+ streamer=streamer
37
+ )
38
+ thread = Thread(target=model.generate, kwargs=generation_kwargs)
39
+ thread.start()
40
+ partial_message = ""
41
+ for new_text in streamer:
42
+ partial_message += new_text
43
+ display_message = partial_message
44
+ if "assistantfinal" in display_message:
45
+ display_message = display_message.split("assistantfinal")[-1].strip()
46
+ elif "assistant" in display_message:
47
+ display_message = display_message.split("assistant")[-1].strip()
48
+ yield display_message
49
+
50
+ demo = gr.ChatInterface(
51
+ fn=predict,
52
+ title="GPT-OSS Chatbot",
53
+ description="واجهة دردشة سريعة باستخدام موديل gpt-oss-20b مع دعم ZeroGPU.",
54
+ textbox=gr.Textbox(placeholder="اكتب رسالتك هون...", container=False, scale=7))
55
 
56
  if __name__ == "__main__":
57
+ demo.launch()