| 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["experiment/list/mode"] = "train" |
|
|
| 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, mode=q.client["experiment/list/mode"], 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={ |
| |
| "name": "115", |
| "dataset": "100", |
| "problem type": "120", |
| "metric": "70", |
| "val metric": "85", |
| }, |
| link_col="name", |
| height=table_height, |
| ), |
| ], |
| ) |
|
|