LLM_FinetuneR / app.py
Diksha2001's picture
Rename app1.py to app.py
9d2793f verified
import gradio as gr
import json
import subprocess
import logging
import sys
import io
import threading
import queue
from contextlib import redirect_stdout, redirect_stderr
class LiveLogHandler(logging.Handler):
def __init__(self, log_queue):
super().__init__()
self.log_queue = log_queue
def emit(self, record):
msg = self.format(record)
self.log_queue.put(msg)
def run_pipeline(pdf_file, system_prompt, max_step, learning_rate, epochs, model_name):
try:
# Construct job input
data = {
"input": {
"pdf_file": pdf_file.name,
"system_prompt": system_prompt,
"max_step": max_step,
"learning_rate": learning_rate,
"epochs": epochs,
"model_name": model_name
}
}
# Print the start of pipeline to terminal
print("Pipeline started with inputs:", json.dumps(data, indent=2))
# Run the handler in a separate process
process = subprocess.Popen(
['python3', 'handler.py', '--test_input', json.dumps(data)],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
# Read output in real-time and print to terminal
stdout_lines = []
stderr_lines = []
for line in process.stdout:
print(line.strip()) # Print stdout to terminal
stdout_lines.append(line.strip())
for line in process.stderr:
print(f"ERROR: {line.strip()}") # Print stderr to terminal
stderr_lines.append(line.strip())
# Wait for process to complete
process.wait()
# Try to extract JSON result
handler_output = None
for line in stdout_lines:
try:
parsed_line = json.loads(line)
if isinstance(parsed_line, dict) and "status" in parsed_line:
handler_output = parsed_line
break
except json.JSONDecodeError:
continue
# Prepare result
if handler_output and handler_output.get("status") == "success":
return {
"model_name": handler_output.get("model_name", "N/A"),
"processing_time": handler_output.get("processing_time", "N/A"),
"evaluation_results": handler_output.get("evaluation_results", {})
}
else:
return {
"status": "error",
"details": handler_output or "No valid output received"
}
except Exception as e:
print(f"Pipeline execution error: {str(e)}")
return {
"status": "error",
"details": str(e)
}
# Define Gradio interface with dark theme and light blue buttons
with gr.Blocks(css='''
.gradio-container {
background-color: #121212;
color: #e0e0e0;
max-width: 800px;
margin: 0 auto;
}
.custom-input {
min-height: 50px;
height: auto;
background-color: #1e1e1e !important;
color: #e0e0e0 !important;
border: 1px solid #333 !important;
}
.custom-input textarea,
.custom-input input,
.custom-input .upload-icon {
background-color: #1e1e1e !important;
color: #e0e0e0 !important;
}
.gr-button {
background-color: #87CEFA !important; /* Light Sky Blue */
color: #121212 !important;
border: none !important;
font-weight: bold !important;
}
.gr-button:hover {
background-color: #87CEEB !important; /* Slightly different light blue on hover */
}
.gr-form {
background-color: #1e1e1e !important;
border-color: #333 !important;
}
.gr-label {
color: #87CEFA !important; /* Light Sky Blue for labels */
}
''') as demo:
# Add Heading at the top, centered and light blue
title = "πŸ€– Fine-tuning Pipeline Configurator"
header_style = "color: #87CEFA;" # Light Sky Blue
html_content = f"""
<div style="text-align: center;">
<h2><span style="{header_style}">{title}</span></h2>
</div>
"""
gr.Markdown(html_content)
with gr.Column(scale=1):
# System Prompt with consistent styling
system_prompt = gr.Textbox(
label="System Prompt",
placeholder="Enter system instructions",
lines=4,
elem_classes=['custom-input'],
value="You are a helpful assistant that provides detailed information based on the provided text."
)
# Numeric and model name inputs in a row with consistent styling
with gr.Row():
# PDF File Upload
pdf_file = gr.File(
label="Upload PDF",
file_types=[".pdf"],
elem_classes=['custom-input']
)
max_step = gr.Number(
label="Max Steps",
value=150,
elem_classes=['custom-input']
)
learning_rate = gr.Number(
label="Learning Rate",
value=2e-4,
elem_classes=['custom-input']
)
epochs = gr.Number(
label="Epochs",
value=10,
elem_classes=['custom-input']
)
model_name = gr.Textbox(
label="Model Name",
placeholder="Enter model name",
elem_classes=['custom-input']
)
# Results and Run Button
result_output = gr.JSON(label="Pipeline Results")
run_button = gr.Button("Run Pipeline", variant="primary")
# Trigger the function when the button is clicked
run_button.click(
run_pipeline,
inputs=[pdf_file, system_prompt, max_step, learning_rate, epochs, model_name],
outputs=[result_output]
)
# Run Gradio app
demo.launch()