import streamlit as st import wandb import pandas as pd import os import time import datetime from utils import fetch_competition_summary, fetch_models_evaluation, get_all_competition_summary, highlight_score_column # from dotenv import load_dotenv from cfg import * # load_dotenv() st.set_page_config(layout="wide") table_font_size = 16 st.markdown(TABLE_STYLE, unsafe_allow_html=True) ### WANDB # Access the API key from the environment variable wandb_api_key = os.getenv('WANDB_API_KEY') # Log in to wandb using the API key if wandb_api_key: wandb.login(key=wandb_api_key) # wandb.login() else: st.error("WANDB_API_KEY not found in environment variables.") wandb_api = wandb.Api() @st.cache_data def update_leader_info(leader_info, competition, best_model): if leader_info.get(competition) is None: leader_info[competition] = { "Hotkey": best_model["Hotkey"], "Date": time.strftime("%Y-%m-%d"), "Days on Top": 1 } else: if leader_info[competition]["Hotkey"] == best_model["Hotkey"]: # count the number of days on top start_date = datetime.datetime.strptime(leader_info[competition]["Date"], "%Y-%m-%d") current_date = datetime.datetime.now() days_on_top = (current_date - start_date).days leader_info[competition]["Days on Top"] = days_on_top + 1 else: leader_info[competition]["Hotkey"] = best_model["Hotkey"] leader_info[competition]["Date"] = time.strftime("%Y-%m-%d") leader_info[competition]["Days on Top"] = 1 return leader_info[competition] @st.cache_data() def load_competition_data(last_update_time=None): competition_summaries = {} model_evaluations = {} for competition in COMPETITIONS: competition_summaries[competition] = fetch_competition_summary(wandb_api, COMPETITIONS, competition) model_evaluations[competition] = fetch_models_evaluation(wandb_api, COMPETITIONS, competition) last_update_time = time.time() return competition_summaries, model_evaluations, last_update_time # Streamlit app main function def main(): st.markdown(HEADER, unsafe_allow_html=True) if 'last_update_time' not in st.session_state: st.session_state.last_update_time = None if "leader_info" not in st.session_state: st.session_state.leader_info = {} if 'selected_competition' not in st.session_state: st.session_state.selected_competition = None if st.session_state.last_update_time is None or (time.time() - st.session_state.last_update_time > UPDATE_INTERVAL): competition_summaries, model_evaluations, st.session_state.last_update_time = load_competition_data(st.session_state.last_update_time) for competition in COMPETITIONS: if not competition_summaries[competition].empty: # get all winning hotkeys and number of wins winning_hotkeys = competition_summaries[competition]["Winning Hotkey"].value_counts() # if not empty, get the best hotkey if not winning_hotkeys.empty: best_hotkey = winning_hotkeys.idxmax() # get the best model with the winning hotkey best_model = model_evaluations[competition][model_evaluations[competition]["Hotkey"] == best_hotkey].iloc[0] st.session_state.leader_info[competition] = update_leader_info(st.session_state.leader_info, competition, best_model) else: st.session_state.leader_info[competition] = { "Hotkey": "N/A", "Date": "N/A", "UID": "N/A", "Days on Top": "N/A" } else: competition_summaries, model_evaluations, _ = load_competition_data(st.session_state.last_update_time) number_of_competitions, number_of_runs = get_all_competition_summary(wandb_api, COMPETITIONS) last_updated = datetime.datetime.fromtimestamp(st.session_state.last_update_time).strftime('%Y-%m-%d %H:%M:%S') st.subheader("Summary information") st.markdown(f"""
Number of competitions | Number of models run | Last updated |
---|---|---|
{number_of_competitions} | {number_of_runs} | {last_updated} |