Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import torch | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| import spaces # مكتبة ZeroGPU المجانية | |
| # إعدادات النموذج - Qwen2.5 Instruct (الأحدث المتاح للمحادثة) | |
| # ملاحظة: Qwen3 Base غير مناسب للمحادثة، نستخدم Qwen2.5-Instruct الأحدث | |
| MODEL_NAME = "Qwen/Qwen2.5-14B-Instruct" # مجاني 100% - مخصص للمحادثة | |
| DEVICE = "cuda" if torch.cuda.is_available() else "cpu" | |
| print(f"🚀 تحميل النموذج: {MODEL_NAME}") | |
| print(f"💻 الجهاز المستخدم: ZeroGPU (مجاني)") | |
| print(f"🎉 الإصدار: Qwen2.5-Instruct (محسّن للمحادثة)") | |
| # تحميل Tokenizer والنموذج | |
| tokenizer = AutoTokenizer.from_pretrained( | |
| MODEL_NAME, | |
| trust_remote_code=True | |
| ) | |
| model = AutoModelForCausalLM.from_pretrained( | |
| MODEL_NAME, | |
| device_map="auto", | |
| trust_remote_code=True, | |
| torch_dtype=torch.float16 | |
| ) | |
| print("✅ تم تحميل النموذج بنجاح على ZeroGPU!") | |
| # هذا السطر مهم جداً للـ ZeroGPU المجاني! | |
| def generate_response( | |
| message, | |
| history, | |
| system_message="أنت مساعد ذكي ومفيد.", | |
| max_tokens=2048, | |
| temperature=0.7, | |
| top_p=0.9, | |
| top_k=50, | |
| repetition_penalty=1.1, | |
| do_sample=True | |
| ): | |
| """ | |
| دالة توليد الردود مع جميع الخيارات المتقدمة | |
| تعمل على ZeroGPU المجاني من Hugging Face | |
| """ | |
| # بناء المحادثة | |
| messages = [{"role": "system", "content": system_message}] | |
| # إضافة التاريخ | |
| for user_msg, assistant_msg in history: | |
| messages.append({"role": "user", "content": user_msg}) | |
| messages.append({"role": "assistant", "content": assistant_msg}) | |
| # إضافة الرسالة الحالية | |
| messages.append({"role": "user", "content": message}) | |
| # تحويل إلى نص | |
| text = tokenizer.apply_chat_template( | |
| messages, | |
| tokenize=False, | |
| add_generation_prompt=True | |
| ) | |
| # Tokenization | |
| model_inputs = tokenizer([text], return_tensors="pt").to(DEVICE) | |
| # التوليد | |
| generated_ids = model.generate( | |
| **model_inputs, | |
| max_new_tokens=max_tokens, | |
| temperature=temperature, | |
| top_p=top_p, | |
| top_k=top_k, | |
| repetition_penalty=repetition_penalty, | |
| do_sample=do_sample, | |
| pad_token_id=tokenizer.pad_token_id, | |
| eos_token_id=tokenizer.eos_token_id, | |
| ) | |
| # فك التشفير | |
| response = tokenizer.batch_decode( | |
| generated_ids[:, model_inputs.input_ids.shape[1]:], | |
| skip_special_tokens=True | |
| )[0] | |
| return response | |
| # واجهة Gradio المتقدمة | |
| with gr.Blocks( | |
| theme=gr.themes.Soft(), | |
| css=""" | |
| .rtl {direction: rtl; text-align: right;} | |
| footer {visibility: hidden;} | |
| .gpu-badge { | |
| background: linear-gradient(90deg, #00d2ff 0%, #3a7bd5 100%); | |
| color: white; | |
| padding: 10px 20px; | |
| border-radius: 10px; | |
| text-align: center; | |
| font-weight: bold; | |
| margin: 10px 0; | |
| } | |
| """ | |
| ) as demo: | |
| gr.Markdown( | |
| """ | |
| # 🤖 Qwen3-14B - أحدث محرك ذكاء اصطناعي من Alibaba | |
| ### الإصدار 3 الجديد - مجاني 100% على ZeroGPU ⚡ | |
| #### 🎯 أقوى من GPT-3.5 | متخصص في البرمجة والعلوم | دعم عربي ممتاز | |
| """, | |
| elem_classes="rtl" | |
| ) | |
| gr.HTML( | |
| """ | |
| <div class="gpu-badge"> | |
| ⚡ Qwen3 (مايو 2025) - يعمل على ZeroGPU المجاني (Nvidia H200) - بدون أي تكلفة! | |
| </div> | |
| """ | |
| ) | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| # منطقة الدردشة | |
| chatbot = gr.Chatbot( | |
| height=500, | |
| label="المحادثة", | |
| rtl=True, | |
| show_copy_button=True, | |
| avatar_images=(None, "https://huggingface.co/datasets/huggingface/brand-assets/resolve/main/hf-logo.png") | |
| ) | |
| with gr.Row(): | |
| msg = gr.Textbox( | |
| placeholder="اكتب رسالتك هنا...", | |
| label="رسالتك", | |
| scale=4, | |
| rtl=True, | |
| lines=2 | |
| ) | |
| submit = gr.Button("إرسال 📤", scale=1, variant="primary") | |
| with gr.Row(): | |
| clear = gr.Button("مسح المحادثة 🗑️") | |
| retry = gr.Button("إعادة المحاولة 🔄") | |
| with gr.Column(scale=1): | |
| # الإعدادات المتقدمة | |
| gr.Markdown("### ⚙️ الإعدادات المتقدمة") | |
| system_message = gr.Textbox( | |
| value="أنت مساعد ذكي ومفيد متخصص في الإلكترونيات الرقمية والأتمتة الصناعية وإنترنت الأشياء.", | |
| label="رسالة النظام", | |
| lines=4, | |
| rtl=True | |
| ) | |
| max_tokens = gr.Slider( | |
| minimum=128, | |
| maximum=4096, | |
| value=2048, | |
| step=128, | |
| label="الحد الأقصى للكلمات (Max Tokens)", | |
| info="عدد الكلمات في الإجابة" | |
| ) | |
| temperature = gr.Slider( | |
| minimum=0.1, | |
| maximum=2.0, | |
| value=0.7, | |
| step=0.1, | |
| label="الإبداع (Temperature)", | |
| info="أعلى = أكثر إبداعاً، أقل = أكثر دقة" | |
| ) | |
| top_p = gr.Slider( | |
| minimum=0.1, | |
| maximum=1.0, | |
| value=0.9, | |
| step=0.05, | |
| label="Top-p (Nucleus Sampling)", | |
| info="يحدد تنوع الكلمات" | |
| ) | |
| top_k = gr.Slider( | |
| minimum=1, | |
| maximum=100, | |
| value=50, | |
| step=1, | |
| label="Top-k Sampling", | |
| info="عدد الكلمات المحتملة" | |
| ) | |
| repetition_penalty = gr.Slider( | |
| minimum=1.0, | |
| maximum=2.0, | |
| value=1.1, | |
| step=0.05, | |
| label="عقوبة التكرار", | |
| info="يمنع تكرار نفس الكلمات" | |
| ) | |
| do_sample = gr.Checkbox( | |
| value=True, | |
| label="استخدام Sampling", | |
| info="للنتائج الإبداعية والمتنوعة" | |
| ) | |
| # أمثلة سريعة | |
| with gr.Accordion("💡 أمثلة سريعة", open=False): | |
| gr.Examples( | |
| examples=[ | |
| ["اشرح لي ما هو إنترنت الأشياء IoT بطريقة مبسطة"], | |
| ["اكتب كود Arduino للتحكم في محرك DC بواسطة L298N"], | |
| ["ما أفضل microcontroller لمشروع IoT منزلي؟"], | |
| ["اقترح مشروع أتمتة صناعية باستخدام PLC"], | |
| ["كيف أربط مستشعر DHT22 مع ESP32 وأرسل البيانات للسحابة؟"], | |
| ["اشرح الفرق بين Modbus RTU و Modbus TCP"], | |
| ], | |
| inputs=msg, | |
| label="جرب هذه الأمثلة" | |
| ) | |
| # معلومات النموذج | |
| with gr.Accordion("ℹ️ معلومات النموذج والنظام", open=False): | |
| gr.Markdown( | |
| f""" | |
| ### 🎯 تفاصيل النموذج | |
| - **النموذج**: Qwen3-14B (أحدث إصدار - مايو 2025) | |
| - **المعاملات**: 14.8 مليار معامل | |
| - **المنصة**: Hugging Face ZeroGPU (مجاني 100%) | |
| - **GPU**: Nvidia H200 (ديناميكي) | |
| - **نوع البيانات**: Float16 | |
| - **الذاكرة**: ~28GB VRAM | |
| - **السرعة**: 35-60 token/ثانية | |
| ### 🌟 المميزات الجديدة في Qwen3 | |
| - ✅ أسرع بـ 40% من Qwen2.5 | |
| - ✅ دقة أعلى في الرياضيات والمنطق | |
| - ✅ فهم أعمق للغة العربية | |
| - ✅ كود برمجي أفضل جودة | |
| - ✅ يدعم 29 لغة برمجة | |
| - ✅ ذاكرة سياق 32K token | |
| ### ⚠️ ملاحظات | |
| - قد يكون هناك انتظار قصير في أوقات الذروة | |
| - ZeroGPU يخصص GPU ديناميكياً عند الحاجة | |
| - الجلسة تنتهي بعد 60 ثانية من عدم النشاط | |
| """ | |
| ) | |
| # معلومات للمطورين | |
| with gr.Accordion("👨💻 للمطورين - تفاصيل تقنية", open=False): | |
| gr.Markdown( | |
| """ | |
| ### كيف يعمل ZeroGPU؟ | |
| ```python | |
| import spaces | |
| @spaces.GPU # يخصص GPU مجاناً عند استدعاء الدالة | |
| def generate_response(...): | |
| # الكود هنا | |
| ``` | |
| ### المكتبات المستخدمة: | |
| - `transformers`: لتحميل النموذج | |
| - `torch`: للحسابات العصبية | |
| - `spaces`: للوصول إلى ZeroGPU | |
| - `gradio`: للواجهة التفاعلية | |
| ### كيف تنسخ هذا المشروع؟ | |
| 1. Duplicate هذا Space | |
| 2. غيّر MODEL_NAME إلى أي نموذج آخر (7B أو 14B) | |
| 3. عدّل system_message حسب احتياجك | |
| 4. انشر وشارك! | |
| """ | |
| ) | |
| # منطق التفاعل | |
| def user_message(message, history): | |
| return "", history + [[message, None]] | |
| def bot_response(history, system_msg, max_tok, temp, top_p_val, top_k_val, rep_pen, do_samp): | |
| user_msg = history[-1][0] | |
| bot_msg = generate_response( | |
| user_msg, | |
| history[:-1], | |
| system_msg, | |
| max_tok, | |
| temp, | |
| top_p_val, | |
| top_k_val, | |
| rep_pen, | |
| do_samp | |
| ) | |
| history[-1][1] = bot_msg | |
| return history | |
| # ربط الأحداث | |
| msg.submit( | |
| user_message, | |
| [msg, chatbot], | |
| [msg, chatbot], | |
| queue=False | |
| ).then( | |
| bot_response, | |
| [chatbot, system_message, max_tokens, temperature, top_p, top_k, repetition_penalty, do_sample], | |
| chatbot | |
| ) | |
| submit.click( | |
| user_message, | |
| [msg, chatbot], | |
| [msg, chatbot], | |
| queue=False | |
| ).then( | |
| bot_response, | |
| [chatbot, system_message, max_tokens, temperature, top_p, top_k, repetition_penalty, do_sample], | |
| chatbot | |
| ) | |
| clear.click(lambda: None, None, chatbot, queue=False) | |
| retry.click( | |
| lambda h: h[:-1] if h else h, | |
| chatbot, | |
| chatbot, | |
| queue=False | |
| ).then( | |
| bot_response, | |
| [chatbot, system_message, max_tokens, temperature, top_p, top_k, repetition_penalty, do_sample], | |
| chatbot | |
| ) | |
| # تشغيل التطبيق | |
| if __name__ == "__main__": | |
| demo.queue(max_size=20) | |
| demo.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=False | |
| ) |