Skip to content

Commit fb9c2c2

Browse files
committed
move milestone display to backend
1 parent 6676656 commit fb9c2c2

File tree

2 files changed

+93
-83
lines changed

2 files changed

+93
-83
lines changed

src/kernelbot/cogs/leaderboard_cog.py

Lines changed: 3 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import math
21
from datetime import datetime, timedelta
32
from io import StringIO
43
from typing import TYPE_CHECKING, List, Optional
@@ -23,9 +22,8 @@
2322
RunItem,
2423
SubmissionItem,
2524
)
26-
from libkernelbot.report import make_benchmark_log
2725
from libkernelbot.submission import SubmissionRequest, prepare_submission
28-
from libkernelbot.utils import format_time, run_item_to_run_result, setup_logging
26+
from libkernelbot.utils import format_time, setup_logging
2927

3028
if TYPE_CHECKING:
3129
from kernelbot.main import ClusterBot
@@ -611,53 +609,10 @@ async def get_task_milestones(
611609
):
612610
await interaction.response.defer(ephemeral=True)
613611

614-
message = f"# Milestones for `{leaderboard_name}`\n"
615-
616612
try:
617-
with self.bot.leaderboard_db as db:
618-
lb = db.get_leaderboard(leaderboard_name)
619-
milestones = db.get_leaderboard_milestones(leaderboard_id=lb["id"])
620-
621-
if len(milestones) == 0:
622-
await send_discord_message(
623-
interaction,
624-
f"Leaderboard `{leaderboard_name}` does not provide any milestones",
625-
ephemeral=True,
626-
)
627-
return
628-
629-
for milestone in milestones:
630-
message += f"## {milestone['name']}\n"
631-
message += milestone["description"] + "\n"
632-
with self.bot.leaderboard_db as db:
633-
runs = db.get_runs_generic(milestone_id=milestone["id"])
634-
635-
runs = [r for r in runs if r["mode"] == SubmissionMode.LEADERBOARD.value]
636-
637-
if len(runs) == 0:
638-
message += "⚠️ No runs available. Maybe they haven't been triggered yet?\n"
639-
640-
if gpu is not None:
641-
runs = [r for r in runs if r["runner"] == gpu]
642-
if len(runs) == 0:
643-
message += f"⚠️ No runs available for GPU {gpu}\n"
644-
645-
max_len = 0
646-
min_val = float("inf")
647-
for run in runs:
648-
max_len = max(max_len, len(run["runner"]))
649-
min_val = min(min_val, run["score"])
650-
651-
digits = max(0, 1 - math.floor(math.log10(min_val)))
652-
653-
message += "```\n"
654-
for run in runs:
655-
message += f" {run['runner']:<{max_len}}: {run['score']:.{digits}f}\n"
656-
message += "```\n\n"
657-
658613
await send_discord_message(
659614
interaction,
660-
message,
615+
self.bot.backend.get_milestone_overview(leaderboard_name, gpu),
661616
ephemeral=True,
662617
)
663618

@@ -685,41 +640,7 @@ async def show_milestone_result(
685640
gpu: Optional[str] = None,
686641
):
687642
await interaction.response.defer(ephemeral=True)
688-
with self.bot.leaderboard_db as db:
689-
lb = db.get_leaderboard(leaderboard_name)
690-
milestones = db.get_leaderboard_milestones(leaderboard_id=lb["id"])
691-
692-
selected = None
693-
for milestone in milestones:
694-
if milestone["name"].lower() == milestone_name.lower():
695-
selected = milestone
696-
break
697-
698-
if selected is None:
699-
await send_discord_message(
700-
interaction,
701-
f"Could not find milestone `{milestone_name}` for leaderboard `{leaderboard_name}`",
702-
ephemeral=True,
703-
)
704-
return
705-
706-
with self.bot.leaderboard_db as db:
707-
runs = db.get_runs_generic(milestone_id=selected["id"])
708-
709-
runs = [r for r in runs if r["mode"] == SubmissionMode.LEADERBOARD.value]
710-
711-
if len(runs) == 0:
712-
await send_discord_message(
713-
interaction,
714-
f"⚠️ No runs available for milestone `{milestone_name}`."
715-
"Maybe they haven't been triggered yet?",
716-
ephemeral=True,
717-
)
718-
return
719-
720-
for run in runs:
721-
log = make_benchmark_log(run_item_to_run_result(run))
722-
message = f"{milestone_name} on {run['runner']}\n```{log}```\n"
643+
for message in self.bot.backend.get_milestone_result(leaderboard_name, milestone_name, gpu):
723644
await send_discord_message(
724645
interaction,
725646
message,

src/libkernelbot/backend.py

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import asyncio
22
import copy
3+
import math
34
from datetime import datetime
45
from types import SimpleNamespace
56
from typing import Optional
@@ -11,12 +12,13 @@
1112
MultiProgressReporter,
1213
RunProgressReporter,
1314
generate_report,
15+
make_benchmark_log,
1416
make_short_report,
1517
)
1618
from libkernelbot.run_eval import FullResult
1719
from libkernelbot.submission import ProcessedSubmissionRequest, compute_score
1820
from libkernelbot.task import LeaderboardTask, build_task_config
19-
from libkernelbot.utils import setup_logging
21+
from libkernelbot.utils import KernelBotError, run_item_to_run_result, setup_logging
2022

