Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import torch | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| import logging | |
| # Configure logging | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| # Dictionary to store loaded models and tokenizers | |
| loaded_models = {} | |
| # List of available models (ensure these are correct and accessible) | |
| models = [ | |
| "Qwen/Qwen2.5-7B-Instruct", | |
| "Qwen/Qwen2.5-0.5B-Instruct" | |
| ] | |
| def load_all_models(): | |
| """ | |
| Pre-loads all models and their tokenizers into memory. | |
| """ | |
| for model_name in models: | |
| if model_name not in loaded_models: | |
| try: | |
| logger.info(f"Loading model: {model_name}") | |
| tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| model = AutoModelForCausalLM.from_pretrained(model_name).to( | |
| "cuda" if torch.cuda.is_available() else "cpu") | |
| loaded_models[model_name] = (model, tokenizer) | |
| logger.info(f"Successfully loaded {model_name}") | |
| except Exception as e: | |
| logger.error(f"Failed to load model {model_name}: {e}") | |
| def get_model_response(model_name, message): | |
| """ | |
| Generates a response from the specified model given a user message. | |
| """ | |
| try: | |
| model, tokenizer = loaded_models[model_name] | |
| inputs = tokenizer(message, return_tensors="pt").to(model.device) | |
| # Generate response with appropriate parameters | |
| with torch.no_grad(): | |
| outputs = model.generate( | |
| **inputs, | |
| max_length=512, | |
| do_sample=True, | |
| top_p=0.95, | |
| top_k=50 | |
| ) | |
| response = tokenizer.decode(outputs[0], skip_special_tokens=True) | |
| return response | |
| except KeyError: | |
| logger.error(f"Model {model_name} not found in loaded_models.") | |
| return f"Error: Model {model_name} not loaded." | |
| except Exception as e: | |
| logger.error(f"Error generating response from {model_name}: {e}") | |
| return f"Error generating response: {e}" | |
| def chat(message, history1, history2, model1, model2): | |
| """ | |
| Handles the chat interaction by getting responses from both models | |
| and updating their respective histories. | |
| """ | |
| response1 = get_model_response(model1, message) | |
| response2 = get_model_response(model2, message) | |
| history1 = history1 or [] | |
| history2 = history2 or [] | |
| # Update history for Model 1 | |
| history1.append(("User", message)) | |
| history1.append((model1.split("/")[-1], response1)) | |
| # Update history for Model 2 | |
| history2.append(("User", message)) | |
| history2.append((model2.split("/")[-1], response2)) | |
| return history1, history2 | |
| # Initialize vote counts | |
| vote_counts = {"model1": 0, "model2": 0} | |
| def upvote_vote(model1, model2): | |
| """ | |
| Increments the vote count for Model 1 and returns updated counts. | |
| """ | |
| vote_counts["model1"] += 1 | |
| return f"Votes - {model1.split('/')[-1]}: {vote_counts['model1']}, {model2.split('/')[-1]}: {vote_counts['model2']}" | |
| def downvote_vote(model1, model2): | |
| """ | |
| Increments the vote count for Model 2 and returns updated counts. | |
| """ | |
| vote_counts["model2"] += 1 | |
| return f"Votes - {model1.split('/')[-1]}: {vote_counts['model1']}, {model2.split('/')[-1]}: {vote_counts['model2']}" | |
| def clear_chat(): | |
| """ | |
| Clears both chat histories and resets vote counts. | |
| """ | |
| global vote_counts | |
| vote_counts = {"model1": 0, "model2": 0} | |
| return [], [], "Votes - 0, 0" | |
| # Pre-load all models before building the Gradio interface | |
| load_all_models() | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# π€ Model Comparison Space") | |
| # Dropdowns for selecting models | |
| with gr.Row(): | |
| model1_dropdown = gr.Dropdown(choices=models, label="Model 1", value=models[0]) | |
| model2_dropdown = gr.Dropdown(choices=models, label="Model 2", value=models[1]) | |
| # Separate chatboxes for each model | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown("### Model 1 Chat") | |
| chatbot1 = gr.Chatbot(label=f"{models[0].split('/')[-1]} Chat History") | |
| with gr.Column(): | |
| gr.Markdown("### Model 2 Chat") | |
| chatbot2 = gr.Chatbot(label=f"{models[1].split('/')[-1]} Chat History") | |
| # Input textbox for user message | |
| msg = gr.Textbox(label="π¬ Your Message", placeholder="Type your message here...") | |
| # Buttons for upvote, downvote, and clearing the chat | |
| with gr.Row(): | |
| upvote = gr.Button("π Upvote Model 1") | |
| downvote = gr.Button("π Downvote Model 2") | |
| clear = gr.Button("π§Ή Clear Chat") | |
| # Textbox to display vote counts | |
| vote_text = gr.Textbox(label="π Vote Counts", value="Votes - 0, 0", interactive=False) | |
| # Define interactions | |
| msg.submit( | |
| chat, | |
| inputs=[msg, chatbot1, chatbot2, model1_dropdown, model2_dropdown], | |
| outputs=[chatbot1, chatbot2] | |
| ) | |
| upvote.click( | |
| upvote_vote, | |
| inputs=[model1_dropdown, model2_dropdown], | |
| outputs=vote_text | |
| ) | |
| downvote.click( | |
| downvote_vote, | |
| inputs=[model1_dropdown, model2_dropdown], | |
| outputs=vote_text | |
| ) | |
| clear.click( | |
| clear_chat, | |
| outputs=[chatbot1, chatbot2, vote_text] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch(share=True) | |