docs(readme): surface repository migration notice
📌 提交说明:受官方提交渠道账号关联异常影响,队伍注销原账号并重新提交后,早期 GitLink 开发活动记录未能迁移;当前仓库已保留重建后的分阶段提交记录。😢
EulerPilot-MA 是一个面向 openEuler 的用户态资源管控 Agent 框架。项目以 CPU 资源管控为首个验证场景:系统从 eBPF、procfs、压力停顿信息(Pressure Stall Information,PSI)和应用侧指标中提取运行特征,识别 workload 类型与竞争风险;本地大语言模型(Large Language Model,LLM)在慢环中生成受约束的策略意图;确定性状态机快环在安全边界内执行、续租、降级和回滚。
系统的核心数据与控制链路如下:
eBPF / procfs / PSI / 应用指标精细感知 -> 决策树 workload 分类与风险特征提取 -> 本地 LLM 慢环生成目标条件化策略边界 -> 状态机快环在安全边界内执行、续租、降级和回滚 -> cgroup v1/cpuset 或 sched_ext/scx 后端执行
系统并不让大模型实时调度 CPU。LLM 仅在慢环中输出可校验的策略意图或策略描述语言(Policy Domain-Specific Language,Policy DSL);500 ms 快环只执行经 Skill/Tool 注册表、JSON Schema 和资源守护器校验后的动作,从而将模型推理延迟隔离在在线控制关键路径之外。
图 1|EulerPilot-MA 的观测、感知、策略规划、确定性执行与反馈闭环。
查看高清框架及流程图(PDF)
技术报告.pdf
原创承诺书.pdf
演示视频.mp4
答辩演示.pptx
docs/presentation/EulerPilot-MA-Competition-Presentation.pptx
docs/submission/GITLINK_SUBMISSION_GUIDE.md
SkillRegistry
LatencySensitive
Throughput
Background
ResourceBrief
StrategyPlan
这套分层使学习模型负责“选择目标和策略边界”,确定性控制器负责“何时执行以及如何安全退出”。即使模型不可用、输出非法或推理超时,500 ms 快环仍能依靠最近有效租约或规则策略继续运行。
sched_ext/scx 由运行时能力探测决定:内核支持时启用 scx 专家,不支持时自动降级到当前可用的资源控制后端,并完整记录选择与回滚原因。
sched_ext/scx
Skill420 是一条 420 秒连续 workload 时间流,覆盖低压校准、服务请求突发、批处理竞争、短任务扰动、混合过载、局部恢复、重复压力、后台噪声、路由窗口和最终冷却。所有对比方法均在同一时间流上运行,完整原始结果和统计口径保存在仓库中。
在线分类器从每个任务窗口提取 16 维特征,包括 eBPF CPU 指纹、运行时间增量、在核时间、上下文切换、唤醒频率、运行比例、窗口任务总量和 CPU 排名等。决策树将任务划分为低时延任务(LatencySensitive)、吞吐任务(Throughput)和后台任务(Background),分类结果进入 ResourceBrief,用于修正语义场景、干扰评分和快环风险判断;分类器本身不直接修改系统资源。
在线发布模型采用 75%/25% 分层划分,独立留出集包含 14,913 条样本,Accuracy 为 99.48%、Macro-F1 为 98.97%。低时延类 Precision/Recall 为 99.79% / 99.52%,吞吐类为 99.95% / 99.48%,后台类为 95.94% / 99.22%。图 2 展示的是同一模型在 59,649 条全量可见样本上的误差分析,对应 Accuracy 99.54%、Macro-F1 99.12%;该口径用于分析可见样本覆盖,不替代独立留出集指标。当模型文件或运行依赖不可用时,控制器自动回退到阈值规则感知。
图 2|59,649 条全量可见样本的决策树三分类混淆矩阵;独立留出集指标见上文。两个统计口径均来自同一训练包,但用途不同。
慢环采用 Qwen3-0.6B 与 SmolLM2-360M-Instruct 两种本地模型。训练任务不是开放式对话,而是把压缩资源摘要(CompactResourceBrief)映射为固定长度的 Policy DSL:SKILL|LEVEL|TTL|TOOL|REASON。18,134 条训练样本由 18,000 条覆盖边界条件的合成样本与 134 条真实 VM 轨迹样本组成,覆盖正常、批处理突发、编译突发、测试突发、内存压力、后台维护、混合压力和恢复八类场景,并按 14,507 / 1,813 / 1,814 划分训练、验证和测试集。
CompactResourceBrief
SKILL|LEVEL|TTL|TOOL|REASON
两种模型均采用 4 bit NF4 量化低秩适配(Quantized Low-Rank Adaptation,QLoRA):基础模型以 4 bit 加载,LoRA 使用 rank=16、alpha=32、dropout=0.05 并作用于全部线性层,输入最长 1,024 token。训练时只计算 assistant 输出 token 的自回归交叉熵,提示词 token 使用 -100 掩码:
rank=16
alpha=32
dropout=0.05
-100
L_DSL = -(1 / N) Σ[t∈DSL] log pθ(y_t | x, y<t)
验证损失用于选择 LoRA 检查点,而不是直接作为系统性能指标;最终策略仍须经过 DSL 解析、Schema、工具白名单和资源边界校验后才能进入快环。
图 3|Skill420 连续时间流上的滚动 P99 时序。S0 低压阶段各方法接近 10 ms;混合干扰与重复压力阶段体现不同控制策略的差异。
图 4|五路方法在 P99、SLO 违约率、批处理吞吐和相对改善上的汇总比较。最佳路线将 P99 从 30.38 ms 降至 15.11 ms,改善约 50%。
五路结果体现的是服务质量与吞吐之间的策略权衡。规则慢环取得最低总体 P99 和较高吞吐保持率;完整 Agent 路线以异步 LLM 策略边界和 Memory-Guard 支持目标条件化规划、重复场景复用与安全回退,并取得 0.3513% 的总体 SLO 违约率。仓库不把“是否使用 LLM”简单等同于所有指标必然更优,所有结论均以五路原始日志和分阶段统计为准。
完整可核验数据位于 dataset/skill420_420s/paper_metrics/,包括整体、阶段、场景组、记忆、控制开销、workload 分类器和 LLM 离线评测指标。
dataset/skill420_420s/paper_metrics/
adapter/ LLM planner、Policy DSL 编译器、StrategyPlan 校验器 runtime/ 在线控制器、状态机、cgroup 后端、scx 后端、workload 分类器 registry/ Skill 注册表、参数 profile、禁止动作 schemas/ ResourceBrief、StrategyPlan、PolicyIntent 等 JSON Schema models/ workload 分类器与 Qwen3/SmolLM2 LoRA 适配器 training_packages/ Qwen3-0.6B、SmolLM2-360M、决策树训练包 bench/scripts/ workload 注入与 eBPF 采集脚本 scripts/ 远程运行、绘图、汇总、smoke 测试脚本 scx/ sched_ext/scx 集成契约和说明 dataset/skill420_420s/ 最终 420 秒数据集、图、论文数值 docs/assets/ README 使用的架构图、高清 PDF 与结果图 docs/architecture/ Agent 架构、eBPF、scx、Skill 路由和分类器说明 docs/deployment/ openEuler 部署与复现实验指南 docs/experiments/ Skill420 场景、指标和结果说明 docs/operations/ 代码审计与运行手册 docs/submission/ GitLink 提交与验收指南
openEuler VM 中安装轻量运行依赖:
dnf install -y python3 python3-pip git make gcc clang llvm bpftool stress-ng procps-ng util-linux openssh-server python3 -m pip install -r requirements-runtime.txt
如果要在 VM 内直接运行 HuggingFace 本地模型,再安装:
python3 -m pip install -r requirements.txt
requirements-runtime.txt 只包含控制器、远程运行、决策树分类器和复现实验所需依赖;requirements.txt 包含大模型训练或推理依赖。
requirements-runtime.txt
requirements.txt
在 openEuler/Linux 中执行完整 smoke:
bash scripts/smoke_test.sh
也可以逐项执行:
python3 -m py_compile runtime/controller.py runtime/workload_classifier.py runtime/scx_backend.py runtime/scheduler_router.py python3 scripts/smoke_workload_classifier.py --model-dir models/workload_classifier/decision_tree --samples dataset/skill420_420s/raw_results/smollm2_360m_llm_memory/ebpf_sched_samples.jsonl --limit 5 python3 scripts/scx_backend_smoke.py python3 scripts/smoke_scheduler_router.py python3 scripts/smoke_policy_intent_compiler.py
从 Windows 主机远程运行 openEuler VM:
$env:EULERPILOT_SSH_PASSWORD='你的root密码' python scripts\run_remote_experiment.py ` --host <VM_IP> ` --user root ` --scenario skill420 ` --duration 420 ` --interval 0.5 ` --service-work-us 9000 ` --slo-ms 20 ` --out-dir data\skill420_final_reproduce ` --enable-ebpf ` --enable-workload-cpuset ` --latency-cpus 6-7 ` --batch-cpus 0-5 ` --background-cpus 0-5 ` --llm-worker-cpus 5 ` --cgroup-profile-set competition ` --apply-scx ` --include-local-hf-http ` --remote-model-dir /root/eulerpilot/app/models/policy_planners/smollm2_360m_lora ` --local-hf-max-new-tokens 16 ` --llm-output-mode policy_dsl ` --local-hf-torch-threads 1 ` --planner-cache-ttl-sec 5 ` --enable-memory-guard
说明:
scripts/run_remote_experiment.py
adapter/
runtime/
schemas/
registry/
configs/
models/
scripts/
models/workload_classifier/decision_tree/
models/policy_planners/
--apply-scx
docs/deployment/OPENEULER_DEPLOYMENT.md
最终 Skill420 数据集位于:
dataset/skill420_420s/
论文 A-J 数值汇总位于:
关键文件:
paper_run_manifest.json
paper_overall_summary.csv
paper_stage_summary.csv
paper_group_summary.csv
paper_s11_detail.csv
paper_memory_summary.json
paper_overhead_summary.csv
paper_workload_classifier_detail.json
paper_llm_offline_eval.csv
paper_metrics_report.md
注意:部分图文件仍保留 strong360_*.pdf 历史命名,但本次论文统计窗口是 0 到 420 秒,具体以 paper_run_manifest.json 为准。
strong360_*.pdf
Skill420 的场景含义、指标口径和结果解读见 docs/experiments/SKILL420_SCENARIOS.md 与 docs/experiments/SKILL420_RESULTS.md。
docs/experiments/SKILL420_SCENARIOS.md
docs/experiments/SKILL420_RESULTS.md
scx 集成代码在:
runtime/scx_backend.py
runtime/scheduler_router.py
configs/scx_profiles.json
scx/README.md
真实 scx 运行需要 /sys/kernel/sched_ext 存在、内核启用 CONFIG_SCHED_CLASS_EXT=y,并且系统中有 allowlist 内的 scx_* scheduler 工具。当前 Skill420 最终结果记录显示 scx 不可用,真实执行后端是 cgroup v1/cpuset/cpu.shares,不能把性能提升归因于 scx。
/sys/kernel/sched_ext
CONFIG_SCHED_CLASS_EXT=y
scx_*
cgroup v1/cpuset/cpu.shares
GitLink 提交建议见:
最终代码审计和运行手册见:
docs/operations/CODE_AUDIT_AND_RUNBOOK.md
openEuler 部署细节见:
EulerPilot-MA 自研源代码采用 Apache License 2.0 发布。第三方 Python 依赖、基础模型、Linux/openEuler 系统组件及 sched_ext/scx 继续遵循各自的上游许可证;仓库中的 LoRA 文件仅包含本项目训练得到的适配器,不重复分发基础模型权重。
完整的依赖来源和许可边界见 THIRD_PARTY_NOTICES.md。
THIRD_PARTY_NOTICES.md
EulerPilot-MA 是基于 eBPF 感知、本地 LLM 策略规划与 sched_ext/scx 可编程执行的 openEuler 自适应资源管控 Agent,实现 workload 识别、快慢双环决策、安全策略编译、动态路由、故障回滚与压力指纹记忆。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
🧠 EulerPilot-MA:面向 openEuler 的自适应资源管控 Agent
EulerPilot-MA 是一个面向 openEuler 的用户态资源管控 Agent 框架。项目以 CPU 资源管控为首个验证场景:系统从 eBPF、procfs、压力停顿信息(Pressure Stall Information,PSI)和应用侧指标中提取运行特征,识别 workload 类型与竞争风险;本地大语言模型(Large Language Model,LLM)在慢环中生成受约束的策略意图;确定性状态机快环在安全边界内执行、续租、降级和回滚。
系统的核心数据与控制链路如下:
系统并不让大模型实时调度 CPU。LLM 仅在慢环中输出可校验的策略意图或策略描述语言(Policy Domain-Specific Language,Policy DSL);500 ms 快环只执行经 Skill/Tool 注册表、JSON Schema 和资源守护器校验后的动作,从而将模型推理延迟隔离在在线控制关键路径之外。
🧩 系统架构
图 1|EulerPilot-MA 的观测、感知、策略规划、确定性执行与反馈闭环。
查看高清框架及流程图(PDF)
📦 提交材料
技术报告.pdf原创承诺书.pdf演示视频.mp4答辩演示.pptx(文档目录同步副本:docs/presentation/EulerPilot-MA-Competition-Presentation.pptx)docs/submission/GITLINK_SUBMISSION_GUIDE.md✨ 1. 主要设计与实现要点
SkillRegistry中的 Skill 和 profile,不能直接写 cgroup、cpuset 或 scx。LatencySensitive、Throughput、Background等标签,为风险评分和快环转移提供输入。🔄 从观测到执行的方法闭环
ResourceBrief、当前状态与目标约束StrategyPlan;失败时回退规则策略这套分层使学习模型负责“选择目标和策略边界”,确定性控制器负责“何时执行以及如何安全退出”。即使模型不可用、输出非法或推理超时,500 ms 快环仍能依靠最近有效租约或规则策略继续运行。
✅ 赛题要求与实现映射
🔬 2. 实验概览与可核验结果
Skill420 是一条 420 秒连续 workload 时间流,覆盖低压校准、服务请求突发、批处理竞争、短任务扰动、混合过载、局部恢复、重复压力、后台噪声、路由窗口和最终冷却。所有对比方法均在同一时间流上运行,完整原始结果和统计口径保存在仓库中。
🎯 Workload 感知能力
在线分类器从每个任务窗口提取 16 维特征,包括 eBPF CPU 指纹、运行时间增量、在核时间、上下文切换、唤醒频率、运行比例、窗口任务总量和 CPU 排名等。决策树将任务划分为低时延任务(
LatencySensitive)、吞吐任务(Throughput)和后台任务(Background),分类结果进入ResourceBrief,用于修正语义场景、干扰评分和快环风险判断;分类器本身不直接修改系统资源。在线发布模型采用 75%/25% 分层划分,独立留出集包含 14,913 条样本,Accuracy 为 99.48%、Macro-F1 为 98.97%。低时延类 Precision/Recall 为 99.79% / 99.52%,吞吐类为 99.95% / 99.48%,后台类为 95.94% / 99.22%。图 2 展示的是同一模型在 59,649 条全量可见样本上的误差分析,对应 Accuracy 99.54%、Macro-F1 99.12%;该口径用于分析可见样本覆盖,不替代独立留出集指标。当模型文件或运行依赖不可用时,控制器自动回退到阈值规则感知。
图 2|59,649 条全量可见样本的决策树三分类混淆矩阵;独立留出集指标见上文。两个统计口径均来自同一训练包,但用途不同。
🧠 本地 LLM 与 LoRA 微调
慢环采用 Qwen3-0.6B 与 SmolLM2-360M-Instruct 两种本地模型。训练任务不是开放式对话,而是把压缩资源摘要(
CompactResourceBrief)映射为固定长度的 Policy DSL:SKILL|LEVEL|TTL|TOOL|REASON。18,134 条训练样本由 18,000 条覆盖边界条件的合成样本与 134 条真实 VM 轨迹样本组成,覆盖正常、批处理突发、编译突发、测试突发、内存压力、后台维护、混合压力和恢复八类场景,并按 14,507 / 1,813 / 1,814 划分训练、验证和测试集。两种模型均采用 4 bit NF4 量化低秩适配(Quantized Low-Rank Adaptation,QLoRA):基础模型以 4 bit 加载,LoRA 使用
rank=16、alpha=32、dropout=0.05并作用于全部线性层,输入最长 1,024 token。训练时只计算 assistant 输出 token 的自回归交叉熵,提示词 token 使用-100掩码:验证损失用于选择 LoRA 检查点,而不是直接作为系统性能指标;最终策略仍须经过 DSL 解析、Schema、工具白名单和资源边界校验后才能进入快环。
📈 Skill420 端到端调度结果
图 3|Skill420 连续时间流上的滚动 P99 时序。S0 低压阶段各方法接近 10 ms;混合干扰与重复压力阶段体现不同控制策略的差异。
图 4|五路方法在 P99、SLO 违约率、批处理吞吐和相对改善上的汇总比较。最佳路线将 P99 从 30.38 ms 降至 15.11 ms,改善约 50%。
五路结果体现的是服务质量与吞吐之间的策略权衡。规则慢环取得最低总体 P99 和较高吞吐保持率;完整 Agent 路线以异步 LLM 策略边界和 Memory-Guard 支持目标条件化规划、重复场景复用与安全回退,并取得 0.3513% 的总体 SLO 违约率。仓库不把“是否使用 LLM”简单等同于所有指标必然更优,所有结论均以五路原始日志和分阶段统计为准。
完整可核验数据位于
dataset/skill420_420s/paper_metrics/,包括整体、阶段、场景组、记忆、控制开销、workload 分类器和 LLM 离线评测指标。🗂️ 3. 目录结构
🚀 4. 快速安装
openEuler VM 中安装轻量运行依赖:
如果要在 VM 内直接运行 HuggingFace 本地模型,再安装:
requirements-runtime.txt只包含控制器、远程运行、决策树分类器和复现实验所需依赖;requirements.txt包含大模型训练或推理依赖。✅ 5. 一键 smoke 测试
在 openEuler/Linux 中执行完整 smoke:
也可以逐项执行:
🖥️ 6. openEuler VM 复现实验
从 Windows 主机远程运行 openEuler VM:
说明:
scripts/run_remote_experiment.py会上传adapter/、runtime/、schemas/、registry/、configs/、models/、scripts/和 bench 脚本。models/workload_classifier/decision_tree/会随代码上传,默认启用决策树 workload 感知。models/policy_planners/;基础模型不重复分发,离线部署方式见该目录的 README。--apply-scx会探测 sched_ext/scx;如果当前内核不可用,会记录原因并自动降级到 cgroup v1/cpuset。docs/deployment/OPENEULER_DEPLOYMENT.md。📊 7. 最终数据和论文数值
最终 Skill420 数据集位于:
论文 A-J 数值汇总位于:
关键文件:
paper_run_manifest.jsonpaper_overall_summary.csvpaper_stage_summary.csvpaper_group_summary.csvpaper_s11_detail.csvpaper_memory_summary.jsonpaper_overhead_summary.csvpaper_workload_classifier_detail.jsonpaper_llm_offline_eval.csvpaper_metrics_report.md注意:部分图文件仍保留
strong360_*.pdf历史命名,但本次论文统计窗口是 0 到 420 秒,具体以paper_run_manifest.json为准。Skill420 的场景含义、指标口径和结果解读见
docs/experiments/SKILL420_SCENARIOS.md与docs/experiments/SKILL420_RESULTS.md。⚙️ 8. sched_ext/scx 说明
scx 集成代码在:
runtime/scx_backend.pyruntime/scheduler_router.pyconfigs/scx_profiles.jsonscx/README.md真实 scx 运行需要
/sys/kernel/sched_ext存在、内核启用CONFIG_SCHED_CLASS_EXT=y,并且系统中有 allowlist 内的scx_*scheduler 工具。当前 Skill420 最终结果记录显示 scx 不可用,真实执行后端是cgroup v1/cpuset/cpu.shares,不能把性能提升归因于 scx。📤 9. 提交说明
GitLink 提交建议见:
最终代码审计和运行手册见:
openEuler 部署细节见:
⚖️ 10. 开源许可
EulerPilot-MA 自研源代码采用 Apache License 2.0 发布。第三方 Python 依赖、基础模型、Linux/openEuler 系统组件及 sched_ext/scx 继续遵循各自的上游许可证;仓库中的 LoRA 文件仅包含本项目训练得到的适配器,不重复分发基础模型权重。
完整的依赖来源和许可边界见
THIRD_PARTY_NOTICES.md。