math-llm-demo / app.py
Joash2024's picture
Add initial demo files
0e7ff76
raw
history blame
4.97 kB
import gradio as gr
from transformers import AutoTokenizer, pipeline
import torch
import numpy as np
from monitoring import PerformanceMonitor, measure_time
# Model IDs
BASE_MODEL_ID = "Alexis-Az/Math-Problem-LlaMA-3.2-1B-GGUF"
FINETUNED_MODEL_ID = "Alexis-Az/Math-Problem-LlaMA-3.2-1.7B-GGUF"
# Initialize performance monitor
monitor = PerformanceMonitor()
def format_prompt(problem):
"""Format the input problem according to the model's expected format"""
return f"<|im_start|>user\nCan you help me solve this math problem? {problem}<|im_end|>\n"
@measure_time
def get_model_response(problem, model_id):
"""Get response from a specific model"""
try:
# Initialize pipeline
pipe = pipeline(
"text-generation",
model=model_id,
torch_dtype=torch.float16,
device_map="auto",
)
# Format prompt and generate response
prompt = format_prompt(problem)
response = pipe(
prompt,
max_new_tokens=100,
temperature=0.1,
top_p=0.95,
repetition_penalty=1.15
)[0]["generated_text"]
# Extract assistant's response
assistant_response = response.split("<|im_start|>assistant\n")[-1].split("<|im_end|>")[0]
return assistant_response.strip()
except Exception as e:
return f"Error: {str(e)}"
def solve_problem(problem, problem_type):
"""Solve a math problem using both models"""
if not problem:
return "Please enter a problem", "Please enter a problem", None
# Record problem type
monitor.record_problem_type(problem_type)
# Add problem type context if provided
if problem_type != "Custom":
problem = f"{problem_type}: {problem}"
# Get responses from both models with timing
base_response, base_time = get_model_response(problem, BASE_MODEL_ID)
finetuned_response, finetuned_time = get_model_response(problem, FINETUNED_MODEL_ID)
# Record response times
monitor.record_response_time("base", base_time)
monitor.record_response_time("finetuned", finetuned_time)
# Record success (basic check - no error message)
monitor.record_success("base", not base_response.startswith("Error"))
monitor.record_success("finetuned", not finetuned_response.startswith("Error"))
# Get updated statistics
stats = monitor.get_statistics()
# Format statistics for display
stats_display = f"""
### Performance Metrics
#### Response Times (seconds)
- Base Model: {stats.get('base_avg_response_time', 0):.2f} avg
- Fine-tuned Model: {stats.get('finetuned_avg_response_time', 0):.2f} avg
#### Success Rates
- Base Model: {stats.get('base_success_rate', 0):.1f}%
- Fine-tuned Model: {stats.get('finetuned_success_rate', 0):.1f}%
#### Problem Type Distribution
"""
for ptype, percentage in stats.get('problem_type_distribution', {}).items():
stats_display += f"- {ptype}: {percentage:.1f}%\n"
return base_response, finetuned_response, stats_display
# Create Gradio interface
with gr.Blocks(title="Mathematics Problem Solver") as demo:
gr.Markdown("# Mathematics Problem Solver")
gr.Markdown("Compare solutions between base (1B) and fine-tuned (1.7B) models")
with gr.Row():
with gr.Column():
problem_type = gr.Dropdown(
choices=["Addition", "Root Finding", "Derivative", "Custom"],
value="Custom",
label="Problem Type"
)
problem_input = gr.Textbox(
label="Enter your math problem",
placeholder="Example: Find the derivative of x^2 + 3x"
)
solve_btn = gr.Button("Solve", variant="primary")
with gr.Row():
with gr.Column():
gr.Markdown("### Base Model (1B)")
base_output = gr.Textbox(label="Base Model Solution", lines=5)
with gr.Column():
gr.Markdown("### Fine-tuned Model (1.7B)")
finetuned_output = gr.Textbox(label="Fine-tuned Model Solution", lines=5)
# Performance metrics display
with gr.Row():
metrics_display = gr.Markdown("### Performance Metrics\n*Solve a problem to see metrics*")
# Example problems
gr.Examples(
examples=[
["Find the derivative of x^2 + 3x", "Derivative"],
["What is the square root of 144?", "Root Finding"],
["Calculate 235 + 567", "Addition"],
],
inputs=[problem_input, problem_type],
outputs=[base_output, finetuned_output, metrics_display],
fn=solve_problem,
cache_examples=True,
)
# Connect the interface
solve_btn.click(
fn=solve_problem,
inputs=[problem_input, problem_type],
outputs=[base_output, finetuned_output, metrics_display]
)
if __name__ == "__main__":
demo.launch()