giskard-evaluator / app_debug.py
inoki-giskard's picture
Polish wordings for job interruption
e71d7e4
from os import listdir
from os.path import isfile, join
import html
import gradio as gr
import os
import pipe
from io_utils import get_logs_file
from app_env import HF_WRITE_TOKEN
LOG_PATH = "./tmp"
CONFIG_PATH = "./cicd/configs/submitted/"
MAX_FILES_NUM = 20
def get_accordions_of_files(path, files):
components = [None for _ in range(0, MAX_FILES_NUM)]
for i in range(0, len(files)):
if i >= MAX_FILES_NUM:
break
with open(join(path, files[i]), "r") as f:
components[i] = f.read()
return components
def get_accordions_of_log_files():
log_files = [
f for f in listdir(LOG_PATH) if isfile(join(LOG_PATH, f)) and f.endswith("_log")
]
return get_accordions_of_files(LOG_PATH, log_files)
def get_accordions_of_config_files():
config_files = [
f
for f in listdir(CONFIG_PATH)
if isfile(join(CONFIG_PATH, f)) and f.endswith(".yaml")
]
return get_accordions_of_files(CONFIG_PATH, config_files)
def get_config_files():
config_files = [
join(CONFIG_PATH, f)
for f in listdir(CONFIG_PATH)
if isfile(join(CONFIG_PATH, f)) and f.endswith(".yaml")
]
return config_files
def get_log_files():
return [
join(LOG_PATH, f)
for f in listdir(LOG_PATH)
if isfile(join(LOG_PATH, f)) and f.endswith("log")
]
def get_jobs_info_in_queue():
return [
f"⌛️job id {html.escape(job[0])}: {html.escape(job[2])}<br/>"
for job in pipe.jobs
]
def get_queue_status():
if len(pipe.jobs) > 0 or pipe.current is not None:
current = pipe.current
if current is None:
current = "None"
return f'<div style="padding-top: 5%">Current job: {html.escape(current)} <br/> Job queue: <br/> {"".join(get_jobs_info_in_queue())}</div>'
else:
return '<div style="padding-top: 5%">No jobs waiting, please submit an evaluation task from Text-Classification tab.</div>'
def can_write_this_space(hf_token):
# Only the user owning `HF_WRITE_TOKEN` is able to manage this space
if hf_token == os.getenv(HF_WRITE_TOKEN, ""):
return True
return False
def stop_current_job(hf_token):
if not can_write_this_space(hf_token):
gr.Warning(
"You cannot stop the current job, "
"because your token does not match `HF_WRITE_TOKEN` in this space."
)
return
task_uuid = pipe.current
if not task_uuid:
gr.Warning("No job in progress")
return
# Interrupt and stop the task
pipe.current = None
gr.Info(f"Job {task_uuid} interrupted by admin.")
def get_demo():
if not os.path.exists(CONFIG_PATH):
os.makedirs(CONFIG_PATH)
with gr.Row():
gr.HTML(
value=get_queue_status,
every=5,
)
with gr.Accordion(label="Admin", open=False):
with gr.Row():
hf_write_token_input = gr.Textbox(
label="HF write token",
type="password",
placeholder="Please input HF_WRITE_TOKEN configured in the current space",
)
with gr.Row():
stop_job_btn = gr.Button(value="Stop current job", variant="stop")
stop_job_btn.click(stop_current_job, inputs=hf_write_token_input)
with gr.Accordion(label="Log Files", open=True):
with gr.Row():
gr.Textbox(
value=get_logs_file,
every=0.5,
lines=10,
visible=True,
label="Current Log File",
)
with gr.Row():
gr.Files(value=get_log_files, label="Log Files", every=10)
with gr.Accordion(label="Config Files", open=False):
gr.Files(value=get_config_files, label="Config Files", every=10)