File size: 3,049 Bytes
df1aa82 66e8b15 e7aeb95 df1aa82 59166be 66e8b15 6348ca6 e05b343 7a1d097 6348ca6 28e9187 6348ca6 66e8b15 bfb27a7 59166be 2ecd2bd 59166be 29d69db 59166be 2ecd2bd 629a811 66e8b15 6348ca6 66e8b15 59166be 629a811 66e8b15 6348ca6 e05b343 6348ca6 66e8b15 59166be 66e8b15 59166be df1aa82 69b1728 6348ca6 69b1728 6348ca6 7a1d097 e05b343 97e37df 6348ca6 69b1728 6348ca6 69b1728 6348ca6 bfb27a7 6348ca6 df1aa82 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
import gradio as gr
from urllib.parse import urlparse
import subprocess
import threading
import sys
import os
from giskard.settings import settings
LOG_FILE = "output.log"
def read_logs():
sys.stdout.flush()
try:
with open(LOG_FILE, "r") as f:
return f.read()
except Exception:
return "ML worker not running"
previous_url = ""
ml_worker = None
def read_status():
if ml_worker:
return f"ML worker serving {previous_url}"
elif len(previous_url):
return f"ML worker exited for {previous_url}"
else:
return "ML worker not started"
def run_ml_worker(url, api_key, hf_token):
global ml_worker, previous_url
previous_url = url
ml_worker = subprocess.Popen(
[
"giskard", "worker", "start",
"-u", f"{url}", "-k", f"{api_key}", "-t", f"{hf_token}"
],
stdout=open(LOG_FILE, "w"), stderr=subprocess.STDOUT
)
args = ml_worker.args
print(f"Process {args} exited with {ml_worker.wait()}")
ml_worker = None
def stop_ml_worker():
global ml_worker, previous_url
if ml_worker is not None:
print(f"Stopping ML worker for {previous_url}")
ml_worker.terminate()
ml_worker = None
print("ML worker stopped")
return "ML worker stopped"
return "ML worker not started"
def start_ml_worker(url, api_key, hf_token):
if not url or len(url) < 1:
return "Please provide URL of Giskard"
# Always run an external ML worker
stop_ml_worker()
print(f"Starting ML worker for {url}")
thread = threading.Thread(target=run_ml_worker, args=(url, api_key, hf_token))
thread.start()
return f"ML worker running for {url}"
theme = gr.themes.Soft(
primary_hue="green",
)
with gr.Blocks(theme=theme) as iface:
with gr.Row():
with gr.Column():
url_input = gr.Textbox(
label="Giskard Hub URL",
value=f"htts://{os.environ.get('SPACE_HOST')}"
if os.environ.get("SPACE_HOST")
else f"http://{settings.host}:{settings.ws_port}",
)
api_key_input = gr.Textbox(
label="Giskard Hub API Key",
value=os.environ.get("GSK_API_KEY"),
placeholder="gsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)
hf_token_input = gr.Textbox(
label="Hugging Face Spaces Token",
info="if using a private Giskard Hub on Hugging Face Spaces",
)
output = gr.Textbox(label="Status")
with gr.Row():
run_btn = gr.Button("Run", variant="primary")
run_btn.click(start_ml_worker, [url_input, api_key_input, hf_token_input], output)
stop_btn = gr.Button("Stop", variant="stop")
stop_btn.click(stop_ml_worker, None, output)
logs = gr.Textbox(label="Giskard ML worker log:")
iface.load(read_logs, None, logs, every=0.5)
iface.load(read_status, None, output, every=5)
iface.queue()
iface.launch()
|