Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import gradio as gr | |
import pandas as pd | |
from apscheduler.schedulers.background import BackgroundScheduler | |
from gradio_leaderboard import ColumnFilter, Leaderboard, SelectColumns | |
from display.formatting import styled_error | |
from src.about import CITATION_BUTTON_LABEL, CITATION_BUTTON_TEXT, EVALUATION_QUEUE_TEXT, INTRODUCTION_TEXT, TITLE | |
from src.datamodel.data import F1Data | |
from src.display.css_html_js import custom_css | |
from src.display.utils import AutoEvalColumn, ModelType, fields | |
from src.envs import API, CODE_PROBLEMS_REPO, REPO_ID, RESULTS_REPO, SUBMISSIONS_REPO | |
from src.logger import get_logger | |
from src.populate import get_leaderboard_df | |
from src.submission.submit import add_new_solutions | |
from src.validation.validate import MAX_INPUT_LENGTH, MIN_INPUT_LENGTH, is_submission_file_valid, is_valid | |
logger = get_logger(__name__) | |
ENSURE_ALL_PRESENT = False # TODO: Switch to True. | |
SPLIT = "warmup" # TODO temp | |
def restart_space(): | |
API.restart_space(repo_id=REPO_ID) | |
lbdb = F1Data( | |
cp_ds_name=CODE_PROBLEMS_REPO, | |
sub_ds_name=SUBMISSIONS_REPO, | |
res_ds_name=RESULTS_REPO, | |
split=SPLIT, | |
) | |
leaderboard_df = get_leaderboard_df(RESULTS_REPO) | |
logger.info("Initialized LBDB") | |
def init_leaderboard(dataframe: pd.DataFrame): | |
if dataframe is None or dataframe.empty: | |
raise ValueError("Leaderboard DataFrame is empty or None.") | |
return Leaderboard( | |
value=dataframe, | |
datatype=[c.type for c in fields(AutoEvalColumn)], | |
select_columns=SelectColumns( | |
default_selection=[c.name for c in fields(AutoEvalColumn) if c.displayed_by_default], | |
cant_deselect=[c.name for c in fields(AutoEvalColumn) if c.never_hidden], | |
label="Select Columns to Display:", | |
), | |
search_columns=[AutoEvalColumn.system.name, AutoEvalColumn.system_type.name], | |
hide_columns=[c.name for c in fields(AutoEvalColumn) if c.hidden], | |
filter_columns=[ | |
ColumnFilter(AutoEvalColumn.system_type.name, type="checkboxgroup", label="Model types"), | |
], | |
bool_checkboxgroup_label="Hide models", | |
interactive=False, | |
) | |
demo = gr.Blocks(css=custom_css) | |
with demo: | |
gr.Image( | |
"assets/banner.png", | |
interactive=False, | |
show_label=False, | |
show_download_button=False, | |
container=False, | |
) | |
gr.HTML( | |
""" | |
<style> | |
body { | |
background-color: #121212; | |
color: white; | |
margin: 0; /* Reset browser default */ | |
} | |
/* Outer container margin & spacing */ | |
.gradio-container { | |
max-width: 1100px; | |
margin: 2rem auto; /* top/bottom spacing + horizontal centering */ | |
padding: 2rem; /* inner spacing */ | |
background-color: rgba(0, 0, 0, 0.6); /* optional: semi-transparent panel */ | |
border-radius: 12px; /* rounded corners */ | |
} | |
</style> | |
""" | |
) | |
gr.HTML(TITLE) | |
gr.Markdown(INTRODUCTION_TEXT, elem_classes="markdown-text") | |
with gr.Tabs(elem_classes="tab-buttons") as tabs: | |
with gr.TabItem("π FormulaOne Leaderboard", elem_id="formulaone-leaderboar-tab-table", id=0): | |
leaderboard = init_leaderboard(leaderboard_df) | |
with gr.TabItem("π Submit here! ", elem_id="llm-benchmark-tab-table", id=2): | |
logger.info("Tab submission") | |
with gr.Column(): | |
with gr.Row(): | |
gr.Markdown(EVALUATION_QUEUE_TEXT, elem_classes="markdown-text") | |
with gr.Row(): | |
gr.Markdown("# βοΈβ¨ Submit your solutions here!", elem_classes="markdown-text") | |
with gr.Row(): | |
with gr.Column(): | |
system_name_textbox = gr.Textbox(label=AutoEvalColumn.system.name) | |
org_textbox = gr.Textbox(label=AutoEvalColumn.organization.name) | |
sys_type_dropdown = gr.Dropdown( | |
choices=[t.to_str(" ") for t in ModelType], | |
label=AutoEvalColumn.system_type.name, | |
multiselect=False, | |
value=ModelType.LLM.to_str(" "), | |
interactive=True, | |
) | |
submission_file = gr.File(label="JSONL solutions file", file_types=[".jsonl"]) | |
logger.info("Submit button") | |
submit_button = gr.Button("Submit") | |
submission_result = gr.Markdown() | |
def add_solution_cbk( | |
system_name: str, | |
org: str, | |
sys_type: str, | |
submission_path: str, | |
): | |
try: | |
# Validating the submission file. | |
if len(submission_path) == 0: | |
return styled_error("Please upload JSONL submission file.") | |
if not is_submission_file_valid(submission_path): | |
return styled_error("Failed to read JSONL submission file. Please try again later.") | |
# Validating all user-supplied arguments. | |
for val, val_name in [ | |
(system_name, "System name"), | |
(org, "Organisation name"), | |
(sys_type, "System type"), | |
]: | |
if len(val) == 0: | |
return styled_error(f"Please fill in the '{val_name}' field.") | |
if not is_valid(val): | |
return styled_error( | |
f"{val_name} is invalid! Must only contain characters [a-zA-Z0-9], spaces, " | |
+ "or the special characters '-' and '.', and be of length between " | |
+ f"{MIN_INPUT_LENGTH} and {MAX_INPUT_LENGTH}." | |
) | |
except Exception: | |
logger.warning("Failed to process user submission", exc_info=True) | |
return styled_error("An error occurred. Please try again later.") # Intentionally vague. | |
return add_new_solutions( | |
lbdb, | |
system_name, | |
org, | |
sys_type, | |
submission_path, | |
ensure_all_present=ENSURE_ALL_PRESENT, | |
) | |
submit_button.click( | |
add_solution_cbk, | |
[ | |
system_name_textbox, | |
org_textbox, | |
sys_type_dropdown, | |
submission_file, | |
], | |
submission_result, | |
) | |
with gr.Row(): | |
logger.info("Citation") | |
with gr.Accordion(CITATION_BUTTON_LABEL, open=False): | |
gr.Code( | |
value=CITATION_BUTTON_TEXT.strip(), | |
elem_id="citation-block", | |
) | |
logger.info("Scheduler") | |
scheduler = BackgroundScheduler() | |
scheduler.add_job(restart_space, "interval", seconds=1800) | |
scheduler.start() | |
logger.info("Launch") | |
demo.queue(default_concurrency_limit=40).launch() | |
logger.info("Done") | |