Skip to content

Commit cd4c7bc

Browse files
committed
split leaderboard task into definition and runner-relevant things
1 parent 056634a commit cd4c7bc

6 files changed

Lines changed: 217 additions & 121 deletions

File tree

src/discord-cluster-manager/cogs/admin_cog.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from discord.ext import commands, tasks
1616
from discord_utils import leaderboard_name_autocomplete, send_discord_message, with_error_handling
1717
from leaderboard_db import LeaderboardDoesNotExist, LeaderboardItem, SubmissionItem
18-
from task import LeaderboardTask, make_task
18+
from task import LeaderboardDefinition, make_task_definition
1919
from ui.misc import ConfirmationView, DeleteConfirmationModal, GPUSelectionView
2020
from utils import (
2121
KernelBotError,
@@ -169,7 +169,7 @@ async def leaderboard_create_local(
169169

170170
directory = Path(env.PROBLEM_DEV_DIR) / directory
171171
assert directory.resolve().is_relative_to(Path.cwd() / env.PROBLEM_DEV_DIR)
172-
task = make_task(directory)
172+
definition = make_task_definition(directory)
173173

174174
# clearly mark this leaderboard as development-only
175175
leaderboard_name = directory.name + "-dev"
@@ -203,7 +203,7 @@ async def leaderboard_create_local(
203203
interaction,
204204
leaderboard_name,
205205
datetime.now(timezone.utc) + timedelta(days=365),
206-
task=task,
206+
definition=definition,
207207
forum_id=forum_id,
208208
gpu=gpu.value if gpu else None,
209209
):
@@ -238,7 +238,7 @@ async def leaderboard_create_impl( # noqa: C901
238238
interaction: discord.Interaction,
239239
leaderboard_name: str,
240240
deadline: str,
241-
task: LeaderboardTask,
241+
definition: LeaderboardDefinition,
242242
gpus: Optional[str | list[str]],
243243
):
244244
if len(leaderboard_name) > 95:
@@ -271,13 +271,13 @@ async def leaderboard_create_impl( # noqa: C901
271271
forum_thread = await forum_channel.create_thread(
272272
name=leaderboard_name,
273273
content=self._leaderboard_opening_message(
274-
leaderboard_name, date_value, task.description
274+
leaderboard_name, date_value, definition.description
275275
),
276276
auto_archive_duration=10080, # 7 days
277277
)
278278

279279
success = await self.create_leaderboard_in_db(
280-
interaction, leaderboard_name, date_value, task, forum_thread.thread.id, gpus
280+
interaction, leaderboard_name, date_value, definition, forum_thread.thread.id, gpus
281281
)
282282
if not success:
283283
await forum_thread.delete()
@@ -323,7 +323,7 @@ async def create_leaderboard_in_db(
323323
interaction: discord.Interaction,
324324
leaderboard_name: str,
325325
date_value: datetime,
326-
task: LeaderboardTask,
326+
definition: LeaderboardDefinition,
327327
forum_id: int,
328328
gpu: Optional[str | list[str]] = None,
329329
) -> bool:
@@ -350,14 +350,12 @@ async def create_leaderboard_in_db(
350350
with self.bot.leaderboard_db as db:
351351
try:
352352
db.create_leaderboard(
353-
{
354-
"name": leaderboard_name,
355-
"deadline": date_value,
356-
"task": task,
357-
"gpu_types": selected_gpus,
358-
"creator_id": interaction.user.id,
359-
"forum_id": forum_id,
360-
}
353+
name=leaderboard_name,
354+
deadline=date_value,
355+
definition=definition,
356+
gpu_types=selected_gpus,
357+
creator_id=interaction.user.id,
358+
forum_id=forum_id,
361359
)
362360
except KernelBotError as e:
363361
await send_discord_message(
@@ -617,12 +615,13 @@ async def _create_update_plan( # noqa: C901
617615
if name in leaderboards:
618616
# check for differences
619617
old = leaderboards[name] # type: LeaderboardItem
620-
new_task = make_task(source)
618+
new_def = make_task_definition(source)
619+
new_task = new_def.task
621620

622621
# from the database, we get datetime with timezone,
623622
# so we need to convert here to enable comparison
624623
new_dl = self._parse_deadline(problem["deadline"])
625-
new_dl = new_dl.astimezone()
624+
new_dl = new_dl.astimezone(timezone.utc)
626625
if old["deadline"] != new_dl:
627626
pass
628627
elif old["gpu_types"] != problem["gpus"]:
@@ -729,15 +728,17 @@ async def update_competition(
729728
interaction,
730729
entry["name"],
731730
entry["deadline"],
732-
make_task(root / entry["directory"]),
731+
make_task_definition(root / entry["directory"]),
733732
entry["gpus"],
734733
)
735734
steps += "done\n"
736735

737736
for entry in update_list:
738737
with self.bot.leaderboard_db as db:
739-
task = make_task(root / entry["directory"])
740-
db.update_leaderboard(entry["name"], entry["deadline"], task)
738+
task = make_task_definition(root / entry["directory"])
739+
db.update_leaderboard(
740+
entry["name"], self._parse_deadline(entry["deadline"]), task
741+
)
741742
new_lb: LeaderboardItem = db.get_leaderboard(entry["name"])
742743

743744
forum_id = new_lb["forum_id"]

src/discord-cluster-manager/cogs/leaderboard_cog.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -266,14 +266,10 @@ async def lang_autocomplete(
266266
return [discord.app_commands.Choice(name=c, value=c) for c in candidates]
267267

268268

269-
def add_header_to_template(lang: str, lb: LeaderboardItem):
270-
template_file = lb["task"].templates[lang]
271-
269+
def add_header_to_template(lang: str, code: str, lb: LeaderboardItem):
272270
comment_char = {"CUDA": "//", "Python": "#", "Triton": "#", "HIP": "#"}[lang]
273271

274-
description_comment = [
275-
f"{comment_char} > {line}" for line in lb["task"].description.splitlines()
276-
]
272+
description_comment = [f"{comment_char} > {line}" for line in lb["description"].splitlines()]
277273
header = f"""
278274
{comment_char}!POPCORN leaderboard {lb["name"]}
279275
@@ -287,7 +283,7 @@ def add_header_to_template(lang: str, lb: LeaderboardItem):
287283
{comment_char} Happy hacking!
288284
289285
"""[1:]
290-
return header + template_file + "\n"
286+
return header + code + "\n"
291287

292288

293289
class LeaderboardCog(commands.Cog):
@@ -566,12 +562,11 @@ async def get_task_template(
566562

567563
try:
568564
with self.bot.leaderboard_db as db:
569-
leaderboard_item = db.get_leaderboard(leaderboard_name) # type: LeaderboardItem
565+
templates = db.get_leaderboard_templates(leaderboard_name)
566+
leaderboard_item = db.get_leaderboard(leaderboard_name)
570567

571-
if lang not in leaderboard_item["task"].templates:
572-
langs = "\n".join(
573-
(f"* {lang} " for lang in leaderboard_item["task"].templates.keys())
574-
)
568+
if lang not in templates:
569+
langs = "\n".join((f"* {lang} " for lang in templates.keys()))
575570
await send_discord_message(
576571
interaction,
577572
f"Leaderboard `{leaderboard_name}` does not have a template for `{lang}`.\n" # noqa: E501
@@ -580,7 +575,7 @@ async def get_task_template(
580575
)
581576
return
582577

583-
template = add_header_to_template(lang, leaderboard_item)
578+
template = add_header_to_template(lang, templates[lang], leaderboard_item)
584579
ext = {"CUDA": "cu", "Python": "py", "Triton": "py", "HIP": "py"}
585580
file_name = f"{leaderboard_name}.{ext[lang]}"
586581
file = discord.File(fp=StringIO(template), filename=file_name)

src/discord-cluster-manager/cogs/verify_run_cog.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from discord_reporter import MultiProgressReporterDiscord
1717
from discord_utils import send_discord_message, with_error_handling
1818
from leaderboard_db import RunItem, SubmissionItem
19-
from task import make_task
19+
from task import make_task_definition
2020
from utils import setup_logging
2121

2222
logger = setup_logging()
@@ -52,12 +52,12 @@ async def trigger_run(self, interaction: discord.Interaction, gpu: GPU, reporter
5252
sub_code = create_mock_attachment(
5353
"submission.py", Path("examples/identity_py/submission.py").read_text()
5454
)
55-
task = make_task("examples/identity_py")
55+
task = make_task_definition("examples/identity_py")
5656
else:
5757
sub_code = create_mock_attachment(
5858
"test.cu", Path("examples/identity_cuda/submission.cu").read_text()
5959
)
60-
task = make_task("examples/identity_cuda")
60+
task = make_task_definition("examples/identity_cuda")
6161

6262
return await submit_leaderboard(
6363
interaction,
@@ -184,7 +184,7 @@ async def verify_task(
184184
await send_discord_message(interaction, f"Invalid path {directory.resolve()}")
185185
return
186186
try:
187-
task = make_task(directory)
187+
task = make_task_definition(directory)
188188
except Exception as E:
189189
logger.exception("Could not make task", exc_info=E)
190190
await send_discord_message(interaction, f"Invalid task {directory}")

0 commit comments

Comments
 (0)