Kabalisticus's picture
test 3
1e29694
raw
history blame
7.45 kB
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
st.set_page_config(layout="wide")
### 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)
else:
st.error("WANDB_API_KEY not found in environment variables.")
# Initialize W&B API
api = wandb.Api()
### STREAMLIT APP
# Define available projects (bookmarks)
projects = {
"Melanoma-1": {
"entity": "safe-scan-ai",
"project": "melanoma-1",
"description": "This is a testnet competition for melanoma detection."
},
"Melanoma-testnet": {
"entity": "safe-scan-ai",
"project": "melanoma-testnet",
"description": "This is a testnet competition for melanoma detection."
},
# Add more projects as needed
}
# Initialize leader info
@st.cache_data
def update_leader_info(leader_info, competition, best_model):
if leader_info.get(competition) is None:
leader_info[competition] = {
"Username": best_model["Username"],
"Model Name": best_model["Model Name"],
"Hotkey": best_model["Hotkey"],
"Date": time.strftime("%Y-%m-%d"),
"UID": "xd",
"Days on Top": 1
}
else:
if leader_info[competition]["UID"] == "xd": #best_model["ID"]:
# # update the days on top to the difference between the current date and the date of the last update
# current_date = time.strftime("%Y-%m-%d")
# last_update_date = leader_info[competition]["Date"]
# # Convert the dates from string format to datetime objects
# current_date_obj = datetime.strptime(current_date, "%Y-%m-%d")
# last_update_date_obj = datetime.strptime(last_update_date, "%Y-%m-%d")
# # Calculate the difference in days
# days_on_top = (current_date_obj - last_update_date_obj).days
# leader_info[competition]["Days on Top"] = days_on_top
leader_info[competition]["Days on Top"] += 1
else:
leader_info[competition]["Username"] = best_model["Username"]
leader_info[competition]["Model Name"] = best_model["Model Name"]
leader_info[competition]["Hotkey"] = best_model["Hotkey"]
leader_info[competition]["Date"] = time.strftime("%Y-%m-%d")
leader_info[competition]["UID"] = best_model["ID"]
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 projects:
competition_summaries[competition] = fetch_competition_summary(api, projects, competition)
model_evaluations[competition] = fetch_models_evaluation(api, projects, competition)
last_update_time = time.time()
return competition_summaries, model_evaluations, last_update_time
# Streamlit app main function
def main():
st.title("SafeScan Dashboard")
st.subheader("Welcome to the Competition Dashboard!")
st.write("Explore the various AI competitions and their respective rankings. Select a competition to view more details and rankings.")
update_interval = 20 * 60 # 20 minutes in seconds
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 projects:
if not model_evaluations[competition].empty:
best_model = model_evaluations[competition].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] = {
"Username": "N/A", "Model Name": "N/A", "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(api, projects)
st.write(f"Number of competitions: {number_of_competitions}")
st.write(f"Number of model: {number_of_runs}")
#-----
st.write(f"Last updated: {time.ctime(st.session_state.last_update_time)}")
st.markdown("### Competitions")
st.write("### Select Competition")
# Create a header for the table
cols = st.columns([1, 3, 2, 2, 2, 2, 1, 2])
cols[0].write("Index")
cols[1].write("Competition Name")
cols[2].write("Leader")
cols[3].write("Model")
cols[4].write("Date")
cols[5].write("UID")
cols[6].write("Hotkey")
cols[7].write("Days on Top")
for index, (competition, details) in enumerate(projects.items(), start=1):
leader_info = st.session_state.get("leader_info", {}).get(competition, {})
cols = st.columns([1, 3, 2, 2, 2, 2, 1, 2])
cols[0].write(index)
if cols[1].button(competition):
st.session_state.selected_competition = competition
cols[2].write(leader_info.get("Username", "N/A"))
cols[3].write(leader_info.get("Model Name", "N/A"))
cols[4].write(leader_info.get("Date", "N/A"))
cols[5].write(leader_info.get("UID", "N/A"))
cols[6].write(leader_info.get("Hotkey", "N/A"))
cols[7].write(leader_info.get("Days on Top", "N/A"))
if st.session_state.selected_competition:
competition_name = st.session_state.selected_competition
st.write(f"Selected competition: {competition_name}")
competition_details = projects.get(competition_name, {})
description = competition_details.get("description", "No description available.")
st.header(f"Competition: {competition_name}")
st.write(description)
st.subheader("Competition Summary")
competition_summary_df = competition_summaries.get(competition_name, pd.DataFrame())
if not competition_summary_df.empty:
st.dataframe(competition_summary_df)
else:
st.warning("No competition summary data available.")
st.subheader("Models Evaluation")
models_evaluation_df = model_evaluations.get(competition_name, pd.DataFrame())
if not models_evaluation_df.empty:
st.dataframe(models_evaluation_df)
else:
st.warning("No models evaluation data available.")
else:
st.write("Please select a competition to view details.")
# Run the app
if __name__ == "__main__":
main()