目录

CEOSched-RL

让工作流调度,从启发式走向可学习、可验证。

云—边—端异构工作流调度 · 轻量强化学习 · 可复现评测

Python 3.10 PyTorch 2.7 582 parameters Apache-2.0

快速开始 · 界面展示 · 实验结果 · 方法设计 · 训练与复现 · 文档导航

CEOSched-RL 是一套面向云、边、端异构计算环境的工作流调度与强化学习训练评测框架。它将工作流表示为有向无环图(DAG),联合决定下一步选择哪个就绪任务、将任务分配到哪个可行节点,在依赖、资源与通信约束下优化总完成时间(makespan)。

从场景配置、策略训练到排程校验与可视化,项目提供一条可运行、可检查、可扩展的实验流程,适用于静态异构工作流调度研究、策略比较与教学展示。

CEOSched-RL 真实调度工作台:DAG、任务详情与调度指标
真实运行截图:使用本次训练生成的模型进行调度,查看 DAG、任务详情与完成时间。

为什么使用 CEOSched-RL?

能力 你可以做什么
🧠 582 参数轻量策略 使用两个小型 MLP 分别为任务和节点评分,在启发式先验上学习决策修正。
🔗 约束与后继代价感知 同时考虑依赖、节点可行性、预计完成时间、乐观后继代价和剩余独占资源负载。
⚡ 缓存推理 复用静态特征,增量更新动态状态,融合评分计算,并核对优化前后的排程一致性。
✅ 独立排程校验 检查任务完整性、资源可行性、依赖通信时序、节点执行冲突与最终 makespan。
🧪 统一训练与评测 执行三种子从头训练、四域验证、逐实例比较,导出模型、日志与结果收据。
🖥️ 本地交互演示 操作真实调度、DAG 与甘特图、逐步动作回放、训练曲线和证据导出。

🚀 快速开始

1. 准备环境

推荐 Linux x86_64 / WSL2 + Conda + Python 3.10。常规运行使用 CPU,无需 GPU、Node.js 或外部 AI API。

克隆或解压完整项目后,进入包含 demo/、tests/ 和 src/ 的项目根目录。以下命令均从该目录执行:

# 创建项目提供的独立 CPU 环境
export CORE_DIR="$PWD/src/ceosched-rl"
conda env create -f "$CORE_DIR/environment/conda.yaml"
conda activate ceosched-rl-cpu

# 指定解释器并检查运行条件
export PYTHON_BIN="$CONDA_PREFIX/bin/python"
bash "$CORE_DIR/run.sh" --doctor

项目直接运行 Python 源码,无需前端打包;Numba 在首次调用时编译。首次安装依赖需要网络,环境就绪后可本地运行。

依赖版本与可选安装

固定 CPU 环境配置见 environment/conda.yaml。

组件 配置版本 用途
Python 3.10 运行时
PyTorch 2.7.0+cpu 模型与 PPO 训练
NumPy 2.2.6 数值计算
Numba / llvmlite 0.65.1 / 0.47.0 CPU 调度与推理加速
PyYAML / Gymnasium 6.0.3 / 1.2.3 配置与环境接口
pytest / pytest-cov 9.0.3 / ≥4.1 测试

仅执行通用的 pip install -e . 不会配齐正式方法所需依赖。先创建上述环境;如需安装命令行包,再执行:

"$PYTHON_BIN" -m pip install --no-deps --no-build-isolation -e "$CORE_DIR"

图表重绘另需 Matplotlib。原生 Windows 未作为正式验收环境;CUDA 为可选训练路径,缓存推理仍在 CPU 上执行。

2. 启动演示

bash demo/run.sh

浏览器打开 **http://127.0.0.1:8765**,选择场景和策略,执行调度即可查看结果。

  • 调度工作台:查看 DAG、任务分配、甘特图与动作回放。
  • 训练与验证:从头训练三个种子,查看实际曲线、四域结果,并使用新模型调度。
  • 实验与证据 / 复现与部署:比较结果、导出证据,获取复现入口。

端口冲突时使用 bash demo/run.sh --port 8875。只想浏览内置示例,可直接打开 demo/index.html;静态页面展示冻结数据,真实调度和训练需启动服务。

3. 运行一次无界面调度

"$PYTHON_BIN" demo/worker.py \
  --request demo/request.json \
  --output runs/demo_01

结果包含 result.json、records.json、trace.json、receipt.json 等文件,可检查排程、逐步动作和运行身份。输出目录需为新目录,再次运行请更换名称。

🖼️ 界面展示

排程对照:同轴甘特图与独立校验

展示任务落在哪个节点、何时执行,以及排程是否通过独立校验。此图来自随包保留的冻结演示记录。

从头训练:三种子进度与实际训练曲线

曲线展示训练样本代价与 Train 内部开发集指标;完整训练完成后再进行四域验证。

训练完成:本次四域验证与新模型应用

