Skip to content

Aununo/scheduler

Repository files navigation

C3 Scheduler

赛道 C3“算子调度与模型部署”的完整提交实现,覆盖 C3.1–C3.5。最新要求以 赛题说明C3.5 Worker 协议赛道三 Q&A为准;文档冲突及实测结论见 更新核对记录,最终目录结构见 提交要求。旧版评分说明仅作为历史参考。

仓库结构

scheduler/              C3.1–C3.4 图 IR、策略、融合、内存规划
export_dag.py           C3.1 DAG 导出入口
infer.py                C3.5 CuPy 推理运行时
infer_worker.py         C3.5 持久化 worker 入口
tests/                  独立自测脚本
tools/benchmark.py      2 warmup + 5 timed + NVML 20ms 基准工具
docs/                   最新赛题文档与更新说明
package_submission.py   确定性提交包生成器

模型、测试数据、私钥、服务器信息和测试输出不会进入提交包。开发容器中的最新版四模型 资料包位于 /workspace/C3/testcases;仓库内旧资料包只保留三个小模型,便于日常回归, BigFormer 的约 18GB 外部权重不纳入版本控制。

评测命令

C3.1:

python3 export_dag.py --onnx {onnx} --output {output}

C3.5:

python3 infer_worker.py

本地查看 ONNX DAG 可视化网页:

python3 visualize.py /path/to/model.onnx

网页会自动打开并覆盖 C3.1–C3.5:DAG、精度路由、Kernel 分解与调优、融合检查、内存与 多流执行计划、运行时兼容性和正式 benchmark 命令;各模块报告均可导出 JSON。也可以载入 export_dag.py 生成的纯 C3.1 JSON 文件。服务仅监听 127.0.0.1:8000,按 Ctrl+C 退出;用 --batch-size 可以调整 C3.2 problem size 的动态 batch。

worker 启动后只向 stdout 输出 READY 和逐任务 JSON;日志、异常均写 stderr。评测机在 同一进程内对一个模型连续发送任务,结束后发送 {"cmd":"exit"}

实现摘要

  • C3.1:稳定导出输入、输出、节点和数据依赖边,兼容空名及重复节点名。
  • C3.2:覆盖 fp32/fp16/fp8/fp4 路由、关键算子分解、中间张量与合法 tuning 参数。
  • C3.3:实现题面五类融合 pattern,并保留图输入、输出和数值等价性。
  • C3.4:best-fit 设备内存池、lifetime slot 复用、pinned H2D、权重预取和多流事件同步均 接入实际运行路径。
  • C3.5:支持公开图实际出现的 18 类算子(题面 17 类加 Identity);BigFormer 外部权重 以 mmap 读取,首次预热时将大型 QKV、FFN 和方形投影缓存为 fp16,再在 768MiB 设备窗口 内逐层上传、回收;cuBLAS GEMM 使用 fp32 累加和输出,小型输出头保持严格 fp32。同一 worker 内复用已校验的 ONNX 元数据,静态张量末次使用位置通过单遍图扫描生成。

自测

每个脚本直接运行,不依赖 pytest:

python3 tests/c31_selftest.py
python3 tests/c32_selftest.py
python3 tests/c32_selftest.py --include-transformer
python3 tests/c32_selftest.py --full-fp32
python3 tests/c33_selftest.py
python3 tests/c34_selftest.py
python3 tests/c35_selftest.py
python3 tests/worker_selftest.py
python3 tests/robustness_test.py
python3 tests/web_selftest.py

小模型端到端检查:

python3 smoke_test.py --model mlp
python3 smoke_test.py --model resnet
python3 smoke_test.py --model transformer

在官方服务器验证单个性能模型:

python3 tools/benchmark.py \
  --worker "python3 infer_worker.py" \
  --onnx /workspace/C3/testcases/models/bigformer_v1.onnx \
  --case /workspace/C3/testcases/testdata/c35/bigformer_v1 \
  --batch-size 64

该工具遵循正式协议:每个模型启动新 worker,2 次预热、5 次计时取中位数,计时阶段以 20ms 间隔读取 NVML 绝对显存并取五次峰值最大值。

H200 MIG 最终基线

公开样例、batch 64、正式 worker 口径:

模型 计时中位数 NVML 峰值 最大绝对误差 准确率
MLP 0.103s 不计性能分 1.53e-5 98.35%
ResNet 5.085s 557,842,432B 8.58e-6 93.51%
Transformer 1.070s 不计性能分 3.34e-5
BigFormer 3.811s 4,651,483,136B 1.06e-3

四个模型均通过官方 selfcheck_worker.py 的完整 2+5、多轮输出、精度和干净退出检查。 ResNet 与 BigFormer 的显存结果由仓库 benchmark 以 20ms NVML 绝对值采样得到。 BigFormer 的最大绝对误差可高于单独的 atol,但仍满足正式的 atol + rtol * abs(golden) 逐元素条件。

打包

以下命令只生成可放入最终 C3/ 目录的组件源码包,不是完整赛道 C 总包:

python3 package_submission.py dist/c3-submission.tgz
sha256sum dist/c3-submission.tgz
tar -tzf dist/c3-submission.tgz

打包器使用源码白名单和固定 tar 元数据;同一源码可重复生成相同 SHA-256,组件根目录中的 说明文件名为规范要求的 readme.md。正式提交前还需将其内容与 C1/C2/ 一起放进 TrackC-成员编号姓名-.../,再按成员信息生成同名 .zip。本仓库不包含 C1、C2 或成员信息, 因此不会自行生成最终总包。

About

ONNX inference runtime optimized for NVIDIA H200 MIG, featuring kernel scheduling, operator fusion, and memory planning.

Resources

Stars

Watchers

Forks

Contributors

Languages