Spaces:
Paused
Paused
import numpy as np | |
import streamlit as st | |
from transformers import AutoModelForCausalLM, AutoTokenizer | |
import torch | |
import os | |
# التحقق من توفر GPU | |
device = "cuda" if torch.cuda.is_available() else "cpu" | |
def load_model(): | |
""" | |
تحميل النموذج والمُرمِّز مع التخزين المؤقت | |
""" | |
model_name = "joermd/speedy-llama2" | |
# تهيئة الـtokenizer أولاً | |
tokenizer = AutoTokenizer.from_pretrained(model_name) | |
# تهيئة النموذج مع إعدادات مناسبة | |
model = AutoModelForCausalLM.from_pretrained( | |
model_name, | |
torch_dtype=torch.float16 if device == "cuda" else torch.float32, | |
low_cpu_mem_usage=True, | |
device_map="auto" | |
) | |
return model, tokenizer | |
def reset_conversation(): | |
''' | |
إعادة تعيين المحادثة | |
''' | |
st.session_state.conversation = [] | |
st.session_state.messages = [] | |
return None | |
def format_prompt(prompt): | |
""" | |
تنسيق المدخل بالطريقة المناسبة لنموذج LLaMA | |
""" | |
return f"<s>[INST] {prompt} [/INST]" | |
def generate_response(model, tokenizer, prompt, temperature=0.7, max_length=500): | |
""" | |
توليد استجابة من النموذج | |
""" | |
try: | |
# تنسيق المدخل | |
formatted_prompt = format_prompt(prompt) | |
# تحضير المدخلات | |
inputs = tokenizer(formatted_prompt, return_tensors="pt").to(device) | |
# توليد النص | |
with torch.no_grad(): | |
outputs = model.generate( | |
**inputs, | |
max_length=max_length, | |
temperature=temperature, | |
do_sample=True, | |
pad_token_id=tokenizer.eos_token_id, | |
repetition_penalty=1.2 # لتجنب التكرار | |
) | |
# فك ترميز النص المولد | |
response = tokenizer.decode(outputs[0], skip_special_tokens=True) | |
# إزالة النص الأصلي من الاستجابة | |
response = response.replace(formatted_prompt, "").strip() | |
return response | |
except Exception as e: | |
return f"حدث خطأ أثناء توليد الاستجابة: {str(e)}" | |
# تهيئة Streamlit | |
st.title("LLaMA-2 Chat 🦙") | |
# إضافة أزرار التحكم في الشريط الجانبي | |
with st.sidebar: | |
st.header("إعدادات") | |
temperature = st.slider("درجة الإبداعية", min_value=0.1, max_value=1.0, value=0.7, step=0.1, | |
help="قيمة أعلى تعني إجابات أكثر إبداعية وتنوعاً") | |
max_tokens = st.slider("الحد الأقصى للكلمات", min_value=50, max_value=1000, value=500, step=50, | |
help="الحد الأقصى لطول الإجابة") | |
if st.button("مسح المحادثة"): | |
reset_conversation() | |
st.markdown("---") | |
st.markdown(""" | |
### معلومات النموذج | |
- **النموذج:** Speedy LLaMA-2 | |
- **الجهاز:** {} | |
""".format("GPU ⚡" if device == "cuda" else "CPU 💻")) | |
# تحميل النموذج | |
try: | |
with st.spinner("جاري تحميل النموذج... قد يستغرق هذا بضع دقائق..."): | |
model, tokenizer = load_model() | |
st.sidebar.success("تم تحميل النموذج بنجاح! 🎉") | |
except Exception as e: | |
st.error(f"حدث خطأ أثناء تحميل النموذج: {str(e)}") | |
st.error(""" | |
تأكد من تثبيت جميع المكتبات المطلوبة: | |
```bash | |
pip install transformers torch accelerate streamlit | |
``` | |
""") | |
st.stop() | |
# تهيئة سجل المحادثة | |
if "messages" not in st.session_state: | |
st.session_state.messages = [] | |
# عرض المحادثة السابقة | |
for message in st.session_state.messages: | |
with st.chat_message(message["role"]): | |
st.write(message["content"]) | |
# معالجة إدخال المستخدم | |
if prompt := st.chat_input("اكتب رسالتك هنا..."): | |
st.session_state.messages.append({"role": "user", "content": prompt}) | |
with st.chat_message("user"): | |
st.write(prompt) | |
with st.chat_message("assistant"): | |
with st.spinner("جاري التفكير..."): | |
response = generate_response( | |
model=model, | |
tokenizer=tokenizer, | |
prompt=prompt, | |
temperature=temperature, | |
max_length=max_tokens | |
) | |
st.write(response) | |
st.session_state.messages.append({"role": "assistant", "content": response}) |