LLM_FinetuneR / app.py
Diksha2001's picture
Rename app1.py to app.py
9d2793f verified
raw
history blame
6.07 kB
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()