Update app.py
Browse files
app.py
CHANGED
@@ -14,22 +14,23 @@ WANDB_RUN_PATH = os.environ["WANDB_RUN_PATH"]
|
|
14 |
|
15 |
REFRESH_RATE = 30
|
16 |
NET_UID = 39
|
17 |
-
AVERAGE_BENCHMARK_TIME_WARNING_THRESHOLD =
|
18 |
ETA_WARNING_THRESHOLD = 43200 # 12 hours
|
|
|
|
|
19 |
|
20 |
subtensor = bt.subtensor()
|
21 |
metagraph = bt.metagraph(netuid=NET_UID)
|
22 |
|
23 |
-
demo = gr.Blocks(css=".typewriter {font-family: 'JMH Typewriter', sans-serif;}", fill_height=True, fill_width=True)
|
24 |
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
STOPPED = ("Stopped", "red")
|
31 |
CRASHED = ("Crashed", "red")
|
32 |
-
|
33 |
|
34 |
def get_alt_time_text(self) -> str:
|
35 |
return "β" if self.is_broken() else "N/A"
|
@@ -41,12 +42,12 @@ class Status(Enum):
|
|
41 |
return self.value[1]
|
42 |
|
43 |
def is_broken(self):
|
44 |
-
return self ==
|
45 |
|
46 |
|
47 |
@dataclass
|
48 |
class State:
|
49 |
-
|
50 |
hotkey: str
|
51 |
name: str
|
52 |
version: str
|
@@ -123,11 +124,7 @@ def fetch_wandb_data():
|
|
123 |
average_benchmark_time = float(value)
|
124 |
|
125 |
elif key == "invalid":
|
126 |
-
|
127 |
-
invalid = dict(value)
|
128 |
-
except TypeError:
|
129 |
-
invalid = {uid: "Unknown" for uid in value}
|
130 |
-
|
131 |
|
132 |
elif key == "submissions":
|
133 |
submissions = {int(uid) for uid in value.keys()}
|
@@ -135,25 +132,27 @@ def fetch_wandb_data():
|
|
135 |
elif key == "benchmarks":
|
136 |
benchmarks = {int(uid) for uid in value.keys()}
|
137 |
|
138 |
-
benchmarks = set(benchmarks) - set(invalid.keys())
|
139 |
|
140 |
-
|
141 |
run_state = run.state
|
142 |
if run_state == "finished":
|
143 |
-
|
144 |
elif run_state == "crashed":
|
145 |
-
|
146 |
-
elif
|
147 |
-
|
148 |
-
elif
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
|
|
|
|
|
|
153 |
|
154 |
block = subtensor.get_current_block()
|
155 |
data[uid] = State(
|
156 |
-
|
157 |
hotkey=run.config["hotkey"],
|
158 |
name=get_identity(uid) or run.config["hotkey"],
|
159 |
version=run.tags[1][8:],
|
@@ -196,26 +195,26 @@ def get_data() -> gr.Dataframe:
|
|
196 |
now = datetime.now(tz=ZoneInfo("US/Pacific"))
|
197 |
|
198 |
for uid, state in data.items():
|
199 |
-
eta = int(state.average_benchmark_time * (state.submissions -
|
200 |
time_left = timedelta(seconds=eta)
|
201 |
eta_date = now + time_left
|
202 |
-
eta_time = eta_date.strftime("%Y-%m-%d %I:%M:%S %p") if eta > 0 and state.
|
203 |
|
204 |
-
average_time_text = f"{timedelta(seconds=int(state.average_benchmark_time))}" if state.average_benchmark_time else state.
|
205 |
|
206 |
elements.append((
|
207 |
uid,
|
208 |
state.name,
|
209 |
f"<span style='color: {'springgreen' if state.version == latest_version else 'red'}'>{state.version}</span>",
|
210 |
-
f"<span style='color: {state.
|
211 |
-
state.benchmarks
|
212 |
state.submissions,
|
213 |
state.invalid,
|
214 |
f"<span style='color: {'orange' if state.average_benchmark_time > AVERAGE_BENCHMARK_TIME_WARNING_THRESHOLD else 'springgreen'}'>{average_time_text[0]}</span>",
|
215 |
f"<span style='color: {'orange' if eta > ETA_WARNING_THRESHOLD else 'springgreen'}'>{eta_time}</span>",
|
216 |
-
f"<span style='color: {'orange' if eta > ETA_WARNING_THRESHOLD else 'springgreen'}'>{time_left if eta > 0 and state.
|
217 |
-
f"<span style='color: {'springgreen' if state.vtrust >
|
218 |
-
f"<span style='color: {'springgreen' if state.updated <
|
219 |
))
|
220 |
|
221 |
return gr.Dataframe(
|
@@ -228,7 +227,7 @@ def get_data() -> gr.Dataframe:
|
|
228 |
|
229 |
|
230 |
def main():
|
231 |
-
with demo:
|
232 |
table = gr.Dataframe()
|
233 |
table.attach_load_event(lambda: get_data(), None)
|
234 |
demo.launch()
|
|
|
14 |
|
15 |
REFRESH_RATE = 30
|
16 |
NET_UID = 39
|
17 |
+
AVERAGE_BENCHMARK_TIME_WARNING_THRESHOLD = 300 # 5 minutes
|
18 |
ETA_WARNING_THRESHOLD = 43200 # 12 hours
|
19 |
+
UPDATED_WARNING_THRESHOLD = 1000
|
20 |
+
VTRUST_WARNING_THRESHOLD = 0.75
|
21 |
|
22 |
subtensor = bt.subtensor()
|
23 |
metagraph = bt.metagraph(netuid=NET_UID)
|
24 |
|
|
|
25 |
|
26 |
+
class BenchmarkState(Enum):
|
27 |
+
NOT_STARTED = ("Not Started", "orange")
|
28 |
+
IN_PROGRESS = ("In Progress", "orange")
|
29 |
+
FINISHED = ("Finished", "springgreen")
|
30 |
+
OUT_OF_DATE = ("Out of Date", "red")
|
31 |
STOPPED = ("Stopped", "red")
|
32 |
CRASHED = ("Crashed", "red")
|
33 |
+
FAILED = ("Failed", "red")
|
34 |
|
35 |
def get_alt_time_text(self) -> str:
|
36 |
return "β" if self.is_broken() else "N/A"
|
|
|
42 |
return self.value[1]
|
43 |
|
44 |
def is_broken(self):
|
45 |
+
return self == BenchmarkState.NOT_STARTED or self == BenchmarkState.STOPPED or self == BenchmarkState.CRASHED or self == BenchmarkState.FAILED
|
46 |
|
47 |
|
48 |
@dataclass
|
49 |
class State:
|
50 |
+
benchmarking_state: BenchmarkState
|
51 |
hotkey: str
|
52 |
name: str
|
53 |
version: str
|
|
|
124 |
average_benchmark_time = float(value)
|
125 |
|
126 |
elif key == "invalid":
|
127 |
+
invalid = dict(value)
|
|
|
|
|
|
|
|
|
128 |
|
129 |
elif key == "submissions":
|
130 |
submissions = {int(uid) for uid in value.keys()}
|
|
|
132 |
elif key == "benchmarks":
|
133 |
benchmarks = {int(uid) for uid in value.keys()}
|
134 |
|
|
|
135 |
|
136 |
+
benchmarking_state: BenchmarkState
|
137 |
run_state = run.state
|
138 |
if run_state == "finished":
|
139 |
+
benchmarking_state = BenchmarkState.STOPPED
|
140 |
elif run_state == "crashed":
|
141 |
+
benchmarking_state = BenchmarkState.CRASHED
|
142 |
+
elif run_state == "failed":
|
143 |
+
benchmarking_state = BenchmarkState.FAILED
|
144 |
+
elif "benchmarking_state" in run.summary:
|
145 |
+
benchmarking_state = BenchmarkState[run.summary.get("benchmarking_state")]
|
146 |
+
else:
|
147 |
+
benchmarking_state = BenchmarkState.OUT_OF_DATE
|
148 |
+
|
149 |
+
for invalid_uid, reason in invalid.items():
|
150 |
+
if not reason.startswith("Duplicate of UID"):
|
151 |
+
benchmarks.add(invalid_uid)
|
152 |
|
153 |
block = subtensor.get_current_block()
|
154 |
data[uid] = State(
|
155 |
+
benchmarking_state=benchmarking_state,
|
156 |
hotkey=run.config["hotkey"],
|
157 |
name=get_identity(uid) or run.config["hotkey"],
|
158 |
version=run.tags[1][8:],
|
|
|
195 |
now = datetime.now(tz=ZoneInfo("US/Pacific"))
|
196 |
|
197 |
for uid, state in data.items():
|
198 |
+
eta = int(state.average_benchmark_time * (state.submissions - state.benchmarks))
|
199 |
time_left = timedelta(seconds=eta)
|
200 |
eta_date = now + time_left
|
201 |
+
eta_time = eta_date.strftime("%Y-%m-%d %I:%M:%S %p") if eta > 0 and state.benchmarking_state == BenchmarkState.IN_PROGRESS else state.benchmarking_state.get_alt_time_text()
|
202 |
|
203 |
+
average_time_text = f"{timedelta(seconds=int(state.average_benchmark_time))}" if state.average_benchmark_time else state.benchmarking_state.get_alt_time_text(),
|
204 |
|
205 |
elements.append((
|
206 |
uid,
|
207 |
state.name,
|
208 |
f"<span style='color: {'springgreen' if state.version == latest_version else 'red'}'>{state.version}</span>",
|
209 |
+
f"<span style='color: {state.benchmarking_state.color()}'>{state.benchmarking_state.name()}</span>",
|
210 |
+
state.benchmarks,
|
211 |
state.submissions,
|
212 |
state.invalid,
|
213 |
f"<span style='color: {'orange' if state.average_benchmark_time > AVERAGE_BENCHMARK_TIME_WARNING_THRESHOLD else 'springgreen'}'>{average_time_text[0]}</span>",
|
214 |
f"<span style='color: {'orange' if eta > ETA_WARNING_THRESHOLD else 'springgreen'}'>{eta_time}</span>",
|
215 |
+
f"<span style='color: {'orange' if eta > ETA_WARNING_THRESHOLD else 'springgreen'}'>{time_left if eta > 0 and state.benchmarking_state == BenchmarkState.IN_PROGRESS else state.benchmarking_state.get_alt_time_text()}</span>",
|
216 |
+
f"<span style='color: {'springgreen' if state.vtrust > VTRUST_WARNING_THRESHOLD else 'red'}'>{state.vtrust:.4f}</span>",
|
217 |
+
f"<span style='color: {'springgreen' if state.updated < UPDATED_WARNING_THRESHOLD else 'red'}'>{state.updated}</span>",
|
218 |
))
|
219 |
|
220 |
return gr.Dataframe(
|
|
|
227 |
|
228 |
|
229 |
def main():
|
230 |
+
with gr.Blocks(css=".typewriter {font-family: 'JMH Typewriter', sans-serif;}", fill_height=True, fill_width=True) as demo:
|
231 |
table = gr.Dataframe()
|
232 |
table.attach_load_event(lambda: get_data(), None)
|
233 |
demo.launch()
|