课题30:CI 基准编排 + Dashboard
难度:高 | 类型:参考分析 | 源文件:
scratchv/ci/ci_benchmark.py,scratchv/ci/dashboard.py状态:✅ 已完成
概述
CI 基准系统自动运行 ScratchV vs LLVM 的性能对比,生成纯静态 HTML 仪表盘。Dashboard 展示静态/动态指令数对比、缓存命中率,是评估 ScratchV 编译优化进展的核心可视化工具。
理解背景
是什么?
CI 基准系统自动运行 ScratchV vs LLVM 的性能对比,生成纯静态 HTML 仪表盘,展示:
- 静态指令数对比:按算子和指令类别拆分
- 动态指令数对比:带百分比差异
- 缓存命中率 & 时间估算
- 综合评分:绿/黄/红 badge 标记差距大小
make bench-ci
│
├─→ ci_benchmark.py ← 编排器:运行 LLVM 对比
│ └─→ llvm_cache_compare.py
│
└─→ dashboard.py ← 可视化:JSON → HTML dashboard
└─→ benchmark_reports/dashboard.html (纯静态, 零依赖)
为什么?
- 持续监控:每次 push 自动运行,防止性能衰退
- 决策依据:优化是否有效?数据说话
- 可视化:好看的图表比一页数字更有说服力
代码走读
一键运行
# 完整 CI 基准(LLVM 对比 + Dashboard 生成)
make bench-ci
一键运行
# 完整 CI 基准(LLVM 对比 + Dashboard 生成)
make bench-ci
# 完整 CI 基准(LLVM 对比 + Dashboard 生成)
make bench-ci
实际输出:
python3 scratchv/ci/ci_benchmark.py \
--model-registry ci_models.json \
--output-dir benchmark_reports/ \
--html dashboard.html \
--json-out ci_data.json \
--md github_summary.md \
--embed-json \
--skip-cache
Dashboard: benchmark_reports/dashboard.html
JSON data: benchmark_reports/ci_data.json
GitHub summary: benchmark_reports/github_summary.md
只生成 Dashboard(使用已有数据)
# 先单独运行 LLVM 对比
python3 scratchv/standalone/llvm_cache_compare.py \
--json-output /tmp/llvm_vs_scratchv.json
# 再生成 Dashboard
python3 scratchv/ci/dashboard.py --run -o /tmp/dashboard.html
# 先单独运行 LLVM 对比
python3 scratchv/standalone/llvm_cache_compare.py \
--json-output /tmp/llvm_vs_scratchv.json
# 再生成 Dashboard
python3 scratchv/ci/dashboard.py --run -o /tmp/dashboard.html
Dashboard 是纯静态 HTML(CSS 内嵌,零外部依赖),直接用浏览器打开即可。
当前性能关键数据
来自 llvm_cache_compare.py 的实际运行结果:
| 指标 | LLVM | ScratchV | 比值 |
|---|---|---|---|
| 静态指令数 | 1059 | 887 | 0.84× (ScratchV 更少!) |
| 动态指令数 | ~18.5 亿 | ~22.0 亿 | 1.19× |
| LLVM IR 静态 | 1102 | — | — |
| 估算时间 @100MHz | 24.3s | 39.1s | 1.6× |
| CPI | ~1.32 | ~1.34 | — |
Dashboard 数据流
llvm_cache_compare.py → llvm_vs_scratchv.json
│
dashboard.py
│
┌─────────────┴─────────────┐
▼ ▼
dashboard.html ci_data.json
(静态指令+Cache) (结构化数据)
动手练习
练习 1: 生成自己的 Dashboard
llvm_cache_compare.py → llvm_vs_scratchv.json
│
dashboard.py
│
┌─────────────┴─────────────┐
▼ ▼
dashboard.html ci_data.json
(静态指令+Cache) (结构化数据)
练习 1: 生成自己的 Dashboard
运行 make bench-ci,用浏览器打开 benchmark_reports/dashboard.html,找出 ScratchV 和 LLVM 差距最大的维度。
练习 2: 添加新指标
在 dashboard.py 中添加一个新指标列(比如"每 MAC 指令数"),重新生成 dashboard。
练习 3: 自定义样式
修改 dashboard.py 中的 CSS 变量,改变 dashboard 的颜色主题。
常见坑
| 坑 | 说明 |
|---|---|
| CI 超时 | bench-ci 运行较久(LLVM 对比 + HTML 生成),CI 要设置足够的 timeout |
| JSON 缓存 | 如果之前的 JSON 文件存在,dashboard 可能用旧数据。使用 --skip-cache 强制重新运行 |
| Python 版本 | 推荐 Python 3.12,本地开发如果用其他版本可能结果略有差异 |