Update app.py
Browse files
app.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# --- START OF FULLY CORRECTED FILE app.py ---
|
| 2 |
|
| 3 |
import gradio as gr
|
| 4 |
import pandas as pd
|
|
@@ -8,7 +8,6 @@ from datasets import load_dataset # Import the datasets library
|
|
| 8 |
|
| 9 |
# --- Constants ---
|
| 10 |
PARAM_CHOICES = ['< 1B', '1B', '5B', '12B', '32B', '64B', '128B', '256B', '> 500B']
|
| 11 |
-
# --- NEW: Define the default value using indices ---
|
| 12 |
PARAM_CHOICES_DEFAULT_INDICES = [0, len(PARAM_CHOICES) - 1]
|
| 13 |
|
| 14 |
HF_DATASET_ID = "evijit/orgstats_daily_data"
|
|
@@ -63,7 +62,6 @@ def make_treemap_data(df, count_by, top_k=25, tag_filter=None, pipeline_filter=N
|
|
| 63 |
else: print(f"Warning: 'pipeline_tag' column not found for filtering.")
|
| 64 |
if param_range:
|
| 65 |
min_params, max_params = get_param_range_values(param_range)
|
| 66 |
-
# --- MODIFIED: Check against labels, not indices ---
|
| 67 |
is_default_range = (param_range[0] == PARAM_CHOICES[0] and param_range[1] == PARAM_CHOICES[-1])
|
| 68 |
if not is_default_range and 'params' in filtered_df.columns:
|
| 69 |
if min_params is not None: filtered_df = filtered_df[filtered_df['params'] >= min_params]
|
|
@@ -106,25 +104,17 @@ with gr.Blocks(title="ModelVerse Explorer", fill_width=True) as demo:
|
|
| 106 |
tag_filter_dropdown = gr.Dropdown(label="Select Tag", choices=TAG_FILTER_CHOICES, value=None, visible=False)
|
| 107 |
pipeline_filter_dropdown = gr.Dropdown(label="Select Pipeline Tag", choices=PIPELINE_TAGS, value=None, visible=False)
|
| 108 |
|
| 109 |
-
# --- MODIFIED: Replaced RangeSlider with Slider and a dynamic Markdown label ---
|
| 110 |
with gr.Group():
|
| 111 |
with gr.Row():
|
| 112 |
-
gr.Markdown("<div style='
|
| 113 |
reset_params_button = gr.Button("🔄 Reset", visible=False, size="sm", min_width=80)
|
| 114 |
|
| 115 |
-
# This markdown will show the selected text labels
|
| 116 |
-
param_label_display = gr.Markdown(f"Range: **{PARAM_CHOICES[0]}** to **{PARAM_CHOICES[-1]}**")
|
| 117 |
-
|
| 118 |
param_slider = gr.Slider(
|
| 119 |
-
minimum=0,
|
| 120 |
-
maximum=len(PARAM_CHOICES) - 1,
|
| 121 |
-
step=1,
|
| 122 |
value=PARAM_CHOICES_DEFAULT_INDICES,
|
| 123 |
-
label=
|
| 124 |
-
show_label=False
|
| 125 |
)
|
| 126 |
-
|
| 127 |
-
|
| 128 |
top_k_slider = gr.Slider(label="Number of Top Organizations", minimum=5, maximum=50, value=25, step=5)
|
| 129 |
skip_orgs_textbox = gr.Textbox(label="Organizations to Skip (comma-separated)", value="TheBloke,MaziyarPanahi,unsloth,modularai,Gensyn,bartowski")
|
| 130 |
generate_plot_button = gr.Button(value="Generate Plot", variant="primary", interactive=False)
|
|
@@ -134,37 +124,40 @@ with gr.Blocks(title="ModelVerse Explorer", fill_width=True) as demo:
|
|
| 134 |
status_message_md = gr.Markdown("Initializing...")
|
| 135 |
data_info_md = gr.Markdown("")
|
| 136 |
|
| 137 |
-
# ---
|
| 138 |
def _update_slider_ui_elements(current_range_indices):
|
| 139 |
-
"""Updates the
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
min_idx, max_idx = int(current_range_indices[0]), int(current_range_indices[1])
|
| 141 |
-
min_label = PARAM_CHOICES[min_idx]
|
| 142 |
-
max_label = PARAM_CHOICES[max_idx]
|
| 143 |
|
| 144 |
-
|
|
|
|
| 145 |
|
| 146 |
-
|
| 147 |
button_visibility = gr.update(visible=not is_default)
|
| 148 |
|
| 149 |
return label_md, button_visibility
|
| 150 |
|
| 151 |
def _reset_param_slider_and_ui():
|
| 152 |
"""Resets the slider to default and updates the UI elements accordingly."""
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
return gr.update(value=default_indices), default_label, gr.update(visible=False)
|
| 157 |
|
| 158 |
-
|
|
|
|
| 159 |
reset_params_button.click(fn=_reset_param_slider_and_ui, outputs=[param_slider, param_label_display, reset_params_button])
|
| 160 |
-
|
| 161 |
-
|
| 162 |
def _update_button_interactivity(is_loaded_flag): return gr.update(interactive=is_loaded_flag)
|
| 163 |
loading_complete_state.change(fn=_update_button_interactivity, inputs=loading_complete_state, outputs=generate_plot_button)
|
| 164 |
|
| 165 |
def _toggle_filters_visibility(choice): return gr.update(visible=choice == "Tag Filter"), gr.update(visible=choice == "Pipeline Filter")
|
| 166 |
filter_choice_radio.change(fn=_toggle_filters_visibility, inputs=filter_choice_radio, outputs=[tag_filter_dropdown, pipeline_filter_dropdown])
|
| 167 |
|
|
|
|
| 168 |
def ui_load_data_controller(progress=gr.Progress()):
|
| 169 |
progress(0, desc=f"Loading dataset '{HF_DATASET_ID}' from Hugging Face Hub...")
|
| 170 |
status_msg_ui, data_info_text, load_success_flag = "Loading data...", "", False
|
|
@@ -172,8 +165,16 @@ with gr.Blocks(title="ModelVerse Explorer", fill_width=True) as demo:
|
|
| 172 |
current_df, load_success_flag, status_msg_from_load = load_models_data()
|
| 173 |
if load_success_flag:
|
| 174 |
progress(0.9, desc="Processing loaded data...")
|
| 175 |
-
|
| 176 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 177 |
param_count = (current_df['params'] > 0).sum() if 'params' in current_df.columns else 0
|
| 178 |
data_info_text = f"### Data Information\n- Source: `{HF_DATASET_ID}`\n- Status: {status_msg_from_load}\n- Total models loaded: {len(current_df):,}\n- Models with parameter counts: {param_count:,}\n- Data as of: {date_display}\n"
|
| 179 |
status_msg_ui = "Data loaded successfully. Ready to generate plot."
|
|
@@ -186,7 +187,6 @@ with gr.Blocks(title="ModelVerse Explorer", fill_width=True) as demo:
|
|
| 186 |
print(f"Critical error in ui_load_data_controller: {e}")
|
| 187 |
return current_df, load_success_flag, data_info_text, status_msg_ui
|
| 188 |
|
| 189 |
-
# --- MODIFIED: Controller now takes slider indices and converts them to labels ---
|
| 190 |
def ui_generate_plot_controller(metric_choice, filter_type, tag_choice, pipeline_choice,
|
| 191 |
param_range_indices, k_orgs, skip_orgs_input, df_current_models, progress=gr.Progress()):
|
| 192 |
if df_current_models is None or df_current_models.empty:
|
|
@@ -196,7 +196,6 @@ with gr.Blocks(title="ModelVerse Explorer", fill_width=True) as demo:
|
|
| 196 |
pipeline_to_use = pipeline_choice if filter_type == "Pipeline Filter" else None
|
| 197 |
orgs_to_skip = [org.strip() for org in skip_orgs_input.split(',') if org.strip()] if skip_orgs_input else []
|
| 198 |
|
| 199 |
-
# Convert indices from slider back to text labels for filtering logic
|
| 200 |
min_label = PARAM_CHOICES[int(param_range_indices[0])]
|
| 201 |
max_label = PARAM_CHOICES[int(param_range_indices[1])]
|
| 202 |
param_labels_for_filtering = [min_label, max_label]
|
|
@@ -221,7 +220,7 @@ with gr.Blocks(title="ModelVerse Explorer", fill_width=True) as demo:
|
|
| 221 |
generate_plot_button.click(
|
| 222 |
fn=ui_generate_plot_controller,
|
| 223 |
inputs=[count_by_dropdown, filter_choice_radio, tag_filter_dropdown, pipeline_filter_dropdown,
|
| 224 |
-
param_slider, top_k_slider, skip_orgs_textbox, models_data_state],
|
| 225 |
outputs=[plot_output, status_message_md]
|
| 226 |
)
|
| 227 |
|
|
@@ -229,4 +228,4 @@ if __name__ == "__main__":
|
|
| 229 |
print(f"Application starting. Data will be loaded from Hugging Face dataset: {HF_DATASET_ID}")
|
| 230 |
demo.queue().launch()
|
| 231 |
|
| 232 |
-
# --- END OF FULLY CORRECTED FILE app.py ---
|
|
|
|
| 1 |
+
# --- START OF FULLY CORRECTED AND IMPROVED FILE app.py ---
|
| 2 |
|
| 3 |
import gradio as gr
|
| 4 |
import pandas as pd
|
|
|
|
| 8 |
|
| 9 |
# --- Constants ---
|
| 10 |
PARAM_CHOICES = ['< 1B', '1B', '5B', '12B', '32B', '64B', '128B', '256B', '> 500B']
|
|
|
|
| 11 |
PARAM_CHOICES_DEFAULT_INDICES = [0, len(PARAM_CHOICES) - 1]
|
| 12 |
|
| 13 |
HF_DATASET_ID = "evijit/orgstats_daily_data"
|
|
|
|
| 62 |
else: print(f"Warning: 'pipeline_tag' column not found for filtering.")
|
| 63 |
if param_range:
|
| 64 |
min_params, max_params = get_param_range_values(param_range)
|
|
|
|
| 65 |
is_default_range = (param_range[0] == PARAM_CHOICES[0] and param_range[1] == PARAM_CHOICES[-1])
|
| 66 |
if not is_default_range and 'params' in filtered_df.columns:
|
| 67 |
if min_params is not None: filtered_df = filtered_df[filtered_df['params'] >= min_params]
|
|
|
|
| 104 |
tag_filter_dropdown = gr.Dropdown(label="Select Tag", choices=TAG_FILTER_CHOICES, value=None, visible=False)
|
| 105 |
pipeline_filter_dropdown = gr.Dropdown(label="Select Pipeline Tag", choices=PIPELINE_TAGS, value=None, visible=False)
|
| 106 |
|
|
|
|
| 107 |
with gr.Group():
|
| 108 |
with gr.Row():
|
| 109 |
+
param_label_display = gr.Markdown("<div style='font-weight: 500;'>Parameters</div>")
|
| 110 |
reset_params_button = gr.Button("🔄 Reset", visible=False, size="sm", min_width=80)
|
| 111 |
|
|
|
|
|
|
|
|
|
|
| 112 |
param_slider = gr.Slider(
|
| 113 |
+
minimum=0, maximum=len(PARAM_CHOICES) - 1, step=1,
|
|
|
|
|
|
|
| 114 |
value=PARAM_CHOICES_DEFAULT_INDICES,
|
| 115 |
+
label="Parameter Range", show_label=False # Use a hidden label for accessibility
|
|
|
|
| 116 |
)
|
| 117 |
+
|
|
|
|
| 118 |
top_k_slider = gr.Slider(label="Number of Top Organizations", minimum=5, maximum=50, value=25, step=5)
|
| 119 |
skip_orgs_textbox = gr.Textbox(label="Organizations to Skip (comma-separated)", value="TheBloke,MaziyarPanahi,unsloth,modularai,Gensyn,bartowski")
|
| 120 |
generate_plot_button = gr.Button(value="Generate Plot", variant="primary", interactive=False)
|
|
|
|
| 124 |
status_message_md = gr.Markdown("Initializing...")
|
| 125 |
data_info_md = gr.Markdown("")
|
| 126 |
|
| 127 |
+
# --- MODIFIED: More robust event handlers for the slider ---
|
| 128 |
def _update_slider_ui_elements(current_range_indices):
|
| 129 |
+
"""Updates the labels above the slider and the reset button visibility."""
|
| 130 |
+
if not isinstance(current_range_indices, list) or len(current_range_indices) != 2:
|
| 131 |
+
# This is a defensive check to prevent crashes if the input is malformed.
|
| 132 |
+
return gr.update(), gr.update()
|
| 133 |
+
|
| 134 |
min_idx, max_idx = int(current_range_indices[0]), int(current_range_indices[1])
|
| 135 |
+
min_label, max_label = PARAM_CHOICES[min_idx], PARAM_CHOICES[max_idx]
|
|
|
|
| 136 |
|
| 137 |
+
# Using HTML for bold is more reliable in gr.Markdown
|
| 138 |
+
label_md = f"<div style='font-weight: 500;'>Parameters <span style='float: right; font-weight: normal; color: #555;'>{min_label} to {max_label}</span></div>"
|
| 139 |
|
| 140 |
+
is_default = (min_idx == 0 and max_idx == len(PARAM_CHOICES) - 1)
|
| 141 |
button_visibility = gr.update(visible=not is_default)
|
| 142 |
|
| 143 |
return label_md, button_visibility
|
| 144 |
|
| 145 |
def _reset_param_slider_and_ui():
|
| 146 |
"""Resets the slider to default and updates the UI elements accordingly."""
|
| 147 |
+
default_label = "<div style='font-weight: 500;'>Parameters</div>"
|
| 148 |
+
return gr.update(value=PARAM_CHOICES_DEFAULT_INDICES), default_label, gr.update(visible=False)
|
|
|
|
|
|
|
| 149 |
|
| 150 |
+
# Use .change() for better reliability
|
| 151 |
+
param_slider.change(fn=_update_slider_ui_elements, inputs=param_slider, outputs=[param_label_display, reset_params_button])
|
| 152 |
reset_params_button.click(fn=_reset_param_slider_and_ui, outputs=[param_slider, param_label_display, reset_params_button])
|
| 153 |
+
|
|
|
|
| 154 |
def _update_button_interactivity(is_loaded_flag): return gr.update(interactive=is_loaded_flag)
|
| 155 |
loading_complete_state.change(fn=_update_button_interactivity, inputs=loading_complete_state, outputs=generate_plot_button)
|
| 156 |
|
| 157 |
def _toggle_filters_visibility(choice): return gr.update(visible=choice == "Tag Filter"), gr.update(visible=choice == "Pipeline Filter")
|
| 158 |
filter_choice_radio.change(fn=_toggle_filters_visibility, inputs=filter_choice_radio, outputs=[tag_filter_dropdown, pipeline_filter_dropdown])
|
| 159 |
|
| 160 |
+
# --- MODIFIED: Fixed the timezone handling logic ---
|
| 161 |
def ui_load_data_controller(progress=gr.Progress()):
|
| 162 |
progress(0, desc=f"Loading dataset '{HF_DATASET_ID}' from Hugging Face Hub...")
|
| 163 |
status_msg_ui, data_info_text, load_success_flag = "Loading data...", "", False
|
|
|
|
| 165 |
current_df, load_success_flag, status_msg_from_load = load_models_data()
|
| 166 |
if load_success_flag:
|
| 167 |
progress(0.9, desc="Processing loaded data...")
|
| 168 |
+
date_display = "Pre-processed (date unavailable)"
|
| 169 |
+
if 'data_download_timestamp' in current_df.columns and not current_df.empty and pd.notna(current_df['data_download_timestamp'].iloc[0]):
|
| 170 |
+
timestamp = pd.to_datetime(current_df['data_download_timestamp'].iloc[0])
|
| 171 |
+
# Check if tz-aware. If so, convert. If not, localize.
|
| 172 |
+
if timestamp.tzinfo is None:
|
| 173 |
+
ts = timestamp.tz_localize('UTC')
|
| 174 |
+
else:
|
| 175 |
+
ts = timestamp.tz_convert('UTC')
|
| 176 |
+
date_display = ts.strftime('%B %d, %Y, %H:%M:%S %Z')
|
| 177 |
+
|
| 178 |
param_count = (current_df['params'] > 0).sum() if 'params' in current_df.columns else 0
|
| 179 |
data_info_text = f"### Data Information\n- Source: `{HF_DATASET_ID}`\n- Status: {status_msg_from_load}\n- Total models loaded: {len(current_df):,}\n- Models with parameter counts: {param_count:,}\n- Data as of: {date_display}\n"
|
| 180 |
status_msg_ui = "Data loaded successfully. Ready to generate plot."
|
|
|
|
| 187 |
print(f"Critical error in ui_load_data_controller: {e}")
|
| 188 |
return current_df, load_success_flag, data_info_text, status_msg_ui
|
| 189 |
|
|
|
|
| 190 |
def ui_generate_plot_controller(metric_choice, filter_type, tag_choice, pipeline_choice,
|
| 191 |
param_range_indices, k_orgs, skip_orgs_input, df_current_models, progress=gr.Progress()):
|
| 192 |
if df_current_models is None or df_current_models.empty:
|
|
|
|
| 196 |
pipeline_to_use = pipeline_choice if filter_type == "Pipeline Filter" else None
|
| 197 |
orgs_to_skip = [org.strip() for org in skip_orgs_input.split(',') if org.strip()] if skip_orgs_input else []
|
| 198 |
|
|
|
|
| 199 |
min_label = PARAM_CHOICES[int(param_range_indices[0])]
|
| 200 |
max_label = PARAM_CHOICES[int(param_range_indices[1])]
|
| 201 |
param_labels_for_filtering = [min_label, max_label]
|
|
|
|
| 220 |
generate_plot_button.click(
|
| 221 |
fn=ui_generate_plot_controller,
|
| 222 |
inputs=[count_by_dropdown, filter_choice_radio, tag_filter_dropdown, pipeline_filter_dropdown,
|
| 223 |
+
param_slider, top_k_slider, skip_orgs_textbox, models_data_state],
|
| 224 |
outputs=[plot_output, status_message_md]
|
| 225 |
)
|
| 226 |
|
|
|
|
| 228 |
print(f"Application starting. Data will be loaded from Hugging Face dataset: {HF_DATASET_ID}")
|
| 229 |
demo.queue().launch()
|
| 230 |
|
| 231 |
+
# --- END OF FULLY CORRECTED AND IMPROVED FILE app.py ---
|