2123
logger = setup_logging(__name__)
2224

@@ -224,3 +226,90 @@ async def handle_submission(
224226

225227
def _get_arch(self, gpu_type: GPU):
226228
return GPU_TO_SM[gpu_type.name]
229+
230+
def get_milestone_overview(self, leaderboard_name: str, gpu: Optional[str] = None) -> str:
231+
"""
232+
Generates a message that gives an overview over milestone performance.
233+
"""
234+
message = f"# Milestones for `{leaderboard_name}`\n"
235+
236+
with self.bot.leaderboard_db as db:
237+
lb = db.get_leaderboard(leaderboard_name)
238+
milestones = db.get_leaderboard_milestones(leaderboard_id=lb["id"])
239+
240+
if len(milestones) == 0:
241+
return f"Leaderboard `{leaderboard_name}` does not provide any milestones"
242+
243+
for milestone in milestones:
244+
message += f"## {milestone['name']}\n"
245+
message += milestone["description"] + "\n"
246+
with self.bot.leaderboard_db as db:
247+
runs = db.get_runs_generic(milestone_id=milestone["id"])
248+
249+
runs = [r for r in runs if r["mode"] == SubmissionMode.LEADERBOARD.value]
250+
251+
if len(runs) == 0:
252+
message += "⚠️ No runs available. Maybe they haven't been triggered yet?\n"
253+
254+
if gpu is not None:
255+
runs = [r for r in runs if r["runner"] == gpu]
256+
if len(runs) == 0:
257+
message += f"⚠️ No runs available for GPU {gpu}\n"
258+
259+
max_len = 0
260+
min_val = float("inf")
261+
for run in runs:
262+
max_len = max(max_len, len(run["runner"]))
263+
min_val = min(min_val, run["score"])
264+
265+
digits = max(0, 1 - math.floor(math.log10(min_val)))
266+
267+
message += "```\n"
268+
for run in runs:
269+
message += f" {run['runner']:<{max_len}}: {run['score']:.{digits}f}\n"
270+
message += "```\n\n"
271+
272+
return message
273+
274+
async def get_milestone_result(
275+
self,
276+
leaderboard_name: str,
277+
milestone_name: str,
278+
gpu: Optional[str] = None,
279+
) -> list[str]:
280+
with self.db as db:
281+
lb = db.get_leaderboard(leaderboard_name)
282+
milestones = db.get_leaderboard_milestones(leaderboard_id=lb["id"])
283+
284+
selected = None
285+
for milestone in milestones:
286+
if milestone["name"].lower() == milestone_name.lower():
287+
selected = milestone
288+
break
289+
290+
if selected is None:
291+
raise KernelBotError(
292+
f"Could not find milestone `{milestone_name}` for leaderboard `{leaderboard_name}`"
293+
)
294+
295+
with self.db as db:
296+
runs = db.get_runs_generic(milestone_id=selected["id"])
297+
298+
runs = [r for r in runs if r["mode"] == SubmissionMode.LEADERBOARD.value]
299+
300+
if len(runs) == 0:
301+
return [
302+
f"⚠️ No runs available for milestone `{milestone_name}`. Maybe they haven't been triggered yet?"
303+
]
304+
if gpu is not None:
305+
runs = [r for r in runs if r["runner"] == gpu]
306+
307+
if len(runs) == 0:
308+
return [f"⚠️ No runs available for GPU {gpu}"]
309+
310+
messages = []
311+
for run in runs:
312+
log = make_benchmark_log(run_item_to_run_result(run))
313+
messages.append(f"{milestone_name} on {run['runner']}\n```{log}```\n")
314+
315+
return messages

0 commit comments

Comments
 (0)