| | import pandas as pd |
| | import streamlit as st |
| | import wandb |
| |
|
| | from dashboard_utils.bubbles import get_global_metrics, get_new_bubble_data, get_leaderboard |
| | from dashboard_utils.main_metrics import get_main_metrics |
| | from streamlit_observable import observable |
| | import time |
| | import requests |
| |
|
| | import streamlit as st |
| | from streamlit_lottie import st_lottie |
| |
|
| |
|
| | def load_lottieurl(url: str): |
| | r = requests.get(url) |
| | if r.status_code != 200: |
| | return None |
| | return r.json() |
| |
|
| |
|
| | |
| | st.set_page_config(page_title="Dashboard", layout="wide") |
| |
|
| | st.markdown("<h1 style='text-align: center;'>Dashboard</h1>", unsafe_allow_html=True) |
| |
|
| | key_figures_margin_left, key_figures_c1, key_figures_c2, key_figures_c3, key_figures_margin_right = st.columns( |
| | (2, 1, 1, 1, 2) |
| | ) |
| | chart_c1, chart_c2 = st.columns((3, 2)) |
| |
|
| | lottie_url_loading = "https://assets5.lottiefiles.com/packages/lf20_OdNgAj.json" |
| | lottie_loading = load_lottieurl(lottie_url_loading) |
| |
|
| |
|
| | with key_figures_c1: |
| | st.caption("\# of contributing users") |
| | placeholder_key_figures_c1 = st.empty() |
| | with placeholder_key_figures_c1: |
| | st_lottie(lottie_loading, height=100, key="loading_key_figure_c1") |
| |
|
| | with key_figures_c2: |
| | st.caption("\# active users") |
| | placeholder_key_figures_c2 = st.empty() |
| | with placeholder_key_figures_c2: |
| | st_lottie(lottie_loading, height=100, key="loading_key_figure_c2") |
| |
|
| | with key_figures_c3: |
| | st.caption("Total runtime") |
| | placeholder_key_figures_c3 = st.empty() |
| | with placeholder_key_figures_c3: |
| | st_lottie(lottie_loading, height=100, key="loading_key_figure_c3") |
| |
|
| | with chart_c1: |
| | st.subheader("Metrics over time") |
| | st.caption("Training Loss") |
| | placeholder_chart_c1_1 = st.empty() |
| | with placeholder_chart_c1_1: |
| | st_lottie(lottie_loading, height=100, key="loading_c1_1") |
| |
|
| | st.caption("Number of alive runs over time") |
| | placeholder_chart_c1_2 = st.empty() |
| | with placeholder_chart_c1_2: |
| | st_lottie(lottie_loading, height=100, key="loading_c1_2") |
| |
|
| | st.caption("Number of steps") |
| | placeholder_chart_c1_3 = st.empty() |
| | with placeholder_chart_c1_3: |
| | st_lottie(lottie_loading, height=100, key="loading_c1_3") |
| |
|
| | with chart_c2: |
| | st.subheader("Global metrics") |
| | st.caption("Collaborative training participants") |
| | placeholder_chart_c2_1 = st.empty() |
| | with placeholder_chart_c2_1: |
| | st_lottie(lottie_loading, height=100, key="loading_c2_1") |
| | |
| | st.write("Chart showing participants of the collaborative-training. Circle radius is relative to the total time contributed, " |
| | "the profile picture is circled in purple if the participant is active. Every purple square represents an " |
| | "active device.") |
| |
|
| | st.caption("Leaderboard") |
| | placeholder_chart_c2_3 = st.empty() |
| | with placeholder_chart_c2_3: |
| | st_lottie(lottie_loading, height=100, key="loading_c2_2") |
| |
|
| |
|
| | wandb.login(anonymous="must") |
| |
|
| |
|
| | steps, dates, losses, alive_peers = get_main_metrics() |
| | source = pd.DataFrame({"steps": steps, "loss": losses, "alive sessions": alive_peers, "date": dates}) |
| |
|
| |
|
| | placeholder_chart_c1_1.vega_lite_chart( |
| | source, |
| | { |
| | "$schema": "https://vega.github.io/schema/vega-lite/v5.json", |
| | "description": "Training Loss", |
| | "mark": {"type": "line", "point": {"tooltip": True, "filled": False, "strokeOpacity": 0}}, |
| | "encoding": {"x": {"field": "date", "type": "temporal"}, "y": {"field": "loss", "type": "quantitative"}}, |
| | "config": {"axisX": {"labelAngle": -40}}, |
| | }, |
| | use_container_width=True, |
| | ) |
| |
|
| | placeholder_chart_c1_2.vega_lite_chart( |
| | source, |
| | { |
| | "$schema": "https://vega.github.io/schema/vega-lite/v5.json", |
| | "description": "Alive sessions", |
| | "mark": {"type": "line", "point": {"tooltip": True, "filled": False, "strokeOpacity": 0}}, |
| | "encoding": { |
| | "x": {"field": "date", "type": "temporal"}, |
| | "y": {"field": "alive sessions", "type": "quantitative"}, |
| | }, |
| | "config": {"axisX": {"labelAngle": -40}}, |
| | }, |
| | use_container_width=True, |
| | ) |
| | placeholder_chart_c1_3.vega_lite_chart( |
| | source, |
| | { |
| | "$schema": "https://vega.github.io/schema/vega-lite/v5.json", |
| | "description": "Training Loss", |
| | "mark": {"type": "line", "point": {"tooltip": True, "filled": False, "strokeOpacity": 0}}, |
| | "encoding": {"x": {"field": "date", "type": "temporal"}, "y": {"field": "steps", "type": "quantitative"}}, |
| | "config": {"axisX": {"labelAngle": -40}}, |
| | }, |
| | use_container_width=True, |
| | ) |
| |
|
| | serialized_data, profiles = get_new_bubble_data() |
| | df_leaderboard = get_leaderboard(serialized_data) |
| | observable( |
| | "_", |
| | notebook="d/9ae236a507f54046", |
| | targets=["c_noaws"], |
| | redefine={"serializedData": serialized_data, "profileSimple": profiles, "width": 0}, |
| | render_empty=True, |
| | ) |
| | placeholder_chart_c2_3.dataframe(df_leaderboard[["User", "Total time contributed"]]) |
| |
|
| | global_metrics = get_global_metrics(serialized_data) |
| |
|
| | placeholder_key_figures_c1.write(f"<b>{global_metrics['num_contributing_users']}</b>", unsafe_allow_html=True) |
| | placeholder_key_figures_c2.write(f"<b>{global_metrics['num_active_users']}</b>", unsafe_allow_html=True) |
| | placeholder_key_figures_c3.write(f"<b>{global_metrics['total_runtime']}</b>", unsafe_allow_html=True) |
| |
|
| | with placeholder_chart_c2_1: |
| | observable( |
| | "Participants", |
| | notebook="d/9ae236a507f54046", |
| | targets=["c_noaws"], |
| | redefine={"serializedData": serialized_data, "profileSimple": profiles}, |
| | ) |
| |
|