Remove superseded architecture assets and exploratory experiment scripts
本项目针对异构环境下 DAG 工作流中任务依赖与设备能力耦合的问题,提出由大语言模型 进化先验引导的强化学习调度方法。LLM4AD 搜索得到的调度表达式提供任务与设备选择偏好; PPO 残差在训练中根据任务与资源状态调整决策,并利用下界增量奖励优化 makespan。 项目提供 openEuler Docker 交互演示,可一键启动、自选工作流,查看与 HEFT 的指标对比、 设备活跃利用率、逐任务分配和甘特图。
论文、图表和 README 统一使用以下展示名;命令行保留稳定的英文标识。
heft
peft
cp_sat
bc_mlp
vanilla_mlp_ppo
lb_mlp_ppo
no_prior_mlp_ppo
llm_prior_ppo
Vanilla、手工先验 LB-reward 与 No-prior 构成原有的 reward/prior 消融。 LLM 主算法与对应训练 seed 的手工先验 LB-reward 使用相同划分、LB reward、 50 次更新及合法动作约束;同种子配对结果比较两种完整策略的调度表现。
ready task × feasible node
method_makespan / HEFT_makespan
训练和评测共用合法动作约束。统一 evaluator 同步报告 invalid_actions_filtered,用于核对策略输出的合法性。
invalid_actions_filtered
固定先验的任务分数为 1.5 × upward_rank + 0.8 × EFT_sufferage,节点分数为 −2.5 × estimated_finish + 0.3 × processing_time。任务分数在 ready tasks 内、 节点分数在每个任务的 feasible nodes 内分别中心化并按标准差归一化,温度为 1, logit 限幅为 3。PPO 学习零初始化的残差,确定性推理按任务、节点两级选动作; 非法动作仍由 mask 排除。实现和完整特征契约见 src/drl_scheduler/algorithms/llm_normalized_aggregate_mlp_ppo/README.md。
1.5 × upward_rank + 0.8 × EFT_sufferage
−2.5 × estimated_finish + 0.3 × processing_time
src/drl_scheduler/algorithms/llm_normalized_aggregate_mlp_ppo/README.md
上图按先验发现与调度策略两段展示方法:LLM4AD 搜索并选定表达式,训练时固定该表达式; 状态特征同时进入先验打分和 PPO 残差分支,两者融合后经合法动作 mask 选择任务—节点对。 环境以 lower-bound increment reward 更新 PPO。 图的源文件为 SVG 格式。
原有 PPO 对每个候选任务—节点对拼接 12 维任务特征、12 维节点特征、 11 维配对特征和 6 维全局特征,形成 41 维输入。共享 MLP 41 → 128 → 128 → 1 为候选对生成 logit,隐藏层使用 Tanh。
41 → 128 → 128 → 1
启用 heuristic prior 时,logit 叠加任务 upward rank、预计完成时间和处理时间 构成的先验项。No-prior 关闭该先验项及对应手工提示特征。 legal_action_mask 将非法动作置为负无穷。
legal_action_mask
原有 PPO 的 Critic 对任务特征和节点特征分别做均值池化,再与 6 维全局特征 拼接为 30 维状态表示。MLP 30 → 128 → 128 → 1 输出状态价值,供 GAE 和 PPO value loss 使用。原三种 PPO 共用 Actor 和 Critic 结构。
30 → 128 → 128 → 1
调度器每一步从 ready task × feasible node 合法动作集合中选择任务—节点对, 目标是最小化 makespan。主算法 llm_prior_ppo 将固定、归一化的 LLM4AD 先验 与可训练 PPO 残差结合,使用 lower-bound increment reward。实验规模为 RNC50、RNC100、RNC300。
项目根目录/ ├─ README.md 项目、运行与测试说明 ├─ pyproject.toml Python 安装与测试配置 ├─ LICENSE 开源许可证 ├─ src/ │ ├─ drl_scheduler/ 调度器、算法和 cli/ 统一入口 │ ├─ llm4ad_next_adapter/ LLM 先验适配器 │ ├─ custom_evaluator.py 赛题评测接口兼容模块 │ └─ configs/ 算法、数据、运行和依赖配置 ├─ tests/ │ ├─ data/hetero_json/ 三个规模的固定工作流 │ ├─ benchmark_results/ 冻结评测结果和图片 │ └─ reproduction/ 冻结实验复现脚本 ├─ docs/ 决赛提交 PDF 材料 ├─ demo/ openEuler Docker 演示与 checkpoints/ 部署模型 └─ presentation/ 决赛 PPT 和演示视频
SchedulingEnv
environment.py
VectorizedSchedulerEnv
tensor_env/environment.py
TensorWorkflowDataset
tensor_env/dataset.py
SchedulerPolicy
evaluator.py
VectorizedMLPPolicy
torch_mlp_ppo/vectorized_policy.py
VectorizedMLPCheckpointPolicy
torch_mlp_ppo/evaluator_policy.py
HEFTSchedulerPolicy
PEFTSchedulerPolicy
CPSATSchedulerPolicy
algorithms/*/policy.py
逐步调度策略使用 reset/select_action;CP-SAT 与部署模型通过 solve_instance 返回完整调度。两类策略均进入统一评测器。
reset/select_action
solve_instance
graph LR A[训练验证测试数据] --> B[数据准备] B --> C[训练 LLM 主算法与对照方法] C --> D[验证集选择模型] D --> E[统一评测器] A --> E F[外部调度基线] --> E E --> G[逐实例与逐种子结果] G --> H[统计图表] G --> I[openEuler验证]
rand0000–rand0119
rand0120–rand0149
rand0150–rand0179
每个工作流先计算 method_makespan / HEFT_makespan,mean_ratio 为这些比值的平均值, 越低越好。
mean_ratio
所有学习方法先在 validation30 上选择 checkpoint,再由统一 evaluator 评测固定 test30。下表中的 LLM 行为每个规模按 validation30 选出的部署检查点结果。
点表示测试实例的均值,误差线表示 95% t 置信区间;LLM 行的浅绿色阴影标出其置信区间。 浅蓝色背景对应优于 HEFT 的比值范围。CP-SAT 括号内为限时求解得到有效解的实例数, 其均值按有效子集计算。基线逐实例记录位于 tests/benchmark_results/formal/, LLM 部署结果位于 llm_prior_test30/。
tests/benchmark_results/formal/
llm_prior_test30/
四种 PPO 使用 seeds 42–51,在固定 test30 上评测。表中为 10 个训练 seed 的 均值 ± 95% t 置信区间;每个点代表一个 seed 的 test30 均值。
箱体表示四分位区间,圆点表示独立训练 seed;数值越低越好。图中展示 Vanilla、 No-prior 和 LLM 主算法的分布。下表进一步用相同训练 seed 的手工先验模型 计算配对差值,给出直接对照。
配对差值为 LLM 减手工先验,越低越好。加粗表示该行最低均值。RNC50/100 的 配对 95% 区间低于零;RNC300 的配对均值差为 −0.0088,区间跨零。 逐 seed、逐工作流结果及胜负分布见 llm_prior_multiseed_test30/。
llm_prior_multiseed_test30/
下图展示 RNC300 的四种 PPO 方法收敛示例。曲线表示截至每次更新的验证集最优 makespan / HEFT,数值越低越好。LLM 主算法在第 4 次更新达到 0.95, 手工先验 LB-reward MLP-PPO 在第 15 次达到,Vanilla MLP-PPO 在第 50 次达到; No-prior MLP-PPO 在 50 次更新内未达到。图中纵轴放大显示 0.885–1.085 区间。 逐更新数据。
makespan / HEFT
rand0167_hetero 上,LLM 主算法将 makespan 从 HEFT 的 81.36 s 降至 66.06 s,降低 18.8%,ratio 为 0.8119。
rand0167_hetero
图中每个色块表示一个任务的执行区间,虚线表示最终 makespan。对应调度记录位于 tests/benchmark_results/schedule_case_rnc50.csv。
tests/benchmark_results/schedule_case_rnc50.csv
同一工作流上,按每台设备的任务执行总时长除以该方法的 makespan 计算活跃利用率。 八台设备的平均值为 LLM 主算法 57.1%、HEFT 46.4%。
项目已在 openEuler 24.03 LTS SP3 x86_64 虚拟机完成 CPU 兼容性验证: 46 项通用测试通过、12 项 CUDA 专用测试显式跳过,RNC50 的 7 方法 × 3 实例 smoke 产生 21 条记录。结果位于 tests/benchmark_results/openeuler/。
tests/benchmark_results/openeuler/
这是 openEuler 容器中的 CPU 模拟调度演示,使用已有模型推理。页面可选择 RNC50、RNC100、RNC300 内置任务流或上传同格式 JSON,选择调度方法后运行。 结果展示 makespan、相对 HEFT 的比值、设备活跃利用率、逐任务分配和甘特图。
从仓库根目录启动:
docker compose -f demo/compose.yaml up --build -d
打开 http://localhost:8501。输入格式、结果下载和命令行用法见 demo/README.md。
demo/README.md
llm_prior_ppo 使用固定的归一化 LLM4AD 先验、LB increment reward 和 50 次 PPO 更新。 每个训练 seed42–51 依据 validation30 选择最佳更新,再在独立 test30 上与 相同训练 seed 的手工先验 LB-PPO 配对。完整结果见 逐 seed 与逐工作流记录。
每个规模按验证集选择一个检查点的部署评测 与上述 10-seed 配对统计分别展示。实验依据汇总于 LLM 主算法证据说明。
训练与部署模型评测命令见分阶段复现。
要求 Python 3.11。CUDA 环境:
python -m venv .venv .\.venv\Scripts\Activate.ps1 python -m pip install --upgrade pip python -m pip install -r src/configs/requirements/cuda.txt python -m pip install -r src/configs/requirements/analysis.txt python -m pip install -e . --no-deps
以下命令依次执行数据准备、LLM 主算法的三规模 10-seed 训练、仓库附带的 验证集选定部署模型的 validation/test 统一评测,以及图表生成:
python -m drl_scheduler.cli all
all 的默认值为 RNC50/100/300、seeds 42–51、PPO 50 次更新、 64 个并行环境和 256 的 PPO minibatch。train 单独运行时默认 RNC50、seed42。 设备使用 auto;PPO 正式训练需要 CUDA,openEuler CPU 虚拟机用于兼容性与 smoke 验证。
all
train
auto
默认命令包含 30 个 LLM 训练运行,并评测仓库附带的全部基线部署检查点。 新训练的 30 个 seed 模型保存在 outputs/runs/;冻结的 10-seed 配对结果与 验证集选定的部署检查点保存在各自目录。配对结果可运行 python tests/verify_llm_prior_results.py 从逐 seed JSON 重新核对。 中断后可直接重跑,已有 training_summary.json 和 checkpoint 的运行会复用。
outputs/runs/
python tests/verify_llm_prior_results.py
training_summary.json
运行时文件与仓库附带的冻结结果分别列于下方主要产物。
准备三规模张量缓存和 train-only HEFT 示范:
python -m drl_scheduler.cli prepare --tasks 50 100 300
正式训练 LLM 主算法,统一 seeds 42–51:
python -m drl_scheduler.cli train ` --methods llm_prior_ppo ` --tasks 50 100 300 ` --seeds 42 43 44 45 46 47 48 49 50 51 ` --updates 50
如需重新训练原有手工先验消融和 BC 基线,显式指定方法:
python -m drl_scheduler.cli train ` --methods bc_mlp vanilla_mlp_ppo lb_mlp_ppo no_prior_mlp_ppo ` --tasks 50 100 300 ` --seeds 42 43 44 45 46 47 48 49 50 51 ` --bc-epochs 20
统一评测和绘图:
python -m drl_scheduler.cli evaluate --tasks 50 100 300 python -m drl_scheduler.cli figures python -m pytest -q
CP-SAT 默认对 RNC50 限时 30 秒,对 RNC100/300 限时 60 秒。
source/
formal/
validation/
figures/
QA.md
demo/checkpoints/
selection.json
manifest.json
tests/data/tensor_cache/
tests/data/demonstrations/
tests/benchmark_results/latest/
demo/compose.yaml
outputs/demo/runs/
tests/data/hetero_json/
src/drl_scheduler/cli/
openeuler/
数据和系统模型源自 AasishKumarSharma/grapheonrl-benchmark 及其 STG JSON 数据集。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
一种异构环境下结合LLM进化先验与下界奖励的DAG工作流强化学习调度方法
本项目针对异构环境下 DAG 工作流中任务依赖与设备能力耦合的问题,提出由大语言模型 进化先验引导的强化学习调度方法。LLM4AD 搜索得到的调度表达式提供任务与设备选择偏好; PPO 残差在训练中根据任务与资源状态调整决策,并利用下界增量奖励优化 makespan。 项目提供 openEuler Docker 交互演示,可一键启动、自选工作流,查看与 HEFT 的指标对比、 设备活跃利用率、逐任务分配和甘特图。
方法命名
论文、图表和 README 统一使用以下展示名;命令行保留稳定的英文标识。
heftpeftcp_satbc_mlpvanilla_mlp_ppolb_mlp_ppono_prior_mlp_ppollm_prior_ppoVanilla、手工先验 LB-reward 与 No-prior 构成原有的 reward/prior 消融。 LLM 主算法与对应训练 seed 的手工先验 LB-reward 使用相同划分、LB reward、 50 次更新及合法动作约束;同种子配对结果比较两种完整策略的调度表现。
MDP 定义
ready task × feasible node中选择一个任务—节点对method_makespan / HEFT_makespan训练和评测共用合法动作约束。统一 evaluator 同步报告
invalid_actions_filtered,用于核对策略输出的合法性。策略结构
LLM 主算法
固定先验的任务分数为
1.5 × upward_rank + 0.8 × EFT_sufferage,节点分数为−2.5 × estimated_finish + 0.3 × processing_time。任务分数在 ready tasks 内、 节点分数在每个任务的 feasible nodes 内分别中心化并按标准差归一化,温度为 1, logit 限幅为 3。PPO 学习零初始化的残差,确定性推理按任务、节点两级选动作; 非法动作仍由 mask 排除。实现和完整特征契约见src/drl_scheduler/algorithms/llm_normalized_aggregate_mlp_ppo/README.md。上图按先验发现与调度策略两段展示方法:LLM4AD 搜索并选定表达式,训练时固定该表达式; 状态特征同时进入先验打分和 PPO 残差分支,两者融合后经合法动作 mask 选择任务—节点对。 环境以 lower-bound increment reward 更新 PPO。 图的源文件为 SVG 格式。
手工先验消融网络
原有 PPO 对每个候选任务—节点对拼接 12 维任务特征、12 维节点特征、 11 维配对特征和 6 维全局特征,形成 41 维输入。共享 MLP
41 → 128 → 128 → 1为候选对生成 logit,隐藏层使用 Tanh。启用 heuristic prior 时,logit 叠加任务 upward rank、预计完成时间和处理时间 构成的先验项。No-prior 关闭该先验项及对应手工提示特征。
legal_action_mask将非法动作置为负无穷。原有 PPO 的 Critic 对任务特征和节点特征分别做均值池化,再与 6 维全局特征 拼接为 30 维状态表示。MLP
30 → 128 → 128 → 1输出状态价值,供 GAE 和 PPO value loss 使用。原三种 PPO 共用 Actor 和 Critic 结构。实现要点
调度器每一步从
ready task × feasible node合法动作集合中选择任务—节点对, 目标是最小化 makespan。主算法llm_prior_ppo将固定、归一化的 LLM4AD 先验 与可训练 PPO 残差结合,使用 lower-bound increment reward。实验规模为 RNC50、RNC100、RNC300。项目结构
核心类职责
SchedulingEnvenvironment.pyVectorizedSchedulerEnvtensor_env/environment.pyTensorWorkflowDatasettensor_env/dataset.pySchedulerPolicyevaluator.pyVectorizedMLPPolicytorch_mlp_ppo/vectorized_policy.pyVectorizedMLPCheckpointPolicytorch_mlp_ppo/evaluator_policy.pyHEFTSchedulerPolicy/PEFTSchedulerPolicy/CPSATSchedulerPolicyalgorithms/*/policy.py逐步调度策略使用
reset/select_action;CP-SAT 与部署模型通过solve_instance返回完整调度。两类策略均进入统一评测器。端到端流程
graph LR A[训练验证测试数据] --> B[数据准备] B --> C[训练 LLM 主算法与对照方法] C --> D[验证集选择模型] D --> E[统一评测器] A --> E F[外部调度基线] --> E E --> G[逐实例与逐种子结果] G --> H[统计图表] G --> I[openEuler验证]数据隔离
rand0000–rand0119:训练。rand0120–rand0149:验证和 checkpoint 选择。rand0150–rand0179:最终测试。实验结果
每个工作流先计算
method_makespan / HEFT_makespan,mean_ratio为这些比值的平均值, 越低越好。正式 test30 主结果
所有学习方法先在 validation30 上选择 checkpoint,再由统一 evaluator 评测固定 test30。下表中的 LLM 行为每个规模按 validation30 选出的部署检查点结果。
点表示测试实例的均值,误差线表示 95% t 置信区间;LLM 行的浅绿色阴影标出其置信区间。 浅蓝色背景对应优于 HEFT 的比值范围。CP-SAT 括号内为限时求解得到有效解的实例数, 其均值按有效子集计算。基线逐实例记录位于
tests/benchmark_results/formal/, LLM 部署结果位于llm_prior_test30/。10-seed 稳定性与消融
四种 PPO 使用 seeds 42–51,在固定 test30 上评测。表中为 10 个训练 seed 的 均值 ± 95% t 置信区间;每个点代表一个 seed 的 test30 均值。
箱体表示四分位区间,圆点表示独立训练 seed;数值越低越好。图中展示 Vanilla、 No-prior 和 LLM 主算法的分布。下表进一步用相同训练 seed 的手工先验模型 计算配对差值,给出直接对照。
配对差值为 LLM 减手工先验,越低越好。加粗表示该行最低均值。RNC50/100 的 配对 95% 区间低于零;RNC300 的配对均值差为 −0.0088,区间跨零。 逐 seed、逐工作流结果及胜负分布见
llm_prior_multiseed_test30/。LLM 先验的训练收敛示例
下图展示 RNC300 的四种 PPO 方法收敛示例。曲线表示截至每次更新的验证集最优
makespan / HEFT,数值越低越好。LLM 主算法在第 4 次更新达到 0.95, 手工先验 LB-reward MLP-PPO 在第 15 次达到,Vanilla MLP-PPO 在第 50 次达到; No-prior MLP-PPO 在 50 次更新内未达到。图中纵轴放大显示 0.885–1.085 区间。 逐更新数据。代表性调度
rand0167_hetero上,LLM 主算法将 makespan 从 HEFT 的 81.36 s 降至 66.06 s,降低 18.8%,ratio 为 0.8119。图中每个色块表示一个任务的执行区间,虚线表示最终 makespan。对应调度记录位于
tests/benchmark_results/schedule_case_rnc50.csv。同一工作流上,按每台设备的任务执行总时长除以该方法的 makespan 计算活跃利用率。 八台设备的平均值为 LLM 主算法 57.1%、HEFT 46.4%。
项目已在 openEuler 24.03 LTS SP3 x86_64 虚拟机完成 CPU 兼容性验证: 46 项通用测试通过、12 项 CUDA 专用测试显式跳过,RNC50 的 7 方法 × 3 实例 smoke 产生 21 条记录。结果位于
tests/benchmark_results/openeuler/。交互演示
这是 openEuler 容器中的 CPU 模拟调度演示,使用已有模型推理。页面可选择 RNC50、RNC100、RNC300 内置任务流或上传同格式 JSON,选择调度方法后运行。 结果展示 makespan、相对 HEFT 的比值、设备活跃利用率、逐任务分配和甘特图。
从仓库根目录启动:
打开 http://localhost:8501。输入格式、结果下载和命令行用法见
demo/README.md。复现固定 LLM 先验实验
llm_prior_ppo使用固定的归一化 LLM4AD 先验、LB increment reward 和 50 次 PPO 更新。 每个训练 seed42–51 依据 validation30 选择最佳更新,再在独立 test30 上与 相同训练 seed 的手工先验 LB-PPO 配对。完整结果见 逐 seed 与逐工作流记录。每个规模按验证集选择一个检查点的部署评测 与上述 10-seed 配对统计分别展示。实验依据汇总于 LLM 主算法证据说明。
训练与部署模型评测命令见分阶段复现。
环境
要求 Python 3.11。CUDA 环境:
实验命令
一键训练与部署评测
以下命令依次执行数据准备、LLM 主算法的三规模 10-seed 训练、仓库附带的 验证集选定部署模型的 validation/test 统一评测,以及图表生成:
all的默认值为 RNC50/100/300、seeds 42–51、PPO 50 次更新、 64 个并行环境和 256 的 PPO minibatch。train单独运行时默认 RNC50、seed42。 设备使用auto;PPO 正式训练需要 CUDA,openEuler CPU 虚拟机用于兼容性与 smoke 验证。默认命令包含 30 个 LLM 训练运行,并评测仓库附带的全部基线部署检查点。 新训练的 30 个 seed 模型保存在
outputs/runs/;冻结的 10-seed 配对结果与 验证集选定的部署检查点保存在各自目录。配对结果可运行python tests/verify_llm_prior_results.py从逐 seed JSON 重新核对。 中断后可直接重跑,已有training_summary.json和 checkpoint 的运行会复用。运行时文件与仓库附带的冻结结果分别列于下方主要产物。
分阶段复现
准备三规模张量缓存和 train-only HEFT 示范:
正式训练 LLM 主算法,统一 seeds 42–51:
如需重新训练原有手工先验消融和 BC 基线,显式指定方法:
统一评测和绘图:
CP-SAT 默认对 RNC50 限时 30 秒,对 RNC100/300 限时 60 秒。
主要产物
source/、formal/llm_prior_multiseed_test30/llm_prior_test30/、validation/figures/QA.mddemo/checkpoints/selection.json验证集选择记录与manifest.jsonSHA-256 清单tests/data/tensor_cache/、tests/data/demonstrations/、outputs/runs/、tests/benchmark_results/latest/demo/README.md、demo/compose.yamloutputs/demo/runs/赛题内容与仓库位置
formal/tests/data/hetero_json/、数据隔离llm_prior_multiseed_test30/、figures/src/drl_scheduler/cli/demo/README.md、demo/compose.yamlopeneuler/数据和系统模型源自 AasishKumarSharma/grapheonrl-benchmark 及其 STG JSON 数据集。