Alina Lozovskaya
Update process status and config
25580aa
raw
history blame
6.61 kB
import os
import sys
import time
import gradio as gr
from pathlib import Path
from loguru import logger
from huggingface_hub import whoami
from yourbench_space.config import generate_and_save_config
from yourbench_space.utils import (
CONFIG_PATH,
UPLOAD_DIRECTORY,
SubprocessManager,
save_files,
STAGES,
)
project_description = """
# YourBench 🚀
**Dynamic Benchmark Generation for Language Models**
Quickly create zero-shot benchmarks from your documents – keeping models accurate and adaptable
- 📖 [FAQ](#)
- 💻 [GitHub](https://github.com/huggingface/yourbench/tree/v0.2-alpha-space)
"""
UPLOAD_DIRECTORY.mkdir(parents=True, exist_ok=True)
logger.remove()
logger.add(sys.stderr, level="INFO")
command = ["uv", "run", "yourbench", f"--config={CONFIG_PATH}"]
manager = SubprocessManager(command)
docs_path = Path(__file__).parent / "docs.md"
citation_content = (
docs_path.read_text().split("# Citation")[-1].strip()
if docs_path.exists()
else "# Citation\n\nDocumentation file not found."
)
def generate_and_return(hf_org, hf_prefix):
generate_and_save_config(hf_org, hf_prefix)
for _ in range(5):
if CONFIG_PATH.exists():
break
time.sleep(0.5)
return (
(
"✅ Config saved!",
gr.update(value=str(CONFIG_PATH), visible=True, interactive=True),
)
if CONFIG_PATH.exists()
else (
"❌ Config generation failed.",
gr.update(visible=False, interactive=False),
)
)
def update_process_status():
"""Update process status and include exit details if process has terminated"""
is_running = manager.is_running()
if not is_running:
exit_code, exit_reason = manager.get_exit_details()
status_text = f"Process Status: Stopped - {exit_reason}, exit code - {exit_code}" if exit_reason else "Process Status: Stopped"
return gr.update(value=False, label=status_text)
return gr.update(value=True, label="Process Status: Running")
def prepare_task(oauth_token: gr.OAuthToken | None, hf_dataset_prefix: str, _=None):
new_env = os.environ.copy()
if oauth_token:
new_env["HF_TOKEN"] = oauth_token.token
new_env["DATASET_PREFIX"] = hf_dataset_prefix
manager.start_process(custom_env=new_env)
def update_hf_org_dropdown(oauth_token: gr.OAuthToken | None):
if oauth_token is None:
return gr.Dropdown([], label="Organization")
try:
user_info = whoami(oauth_token.token)
org_names = [org["name"] for org in user_info.get("orgs", [])]
user_name = user_info.get("name", "Unknown User")
org_names.insert(0, user_name)
return gr.Dropdown(org_names, value=user_name, label="Organization")
except Exception as e:
return gr.Dropdown([], label="Organization")
def switch_to_run_generation_tab():
return gr.Tabs(selected=1)
def enable_button(files):
return gr.update(interactive=bool(files))
with gr.Blocks(theme=gr.themes.Default()) as app:
gr.Markdown(project_description)
with gr.Row():
gr.Markdown("## ⚙️ YourBench Setup", elem_id="setup-title")
with gr.Column(scale=0, min_width=150):
login_btn = gr.LoginButton()
with gr.Tabs() as tabs:
with gr.Tab("Setup", id=0):
with gr.Row():
with gr.Accordion("Hugging Face Settings"):
hf_org_dropdown = gr.Dropdown(
choices=[], label="Organization", allow_custom_value=True
)
app.load(
update_hf_org_dropdown, inputs=None, outputs=hf_org_dropdown
)
hf_dataset_prefix = gr.Textbox(
label="Dataset Prefix",
value="yourbench",
info="Prefix applied to all datasets",
)
with gr.Accordion("Upload documents"):
file_input = gr.File(
label="Upload text files",
file_count="multiple",
file_types=[".txt", ".md", ".html", ".pdf"],
)
output = gr.Textbox(label="Log")
file_input.upload(
lambda files: save_files([file.name for file in files]),
file_input,
output,
)
preview_button = gr.Button("Generate New Config", interactive=False)
log_message = gr.Textbox(label="Log Message", visible=True)
download_button = gr.File(
label="Download Config", visible=False, interactive=False
)
file_input.change(enable_button, inputs=file_input, outputs=preview_button)
preview_button.click(
generate_and_return,
inputs=[hf_org_dropdown, hf_dataset_prefix],
outputs=[log_message, download_button],
)
preview_button.click(
switch_to_run_generation_tab,
inputs=None,
outputs=tabs,
)
with gr.Tab("Run Generation", id=1):
with gr.Row():
with gr.Accordion("Log Output", open=True):
log_output = gr.Code(language=None, lines=20, interactive=False)
with gr.Accordion("Stages", open=True):
stages_table = gr.CheckboxGroup(
choices=STAGES,
value=[],
label="Pipeline Stages Completed",
interactive=False,
)
log_timer = gr.Timer(1.0, active=True)
log_timer.tick(
manager.read_and_get_output, outputs=[log_output, stages_table]
)
with gr.Row():
process_status = gr.Checkbox(label="Process Status", interactive=False)
status_timer = gr.Timer(1.0, active=True)
status_timer.tick(update_process_status, outputs=process_status)
with gr.Row():
start_button = gr.Button("Start Task")
start_button.click(prepare_task, inputs=[login_btn, hf_dataset_prefix])
stop_button = gr.Button("Stop Task")
stop_button.click(manager.stop_process)
kill_button = gr.Button("Kill Task")
kill_button.click(manager.kill_process)
app.launch(allowed_paths=["/app"])