此图对应演示中本次训练的结果;下方主成绩表使用正式冻结模型,两者分别保留。

📊 实验结果

正式主方法为 **R10 三种子冻结模型 + CachedContextPolicy**。以相同场景下的 HEFT-Append 为基准,统计逐场景完成时间比值:

Ratio=makespanCEOSched-RLmakespanHEFT-Append\mathrm{Ratio}=\frac{\mathrm{makespan}_{\mathrm{CEOSched\text{-}RL}}}{\mathrm{makespan}_{\mathrm{HEFT\text{-}Append}}}

Ratio 越低越好,低于 1 表示完成时间更短。 下表为三个固定种子的均值及种子间样本标准差。

Validation 域 场景数 完成时间比值 ↓ 相对基准平均改善 ↑
Synthetic 288 0.955278 ± 0.003906 4.47%
RNC50 27 0.900903 ± 0.002700 9.91%
RNC100 27 0.952597 ± 0.002451 4.74%
RNC300 27 0.945909 ± 0.002316 5.41%

数据来源:域汇总 CSV · 逐实例冻结记录 · 结果与分析

统计口径: 共 369 个场景、1107 条三种子记录,全部为有效排程;其中保留了 133 条相对 HEFT-Append 退化的记录。改善率为 1 − mean_ratio,不代表每个实例都更优。Synthetic 的 288 个场景来自 24 个拓扑的变体,场景数不等于独立拓扑数。

公开 Validation 参与过历史开发;RNC300 的任务规模在训练范围内。以上结果用于公开验证集比较,不作为隐藏 Test 成绩或规模外推结论。

🧠 方法设计

联合选择任务与节点

策略将一个调度动作分解为两步:先在就绪任务中选任务,再在其可行节点中选节点。

π(t,n∣s)=πtask(t∣s)  πnode(n∣s,t)\pi(t,n\mid s)=\pi_{\mathrm{task}}(t\mid s)\;\pi_{\mathrm{node}}(n\mid s,t)

两个候选共享的 16 → 16 → 1 MLP 分别负责两阶段评分,包含可学习的先验系数,总计 582 个参数。上下文结合任务优先级、预计完成时间、乐观后继代价与剩余独占资源负载,使当前决策能够考虑后续任务的执行条件。

训练采用 PPO,以完整排程相对 HEFT 的归一化完成时间构造优化信号;同图多条轨迹通过 leave-one-out 基线降低方差。推理采用单轨迹 greedy 决策。

从策略到可复核排程

flowchart TD
    A["DAG、节点与通信配置"] --> B["调度状态与合法候选"]
    B --> C["任务评分:选择就绪任务"]
    C --> D["节点评分:选择可行节点"]
    D --> E["应用动作并更新状态"]
    E -->|仍有任务| B
    E -->|排程完成| F["独立校验器"]
    F --> G["结果、轨迹与运行收据"]

上图展示逻辑决策过程。缓存实现复用静态特征和动态统计量;预生成的动作序列由统一 Kernel 重放,再交给独立校验器检查。优化同时核对动作与排程一致性。

实现 代码入口
双阶段 Actor 与先验评分 context_actor.py
PPO 与完整轨迹训练 context_training.py
特征、状态与调度计算 fast_dispatch.py
静态缓存与推理优化 context_inference.py
统一调度内核 / 独立校验 kernel.py / validation.py

当前正式方法使用上述上下文策略;仓库保留的早期 GNN 等研究模块不属于这组主成绩。

🔬 训练与复现

完成快速开始中的环境设置后,按目标选择一个命令。每次使用新的输出目录:

# 复核三个冻结模型:四域、369 个场景
bash "$CORE_DIR/run.sh" --evaluate-frozen --output "$PWD/runs/frozen_01"

# 正式从头训练:3 个种子,各 1200 轮,再进行四域验证
bash "$CORE_DIR/run.sh" --submission --device cpu --output "$PWD/runs/train_01"

# 流程检查:3 个种子,各 2 轮,不用于证明正式模型质量
bash "$CORE_DIR/run.sh" --smoke --output "$PWD/runs/smoke_01"

训练配置见 r10_context_multiseed.json,种子为 2026 / 2027 / 2028。选模使用 Train 内部开发集;输出包含模型、阶段日志、report.html、summary.json、scoreboard.csv 和逐实例记录。

成功运行应同时满足:退出码为 0、receipt.json 中 status=complete、summary.json 中 acceptance.passed=true。正式重训按预设门槛验收:零失败、每域每种子平均 Ratio 小于 1,且域三种子均值不超过冻结值加 0.015。

正式全链验收预算为 4 CPU、16 GiB 内存、7200 秒,属于验收配置;实际耗时随硬件与环境变化。可视化训练结果保存在 runs/interactive-demo/。关闭网页不会停止训练,请使用页面停止按钮或停止所属服务。

openEuler 容器构建与运行

