import time
import pandas as pd
import streamlit as st
import plotly.express as px
import utils
_ = """
[x] Define KPIs: Number of steps, number of completions and total generated tokens
[x] Data pipeline I: pull run summary data from wandb
[x] Data pipeline II: pull run event data from wandb (max 500 steps per run)
[x] Task trends: Number of tasks over time
[x] Reward trends I: average reward over time, by task
[x] Reward trends II: average nonzero reward over time, by task
[x] Reward trends III: average nonzero normalized reward over time, by task
[x] Explain trends: show release dates to indicate sudden changes
[ ] Miner trends: associate uids with miner rankings and plot top miner rewards vs network avg
[ ] Baseline rewards I: compare the network trends with baseline model gpt-3.5-turbo
[ ] Baseline rewards II: compare the network trends with baseline model gpt-4o
[ ] Baseline rewards III: compare the network trends with baseline model zephyr
[ ] Baseline rewards IV: compare the network trends with baseline model solar
[ ] Baseline rewards V: compare the network trends with baseline model llama3 8B
[ ] Baseline rewards VI: compare the network trends with baseline model llama3 70B
---------
"""
st.title('Prompting Subnet Dashboard')
st.markdown('
', unsafe_allow_html=True)
# reload data periodically
state_vars = utils.load_state_vars()
df_runs = state_vars['df_runs']
df_runs_24h = state_vars['df_runs_24h']
df_vali = state_vars['df_vali']
df_events = state_vars['df_events']
df_task_counts = state_vars['df_task_counts']
df_m = state_vars['metagraph']
st.toast(f'Loaded {len(df_runs)} runs')
#### ------ PRODUCTIVITY ------
# Overview of productivity
st.subheader('Productivity overview')
st.info('Productivity metrics show how much data has been created by subnet 1')
productivity = utils.get_productivity(df_runs)
productivity_24h = utils.get_productivity(df_runs_24h)
m1, m2, m3, m4 = st.columns(4)
m1.metric('Competition duration', f'{productivity.get("duration").days} days')
m2.metric('Total events', f'{productivity.get("total_events")/1e6:,.2f}M', delta=f'{productivity_24h.get("total_events")/1e6:,.2f}M (24h)')
m3.metric('Total completions', f'{productivity.get("total_completions")/1e9:,.2f}B', delta=f'{productivity_24h.get("total_completions")/1e9:,.2f}B (24h)')
m4.metric('Total dataset tokens', f'{productivity.get("total_tokens")/1e9:,.2f}B', delta=f'{productivity_24h.get("total_tokens")/1e9:,.2f}B (24h)')
st.markdown('
', unsafe_allow_html=True)
st.plotly_chart(
px.area(df_task_counts, y=df_task_counts.columns, title='Data Created by Task',
labels={'created_at':'','value':'Total data created'},
),
use_container_width=True,
)
st.markdown('
', unsafe_allow_html=True)
# Overview of productivity
st.subheader('Improvement overview')
st.info('Subnet 1 is an endlessly improving system, where miners compete to produce high quality responses to a range of challenging tasks')
TASK_CHOICES = {
'Question answering': 'qa',
'Summarization': 'summarization',
'Date-based question answering': 'date_qa',
'Math': 'math',
'Generic instruction': 'generic',
'Sentiment analysis': 'sentiment',
'Translation': 'translation',
}
with st.expander('Advanced settings'):
c1, c2 = st.columns(2)
remove_zero_rewards = c1.checkbox('Exclude zero rewards', value=True, help='Remove completions which scored zero rewards (failed responses, timeouts etc.)')
normalize_rewards = c1.checkbox('Normalize rewards', value=True, help='Scale rewards for each task to a maximium value of 1 (approx)')
show_releases = c1.checkbox('Show releases', value=False, help='Add annotations which indicate when major releases may have impacted network performance')
moving_avg_window = c2.slider('Moving avg. window', min_value=1, max_value=30, value=14, help='Window size to smooth data and make long term trends clearer')
reward_col = 'normalized_rewards' if normalize_rewards else 'rewards'
df_stats = utils.get_reward_stats(df_events, exclude_multiturn=True, freq='1D', remove_zero_rewards=remove_zero_rewards)
task_choice_label = st.radio('Select task', list(TASK_CHOICES.keys()), index=0, horizontal=True)
task_choice = TASK_CHOICES[task_choice_label]
st.plotly_chart(
# add fillgradient to make it easier to see the trend
utils.plot_reward_trends(df_stats, task=task_choice, window=moving_avg_window, col=reward_col, annotate=show_releases, task_label=task_choice_label),
use_container_width=True,
)
st.markdown('
', unsafe_allow_html=True)
#### ------ LEADERBOARD ------
st.subheader('Leaderboard')
st.info('The leaderboard shows the top miners by incentive.')
m1, m2 = st.columns(2)
ntop = m1.slider('Number of top miners to display', value=10, min_value=3, max_value=50, step=1)
entity_choice = m2.radio('Select entity', utils.ENTITY_CHOICES, index=0, horizontal=True)
df_miners = utils.get_leaderboard(df_m, ntop=ntop, entity_choice=entity_choice)
# hide colorbar and don't show y axis
st.plotly_chart(
px.bar(df_miners, x='I', color='I', hover_name=entity_choice, text=entity_choice if ntop < 20 else None,
labels={'I':'Incentive', 'trust':'Trust', 'stake':'Stake', '_index':'Rank'},
).update_layout(coloraxis_showscale=False, yaxis_visible=False),
use_container_width=True,
)
with st.expander('Show raw metagraph data'):
st.dataframe(df_m)
st.markdown('
', unsafe_allow_html=True)
#### ------ LOGGED RUNS ------
st.subheader('Logged runs')
# st.info('The timeline shows the creation and last event time of each run.')
# st.plotly_chart(
# px.timeline(df_runs, x_start='created_at', x_end='last_event_at', y='user', color='state',
# labels={'created_at':'Created at', 'last_event_at':'Last event at', 'username':''},
# ),
# use_container_width=True
# )
df_runs['spec_version'] = df_runs['spec_version'].astype('int64')
with st.expander('Show raw run data'):
st.dataframe(df_runs)