「RISC-V AI 编译器挑战赛」的线上评测平台(Flask + SQLite 的轻量 OJ 原型)。
姊妹仓 ai_compiler_challange 是赛事的策划与赛题仓库(总策划案、赛题、baseline 验证);本仓是其中"评测系统"一节的最小可运行落地。
pip install -r requirements.txt
python app.py # http://0.0.0.0:5000- Web 提交:队伍名 + 赛题(fwht / conv / spmv)+ Python 源码(≤10MB)
- 后台 worker 线程异步评测:跑选手脚本产出 RISC-V 二进制 → Spike 仿真计时 → 按
baseline/选手计分 - 排行榜(按 problem 过滤,取 top 50)+ 结果详情页(2s 轮询)
| 文件 | 职责 |
|---|---|
app.py |
Flask 入口:/api/submit、/api/result/<id>、/api/leaderboard/<problem> |
config.py |
SQLite 路径、上传/测试数据目录、评测超时 120s |
models.py |
Submission 表(team/problem/code_path/status/score/details) |
tasks.py |
内存队列 + 后台 worker 线程 |
evaluator.py |
编译选手代码、Spike 运行、解析 cycles/instructions、计分 |
templates/ |
提交页 + 结果轮询页(Bootstrap 5 CDN) |
ai_compiler_challange(赛事知识库) riscv-ai-compiler-platform(本仓)
├─ 总策划案.md ——赛事规则/赛制──────→ 排行榜、提交次数等产品需求来源
├─ 评测平台架构设计.md ——蓝图──────→ 本仓是其简化 PoC(无 Docker/Redis/MQ)
├─ 赛题.md ——三道题 fwht/conv/spmv──→ 前端下拉框、problem_id 与之一一对应
├─ 评测工具/verify_model.py ——正确性─→ 本仓尚未接入正确性校验
└─ ScratchV baseline PoC ─────────→ evaluator.py 需对接的编译接口
app.py:35使用time.time()但未 import time,提交接口会直接 500tasks.py:19引用未定义的app、未 importjson,worker 首个任务即崩- 前端
/result/<id>链接存在,但app.py没有该路由,详情页 404 - 正确性校验未接入(策划案一票否决项,
verify_model.py未对接) - 无 Docker 隔离 / 查重 / 提交限频(架构设计文档中的安全项均未落地)
evaluator.py为占位实现:Spike 路径、baseline 数据、ScratchV 接口均需按ai_compiler_challange/评测工具的实际口径修正(指南明确禁用--estimate)
flowchart LR
subgraph ACC["ai_compiler_challange(赛事知识库·策划仓)"]
ZP["总策划案.md<br/>赛制/规则/评分公式"]
JZ["评测平台架构设计.md<br/>五层架构蓝图"]
ST["赛题.md + 赛题baseline.md<br/>fwht / conv / spmv 三题定义"]
VT["评测工具/verify_model.py<br/>正确性校验(已建成)"]
PO["poc_fwht / conv_fix<br/>ScratchV baseline PoC"]
end
subgraph PLAT["riscv-ai-compiler-platform(本仓·平台实现)"]
WEB["templates/<br/>提交页+结果页"]
API["app.py<br/>Flask 3个API"]
TQ["tasks.py<br/>队列+worker"]
EV["evaluator.py<br/>编译+Spike+计分"]
DB[("platform.db<br/>Submission表")]
end
ZP -- "排行榜/99次每日/评分公式<br/>(产品需求)" --> API
JZ -- "简化落地: 去掉Docker/Redis/MQ<br/>(架构蓝图)" --> PLAT
ST -- "problem_id 三值对齐<br/>(赛题定义)" --> WEB
PO -. "ScratchV 编译接口(待对接)" .-> EV
VT -. "正确性校验(未接入)" .-> EV
flowchart TD
U["选手浏览器"] -->|"POST /api/submit<br/>(team, problem, .py)"| SUB["app.py:25<br/>保存源码+建记录"]
SUB -->|"add_task(id)"| Q["tasks.py 内存队列"]
Q --> W["worker 线程"]
W -->|"status=running"| DBT[("Submission")]
W --> EV["evaluator.py"]
EV -->|"① python3 code.py<br/>--output binary"| BIN["选手产出的 RISC-V 二进制"]
EV -->|"② spike --isa=RV64IMAC<br/>--cycles (stdin喂 case_N.in)"| SP["Spike 仿真"]
SP -->|"③ 正则抓 cycle/instruction count"| SC["计分: 3分×Σmin(1, baseline/time)"]
SC -->|"status/score/details"| DBT
U -->|"GET /api/leaderboard/:problem<br/>GET /api/result/:id (2s轮询)"| SUB
DBT --> U