Nexa / App.py
Allanatrix's picture
Update App.py
b763daf verified
import gradio as gr
import json
import pandas as pd
from Engine import Engine
def run_study(mode, benchmark_func, optimizers, dim, dataset, epochs, batch_size, lr, use_sa, sa_temp, sa_cooling_rate):
# Ensure optimizers is a list
optimizers = [optimizers] if isinstance(optimizers, str) else optimizers or []
if not optimizers:
raise gr.Error("Please select at least one optimizer.")
if mode == "Benchmark Optimization" and not benchmark_func:
raise gr.Error("Please select a benchmark function.")
if mode == "ML Task Training" and not dataset:
raise gr.Error("Please select a dataset.")
config = {
'mode': 'benchmark' if mode == "Benchmark Optimization" else 'ml_task',
'benchmark_func': benchmark_func,
'optimizers': optimizers,
'dim': int(dim) if dim else 2,
'dataset': dataset,
'epochs': int(epochs) if epochs else 10,
'batch_size': int(batch_size) if batch_size else 32,
'lr': float(lr) if lr else 0.001,
'use_sa': use_sa if 'AzureSky' in optimizers else None,
'sa_temp': float(sa_temp) if 'AzureSky' in optimizers and use_sa else None,
'sa_cooling_rate': float(sa_cooling_rate) if 'AzureSky' in optimizers and use_sa else None,
'max_iter': 100
}
runner = Engine()
results = runner.run(config)
if config['mode'] == 'benchmark':
metrics_df = pd.DataFrame(results['metrics'], index=config['optimizers'])
return results['plot'], None, metrics_df, json.dumps(results, indent=2), "Study completed successfully."
else:
metrics_df = pd.DataFrame(results['metrics'], index=config['optimizers'])
return results['plot_acc'], results['plot_loss'], metrics_df, json.dumps(results, indent=2), "Study completed successfully."
def export_results(results_json):
with open("results.json", "w") as f:
f.write(results_json)
return "results.json"
def toggle_azure_settings(optimizers):
optimizers = [optimizers] if isinstance(optimizers, str) else optimizers or []
return gr.update(visible='AzureSky' in optimizers)
def toggle_tabs(mode):
return gr.update(visible=mode == 'Benchmark Optimization'), gr.update(visible=mode == 'ML Task Training')
with gr.Blocks(theme=gr.themes.Soft(), title="Nexa R&D Studio", css="""
.gr-button { margin-top: 10px; }
.gr-box { border-radius: 8px; }
.status-message { color: green; font-weight: bold; }
""") as app:
gr.Markdown("""
# Nexa R&D Studio
A visual research tool for comparing and evaluating optimizers on benchmark functions and ML tasks.
Select a mode, configure your study, and analyze results with interactive plots and metrics.
""")
with gr.Tabs():
with gr.TabItem("Study Configuration"):
mode = gr.Radio(
['Benchmark Optimization', 'ML Task Training'],
label='Study Mode',
value='Benchmark Optimization',
info='Choose between optimizing benchmark functions or training on ML datasets.'
)
with gr.Row():
with gr.Column():
optimizers = gr.CheckboxGroup(
['AzureSky', 'Adam', 'SGD', 'AdamW', 'RMSprop'],
label='Optimizers',
info='Select optimizers to compare. AzureSky includes a Simulated Annealing option.'
)
with gr.Accordion("AzureSky Ablation Settings", open=False, visible=False) as azure_settings:
use_sa = gr.Checkbox(
label='Enable Simulated Annealing (AzureSky)',
value=True,
info='Toggle Simulated Annealing for AzureSky optimizer.'
)
sa_temp = gr.Number(
label='Initial SA Temperature',
value=1.0,
minimum=0.1,
info='Controls exploration in Simulated Annealing (higher = more exploration).'
)
sa_cooling_rate = gr.Number(
label='SA Cooling Rate',
value=0.95,
minimum=0.1,
maximum=0.99,
info='Rate at which SA temperature decreases (closer to 1 = slower cooling).'
)
with gr.Column():
with gr.Group(visible=True) as benchmark_tab:
benchmark_func = gr.Dropdown(
['Himmelblau', 'Ackley', 'Adjiman', 'Brent'],
label='Benchmark Function',
info='Select a mathematical function to optimize.'
)
dim = gr.Number(
label='Dimensionality',
value=2,
minimum=2,
info='Number of dimensions for the benchmark function.'
)
with gr.Group(visible=False) as ml_task_tab:
dataset = gr.Dropdown(
['MNIST', 'CIFAR-10'],
label='Dataset',
info='Select a dataset for ML training.'
)
epochs = gr.Number(
label='Epochs',
value=10,
minimum=1,
info='Number of training epochs.'
)
batch_size = gr.Number(
label='Batch Size',
value=32,
minimum=1,
info='Number of samples per training batch.'
)
lr = gr.Number(
label='Learning Rate',
value=0.001,
minimum=0,
info='Learning rate for optimizers.'
)
run_button = gr.Button('Run Study', variant='primary')
with gr.TabItem("Results"):
status_message = gr.Markdown("Configure and run a study to view results.", elem_classes=["status-message"])
with gr.Row():
plot1 = gr.Plot(label='Main Plot (Benchmark or Accuracy)')
plot2 = gr.Plot(label='Loss Plot (ML Mode)')
metrics_df = gr.Dataframe(label='Metrics Table')
metrics_json = gr.JSON(label='Detailed Metrics')
export_button = gr.Button('Export Results as JSON')
export_file = gr.File(label='Download Results')
mode.change(
fn=toggle_tabs,
inputs=mode,
outputs=[benchmark_tab, ml_task_tab]
)
optimizers.change(
fn=toggle_azure_settings,
inputs=optimizers,
outputs=azure_settings
)
run_button.click(
fn=run_study,
inputs=[mode, benchmark_func, optimizers, dim, dataset, epochs, batch_size, lr, use_sa, sa_temp, sa_cooling_rate],
outputs=[plot1, plot2, metrics_df, metrics_json, status_message]
)
export_button.click(
fn=export_results,
inputs=metrics_json,
outputs=export_file
)
# Launch without share parameter for Hugging Face Spaces
app.launch()