安装 Docker 后,在项目根目录构建依赖镜像并启动演示:

docker build \
  -f src/ceosched-rl/containers/Dockerfile.submission.openEuler \
  -t ceosched-rl:r10-openeuler-20260929 \
  src/ceosched-rl

bash demo/deploy.sh

访问 **http://127.0.0.1:8766**。首次构建需要网络;部署脚本以只读方式挂载源码,并独立保存结果。

演示容器默认配额为 4 CPU、2 GiB;正式完整训练应按 16 GiB 验收预算配置。更多镜像和部署选项见 演示说明 与 openEuler 文档。

🧪 测试与验证

项目将材料核验、回归测试、冻结复核与正式训练分开,便于按验证目标选择入口。

# 仅核对文件、统计与已记录门槛;只需 Python 标准库
python3 tests/tools/verify_materials.py

# 核心回归、约束检查、插件与真实默认调度
"$PYTHON_BIN" tests/tools/run_validation.py \
  --suite quick --output runs/check_quick_01

# 训练演示边界测试:单独执行,补充 quick 套件
PYTHONPATH=src/ceosched-rl/src:src/ceosched-rl:src/ceosched-rl/examples \
  "$PYTHON_BIN" -m pytest tests/test_demo_training.py -q

完整测试入口见 测试说明 和 训练演示验收。run_validation.py 还提供 frozen、supplementary、train 套件;每次运行需指定新的输出目录。

原始证据位于 tests/materials/,统计报告位于 tests/reports/,结论索引见 tests/claims.json。下载后可本地打开 tests/index.html 浏览报告。随包历史验收记录与当前机器重新运行的结果分别保留。

🧩 扩展自己的策略

调度策略通过 reset(instance) 和 choose(kernel, deterministic=True) 接入,返回 Decision(task, node)。策略从 kernel.legal_actions() 选择合法动作,共用调度内核与独立校验器。

在 YAML 中声明外部策略即可接入评测:

policy_plugins:
  - id: my_policy
    class_path: my_package.module:MyPolicy
    kwargs:
      weight: 0.5

evaluation:
  policies: [heft, global_eft, my_policy]

以上为配置片段;完整接口、数据配置和可运行示例见 策略插件文档。任务规模、DAG 类型、节点能力与通信条件可通过 configs/ 调整。

📚 文档导航

想了解什么 从这里开始
演示操作、训练与结果导出 demo/README.md
R10 训练与复现细节 r10_reproduction.md
场景、数据划分与评测协议 dataset_protocol.md
HEFT 对照与调度语义 heft_semantics.md
独立消融实验 r11_reproduction.md
测试与原始证据 tests/README.md
第三方代码、数据与许可 THIRD_PARTY_NOTICES.txt

核心代码位于 src/ceosched-rl/src/ceosched/;demo/ 提供交互入口,tests/ 保存验证工具和证据,src/ceosched-rl/artifacts/ 保存冻结模型及历史实验材料。

📌 已知限制

  • 静态模拟范围。 当前面向已知 DAG 的离线调度;不包含在线任务到达、迁移、故障恢复或实体集群执行。openEuler 验证覆盖容器用户空间。
  • 资源与时序语义。 任务非抢占,每节点串行、尾部追加;CPU、内存及能力标签用于判断可行性。就绪表示前驱已分配,实际开始仍需等待完成和数据到达;通信模型不包含链路竞争。
  • 比较口径。 主成绩使用 HEFT-Append;HEFT-Insertion 的插空语义不同,作为单独参考。公开数据采用标量 CPU 投影,不能直接与原始任意成本矩阵实验排名。
  • 性能与泛化。 平均完成时间改善不保证逐实例占优;同后端优化的 HEFT 仍更快。调度质量、决策耗时和 JIT 冷启动分别统计;当前结果不支持大图全局最优或隐藏测试集泛化主张。
  • 运行边界。 演示默认本机访问,未提供公网多用户认证。评测器没有单实例硬隔离超时,正式流水线使用阶段预算;不同环境重训可能产生不同权重。

🤝 参与改进

欢迎通过 Issue 或 Pull Request 讨论调度策略、场景配置、测试与文档。复现问题时,请附上运行命令、配置、随机种子、环境信息及相关日志;比较新策略时,请保留逐实例结果和独立校验记录。

📄 许可证与致谢

项目自有源码采用 Apache License 2.0,第三方依赖与数据遵循各自许可证。

公开工作流数据来自 GrapheonRL Benchmark dataset v1.0(DOI: 10.5281/zenodo.18927122,CC BY 4.0),本项目使用 public_scalar_cpu_projection 转换。完整署名、转换说明与许可文本见 数据来源记录 和 第三方声明。

感谢 HEFT、PEFT、PPO 等相关研究,以及 PyTorch、NumPy、Numba 和 openEuler 生态为本项目提供的方法与工程基础。

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

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