Sn25 / app.py
schampoux's picture
hotfix/24h (#3)
0872630 verified
raw
history blame
5.42 kB
import time
import pandas as pd
import streamlit as st
import plotly.express as px
import requests
import utils
_ = """
Proteins folded (delta 24hr)
Current proteins folding (24hr)
Average time to fold trend
Refolded proteins (group by run id and pdb id and get unique)
Simulation duration distribution
"""
UPDATE_INTERVAL = 3600
BASE_URL = 'http://143.198.21.86:5001/'
st.title('Folding Subnet Dashboard')
st.markdown('<br>', unsafe_allow_html=True)
#### ------ PRODUCTIVITY ------
# Overview of productivity
st.subheader('Productivity overview')
st.info('Productivity metrics show how many proteins have been folded, which is the primary goal of the subnet. Metrics are estimated using weights and biases data combined with heuristics.')
productivity_all = requests.get(f'{BASE_URL}/productivity').json()
productivity = productivity_all['all_time']
productivity_24h = productivity_all['last_24h']
# st.write(productivity_all)
# # st.write(productivity)
# st.write(productivity_24h)
m1, m2 = st.columns(2)
m1.metric('Unique proteins folded', f'{productivity.get("unique_folded", 0):,.0f}', delta=f'{productivity_24h.get("unique_folded", 0):,.0f} (24h)')
m2.metric('Total jobs completed', f'{productivity.get("total_completed_jobs", 0):,.0f}', delta=f'{productivity_24h.get("total_completed_jobs", 0):,.0f} (24h)')
# m3.metric('Total simulation steps', f'{productivity.get("total_md_steps"):,.0f}', delta=f'{productivity_24h.get("total_md_steps"):,.0f} (24h)')
# st.markdown('<br>', unsafe_allow_html=True)
# time_binned_data = df.set_index('last_event_at').groupby(pd.Grouper(freq='12h'))
# PROD_CHOICES = {
# 'Unique proteins folded': 'unique_pdbs',
# 'Total simulations': 'total_pdbs',
# 'Total simulation steps': 'total_md_steps',
# }
# prod_choice_label = st.radio('Select productivity metric', list(PROD_CHOICES.keys()), index=0, horizontal=True)
# prod_choice = PROD_CHOICES[prod_choice_label]
# steps_running_total = time_binned_data[prod_choice].sum().cumsum()
# st.plotly_chart(
# # add fillgradient to make it easier to see the trend
# px.area(steps_running_total, y=prod_choice,
# labels={'last_event_at':'', prod_choice: prod_choice_label},
# ).update_traces(fill='tozeroy'),
# use_container_width=True,
# )
st.markdown('<br>', unsafe_allow_html=True)
#### ------ THROUGHPUT ------
st.subheader('Throughput overview')
st.info('Throughput metrics show the total amount of data sent and received by the validators. This is a measure of the network activity and the amount of data that is being processed by the subnet.')
MEM_UNIT = 'GB' #st.radio('Select memory unit', ['TB','GB', 'MB'], index=0, horizontal=True)
throughput = requests.get(f'{BASE_URL}/throughput').json()
data_transferred = throughput['all_time']
data_transferred_24h = throughput['last_24h']
m1, m2, m3 = st.columns(3)
m1.metric(f'Total validator data sent ({MEM_UNIT})', f'{data_transferred["validator_sent"]:,.0f}', delta=f'{data_transferred_24h["validator_sent"]:,.0f} (24h)')
m2.metric(f'Total received data ({MEM_UNIT})', f'{data_transferred["miner_sent"]:,.0f}', delta=f'{data_transferred_24h["miner_sent"]:,.0f} (24h)')
m3.metric(f'Total transferred data ({MEM_UNIT})', f'{data_transferred["validator_sent"]+data_transferred["miner_sent"]:,.0f}', delta=f'{data_transferred_24h["validator_sent"]+data_transferred_24h["miner_sent"]:,.0f} (24h)')
# IO_CHOICES = {'total_data_sent':'Sent', 'total_data_received':'Received'}
# io_running_total = time_binned_data[list(IO_CHOICES.keys())].sum().rename(columns=IO_CHOICES).cumsum().melt(ignore_index=False)
# io_running_total['value'] = io_running_total['value'].apply(utils.convert_unit, args=(utils.BASE_UNITS, MEM_UNIT))
# st.plotly_chart(
# px.area(io_running_total, y='value', color='variable',
# labels={'last_event_at':'', 'value': f'Data transferred ({MEM_UNIT})', 'variable':'Direction'},
# ),
# use_container_width=True,
# )
st.markdown('<br>', 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_m = utils.get_metagraph(time.time()//UPDATE_INTERVAL)
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('<br>', 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, x_start='created_at', x_end='last_event_at', y='username', color='state',
# labels={'created_at':'Created at', 'last_event_at':'Last event at', 'username':''},
# ),
# use_container_width=True
# )
# with st.expander('Show raw run data'):
# st.dataframe(df)