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"]
CEOSched-RL
面向云—边—端异构资源的可复现 DAG 调度与深度强化学习框架
统一调度内核·HEFT 行为克隆·Directed-GNN Masked PPO·公平配对评测·openEuler5 分钟快速上手 · 核心成绩 · 系统设计 · 评分点对照 · 完整说明书
项目概览
CEOSched-RL 面向“基于深度强化学习的云—边—端异构计算资源管理调度方法”赛题。输入为带依赖约束的任务 DAG 和可配置的云、边、端计算节点;调度器在每一步选择一个就绪任务—可行节点组合,以最小化整体完成时间(makespan)。
本项目不仅提供一个训练后的模型,更提供一套可复用、可插拔、可审计的完整框架:
SchedulingKernel;policy_makespan / HEFT_makespan;run.sh支持训练、自检、冻结评测、STG/RNC 和离线展示。🏆 核心成绩
冻结模型在 288 个 Validation 场景上的配对结果如下。所有策略产生的调度均通过独立验证器。
主指标严格按逐实例配对计算:
结果证据:
HEFT 口径说明
正式分母
HEFT-Append与 RL 环境共享 append-only 节点队列语义,保证动作空间和状态转移完全一致。项目同时独立实现经典 idle-gap insertion,并以HEFT-Insertion v2单独报告,不把较弱基线冒充经典 HEFT。详见 HEFT 语义说明。🚀 5 分钟快速上手
1. 安装
要求 Python 3.10+。推荐使用 Conda:
也可以安装到已有环境:
2. 运行自动化测试
当前源码基线:72 项测试全部通过。
3. 最小 BC → PPO → Validation
该命令在 CPU 上完成小数据生成、HEFT 专家、BC 1 epoch、PPO 1 iteration 和 Validation,适合评委快速确认训练闭环。
4. 复现冻结模型 Validation
程序会先验证模型 SHA-256,再审计数据集并运行 288 个 Validation 场景。结果写入:
5. 打开答辩展示
打开
results/showcase/report.html,即可查看 DAG 图、HEFT/PPO 甘特图、策略对比图和训练曲线。🧭 一键运行模式
bash run.shresults/competition/bash run.sh --competitionresults/competition/bash run.sh --smokeruns/openeuler_cli/DEVICE=cuda bash run.sh --train-finalistresults/finalist_retrain_seed_2027/bash run.sh --evaluate-frozenresults/frozen_validation/bash run.sh --reportresults/showcase/report.htmlbash run.sh --stg <config>bash run.sh --evaluate-policies --config <yaml>bash scripts/run_openeuler.shartifacts/openeuler*/所有模式支持环境变量覆盖,无需修改核心代码:
🏗️ 系统设计
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统一实现:所有策略最终调用同一个:
因此不会出现“HEFT、RL 和评测器分别实现不同时间模型”的不公平问题。
问题建模
任务
i在节点j上的执行时间:前驱
p与任务i分配到不同节点时:最早开始和完成时间:
当前 MDP 使用清晰的 append-only 节点队列:任务不可抢占、每个节点串行、已调度任务不重排。
状态、动作与合法性
状态包含:
动作定义:
合法动作必须满足:
训练和推理共享以下合法性链路:
BC + Directed-GNN Masked PPO
训练路线:
主要稳定性设计:
📦 数据与泛化协议
正式套件由 YAML 生成:
覆盖:
同一 DAG 的所有资源和负载变体共享
topology_id,分组划分保证它们只进入一个 split。audit_dataset.py会重新计算文件哈希并检查跨 split 拓扑交集。关键配置:
🔌 STG / RNC / GrapheonRL 数据
内置小型 STG 演示:
使用公开 RNC50 时,只需在 stg_rnc50.yaml 中配置 workflow 和 system JSON 路径:
流程自动完成:
由于外部格式可能提供 task-feature-specific speed,而本项目核心模型采用每节点标量速度,任何有损映射都会写入 metadata,避免把不同问题语义的结果混合比较。详见 外部 STG 说明。
🧩 第三方策略零代码接入
所有策略实现统一
SchedulingPolicyProtocol:评委或用户无需修改评测器,只需在 YAML 中声明:
统一评测:
框架会对所有策略使用相同场景、内核、验证器和指标。完整说明见 策略插件文档。
🐧 openEuler 与运行环境
主验证平台为 openEuler 24.03 LTS:
容器流程包括依赖安装、自动化测试和最小 HEFT→BC→PPO→Validation。环境文件与证据位于:
📁 仓库结构
📊 标准输出
每次正式评测至少输出:
summary.json包含:每个
per_instance.csv行同时保留场景 ID、拓扑 ID、任务数、策略 makespan、两套 HEFT makespan、比值、运行时间和合法性,便于评委复算。✅ 赛题评分点对照
run.sh串联完整 BC→PPO→Validationbash run.sh --smokeconfigs/与src/ceosched/bash run.sh --evaluate-policies ...PYTHONPATH=src python -m pytest -qbash run.sh --evaluate-frozendocs/ppo_gnn.mdbash run.sh --helpdocs/CEOSched-RL_使用说明书.mdartifacts/finalist_r5.jsonbash scripts/run_openeuler.sh🧪 实验纪律与可复现性
1b0154b8bf013716490a6c19a3b72fbd44612cd5d0f33d331a2b422e6747d649。📚 文档导航
🔍 已知边界
为保证结果透明,项目明确以下边界:
📄 许可证与原创声明
项目采用 Apache License 2.0。第三方依赖、参考算法与原创范围见 原创与开源软件声明。
核心实现均为本项目独立开发;PyTorch、Gymnasium、NumPy 和 PyYAML 仅作为运行库调用。本项目未复制 GrapheonRL 或其他参赛作品的源码、模型、配置及实验结果。
推荐评委验证顺序
pytest→run.sh --smoke→run.sh --evaluate-frozen→run.sh --report