AI Infra Seminars(未名超算队 × LCPU)实践作业的自动评测机,fork 自 lcpu-club/lfs-auto-grader。 单机 Docker 执行,无需 Kubernetes;对接 AOI(hpcgame.pku.edu.cn)的 Runner 协议。
AOI 后端 ──poll──▶ manager(单进程,250ms 轮询)
│ 按题目 judge.config 起一次性 Docker 容器
▼
评测容器(judge-image/*)
│ 下载学生提交 → 官方题目树 + 白名单覆盖 → 跑测试
│ 报告写入 bind mount 的 /output
▼
adapter 解析报告计分 ──PATCH/details/complete──▶ AOI
internal/manager/— 轮询 AOI、容器编排、结果上报internal/executor/— Docker 执行器(支持 GPU:gpus/shmSize配置)internal/adapters/— 报告解析适配器(注册表模式):lfs1— 纯 pytest 报告,按通过率等权计分(LFS 作业,保留自上游)wmhpc1— pytest 报告 +cuda_report.json加权合并计分(Seminars 作业)
judge-image/wmhpc1/— assignment01 评测镜像(CUDA 12.8 devel + torch/triton/tilelang)pkg/aoiclient/— AOI Runner 协议客户端pkg/judgerproto/— 容器 stdout JSON-Lines 协议(可选通道)
评测机要求:NVIDIA GPU + 驱动 + nvidia-container-toolkit + Docker。
just build # 构建 build/manager 和 build/utility
# 1. 注册 runner(token 由 AOI 组织管理员在后台生成)
./build/utility register --name <评测机名> --label wmhpc-a1 --token <registrationToken>
# 成功后生成 runner.env(RUNNER_ID / RUNNER_KEY)
# 2. 准备官方题目数据(评测容器只读挂载)
git clone git@github.com:lcpu-club/wmhpc-training-camp-x-lcpu-ai-infra-seminars.git /tmp/seminars
mkdir -p /data/wmhpc && cp -r /tmp/seminars/assignment01 /data/wmhpc/assignment01
# 3. 构建评测镜像
docker build -t crmirror.lcpu.dev/wmhpc/seminars-infra-judge-a1:latest judge-image/wmhpc1/
# 4. 启动 manager
set -a; source runner.env; set +a
ENDPOINT=https://hpcgame.pku.edu.cn ./build/manager题目在 AOI 上的 judge 配置见 judge-image/wmhpc1/problem_config.json,
其中 label 必须与 runner 注册时的 --label 一致。
- 容器下载学生 zip,解压后定位含
kernels//cuda/的根目录; - 复制只读的官方
assignment01(/official)为工作树,仅把grading/student_files.txt白名单内的学生文件覆盖进去(学生改tests/、conftest.py、Makefile不生效); WMHPC_GRADING=1下跑pytest --json-report(Triton/TileLang 题), 跳过的测试一律按未完成计;- 跑
grading/grade_cuda.sh(CUDA 题:逐目标编译运行,退出码定通过与否, 压轴题走judge_saxpy.sh七个测试点给部分分); - manager 侧
wmhpc1adapter 合并两份报告:pytest 每测试权重 1, CUDA 条目按grading/cuda_targets.txt的权重,加权得分率 × 100 为总分。
grading/ 目录随课程仓库维护(assignment01/grading/),评分范围与权重
调整不需要动本仓库。