目录

CEOSched-RL

面向云—边—端异构资源的可复现 DAG 调度与深度强化学习框架

统一调度内核 · HEFT 行为克隆 · Directed-GNN Masked PPO · 公平配对评测 · openEuler

Python PyTorch openEuler Tests License

5 分钟快速上手 · 核心成绩 · 系统设计 · 评分点对照 · 完整说明书


项目概览

CEOSched-RL 面向“基于深度强化学习的云—边—端异构计算资源管理调度方法”赛题。输入为带依赖约束的任务 DAG 和可配置的云、边、端计算节点;调度器在每一步选择一个就绪任务—可行节点组合,以最小化整体完成时间(makespan)。

本项目不仅提供一个训练后的模型,更提供一套可复用、可插拔、可审计的完整框架:

  • 一个调度语义:HEFT、EFT、BC、PPO 和评测器共享同一个 SchedulingKernel
  • 严格合法动作:ready/feasible 候选过滤、action mask、Actor 候选打分和内核校验四层一致;
  • 完整 DRL 链路:HEFT 专家轨迹 → 行为克隆 → Directed-GNN Masked PPO → Validation 早停;
  • 公平对比:同一场景、同一内核、同一验证器,逐实例计算 policy_makespan / HEFT_makespan
  • 防止数据泄漏:按 DAG 拓扑 SHA-256 指纹分组划分 train/validation/test;
  • 配置与插件化:场景、资源、训练参数和第三方策略均可通过 YAML 替换;
  • 国产操作系统验证:提供 openEuler 24.03 LTS 容器、环境快照和最小训练日志;
  • 解压即运行:统一 run.sh 支持训练、自检、冻结评测、STG/RNC 和离线展示。

项目参考 HEFT、PPO、图消息传递和 GrapheonRL Benchmark 的公开思想与数据接口;核心领域模型、调度内核、环境、算法、评测和实验治理均独立实现,不复制参考项目源码、权重或结果。

🏆 核心成绩

冻结模型在 288 个 Validation 场景上的配对结果如下。所有策略产生的调度均通过独立验证器。

策略 方法类别 相对 HEFT-Append 相对经典 HEFT-Insertion v2 合法调度率
Global EFT 启发式基线 1.11815 1.13118 100%
HEFT-Append 正式同语义基线 1.00000 1.01132 100%
PPO Greedy 纯 DRL 单次推理 0.95917 0.96939 100%
PPO Best-of-8 纯 DRL 采样增强 0.95313 ± 0.06453 0.96327 100%
HEFT-Insertion v2 经典插空参考 0.98992 1.00000 100%

主指标严格按逐实例配对计算:

mean_ratio = mean_i(policy_makespan_i / HEFT_makespan_i)

结果证据:

HEFT 口径说明

正式分母 HEFT-Append 与 RL 环境共享 append-only 节点队列语义,保证动作空间和状态转移完全一致。项目同时独立实现经典 idle-gap insertion,并以 HEFT-Insertion v2 单独报告,不把较弱基线冒充经典 HEFT。详见 HEFT 语义说明

🚀 5 分钟快速上手

1. 安装

要求 Python 3.10+。推荐使用 Conda:

bash scripts/bootstrap_conda.sh
conda activate ceosched-rl

也可以安装到已有环境:

python -m pip install -r requirements.txt
python -m pip install -e ".[train,dev]"

2. 运行自动化测试

PYTHONPATH=src python -m pytest -q

当前源码基线:72 项测试全部通过

3. 最小 BC → PPO → Validation

bash run.sh --smoke

该命令在 CPU 上完成小数据生成、HEFT 专家、BC 1 epoch、PPO 1 iteration 和 Validation,适合评委快速确认训练闭环。

4. 复现冻结模型 Validation

DEVICE=auto bash run.sh --evaluate-frozen

程序会先验证模型 SHA-256,再审计数据集并运行 288 个 Validation 场景。结果写入:

results/frozen_validation/
├── summary.json
└── per_instance.csv

5. 打开答辩展示

bash run.sh --report

打开 results/showcase/report.html,即可查看 DAG 图、HEFT/PPO 甘特图、策略对比图和训练曲线。

CEOSched-RL 离线展示报告

🧭 一键运行模式

