File size: 2,272 Bytes
df1aa82
66e8b15
e7aeb95
df1aa82
59166be
66e8b15
 
6348ca6
 
 
 
 
 
 
 
 
 
66e8b15
 
 
bfb27a7
 
 
 
 
 
 
 
 
59166be
 
 
2ecd2bd
59166be
 
 
 
29d69db
59166be
2ecd2bd
 
66e8b15
 
6348ca6
66e8b15
 
 
59166be
66e8b15
6348ca6
 
 
 
 
 
 
66e8b15
59166be
 
66e8b15
59166be
df1aa82
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
import gradio as gr

from urllib.parse import urlparse

import subprocess
import threading

import sys

LOG_FILE = "output.log"

def read_logs():
    sys.stdout.flush()
    with open(LOG_FILE, "r") as f:
        return f.read()


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()}")


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()
        print("ML worker stopped")
        return "ML worker stopped"
    return "ML worker not started"


def start_ml_worker(url, api_key, hf_token):
    # 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}"


with gr.Blocks() as iface:
    with gr.Row():
        with gr.Column():
            url_input = gr.Textbox(label="Giskard Hub URL")
            api_key_input = gr.Textbox(label="Giskard Hub API Key", placeholder="gsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx")
            hf_token_input = gr.Textbox(label="Hugging Face Spaces Token")

        output = gr.Textbox(label="Status")
    with gr.Row():
        run_btn = gr.Button("Run")
        run_btn.click(start_ml_worker, [url_input, api_key_input, hf_token_input], output)

        stop_btn = gr.Button("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()