math-under-llm / ui /tab_database.py
Alex W.
add 2 UI tabs.
357d754
raw
history blame
7.21 kB
# ui/tab_database.py
"""
Tab4๏ผšๆ•ฐๆฎๅบ“ๆต่งˆ
- ๆŸฅ็œ‹ๅทฒๅˆ†ๆžๆจกๅž‹ๅˆ—่กจ
- ๆŸฅ็œ‹ๆŸๆจกๅž‹็š„้€ๅฑ‚ๅŽŸๅง‹ๆ•ฐๆฎ
- ๆ•ฐๆฎๅบ“็ปŸ่ฎกไฟกๆฏ
"""
import gradio as gr
import pandas as pd
from db.schema import init_db, get_db_stats
from db.reader import (
get_analyzed_models,
get_model_summary,
get_layer_metrics,
get_resume_status,
)
def load_db_stats() -> str:
"""่Žทๅ–ๆ•ฐๆฎๅบ“็ปŸ่ฎกไฟกๆฏ"""
conn = init_db()
stats = get_db_stats(conn)
return (
f"๐Ÿ“Š ๆ•ฐๆฎๅบ“็ปŸ่ฎก\n"
f"{'โ”€'*40}\n"
f" ๆจกๅž‹ๆ•ฐ๏ผš {stats.get('models', 0)}\n"
f" ็ป„ไปถๆ•ฐ๏ผš {stats.get('components', 0)}\n"
f" ๅฑ‚ๅคด่ฎฐๅฝ•ๆ•ฐ๏ผš {stats.get('layer_head_metrics', 0)}\n"
f" ๆฑ‡ๆ€ป่กŒๆ•ฐ๏ผš {stats.get('model_summary', 0)}\n"
f" ๆ•ฐๆฎๅบ“ๅคงๅฐ๏ผš {stats.get('db_size_mb', 0)} MB\n"
)
def load_model_list() -> pd.DataFrame:
"""ๅŠ ่ฝฝๅทฒๅˆ†ๆžๆจกๅž‹ๅˆ—่กจ"""
conn = init_db()
df = get_analyzed_models(conn)
if df.empty:
return pd.DataFrame(
columns=["model_id", "model_type", "analyzed_at",
"analyze_sec", "n_components", "total_layers"]
)
return df
def load_model_detail(model_id: str) -> tuple[pd.DataFrame, pd.DataFrame, str]:
"""
ๅŠ ่ฝฝๆจกๅž‹่ฏฆๆƒ…
่ฟ”ๅ›ž (summary_df, ๆ–ญ็‚น็ปญไผ ็Šถๆ€ๆ–‡ๆœฌ)
"""
if not model_id.strip():
return pd.DataFrame(), pd.DataFrame(), "่ฏท่พ“ๅ…ฅๆจกๅž‹ ID"
conn = init_db()
# ๆฑ‡ๆ€ป็ปŸ่ฎก
summary_df = get_model_summary(conn, model_id.strip())
# ๆ–ญ็‚น็ปญไผ ็Šถๆ€๏ผˆๆŒ‰ๅ‰็ผ€๏ผ‰
status_lines = [f"๐Ÿ“ ๆ–ญ็‚น็ปญไผ ็Šถๆ€๏ผš{model_id}\n{'โ”€'*50}\n"]
if not summary_df.empty:
for pfx in summary_df["prefix"].unique():
rs = get_resume_status(conn, model_id.strip(), pfx)
status_lines.append(
f" [{pfx}]\n"
f" ๅทฒๅฎŒๆˆๅฑ‚ๆ•ฐ๏ผš{rs['total_done']}\n"
f" ๅฑ‚ๅท๏ผš{sorted(rs['done_layers'])}\n"
)
else:
status_lines.append(" ๆš‚ๆ— ๆ•ฐๆฎ\n")
return summary_df, "".join(status_lines)
def load_layer_data(
model_id: str,
prefix: str,
layer_type: str,
start_layer: int,
end_layer: int,
) -> tuple[pd.DataFrame, str]:
"""ๅŠ ่ฝฝ้€ๅคดๅŽŸๅง‹ๆ•ฐๆฎ"""
if not model_id.strip():
return pd.DataFrame(), "่ฏท่พ“ๅ…ฅๆจกๅž‹ ID"
conn = init_db()
lt = layer_type if layer_type != "all" else None
pfx = prefix.strip() or None
df = get_layer_metrics(
conn,
model_id = model_id.strip(),
prefix = pfx,
layer_type = lt,
start_layer = int(start_layer),
end_layer = int(end_layer),
)
if df.empty:
return pd.DataFrame(), f"โš ๏ธ ๆ— ๆ•ฐๆฎ๏ผšmodel={model_id} prefix={pfx} layer_type={lt}"
status = (
f"โœ… {len(df)} ๆก่ฎฐๅฝ• "
f"| ๅฑ‚ {df['layer'].min()}~{df['layer'].max()} "
f"| prefix={pfx or 'ๅ…จ้ƒจ'}"
)
return df, status
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# Tab4 UI
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def build_tab_database():
with gr.Tab("๐Ÿ—„๏ธ ๆ•ฐๆฎๅบ“"):
gr.Markdown("## ๆ•ฐๆฎๅบ“ๆต่งˆ \nๆŸฅ็œ‹ๅทฒๅˆ†ๆžๆจกๅž‹็š„ๅŽŸๅง‹ๆ•ฐๆฎๅ’Œๆฑ‡ๆ€ป็ปŸ่ฎกใ€‚")
# โ”€โ”€ ๆ•ฐๆฎๅบ“็ปŸ่ฎก โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
with gr.Row():
stats_text = gr.Textbox(
label="ๆ•ฐๆฎๅบ“็ปŸ่ฎก",
value="็‚นๅ‡ปๅˆทๆ–ฐ",
lines=7,
interactive=False,
scale=2,
)
refresh_stats_btn = gr.Button(
"๐Ÿ”„ ๅˆทๆ–ฐ็ปŸ่ฎก", scale=1, variant="secondary"
)
refresh_stats_btn.click(
fn=load_db_stats,
outputs=stats_text,
)
gr.Markdown("---")
# โ”€โ”€ ๅทฒๅˆ†ๆžๆจกๅž‹ๅˆ—่กจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
gr.Markdown("### ๅทฒๅˆ†ๆžๆจกๅž‹")
with gr.Row():
refresh_models_btn = gr.Button(
"๐Ÿ”„ ๅˆทๆ–ฐๆจกๅž‹ๅˆ—่กจ", variant="secondary"
)
models_table = gr.Dataframe(
label="ๅทฒๅˆ†ๆžๆจกๅž‹",
interactive=False,
)
refresh_models_btn.click(
fn=load_model_list,
outputs=models_table,
)
gr.Markdown("---")
# โ”€โ”€ ๆจกๅž‹่ฏฆๆƒ… โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
gr.Markdown("### ๆจกๅž‹่ฏฆๆƒ… & ๆ–ญ็‚น็ปญไผ ็Šถๆ€")
with gr.Row():
detail_model_id = gr.Textbox(
label="ๆจกๅž‹ ID",
placeholder="google/gemma-4-e2b",
scale=3,
)
load_detail_btn = gr.Button(
"๐Ÿ“‹ ๆŸฅ็œ‹่ฏฆๆƒ…", variant="secondary", scale=1
)
resume_status_text = gr.Textbox(
label="ๆ–ญ็‚น็ปญไผ ็Šถๆ€",
lines=8,
interactive=False,
)
summary_table = gr.Dataframe(
label="ๆจกๅž‹ๆฑ‡ๆ€ป็ปŸ่ฎก๏ผˆall/standard/global ไธ‰่กŒ๏ผ‰",
interactive=False,
)
load_detail_btn.click(
fn=load_model_detail,
inputs=[detail_model_id],
outputs=[summary_table, resume_status_text],
)
gr.Markdown("---")
# โ”€โ”€ ้€ๅคดๅŽŸๅง‹ๆ•ฐๆฎ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
gr.Markdown("### ้€ๅคดๅŽŸๅง‹ๆ•ฐๆฎๆŸฅ่ฏข")
with gr.Row():
raw_model_id = gr.Textbox(
label="ๆจกๅž‹ ID",
placeholder="google/gemma-4-e2b",
scale=2,
)
raw_prefix = gr.Textbox(
label="็ป„ไปถๅ‰็ผ€๏ผˆ็•™็ฉบ=ๅ…จ้ƒจ๏ผ‰",
placeholder="model.language_model.",
scale=2,
)
raw_layer_type = gr.Dropdown(
label="ๅฑ‚็ฑปๅž‹",
choices=["all", "standard", "global"],
value="all",
scale=1,
)
with gr.Row():
raw_start = gr.Number(
label="่ตทๅง‹ๅฑ‚ๅท", value=0, precision=0, scale=1
)
raw_end = gr.Number(
label="็ป“ๆŸๅฑ‚ๅท", value=10, precision=0, scale=1
)
load_raw_btn = gr.Button(
"๐Ÿ” ๆŸฅ่ฏขๆ•ฐๆฎ", variant="secondary", scale=1
)
raw_status = gr.Textbox(
label="ๆŸฅ่ฏข็Šถๆ€", lines=1, interactive=False
)
raw_table = gr.Dataframe(
label="้€ๅคดๅŽŸๅง‹ๆ•ฐๆฎ",
interactive=False,
wrap=False,
)
load_raw_btn.click(
fn=load_layer_data,
inputs=[raw_model_id, raw_prefix, raw_layer_type,
raw_start, raw_end],
outputs=[raw_table, raw_status],
)