- 新增亮点速览、问题定义与统一指标口径 - 核心结果直接展示:三划分主表、5-seed 统计、质量-时延 Pareto、 蒸馏 Top-K、Conformal、因果在线、国产 OS 逐位复现 - 一键复现脚本带注释(生成/训练/评测/策略矩阵/Web)+ 论文级证据复现命令 - 文档索引按「核心/工程部署/历史参考」分类并逐篇加摘要,标注旧协议文档勿引用 - 补充数据集口径与诚实边界声明 |
||
|---|---|---|
| configs | ||
| data | ||
| docs | ||
| iterations | ||
| results | ||
| scripts | ||
| src/sched | ||
| swarm | ||
| tasks | ||
| tests | ||
| web | ||
| .gitignore | ||
| DAG初赛讲解视频.mp4 | ||
| README.md | ||
| git | ||
| pyproject.toml | ||
| requirements.txt | ||
| 操作系统开源创新大赛 作品原创承诺书.docx | ||
| 操作系统开源创新大赛项目答辩PPT.pptx | ||
| 操作系统开源创新大赛项目说明书.docx | ||
README.md
DRL 云-边-端异构资源调度框架
面向赛题 #16《基于深度强化学习的云-边-端异构计算资源管理调度方法》 的完整开源实现:
一套可训练、可插拔、可复现的 DAG 调度框架,把「专家启发式 + Transformer 课程强化学习候选 + 仿真择优安全选择」
统一到同一个 Policy 接口与同一个 makespan 仿真器下公平比较,并附带蒸馏快速策略、Conformal 校准、
因果在线重调度,以及在三大国产操作系统上的逐位可复现证据链。
一句话结果:主方法
safe[rlk_10+peft+heft_insertion]在三个独立划分上全面优于 HEFT 基线 (mean_ratioval 0.9322 / test 0.9427 / OOD 0.9404,HEFT=1.0,越低越好), 且经 5 个随机种子复跑确认(std ≤ 0.0041),并在 openEuler / openKylin / OpenCloudOS 上逐位复现。
目录
为什么值得看(亮点)
- 🏗️ 候选生成与安全选择解耦的混合框架:
SafeSelector对候选池(7 种启发式 + RL 多样本rlk_K)逐一真实仿真取 makespan 最小者——框架输出可证明不差于池内最强单候选,RL 候选即使不完美也能带来净收益。 - 🤖 Transformer + 四阶段课程 PPO:DAG 边偏置 self-attention + 节点 cross-attention + 上下文感知解码器;让 RL 候选首次给安全选择器带来净收益(CEED-100 上
rlk_51.0009,旧 GNN 为 1.0893,−0.088)。 - ⚡ 蒸馏 Top-K 工程策略:50 维结构特征预测候选排序,只真实运行最有希望的 K 个;~24 ms 逼近仿真择优上界,OOD 上反超含 RL 的完整方法(0.9373 vs 0.9404)。
- 📐 Conformal 覆盖校准 + OOD 检测:分布内对候选集合做 split conformal 校准(coverage ≈ 0.90),分布外用 KS 检验识别偏移并主动保守回退。
- 🔄 因果在线重调度(诚实口径):事件驱动在线仿真(节点失效/恢复、速度/带宽波动、工作负载揭示);正式评测不读取未来事件,预知结果只作为 Oracle 上界单独标注。
- 🇨🇳 三大国产 OS 逐位可复现 + 可审计证据链:同一份代码 + 数据,在 openEuler / openKylin / OpenCloudOS 原生软件源部署,1440 个 makespan(800 + 640)跨系统逐位一致,每个系统附完整安装/执行/包来源证据。
- 📊 统计严谨:主方法 5 个随机种子复跑、逐实例比值均值 + win_rate + 配对 t-test,单 checkpoint 的偶然性已闭环排除。
- 🖥️ 开箱即用的前端:Flask + ECharts 9 个页面,含可当场审计的「因果在线演示台」与「OS 兼容覆盖矩阵」(按证据文件存在性实时计算,删一个证据文件对应单元格立即变灰)。
问题定义
给定任务有向无环图 G=(V,E) 与云、边、端异构计算资源:
- 任务
i ∈ V携带计算量w_i;依赖边(i→j) ∈ E携带数据量d_ij,仅当两任务被分到不同节点时产生通信开销。 - 节点
n具有异构计算速度speed_n,节点间为带宽矩阵B;单处理机串行执行模型。 - 调度器需在满足依赖与合法动作约束下,为每个就绪任务选择执行节点,最小化整体完成时间(makespan)。
主指标(全文统一口径):
mean_ratio = mean_over_scenarios( policy_makespan / HEFT_makespan )
mean_ratio 越低越好,< 1 表示平均优于 HEFT,HEFT 恒等于 1.0。
MDP 建模(状态 / 联合动作 a = task·N + node / ready-task action mask / 归一化稀疏奖励 r = 1 − makespan/HEFT_makespan)
与代码一一对应,详见 系统设计 与 创新点 §8.1。
核心结果
全部数字来自本仓库
results/下的真实评测产物,非手填。HEFT=1.0,越低越好。
1. 主方法三划分(代表 checkpoint,seed=42)
方法 = safe[rlk_10+peft+heft_insertion](RL 多样本 + 启发式候选,仿真择优)。
| 划分 | 场景数 | mean_ratio | win_rate | 相对 HEFT |
|---|---|---|---|---|
| val | 200 | 0.9322 | 0.795 | −6.8% |
| test | 200 | 0.9427 | 0.765 | −5.7% |
| OOD(40 任务) | 100 | 0.9404 | 0.850 | −6.0% |
三个划分均严格优于任一单候选(如 rlk_10 单列 0.9436 / 0.9609 / 0.9834),验证「安全选择带来净收益」。
2. 五随机种子统计(消除单 checkpoint 偶然性)
主方法用 5 个 Transformer 种子(42–46,同配置仅改 seed)复跑五个划分,mean ± std:
| 划分 | safe[rlk_10+peft+heft_ins] | rlk_10 | rlk_5 |
|---|---|---|---|
| val | 0.9380 ± 0.0041 | 0.9648 ± 0.0179 | 0.9725 ± 0.0183 |
| test | 0.9467 ± 0.0037 | 0.9752 ± 0.0178 | 0.9836 ± 0.0195 |
| OOD | 0.9398 ± 0.0023 | 0.9842 ± 0.0153 | 0.9933 ± 0.0190 |
| CEED-100 v2 public | 0.9629 ± 0.0012 | 1.0774 ± 0.0139 | 1.0886 ± 0.0126 |
| CEED-100 v2 hidden_val | 0.9738 ± 0.0019 | — | — |
主方法 std 全部 ≤ 0.0041,远小于单 RL 候选的 ~0.018;配对 t-test 表明 seed42 非「幸运种子」。 注意 v2 上单 RL 候选
rlk_*> 1.0(RL 在通信主导 regime 泛化有限),但安全选择靠启发式候选兜底仍稳超 HEFT——这正是混合框架的价值所在。 证据:results/core_evidence/multiseed_stats.md(5 seed × 5 split = 25 个逐场景目录)。
3. 质量–时延 Pareto(val 划分,同机同口径独立计时)
| 策略 | mean_ratio | win_rate | 推理 ms/场景 | Pareto 前沿 |
|---|---|---|---|---|
safe[rlk_10+peft+heft_insertion] |
0.9322 | 0.795 | 1567.6 | ✓ |
rlk_10 |
0.9436 | 0.735 | 1544.6 | ✓ |
safe[纯启发式 6 候选] |
0.9453 | 0.720 | 37.7 | ✓ |
| 蒸馏 Top-K=3 | 0.9476 | — | ~24 | ✓ |
heft_insertion |
0.9712 | 0.390 | 3.2 | ✓ |
peft |
0.9747 | 0.470 | 4.3 | ✓ |
heft(基线) |
1.0000 | 0.000 | 3.7 | ✓ |
提供从「极致质量」到「极致时延」的完整可调谱系:蒸馏 Top-K 以约 1/65 的推理时延逼近仿真择优上界。 证据:
results/core_evidence/pareto/pareto.md。
4. 蒸馏 Top-K 工程策略(无 torch 依赖,sklearn pickle)
| 划分 | mean_ratio | 说明 |
|---|---|---|
| val | 0.9476 | 距 oracle 择优上界 0.9453 仅 0.0023 |
| test | 0.9557 | — |
| OOD | 0.9373 | win 0.840,反超含 RL 的 safe[rlk_10+…](0.9404) |
5. Conformal 覆盖校准与 OOD 检测
| 划分 | coverage | avg_K | regret | 加速 |
|---|---|---|---|---|
| val | 0.895 | 3.3 | +0.0013 | 1.14× |
| test | 0.905 | 3.4 | +0.0023 | 1.16× |
| OOD | 0.77 | — | 0.0078 | — |
OOD 的 coverage 0.77 是 KS 检测信号(p≈0,识别到分布偏移)而非缺陷——触发后全局回退保守启发式。 证据:
results/p3/conformal_gate_v2_*.md。
6. 因果在线重调度(val 200 场景)
| 方法 | mean_ratio | 口径 |
|---|---|---|
| SafeOnlineSelector(因果在线) | 1.3470 | 主表数字,不读取未来事件 |
| Oracle 上界(预知未来事件) | 1.1207 | 仅作上界,不进主表 |
因果–预知 gap = 0.226,经诊断为信息差距(oracle 提前避障),非触发时机问题;重调度触发器实验为诚实阴性。 证据:
results/online/online_val_causal/。
7. 国产 OS 逐位可复现
| 层 | 内容 | 覆盖系统 | 指纹 |
|---|---|---|---|
| L1 轻量核心 | 8 策略 × CEED-100 v1(100 场景)= 800 makespan | openEuler / openKylin / OpenCloudOS | b411f07f…7280 |
| L2 v2 场景 | 8 策略 × CEED-100 v2(80 场景)= 640 makespan | openEuler / openKylin / OpenCloudOS | 96730abc…65ad |
| L3 完整 DRL | torch + Transformer 三 split + 全量 pytest + Flask | openEuler | 与主链路 4 位小数一致 |
- 轻量核心仅依赖
numpy + 标准库,全部走各发行版原生软件源(dnf / apt),无第三方源、无编译。 - 跨三套不同 numpy 版本(1.24.2 / 1.24.3 / 1.25.2)结果逐位一致,峰值内存 35–43 MB,容器冷启动 246–328 ms。
- openEuler 完整链路:torch 2.13.0+cpu,全量 53 项测试通过,Transformer 固定 ckpt 三 split 与开发机逐位一致。
- 证据:
results/os_compat/evidence/(每系统含build.log/packages_native.txt/evidence.json等可审计文件)。
六大创新点
| # | 创新点 | 一句话主张 | 关键数字 | 证据位置 |
|---|---|---|---|---|
| 1 | 混合调度框架 | 候选生成与安全选择分离,稳超任一单候选 | val/test/OOD 0.9322 / 0.9427 / 0.9404 | results/benchmark/transformer_* |
| 2 | Transformer + 课程 RL | RL 候选首次给安全选择器带来净收益 | CEED rlk_5 1.0009(旧 GNN 1.0893) |
results/ceed100/transformer_run1/ |
| 3 | 蒸馏 Top-K 工程化 | ~24 ms 逼近上界,OOD 反超含 RL 版 | K=3:OOD 0.9373 | results/benchmark/distill_topk_* |
| 4 | Conformal + OOD 检测 | ID 覆盖校准,OOD 用 KS 检测并保守回退 | coverage ≈0.90;OOD regret 0.0078 | results/p3/conformal_gate_v2_* |
| 5 | 因果在线调度 | 因果在线仍最优;预知数字只作上界 | causal 1.3470 vs oracle 1.1207 | results/online/online_val_causal/ |
| 6 | 国产 OS 可复现 + 证据链 | 三大国产 OS 装得上、跑得通、算得逐位一致 | 800+640 makespan 指纹匹配 | results/os_compat/ |
每个创新点的「方法 / 数字 / 答辩口径 / 对答预案」详见 docs/INNOVATION.md。
系统架构
src/sched/
env/ DAG、异构资源、静态与在线仿真器(唯一 makespan 真值 compute_makespan)
scenarios/ 场景生成、加载与数据划分(固定种子区间,零重叠)
policies/ 统一 Policy 接口 + 启发式 / RL / 安全选择器 / 蒸馏 Top-K
training/ 自研 PPO、rollout、四阶段课程学习与训练入口
evaluation/ 公平评测器与指标汇总(逐实例比值 + win_rate + 分位数)
utils/ 配置、IO 与随机种子工具
scripts/ 训练、评测、基准矩阵、蒸馏、Conformal、在线、OS 兼容复现脚本
configs/ 场景 / 模型 / 训练配置(换规模与异构度只改 YAML)
web/ Flask + ECharts 可视化与因果在线演示台
tests/ 核心逻辑与 API 测试(53 项)
统一接口契约:所有调度方法实现 Policy.assign(dag, res) -> {task: node},经同一个确定性仿真器计算 makespan;
RL 的联合动作 task × node 与 ready-task action mask 在训练与推理阶段完全一致,保证行为可复现、口径可比较。
┌────────────── 候选生成(多样性)──────────────┐
DAG + 资源 ──▶ │ HEFT / HEFT-ins / CPOP / PEFT / Lookahead / │
│ EMD / CP-priority / RL 多样本 rlk_K │
└──────────────────────┬─────────────────────────┘
▼
SafeSelector:逐一真实仿真,取 makespan 最小
▼
输出(可证明 ≥ 池内最强单候选)
快速开始(一键复现)
环境:Python ≥ 3.10,CPU 即可,无显卡要求。以下命令均在仓库根目录执行。
0. 安装依赖
# 建议虚拟环境
python -m venv .venv && source .venv/bin/activate
# 安装(torch 用 CPU 构建即可;本项目不依赖 GPU)
python -m pip install -r requirements.txt
一键复现主流程(带注释)
# ── 第 1 步:生成固定场景 ─────────────────────────────────────────────
# 由 configs/scenarios_default.yaml 驱动,生成 train=600 / val=200 / test=200,
# 三个划分使用互不重叠的固定种子区间(base_seed=1234),保证可复现、零泄漏。
python scripts/generate_scenarios.py --config configs/scenarios_default.yaml
# ── 第 2 步:训练 Transformer 课程 PPO(一键完成训练 + 训练中 val 评测)──
# 产出 best.pt / final.pt / summary.json / train_log.json,无需改任何代码。
# 配置见 configs/train_attn_ppo.yaml:hidden=128, n_layers=3, heads=8,
# 4 阶段课程(<=15t -> <=30t -> <=50t -> 全尺寸),PPO 300 iter。
# CPU 上约 2.7 小时;想先跑通可临时把 total_iterations 调小。
python scripts/run_train.py --config configs/train_attn_ppo.yaml
# ── 第 3 步:单 split 公平评测(HEFT / 随机 / RL 同口径比较)──────────
# 加载第 2 步产出的 checkpoint,在 val 上跑统一评测器,产出 summary.json。
python scripts/run_eval.py \
--data data/scenarios \
--split val \
--rl_ckpt results/rl_transformer/best.pt \
--out results/summary_val.json
# ── 第 4 步:完整策略矩阵(多策略 + 逐场景 + 独立计时)─────────────────
# 注册表支持 heft / heft_insertion / cpop / peft / lookahead / emd /
# cp_priority / random / rl / rlk_K / safe[...] / distilled_topk。
# 输出 summary.json(含 mean_ratio / win_rate / 分位数 / 每场景结果)+ per_scenario.csv。
python scripts/benchmark_matrix.py \
--data data/scenarios \
--split val \
--policies 'heft,heft_insertion,peft,rlk_10,safe[rlk_10+peft+heft_insertion]' \
--rl_ckpt results/rl_transformer/best.pt \
--name final_val
# ── 第 5 步:启动 Web 可视化与在线演示台 ───────────────────────────────
python web/app.py # 访问 http://localhost:5050
复现论文级证据(可选,对应核心结果各表)
# 多 seed 统计(5 seed × 5 split,对应「核心结果 §2」)
bash scripts/run_phase4_master.sh # 串行训练 seeds 45/46 + 五 split 评测
python scripts/core_evidence_stats.py # -> results/core_evidence/multiseed_stats.{json,md}
# 质量-时延 Pareto(对应「核心结果 §3」,逐策略独立计时)
python scripts/pareto_comparison.py # -> results/core_evidence/pareto/
# 蒸馏 Top-K(对应「核心结果 §4」,无 torch 依赖)
python scripts/train_distilled_selector.py # 训练逐候选回归器
python scripts/benchmark_matrix.py --data data/scenarios --split val \
--policies 'distilled_topk' --name distill_val
# Conformal 覆盖校准 + OOD 检测(对应「核心结果 §5」)
python scripts/conformal_gate.py
# 因果在线评测(对应「核心结果 §6」,online_lookahead=False 纯因果)
python scripts/online_benchmark.py
# 国产 OS 逐位复现(对应「核心结果 §7」,需对应 OS 环境/容器)
bash scripts/os_compat/run_os_compat.sh # L1 轻量核心
bash scripts/os_compat/run_os_compat.sh v2 # L2 v2 场景
bash scripts/os_compat/run_openeuler_full.sh # L3 openEuler 完整 DRL 链路
固定挑战集 CEED-100 的 manifest 与场景已入库(
data/ceed100/、data/ceed100_v2/),无需重新生成即可复现消融与评测; v2 的hidden_test仅存 sha256 指纹、不落盘场景,防止方法开发期偷看。
Web 可视化与在线演示台
python web/app.py # 默认 http://localhost:5050
| 页面 | 路径 | 内容 |
|---|---|---|
| 总览 | / |
项目与核心指标概览(/api/overview) |
| 静态调度对比 | /schedule |
单场景 RL vs HEFT 甘特图对比(val_00000:HEFT 8.316 → RL 6.273,−25%) |
| 泛化分析 | /generalization |
三划分 + 挑战集泛化(5-seed std ≤ 0.004) |
| 鲁棒性 | /robustness |
扰动下的稳定性 |
| Conformal | /conformal |
覆盖校准与 OOD 检测可视化 |
| 在线调度 | /online |
事件驱动在线仿真结果 |
| 因果在线演示台 | /demo-online |
节点失效/带宽波动等预设,实时因果调度 vs HEFT(主秀) |
| 挑战集 | /challenge |
CEED-100 固定挑战集运行与逐场景结果 |
| OS 兼容 | /oscompat |
覆盖矩阵按 results/ 证据文件存在性实时计算,可当场审计 |
所有页面的 makespan / ratio / 重调度次数 / 决策耗时均来自真实在线仿真,无任何硬编码指标或假动画。
演示台默认策略 SafeOnlineSelector(online_lookahead=False)(纯因果在线)。
录制说明见 演示台操作 与 ≤5 分钟录制脚本。
仓库结构
dr-ce-scheduler/
├── src/sched/ 框架核心(env / scenarios / policies / training / evaluation / utils)
├── scripts/ 训练 / 评测 / 基准矩阵 / 蒸馏 / Conformal / 在线 / OS 复现脚本
├── configs/ 场景、模型与训练 YAML(换规模/异构度只改配置)
├── web/ Flask + ECharts 前端与因果在线演示台
├── tests/ 53 项核心逻辑与 API 测试
├── data/
│ ├── scenarios/ 生成数据(train/val/test,可由脚本重生成)
│ ├── scenarios_ood/ OOD 40 任务场景
│ ├── ceed100/ 固定挑战集 v1(manifest + 场景,入库)
│ └── ceed100_v2/ 固定挑战集 v2(public/hidden_val 入库,hidden_test 仅指纹)
├── results/ 结果与逐场景记录(benchmark / core_evidence / ceed100 / os_compat / logs …)
├── docs/ 设计与答辩文档(见下方索引)
└── iterations/ 阶段状态与项目摘要
文档索引(含摘要)
核心文档(当前可信,优先阅读)
| 文档 | 摘要 |
|---|---|
| 创新点与答辩依据 | 最重要的一份。六大创新点「一句话主张 + 关键数字 + 证据位置」,附赛题评分细则(功能 40 / 性能 35 / 文档 25)逐项自查表、5-seed 统计口径与答辩对答预案。 |
| 系统设计 | 问题建模、MDP(状态/动作/掩码/奖励公式)、五层架构与接口契约、reward 归一化的设计原因。 |
| 复现实验 | 运行命令、配置文件、关键超参表、数据划分(train600/val200/test200,零重叠)、输出路径与依赖版本。 |
| 国产 OS 兼容与复现 | 三层递进实验(L1 轻量核心 / L2 v2 场景 / L3 完整 DRL)、指纹与数值结果、文件级证据链与答辩预案。 |
| 演示台操作说明 | /demo-online 因果在线演示台的录屏流程与预设(节点故障等)。 |
| 演示视频录制脚本 | ≤5 分钟初赛视频的逐场景时间表、画面操作、逐字旁白、字幕与数字速查表。 |
工程与部署文档
| 文档 | 摘要 |
|---|---|
| 极简部署 | 3 步约 5 分钟,把项目传到无显卡 Linux 服务器并用 nohup 跑长训练。 |
| 无人值守部署 | 一次性在服务器上跑完全部训练变体(rsync 同步 + 后台执行)。 |
| 自动化实验闭环 | 把 DRL 调参从手工转为可复现/可扩展/可并行的实验流程:实验控制器 + 独立执行进程 + 结构化记分牌。 |
历史参考文档(基于旧评测协议,数字仅供溯源)
以下三份生成于 Phase 2 P0 修复之前的旧评测协议(各策略 order 不一致),其具体数字已被 INNOVATION.md 与
results/core_evidence/取代,请勿引用其中数字,仅作演进记录保留。
| 文档 | 摘要 |
|---|---|
| 评测与结果(历史) | 旧评测协议下的结果;顶部含 P0 修复声明,修复后同 ckpt val 1.0085 → 1.0450。 |
| 泛化分析(历史) / test 版 | 旧协议下的 val / test 子集泛化分析。 |
| 鲁棒性扰动(历史) | 旧协议下的静态参数扰动泛化(非执行中故障与在线恢复)。 |
测试
python -m pytest -q # 53 passed
覆盖:DAG / 仿真器确定性、action mask 训练-推理一致性、各策略与选择器、蒸馏、Conformal、在线仿真、OS 兼容 API。
数据集与评测口径
| 数据集 | 规模 | 用途 | 说明 |
|---|---|---|---|
data/scenarios |
train 600 / val 200 / test 200 | 训练与分布内评测 | 固定种子区间零重叠(base_seed=1234) |
data/scenarios_ood |
100 × 40 任务 | OOD 规模外泛化 | 训练未见过的更大实例 |
data/ceed100 |
100 场景 | 固定挑战集 v1 | manifest 入库,不重生成 |
data/ceed100_v2 |
public 60 / hidden_val 20 / hidden_test 仅指纹 | 固定挑战集 v2 | 防偷看:hidden_test 不落盘场景 |
- 指标:
mean_ratio = mean(策略 makespan / HEFT makespan),逐实例取比值再平均;辅助 win_rate / std / P90 / P95。 - 时延:Pareto 表中各策略同机、同口径独立计时;纯启发式 SafeSelector 耗时不冒充含 RL 方法耗时。
- 因果口径:在线评测主表只用因果数字,预知结果一律标注「Oracle 上界」。
可复现性与诚实边界
本项目把「可复现」与「诚实口径」作为一等公民:
- ✅ 逐位可复现:仿真器为确定性纯 Python 实现,makespan 指纹 =
(场景id, 策略, round(makespan,6))有序序列的 sha256;跨三套 numpy 版本与三大国产 OS 逐位一致。 - ✅ 统计严谨:主方法 5 个随机种子复跑,std ≤ 0.0041,配对 t-test 排除幸运种子。
- ✅ 防偷看:CEED-100 v2
hidden_test仅存指纹;指纹在全部策略跑完后统一计算,无法事后修改单条。 - ⚠️ 已知边界(如实声明):在 40 任务 OOD 与 CEED-100 v2 等通信主导 regime 上,单 RL 候选泛化有限(rlk_* > 1.0),此时由安全选择器中的启发式候选兜底;纯启发式 SafeSelector 在质量–时延 Pareto 上更优,工程交付可采用蒸馏 Top-K 或启发式安全池。我们对此做了完整的根因诊断(通信主导 + 绝对位置编码尺寸外推弱),而非回避。
赛题 #16 · 基于深度强化学习的云-边-端异构计算资源管理调度方法