bash run.sh --help
目标 命令 默认产物
完整 BC→PPO→Validation bash run.sh results/competition/
显式完整训练 bash run.sh --competition results/competition/
CPU 最小闭环 bash run.sh --smoke runs/openeuler_cli/
finalist 参数重训 DEVICE=cuda bash run.sh --train-finalist results/finalist_retrain_seed_2027/
冻结模型评测 bash run.sh --evaluate-frozen results/frozen_validation/
离线可视化 bash run.sh --report results/showcase/report.html
STG/RNC 训练 bash run.sh --stg <config> 由 YAML 指定
第三方策略评测 bash run.sh --evaluate-policies --config <yaml> 由 YAML 指定
openEuler 验证 bash scripts/run_openeuler.sh artifacts/openeuler*/

所有模式支持环境变量覆盖,无需修改核心代码:

DEVICE=cuda:0 \
MANIFEST=data/competition/manifest.json \
OUTPUT_ROOT=runs/my_experiment \
CHECKPOINT_ROOT=checkpoints/my_experiment \
bash run.sh --competition

顶层入口不会自动访问正式 Test。训练仅使用 Validation 选模;最终模型冻结后,Test 只执行一次并保留访问记录。

🏗️ 系统设计

flowchart LR
    C["YAML 配置"] --> S["场景生成 / STG 加载"]
    S --> D["WorkflowInstance"]
    D --> K["SchedulingKernel
唯一调度语义"] K --> E["DAG Scheduling Env"] K --> H["Random / EFT / HEFT"] K --> V["独立 Validator"] E --> O["Observation + Action Mask"] O --> BC["HEFT Behavior Cloning"] BC --> PPO["Directed-GNN Masked PPO"] H --> R["统一 Evaluator"] PPO --> R V --> R R --> A["JSON / CSV / SVG / HTML"]

唯一可信的调度内核

src/ceosched/kernel.py 统一实现:

  • 前驱就绪检查;
  • CPU、内存和标签可行性;
  • 同节点零通信与跨节点通信开销;
  • EST/EFT;
  • 节点可用时间;
  • 任务开始/完成时间;
  • makespan 更新。

所有策略最终调用同一个:

kernel.apply(task_index, node_index)

因此不会出现“HEFT、RL 和评测器分别实现不同时间模型”的不公平问题。

问题建模

任务 i 在节点 j 上的执行时间:

exec(i,j) = duration(i) / speed(j)

前驱 p 与任务 i 分配到不同节点时:

comm(p,i) = data(p,i) / min(bandwidth(node_p), bandwidth(node_i))
            + tier_latency(node_p, node_i)

最早开始和完成时间:

EST(i,j) = max(node_available(j), max_p(finish(p) + comm(p,i)))
EFT(i,j) = EST(i,j) + exec(i,j)
makespan = max_i(finish(i))

当前 MDP 使用清晰的 append-only 节点队列:任务不可抢占、每个节点串行、已调度任务不重排。

状态、动作与合法性

状态包含:

  • DAG 双向消息传递结构与 upward/downward rank;
  • 任务计算量、资源需求、ready/scheduled 状态;
  • 节点速度、容量、层级和当前可用时间;
  • 每个合法任务—节点组合的 exec、通信、EST、EFT 等 Pair 特征。

动作定义:

action = task_index × num_nodes + node_index

合法动作必须满足:

任务未调度
AND 所有前驱已调度
AND CPU/内存满足
AND required_tags ⊆ node_tags

训练和推理共享以下合法性链路:

kernel.legal_actions()
        ↓
Observation.action_mask
        ↓
Actor 只为 candidate_pairs 打分
        ↓
kernel.apply() 最终强校验

BC + Directed-GNN Masked PPO

训练路线:

HEFT 专家轨迹
→ Pairwise BC 预训练
→ 零门控迁移至 Directed-GNN Actor
→ Masked PPO 微调
→ Validation early stopping
→ best/latest checkpoint

主要稳定性设计:

  • BC warm-start,避免 PPO 从随机策略探索巨大动作空间;
  • 父→子与子→父消息传递参数独立;
  • GNN message gate 从零初始化,迁移时精确保持 BC 输出;
  • Actor/Critic 独立编码器;
  • 50→100→全部任务规模课程学习;
  • Actor/Critic 学习率退火;
  • Validation early stopping;
  • checkpoint 保存配置、数据校验和、特征 Schema 和 RNG 状态;
  • Potential-based shaping 可配置,最终获胜模型将其关闭;
  • Best-of-8 只采样纯 Actor,不调用 HEFT 补全。

📦 数据与泛化协议

正式套件由 YAML 生成:

160 个独立拓扑
× 4 种资源分布
× 3 种工作负载
= 1,920 个场景

覆盖:

  • DAG:random、layered、fork-join、chain;
  • 资源:balanced、cloud-heavy、edge-heavy、strong-heterogeneous;
  • 负载:balanced、computation-heavy、communication-heavy;
  • 独立大规模组:100~300 任务。

同一 DAG 的所有资源和负载变体共享 topology_id,分组划分保证它们只进入一个 split。audit_dataset.py 会重新计算文件哈希并检查跨 split 拓扑交集。

关键配置:

🔌 STG / RNC / GrapheonRL 数据

内置小型 STG 演示:

bash run.sh --stg configs/stg_demo.yaml

使用公开 RNC50 时,只需在 stg_rnc50.yaml 中配置 workflow 和 system JSON 路径:

DEVICE=cuda bash run.sh --stg configs/stg_rnc50.yaml

流程自动完成:

STG 导入
→ topology_id 分组划分
→ 数据审计
→ HEFT 专家
→ BC
→ PPO
→ Validation
→ summary.json / per_instance.csv / 分组报告

由于外部格式可能提供 task-feature-specific speed,而本项目核心模型采用每节点标量速度,任何有损映射都会写入 metadata,避免把不同问题语义的结果混合比较。详见 外部 STG 说明

🧩 第三方策略零代码接入

所有策略实现统一 SchedulingPolicy Protocol:

class SchedulingPolicy(Protocol):
    policy_id: str
    category: str

    def reset(self, instance): ...
    def choose(self, kernel, deterministic=True): ...

评委或用户无需修改评测器,只需在 YAML 中声明:

policy_plugins:
  - id: my_policy
    class_path: my_package.module:MyPolicy
    kwargs: {}

evaluation:
  policies: [random, global_eft, heft, my_policy]

统一评测:

bash run.sh --evaluate-policies \
  --config configs/policy_plugins_demo.yaml

框架会对所有策略使用相同场景、内核、验证器和指标。完整说明见 策略插件文档

🐧 openEuler 与运行环境

主验证平台为 openEuler 24.03 LTS

bash scripts/run_openeuler.sh

容器流程包括依赖安装、自动化测试和最小 HEFT→BC→PPO→Validation。环境文件与证据位于:

containers/Dockerfile.openEuler
environment/conda.yaml
environment/conda-cuda.yaml
environment/formal-cuda.json
artifacts/openeuler-r3/

📁 仓库结构

ceosched-rl/
├── run.sh                    # 解压即运行的统一入口
├── configs/                  # 数据、资源、BC、PPO、STG、插件配置
├── data/                     # 正式数据、示例 STG、专家轨迹
├── src/ceosched/             # 核心框架
│   ├── domain.py             # 不可变任务、节点和场景模型
│   ├── kernel.py             # 唯一 EST/EFT 调度内核
│   ├── environment.py        # 框架无关 MDP
│   ├── observations.py       # 变长特征、候选动作和 mask
│   ├── policies.py           # 策略协议、基线和 Registry
│   ├── evaluation.py         # 逐实例公平评测
│   ├── validation.py         # 独立调度验证器
│   ├── external_formats.py   # STG/GrapheonRL 格式适配
│   ├── visualization.py      # DAG、甘特图和指标图
│   └── learning/             # BC、GNN、PPO、checkpoint
├── scripts/                  # 训练、评测、审计和发布入口
├── tests/                    # 内核、算法、数据和集成测试
├── results/                  # 冻结结果与可视化报告
├── checkpoints/model.pt      # SHA-256 固定的 finalist 模型
├── environment/              # Conda、CUDA、正式环境快照
├── containers/               # openEuler 容器
├── docs/                     # 技术文档、说明书、PPT/PDF
├── artifacts/                # 审计、环境和发布身份
└── release/                  # 扁平最终提交包及 SHA-256

📊 标准输出

每次正式评测至少输出:

summary.json
per_instance.csv

summary.json 包含:

  • 指标定义和 HEFT 语义版本;
  • 场景数与策略类别;
  • mean/std/median/p90 ratio;
  • 对 HEFT 的 win rate;
  • 对经典 HEFT-Insertion v2 的独立比值;
  • valid schedule rate;
  • mean/p95 decision time;
  • Best-of-N 采样预算、种子和设备。

每个 per_instance.csv 行同时保留场景 ID、拓扑 ID、任务数、策略 makespan、两套 HEFT makespan、比值、运行时间和合法性,便于评委复算。

✅ 赛题评分点对照

评分项 项目实现 快速验证
一键训练、验证与结果 run.sh 串联完整 BC→PPO→Validation bash run.sh --smoke
模块化与配置替换 domain/kernel/env/policy/eval 分层,资源下沉 YAML 查看 configs/src/ceosched/
外部方法与统一接口 Random、EFT、双 HEFT、BC、PPO、YAML 插件 bash run.sh --evaluate-policies ...
合法动作 ready/feasible、mask、候选 Actor、内核校验 PYTHONPATH=src python -m pytest -q
指标表现 Best-of-8 对 Append 0.95313,对 Insertion v2 0.96327 bash run.sh --evaluate-frozen
泛化能力 拓扑隔离、1920 场景、100~300 任务、STG 接口 查看数据审计和分组结果
训练策略 HEFT-BC、GNN-PPO、课程学习、早停、退火、消融 docs/ppo_gnn.md
工程效率 smoke/greedy/Best-of-N 分级模式,CPU/CUDA bash run.sh --help
赛题对齐文档 建模→状态→动作→奖励→训练→评测完整对应 docs/CEOSched-RL_使用说明书.md
可复现性 Git/config/data/model/environment SHA 与冻结 Test 纪律 artifacts/finalist_r5.json
国产操作系统 openEuler 镜像、测试和 CLI 训练证据 bash scripts/run_openeuler.sh

🧪 实验纪律与可复现性

  • 数据集保存 dataset checksum 与 split checksum;
  • checkpoint 保存特征 Schema、配置、种子和优化器/RNG 状态;
  • best checkpoint 只由 Validation 指标选择;
  • Test 不参与训练、早停、超参选择或模型排名;
  • 最终模型冻结后 Test 仅访问一次;
  • 多随机种子以“训练种子”为统计单位计算 95% 置信区间;
  • 聚合器发现 HEFT 语义版本混用时拒绝排名;
  • 冻结模型 SHA-256:1b0154b8bf013716490a6c19a3b72fbd44612cd5d0f33d331a2b422e6747d649

📚 文档导航

文档 内容
完整使用说明书 安装、训练、评测、目录和常见问题
系统架构 问题模型、模块边界和调度语义
学习环境 状态、动作、奖励和专家格式
行为克隆 HEFT 专家与 BC 训练
PPO-GNN Actor/Critic、PPO 和 BC 迁移
数据协议 场景生成、指纹划分和审计
训练稳定性 early stopping、课程学习和恢复
正式实验 多种子、消融、冻结与统计
HEFT 语义 Append 与经典 Insertion 边界
STG/RNC 外部数据导入与训练
策略插件 YAML 接入第三方调度算法
openEuler 国产系统构建与运行证据
一页简介 PDF 答辩快速概览
一页简介 PPTX 可编辑答辩材料

🔍 已知边界

为保证结果透明,项目明确以下边界:

  1. 核心 MDP 是 append-only 列表调度,不支持重新插入历史空隙;经典 HEFT-Insertion 因此作为独立参考语义报告。
  2. BC 是当前性能的主要来源,PPO 承担有限微调;不宣称 GNN-PPO 单独带来全部增益。
  3. Best-of-8 以约 8 倍采样预算换取更好 makespan;部署场景可使用更快的 PPO Greedy。
  4. 正式成绩主要来自受控合成套件;框架已支持 STG/RNC,但外部数据结果应单独报告,不能与不同语义 solver 混算。

📄 许可证与原创声明

项目采用 Apache License 2.0。第三方依赖、参考算法与原创范围见 原创与开源软件声明

核心实现均为本项目独立开发;PyTorch、Gymnasium、NumPy 和 PyYAML 仅作为运行库调用。本项目未复制 GrapheonRL 或其他参赛作品的源码、模型、配置及实验结果。


推荐评委验证顺序

pytestrun.sh --smokerun.sh --evaluate-frozenrun.sh --report

关于
59.0 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号