Update README project title
面向云、边缘和终端异构计算资源的 DAG(有向无环图)任务调度实验框架。项目在统一仿真环境中实现分层强化学习、启发式搜索与基线算法,目标是在满足任务依赖和资源约束的前提下缩短工作流总完成时间(makespan),并提供可复现的训练、评测和离线可视化演示。
项目采用 Python 实现,可安装的包名为 cpn-hrl-dag,当前版本为 0.1.0。本 README 位于项目根目录;根目录的 src/ 是 Python 代码项目目录,其中的 src/cpn_hrl_dag/ 是包源码。
cpn-hrl-dag
0.1.0
src/
src/cpn_hrl_dag/
device: cuda
build
CPU 冒烟训练仅用于检查流程。完整训练和搜索的时间、内存需求随 DAG 规模、模型和候选数量变化,项目未给出统一的最低硬件配置。macOS 可参考安装命令,但仓库未提供该平台的验收记录。
依赖声明以 src/pyproject.toml 为准:
train
analysis
dev
离线演示、训练和完整测试建议安装 train,analysis,dev 三组依赖。demo/requirements.txt 记录演示的固定版本,平台验收目录保留各次运行的依赖版本。
train,analysis,dev
如需复现演示依赖,可在兼容这些版本的 Python 环境中执行 python -m pip install -r demo/requirements.txt。固定版本的 Python 要求可能高于项目包声明的最低版本;CUDA 训练应按实际驱动环境选择 PyTorch 分发版本。
python -m pip install -r demo/requirements.txt
本项目为 Python 源码项目,开发运行可直接采用下一节的可编辑安装。需要生成可分发安装包时,在已激活的虚拟环境中,从项目根目录执行:
python -m pip install build python -m build ./src --outdir ./dist
构建完成后,根目录 dist/ 中应生成 wheel(.whl)和源码分发包(.tar.gz)。当前版本的 wheel 文件名为 cpn_hrl_dag-0.1.0-py3-none-any.whl。
dist/
.whl
.tar.gz
cpn_hrl_dag-0.1.0-py3-none-any.whl
也可从项目根目录构建 openEuler CPU 容器镜像:
docker build -f src/deploy/openeuler/Dockerfile -t cpn-hrl-dag:openeuler ./src
Docker 构建需要获取基础镜像和依赖。原始数据被构建上下文的忽略规则排除,运行容器验收时应另行挂载到 /opt/optest/data/raw/。Dockerfile 默认启动平台验收脚本;具体设置见 openEuler Dockerfile。
/opt/optest/data/raw/
在项目根目录执行:
python -m venv .venv
Windows PowerShell 激活环境:
.\.venv\Scripts\Activate.ps1
Linux / macOS 激活环境:
source .venv/bin/activate
在项目根目录安装项目及训练、分析、测试依赖:
python -m pip install --upgrade pip python -m pip install -e "./src[train,analysis,dev]"
安装后可检查包是否可导入:
python -c "import cpn_hrl_dag; print('cpn_hrl_dag import OK')"
完成上一节的包构建后,也可从项目根目录执行:
python -m pip install "./dist/cpn_hrl_dag-0.1.0-py3-none-any.whl[train,analysis,dev]"
wheel 安装提供 Python 包。本文使用的 run_demo.py、实验脚本、配置、演示资产与原始数据仍需从项目目录访问;运行这些入口时应保留源码目录结构。
run_demo.py
python run_demo.py
Windows 也可以双击 run_demo.cmd。程序校验演示资源的 SHA-256,使用内置模型在 CPU 上运行 HEFT、搜索和 HRL 候选,并在完成后打开结果页面。安装依赖后,演示不需要下载完整数据集或重新训练。
run_demo.cmd
演示覆盖 50、100、300 个任务规模,每个规模包含同构与异构资源场景,共 6 个场景。默认输出到 demo/runs/<时间戳>/:
demo/runs/<时间戳>/
index.html
results.json
summary.json
metrics.csv
provenance.json
progress.jsonl
status.json
不自动打开浏览器,或指定输出目录:
python run_demo.py --no-open python run_demo.py --output demo/runs/my_demo
指定目录应为空或尚不存在。只运行一个场景:
python run_demo.py --scene grapheonrl:rnc50:rand0000:heterogeneous
--scene 可以重复传入,完整场景 ID 见 demo/manifest.json。也可以直接打开已有的 演示页面 或 四种方法对比页面 查看保存结果;查看页面不会启动新的计算。
--scene
完整训练与评测使用 Zenodo 18927122 中的 GrapheonRL 数据。原始数据归属 Aasish Kumar Sharma,演示清单记录的数据许可为 CC-BY-4.0;使用时应保留原始署名及许可信息。
原始压缩包不随 Git 仓库分发。下载后,按以下结构放置,适配器可直接读取压缩包成员,无需先全部解压:
src/data/raw/zenodo-18927122-derived/ ├── system_configs.tar.xz ├── rnc50_homo_json.tar.xz ├── rnc50_hetero_json.tar.xz ├── rnc100_homo_json.tar.xz ├── rnc100_hetero_json.tar.xz ├── rnc300_homo_json.tar.xz └── rnc300_hetero_json.tar.xz
进入代码项目目录后检查本地数据位置:
cd src python scripts/prepare_data.py
该脚本仅检查目录、系统配置包和工作流压缩包是否存在,不下载数据,也不完整校验全部压缩包内容。默认 50/100/300 任务实验需要上面列出的全部文件。
数据说明见 src/data/README.md。复现归档结果时保留固定划分文件 grapheonrl_mixed_iid_seed7.json,同一基础 DAG 的资源变体按基础 DAG 分组划分。
以下命令均在根目录下的 src/ 中运行,并以完成依赖安装和完整数据准备为前提。配置中的 data/、outputs/ 等相对路径也以该目录为基准。
data/
outputs/
运行默认 CPU 冒烟训练:
python scripts/train.py --config configs/cpn_hrl_dag.yaml
默认配置只运行少量场景和训练 episode,用于验证训练链路。权重与报告写入 src/outputs/cpn_hrl_dag_smoke/,包括 best.pt、latest.pt、训练日志、数据划分和评测报告。
src/outputs/cpn_hrl_dag_smoke/
best.pt
latest.pt
在验证集上评测 HEFT 和训练得到的 HRL:
python scripts/evaluate.py --config configs/cpn_hrl_dag.yaml --policy heft --split validation python scripts/evaluate.py --config configs/cpn_hrl_dag.yaml --policy hrl --checkpoint outputs/cpn_hrl_dag_smoke/best.pt --split validation
评测结果写入配置输出目录下的 eval_<策略>_<划分>/。其他策略包括 random、greedy、portfolio、search、hrl_safe 和 hrl_search_safe;HRL 相关策略需要 --checkpoint。模型结构、观测选项与权重应使用匹配的配置。
eval_<策略>_<划分>/
random
greedy
portfolio
search
hrl_safe
hrl_search_safe
--checkpoint
scripts/train_main_comparison.py
configs/main_gpu_3000_seed2026.yaml
scripts/train_graph_baselines.py
scripts/compare_main_models.py
scripts/evaluate_independent_hybrid.py
scripts/train_dag_pair.py
configs/generated_smoke.yaml
例如,使用可用的 CUDA 环境运行主模型训练:
python scripts/train_main_comparison.py --config configs/main_gpu_3000_seed2026.yaml
图基线示例:
python scripts/train_graph_baselines.py --config configs/zenodo_graph_ppo_comparison.yaml python scripts/train_graph_baselines.py --config configs/zenodo_tier_mappo_comparison.yaml
运行独立混合评测前,需要将 configs/hrl_independent_hybrid_seed2026.yaml 中的 checkpoint 和 search_config 改为已有实验文件的实际路径;默认值指向本地历史实验,完整实验产物未随仓库分发。
configs/hrl_independent_hybrid_seed2026.yaml
checkpoint
search_config
python scripts/evaluate_independent_hybrid.py --config configs/hrl_independent_hybrid_seed2026.yaml
每次新实验建议使用新的 output_dir。部分脚本会拒绝覆盖已有非空目录。更多参数可通过相应脚本的 --help 查看。
output_dir
--help
主要指标为同一仿真环境下相对于 HEFT 的完成时间比值:
ratio = 当前策略 makespan / HEFT makespan
ratio < 1 表示比 HEFT 更快,ratio = 1 表示相当;mean_ratio 是逐场景比值的算术平均。评测同时记录合法调度率、优于 HEFT 的比例和推理耗时。搜索策略的推理计时包含候选方案生成与选择,应结合时间开销评估收益。
ratio < 1
ratio = 1
mean_ratio
仓库保留的三种子结果使用相同的 108 个验证场景 / 54 个基础 DAG。下表摘自 mean_std.csv,数值保留六位小数:
验证集用于模型选择,因此这些数值属于验证结果。混合策略的大部分收益来自搜索分支,不能全部归因于 HRL。6 场景演示是验证集的固定子集,不能替代完整验证成绩或独立测试结果。完整说明见 三种子训练验收与结果报告。
归档目录仅保留轻量报告和表格,完整实验权重、训练日志和逐场景调度未随该目录分发;离线演示所需的精选权重单独保存在 demo/assets/。
demo/assets/
完成依赖安装后,从项目根目录进入 src/ 执行自动测试。部分数据适配器与集成测试依赖原始数据,完整验收应先按“运行方法”准备数据。
cd src python -m pytest -q
测试涵盖仿真器、动作掩码、HEFT、PPO、数据划分、搜索、混合策略、报告与实验流程。
尚未准备原始数据时,可以先在 src/ 运行不依赖原始数据的仿真器与 PPO 掩码测试:
python -m pytest -q tests/test_simulator.py tests/test_ppo_mask.py
pytest 返回码为 0 表示本次选中的测试通过;完整验收还应检查输出中的跳过项,确认所需数据相关测试实际执行。一次完整演示也可用于运行检查:在项目根目录执行 python run_demo.py --no-open,确认新输出目录中 status.json 的 status 为 complete,并查看结果中的合法调度率。
0
python run_demo.py --no-open
status
complete
仓库记录了两种 Linux 系统的虚拟机 CPU 验收:
以上数量为归档时的记录,平台冒烟验收用于证明运行兼容性。环境与结果证据见 openEuler 验收 和 openKylin 验收。
在准备好依赖和数据的 Linux 环境中,可从 src/ 运行新的验收:
python scripts/verify_platform.py --output outputs/platform_acceptance_new --execution-kind native
在虚拟机内执行时将 native 改为 vm。验收输出目录应尚不存在;脚本会生成环境信息、测试记录、训练及重载评测结果和 acceptance.json。该入口读取 Linux 系统信息,应在 Linux 环境执行。
native
vm
acceptance.json
. ├── README.md ├── run_demo.py / run_demo.cmd # 根目录演示启动入口 ├── demo/ # 内置权重、场景、网页模板与演示结果 ├── docs/ # 项目说明书及相关文档 ├── presentation/ # 展示材料目录 ├── src/ # 可安装的 Python 项目 │ ├── pyproject.toml # 包信息、依赖与 pytest 配置 │ ├── configs/ # 训练、评测、资源与平台配置 │ ├── data/ # 数据说明、固定划分与本地原始数据 │ ├── scripts/ # 数据准备、训练、评测、绘图与验收入口 │ ├── src/cpn_hrl_dag/ # 数据、环境、模型、策略、算法与评测实现 │ ├── tests/ # Python 自动化测试 │ └── deploy/openeuler/ # openEuler 容器环境 └── tests/ # 结果归档、演示审计与平台验收证据
项目说明书见 docs/项目说明书.pdf。
**提示找不到 cpn_hrl_dag**:确认使用当前虚拟环境的 Python,并在项目根目录执行 python -m pip install -e "./src[train,analysis,dev]"。
cpn_hrl_dag
python -m pip install -e "./src[train,analysis,dev]"
提示缺少 Zenodo 数据:完整训练需要手动准备原始压缩包;仅体验内置演示可以直接使用根目录的 run_demo.py。
出现 CUDA 不可用错误:检查 PyTorch 和驱动,或复制配置并设置 device: cpu、新的 output_dir。完整训练在 CPU 上可能耗时较长。
device: cpu
演示资源哈希不匹配:恢复与 demo/manifest.json 匹配的场景、权重和配置;主动更换资源时,应使用 scripts/prepare_hybrid_demo.py 重新生成演示包。
demo/manifest.json
scripts/prepare_hybrid_demo.py
输出目录已存在:为新运行指定空目录或新的路径,避免与已有结果混用。
由于本项目演示视频过大,因此按照大赛要求采用网盘链接形式提供
具体链接:
通过网盘分享的文件:演示视频.mp4 链接: https://pan.baidu.com/s/1ekoLk1HXradGP4BRYFr8SQ 提取码: w59d –来自百度网盘超级会员v7的分享
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
CPN-HRL-DAG :基于分层强化学习的 云-边-端异构计算资源管理调度方法
项目简介
面向云、边缘和终端异构计算资源的 DAG(有向无环图)任务调度实验框架。项目在统一仿真环境中实现分层强化学习、启发式搜索与基线算法,目标是在满足任务依赖和资源约束的前提下缩短工作流总完成时间(makespan),并提供可复现的训练、评测和离线可视化演示。
项目采用 Python 实现,可安装的包名为
cpn-hrl-dag,当前版本为0.1.0。本 README 位于项目根目录;根目录的src/是 Python 代码项目目录,其中的src/cpn_hrl_dag/是包源码。应用场景
系统环境
device: cuda的配置需要支持 CUDA 的 GPU、匹配的驱动与 PyTorchbuild与 setuptools;容器构建需要 DockerCPU 冒烟训练仅用于检查流程。完整训练和搜索的时间、内存需求随 DAG 规模、模型和候选数量变化,项目未给出统一的最低硬件配置。macOS 可参考安装命令,但仓库未提供该平台的验收记录。
主要功能
依赖要求
依赖声明以 src/pyproject.toml 为准:
trainanalysisdevbuild离线演示、训练和完整测试建议安装
train,analysis,dev三组依赖。demo/requirements.txt 记录演示的固定版本,平台验收目录保留各次运行的依赖版本。如需复现演示依赖,可在兼容这些版本的 Python 环境中执行
python -m pip install -r demo/requirements.txt。固定版本的 Python 要求可能高于项目包声明的最低版本;CUDA 训练应按实际驱动环境选择 PyTorch 分发版本。构建方法
本项目为 Python 源码项目,开发运行可直接采用下一节的可编辑安装。需要生成可分发安装包时,在已激活的虚拟环境中,从项目根目录执行:
构建完成后,根目录
dist/中应生成 wheel(.whl)和源码分发包(.tar.gz)。当前版本的 wheel 文件名为cpn_hrl_dag-0.1.0-py3-none-any.whl。也可从项目根目录构建 openEuler CPU 容器镜像:
Docker 构建需要获取基础镜像和依赖。原始数据被构建上下文的忽略规则排除,运行容器验收时应另行挂载到
/opt/optest/data/raw/。Dockerfile 默认启动平台验收脚本;具体设置见 openEuler Dockerfile。安装方法
创建并激活虚拟环境
在项目根目录执行:
Windows PowerShell 激活环境:
Linux / macOS 激活环境:
从源码安装
在项目根目录安装项目及训练、分析、测试依赖:
安装后可检查包是否可导入:
安装构建产物
完成上一节的包构建后,也可从项目根目录执行:
wheel 安装提供 Python 包。本文使用的
run_demo.py、实验脚本、配置、演示资产与原始数据仍需从项目目录访问;运行这些入口时应保留源码目录结构。运行方法
离线演示
在项目根目录执行:
Windows 也可以双击
run_demo.cmd。程序校验演示资源的 SHA-256,使用内置模型在 CPU 上运行 HEFT、搜索和 HRL 候选,并在完成后打开结果页面。安装依赖后,演示不需要下载完整数据集或重新训练。演示覆盖 50、100、300 个任务规模,每个规模包含同构与异构资源场景,共 6 个场景。默认输出到
demo/runs/<时间戳>/:index.htmlresults.jsonsummary.json/metrics.csvprovenance.jsonprogress.jsonl/status.json不自动打开浏览器,或指定输出目录:
指定目录应为空或尚不存在。只运行一个场景:
--scene可以重复传入,完整场景 ID 见 demo/manifest.json。也可以直接打开已有的 演示页面 或 四种方法对比页面 查看保存结果;查看页面不会启动新的计算。完整实验的数据准备
完整训练与评测使用 Zenodo 18927122 中的 GrapheonRL 数据。原始数据归属 Aasish Kumar Sharma,演示清单记录的数据许可为 CC-BY-4.0;使用时应保留原始署名及许可信息。
原始压缩包不随 Git 仓库分发。下载后,按以下结构放置,适配器可直接读取压缩包成员,无需先全部解压:
进入代码项目目录后检查本地数据位置:
该脚本仅检查目录、系统配置包和工作流压缩包是否存在,不下载数据,也不完整校验全部压缩包内容。默认 50/100/300 任务实验需要上面列出的全部文件。
数据说明见 src/data/README.md。复现归档结果时保留固定划分文件 grapheonrl_mixed_iid_seed7.json,同一基础 DAG 的资源变体按基础 DAG 分组划分。
训练与评测
以下命令均在根目录下的
src/中运行,并以完成依赖安装和完整数据准备为前提。配置中的data/、outputs/等相对路径也以该目录为基准。小规模训练与基线评测
运行默认 CPU 冒烟训练:
默认配置只运行少量场景和训练 episode,用于验证训练链路。权重与报告写入
src/outputs/cpn_hrl_dag_smoke/,包括best.pt、latest.pt、训练日志、数据划分和评测报告。在验证集上评测 HEFT 和训练得到的 HRL:
评测结果写入配置输出目录下的
eval_<策略>_<划分>/。其他策略包括random、greedy、portfolio、search、hrl_safe和hrl_search_safe;HRL 相关策略需要--checkpoint。模型结构、观测选项与权重应使用匹配的配置。正式训练与扩展实验
scripts/train_main_comparison.pyconfigs/main_gpu_3000_seed2026.yamlscripts/train_graph_baselines.pyscripts/compare_main_models.pyscripts/evaluate_independent_hybrid.pyscripts/train_dag_pair.pyconfigs/generated_smoke.yaml例如,使用可用的 CUDA 环境运行主模型训练:
图基线示例:
运行独立混合评测前,需要将
configs/hrl_independent_hybrid_seed2026.yaml中的checkpoint和search_config改为已有实验文件的实际路径;默认值指向本地历史实验,完整实验产物未随仓库分发。每次新实验建议使用新的
output_dir。部分脚本会拒绝覆盖已有非空目录。更多参数可通过相应脚本的--help查看。指标与已有结果
主要指标为同一仿真环境下相对于 HEFT 的完成时间比值:
ratio < 1表示比 HEFT 更快,ratio = 1表示相当;mean_ratio是逐场景比值的算术平均。评测同时记录合法调度率、优于 HEFT 的比例和推理耗时。搜索策略的推理计时包含候选方案生成与选择,应结合时间开销评估收益。仓库保留的三种子结果使用相同的 108 个验证场景 / 54 个基础 DAG。下表摘自 mean_std.csv,数值保留六位小数:
mean_ratio验证集用于模型选择,因此这些数值属于验证结果。混合策略的大部分收益来自搜索分支,不能全部归因于 HRL。6 场景演示是验证集的固定子集,不能替代完整验证成绩或独立测试结果。完整说明见 三种子训练验收与结果报告。
归档目录仅保留轻量报告和表格,完整实验权重、训练日志和逐场景调度未随该目录分发;离线演示所需的精选权重单独保存在
demo/assets/。测试方法
自动化测试
完成依赖安装后,从项目根目录进入
src/执行自动测试。部分数据适配器与集成测试依赖原始数据,完整验收应先按“运行方法”准备数据。测试涵盖仿真器、动作掩码、HEFT、PPO、数据划分、搜索、混合策略、报告与实验流程。
尚未准备原始数据时,可以先在
src/运行不依赖原始数据的仿真器与 PPO 掩码测试:pytest 返回码为
0表示本次选中的测试通过;完整验收还应检查输出中的跳过项,确认所需数据相关测试实际执行。一次完整演示也可用于运行检查:在项目根目录执行python run_demo.py --no-open,确认新输出目录中status.json的status为complete,并查看结果中的合法调度率。Linux 平台验收
仓库记录了两种 Linux 系统的虚拟机 CPU 验收:
以上数量为归档时的记录,平台冒烟验收用于证明运行兼容性。环境与结果证据见 openEuler 验收 和 openKylin 验收。
在准备好依赖和数据的 Linux 环境中,可从
src/运行新的验收:在虚拟机内执行时将
native改为vm。验收输出目录应尚不存在;脚本会生成环境信息、测试记录、训练及重载评测结果和acceptance.json。该入口读取 Linux 系统信息,应在 Linux 环境执行。已知限制
目录结构
项目说明书见 docs/项目说明书.pdf。
常见问题
**提示找不到
cpn_hrl_dag**:确认使用当前虚拟环境的 Python,并在项目根目录执行python -m pip install -e "./src[train,analysis,dev]"。提示缺少 Zenodo 数据:完整训练需要手动准备原始压缩包;仅体验内置演示可以直接使用根目录的
run_demo.py。出现 CUDA 不可用错误:检查 PyTorch 和驱动,或复制配置并设置
device: cpu、新的output_dir。完整训练在 CPU 上可能耗时较长。演示资源哈希不匹配:恢复与
demo/manifest.json匹配的场景、权重和配置;主动更换资源时,应使用scripts/prepare_hybrid_demo.py重新生成演示包。输出目录已存在:为新运行指定空目录或新的路径,避免与已有结果混用。
演示视频
由于本项目演示视频过大,因此按照大赛要求采用网盘链接形式提供
具体链接:
通过网盘分享的文件:演示视频.mp4 链接: https://pan.baidu.com/s/1ekoLk1HXradGP4BRYFr8SQ 提取码: w59d –来自百度网盘超级会员v7的分享