siro1's picture
siro1 HF Staff
Feat: stuff works and looks human-ish?
1cf1270
raw
history blame
4.08 kB
import gradio as gr
import asyncio
import time
import threading
from src.retrieve_data import populate_lb_data
leaderboard_data = {}
async def fetch_data():
"""Fetch the leaderboard data asynchronously"""
global leaderboard_data
try:
data = await populate_lb_data()
leaderboard_data = data
return True
except Exception as e:
print(f"Error fetching data: {e}")
return False
def background_update():
"""Background thread function to update data every 5 minutes"""
while True:
print("Updating leaderboard data...")
asyncio.run(fetch_data())
time.sleep(300) # 5 minutes
def create_table_for_lb(lb_name, gpu_name):
"""Create a formatted table for a specific leaderboard and GPU"""
if (
not lb_name
or not gpu_name
or lb_name not in leaderboard_data
or gpu_name not in leaderboard_data[lb_name]
):
return gr.Dataframe(
headers=["Rank", "Submission Name", "User ID", "Score", "Date"],
datatype=["number", "str", "str", "str", "str"],
value=[],
interactive=False,
)
lb_data = leaderboard_data[lb_name][gpu_name]
headers = ["Rank", "Submission Name", "User ID", "Score", "Date"]
rows = []
for i, result in enumerate(lb_data.results, 1):
rows.append(
[
i,
result.submission_name,
result.user_id,
f"{float(result.submission_score):.4f}",
result.submission_time,
]
)
return gr.Dataframe(
headers=headers,
datatype=["number", "str", "str", "str", "str"],
value=rows,
interactive=False,
)
def refresh_ui():
"""Force refresh the UI with latest data"""
asyncio.run(fetch_data())
return "Data refreshed!", get_lb_names(), [], None
def get_lb_names():
"""Get list of available leaderboard names"""
return list(leaderboard_data.keys())
def get_gpu_names(lb_name):
"""Get list of available GPUs for a specific leaderboard"""
if not lb_name or lb_name not in leaderboard_data:
return []
return list(leaderboard_data[lb_name].keys())
def on_lb_change(lb_name):
gpu_choices = get_gpu_names(lb_name)
return (
gr.update(choices=gpu_choices, value=gpu_choices[0] if gpu_choices else None),
update_table(lb_name, gpu_choices[0]),
)
def update_table(lb_name, gpu_name):
"""Update the table based on selected leaderboard and GPU"""
if not lb_name or not gpu_name:
return None
return create_table_for_lb(lb_name, gpu_name)
def build_ui():
with gr.Blocks(title="ML Leaderboards", theme=gr.themes.Soft()) as app:
gr.Markdown("# 🍿 KernelBot Leaderboard 🍿")
asyncio.run(fetch_data())
with gr.Row():
with gr.Column(scale=1):
lb_dropdown = gr.Dropdown(
choices=get_lb_names(),
label="Select Leaderboard",
interactive=True,
)
gpu_dropdown = gr.Dropdown(
choices=get_gpu_names(lb_dropdown.value),
label="Select GPU",
interactive=True,
)
with gr.Row():
results_table = gr.Dataframe(
headers=["Rank", "Submission Name", "User ID", "Score", "Date"],
datatype=["number", "str", "str", "str", "str"],
interactive=False,
label="Results",
)
lb_dropdown.change(
fn=on_lb_change,
inputs=[lb_dropdown],
outputs=[gpu_dropdown, results_table],
)
gpu_dropdown.change(
fn=update_table, inputs=[lb_dropdown, gpu_dropdown], outputs=results_table
)
return app
if __name__ == "__main__":
update_thread = threading.Thread(target=background_update, daemon=True)
update_thread.start()
app = build_ui()
app.launch()