Spaces:
Sleeping
Sleeping
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() |