File size: 4,489 Bytes
0a8cafa
297f353
74f37a5
 
 
7841db2
74f37a5
 
 
 
 
 
7841db2
10dfcb1
 
74f37a5
10dfcb1
 
fc804b6
74f37a5
 
 
fc804b6
 
 
 
74f37a5
 
fc804b6
 
 
74f37a5
fc804b6
 
 
74f37a5
 
fc804b6
74f37a5
 
 
fc804b6
74f37a5
7841db2
74f37a5
fc804b6
 
 
74f37a5
 
fc804b6
74f37a5
0a8cafa
4fc9e70
7841db2
f3d87e2
 
10dfcb1
 
9038518
 
10dfcb1
f3d87e2
10dfcb1
ae21d92
10dfcb1
 
 
 
 
 
 
 
 
 
 
 
 
 
4b78c6c
 
 
74f37a5
 
4b78c6c
10dfcb1
ae21d92
4b78c6c
74f37a5
10dfcb1
4b78c6c
10dfcb1
4b78c6c
10dfcb1
74f37a5
 
 
 
fd96719
74f37a5
10dfcb1
74f37a5
 
5c30376
 
10dfcb1
 
4b78c6c
74f37a5
 
10dfcb1
 
f3d87e2
0a8cafa
 
7841db2
5c30376
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import gradio as gr
import spaces
from transformers import pipeline
import torch
import logging

# Configure logging/logger
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

# Predefined list of models to compare (can be expanded)
model_options = {
    "Foundation-Sec-8B": pipeline("text-generation", model="fdtn-ai/Foundation-Sec-8B"),
}

#@spaces.GPU
def generate_text_local(model_pipeline, prompt):
    """Local text generation"""
    try:
        # モデル名取得(なければ 'unknown')
        model_name = getattr(getattr(model_pipeline, "model", None), "name_or_path", "unknown")
        logger.info(f"Running local text generation with {model_name}")

        # Move model to GPU (entire pipeline)
        device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        if hasattr(model_pipeline, "model"):
            model_pipeline.model = model_pipeline.model.to(device)

        # Record device information
        device_info = next(model_pipeline.model.parameters()).device if hasattr(model_pipeline, "model") else "unknown"
        logger.info(f"Model {model_name} is running on device: {device_info}")

        outputs = model_pipeline(
            prompt,
            max_new_tokens=3,
            do_sample=True,
            temperature=0.1,
            top_p=0.9,
            clean_up_tokenization_spaces=True,
        )

        # Move model back to CPU
        if hasattr(model_pipeline, "model"):
            model_pipeline.model = model_pipeline.model.to("cpu")

        return outputs[0]["generated_text"].replace(prompt, "").strip()
    except Exception as e:
        logger.error(f"Error in local text generation with {model_name}: {str(e)}")
        return f"Error: {str(e)}"

# Build Gradio app
def create_demo():
    with gr.Blocks() as demo:
        gr.Markdown("# AI Model Comparison Tool 🌟")
        gr.Markdown(
            """
            Compare responses from two AI models side-by-side.  
            Select two models, ask a question, and compare their responses in real time!
            """
        )

        # Input Section
        with gr.Row():
            system_message = gr.Textbox(
                value="You are a helpful assistant providing answers for technical and customer support queries.",
                label="System message"
            )
            user_message = gr.Textbox(label="Your question", placeholder="Type your question here...")

        with gr.Row():
            max_tokens = gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens")
            temperature = gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature")
            top_p = gr.Slider(
                minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"
            )

        # Model Selection Section
        selected_models = gr.CheckboxGroup(
            choices=list(model_options.keys()),
            label="Select exactly two model to compare",
            value=["Foundation-Sec-8B"],  # Default models
        )

        # Dynamic Response Section
        response_box1 = gr.Textbox(label="Response from Model 1", interactive=False)
        #response_box2 = gr.Textbox(label="Response from Model 2", interactive=False)

        # Function to generate responses
        def generate_responses(
            message, system_message, max_tokens, temperature, top_p, selected_models
        ):
            #if len(selected_models) != 2:
            #    return "Error: Please select exactly two models to compare.", ""
            responses = generate_text_local(
                #message, [], system_message, max_tokens, temperature, top_p, selected_models
                model_options[selected_models[0]],
                message
            )
            #return responses.get(selected_models[0], ""), responses.get(selected_models[1], "")
            return responses
        # Add a button for generating responses
        submit_button = gr.Button("Generate Responses")
        submit_button.click(
            generate_responses,
            inputs=[user_message, system_message, max_tokens, temperature, top_p, selected_models],
            #outputs=[response_box1, response_box2],  # Link to response boxes
            outputs=[response_box1]
        )

    return demo

if __name__ == "__main__":
    demo = create_demo()
    demo.launch()