Spaces:
Sleeping
Sleeping
import psutil | |
import torch | |
from h2o_wave import Q, data, ui | |
from llm_studio.app_utils.config import default_cfg | |
from llm_studio.app_utils.sections.common import clean_dashboard | |
from llm_studio.app_utils.utils import ( | |
get_datasets, | |
get_experiments, | |
get_gpu_usage, | |
get_single_gpu_usage, | |
) | |
from llm_studio.app_utils.wave_utils import ui_table_from_df, wave_theme | |
from llm_studio.src.utils.export_utils import get_size_str | |
async def home(q: Q) -> None: | |
await clean_dashboard(q, mode="home") | |
q.client["nav/active"] = "home" | |
experiments = get_experiments(q) | |
hdd = psutil.disk_usage(default_cfg.llm_studio_workdir) | |
q.page["home/disk_usage"] = ui.tall_gauge_stat_card( | |
box=ui.box("content", order=2, width="20%" if len(experiments) > 0 else "30%"), | |
title="Disk usage", | |
value=f"{hdd.percent:.2f} %", | |
aux_value=f"{get_size_str(hdd.used, sig_figs=1)} /\ | |
{get_size_str(hdd.total, sig_figs=1)}", | |
plot_color=wave_theme.get_primary_color(q), | |
progress=hdd.percent / 100, | |
) | |
if len(experiments) > 0: | |
num_finished = len(experiments[experiments["status"] == "finished"]) | |
num_running_queued = len( | |
experiments[experiments["status"].isin(["queued", "running"])] | |
) | |
num_failed_stopped = len( | |
experiments[experiments["status"].isin(["failed", "stopped"])] | |
) | |
q.page["home/experiments_stats"] = ui.form_card( | |
box=ui.box("content", order=1, width="40%"), | |
title="Experiments", | |
items=[ | |
ui.visualization( | |
plot=ui.plot( | |
[ui.mark(type="interval", x="=status", y="=count", y_min=0)] | |
), | |
data=data( | |
fields="status count", | |
rows=[ | |
("finished", num_finished), | |
("queued + running", num_running_queued), | |
("failed + stopped", num_failed_stopped), | |
], | |
pack=True, | |
), | |
) | |
], | |
) | |
stats = [] | |
if torch.cuda.is_available(): | |
stats.append(ui.stat(label="Current GPU load", value=f"{get_gpu_usage():.1f}%")) | |
stats += [ | |
ui.stat(label="Current CPU load", value=f"{psutil.cpu_percent()}%"), | |
ui.stat( | |
label="Memory usage", | |
value=f"{get_size_str(psutil.virtual_memory().used, sig_figs=1)} /\ | |
{get_size_str(psutil.virtual_memory().total, sig_figs=1)}", | |
), | |
] | |
q.page["home/compute_stats"] = ui.tall_stats_card( | |
box=ui.box("content", order=1, width="40%" if len(experiments) > 0 else "70%"), | |
items=stats, | |
) | |
if torch.cuda.is_available(): | |
q.page["home/gpu_stats"] = ui.form_card( | |
box=ui.box("expander", width="100%"), | |
items=[ | |
ui.expander( | |
name="expander", | |
label="Detailed GPU stats", | |
items=get_single_gpu_usage( | |
highlight=wave_theme.get_primary_color(q) | |
), | |
expanded=True, | |
) | |
], | |
) | |
q.client.delete_cards.add("home/gpu_stats") | |
q.client.delete_cards.add("home/compute_stats") | |
q.client.delete_cards.add("home/disk_usage") | |
q.client.delete_cards.add("home/experiments_stats") | |
q.client["dataset/list/df_datasets"] = get_datasets(q) | |
df_viz = q.client["dataset/list/df_datasets"].copy() | |
df_viz = df_viz[df_viz.columns.intersection(["name", "problem type"])] | |
if torch.cuda.is_available(): | |
table_height = "max(calc(100vh - 660px), 400px)" | |
else: | |
table_height = "max(calc(100vh - 550px), 400px)" | |
q.page["dataset/list"] = ui.form_card( | |
box="datasets", | |
items=[ | |
ui.inline( | |
[ | |
ui.button( | |
name="dataset/list", icon="Database", label="", primary=True | |
), | |
ui.label("List of Datasets"), | |
] | |
), | |
ui_table_from_df( | |
q=q, | |
df=df_viz, | |
name="dataset/list/table", | |
sortables=[], | |
searchables=[], | |
min_widths={"name": "240", "problem type": "130"}, | |
link_col="name", | |
height=table_height, | |
), | |
], | |
) | |
q.client.delete_cards.add("dataset/list") | |
q.client["experiment/list/df_experiments"] = get_experiments(q, status="finished") | |
df_viz = q.client["experiment/list/df_experiments"].copy() | |
df_viz = df_viz.rename(columns={"process_id": "pid", "config_file": "problem type"}) | |
df_viz = df_viz[ | |
df_viz.columns.intersection( | |
["name", "dataset", "problem type", "metric", "val metric"] | |
) | |
] | |
q.page["experiment/list"] = ui.form_card( | |
box="experiments", | |
items=[ | |
ui.inline( | |
[ | |
ui.button( | |
name="experiment/list", | |
icon="FlameSolid", | |
label="", | |
primary=True, | |
), | |
ui.label("List of Experiments"), | |
] | |
), | |
ui_table_from_df( | |
q=q, | |
df=df_viz, | |
name="experiment/list/table", | |
sortables=["val metric"], | |
numerics=["val metric"], | |
min_widths={ | |
# "id": "50", | |
"name": "115", | |
"dataset": "100", | |
"problem type": "120", | |
"metric": "70", | |
"val metric": "85", | |
}, | |
link_col="name", | |
height=table_height, | |
), | |
], | |
) | |