refactor: 合并模型可视化脚本
本项目实现一个面向 openEuler 的自适应 CPU 调度 Agent。系统以 ASA 快速闭环为主路径:实时采集系统指标,使用本地分类器输出场景概率,经过时间加权投票得到稳定场景,再通过场景到 sched_ext 调度器的映射执行切换。新增的 LLM 监督层只在异常或不确定事件触发时介入,并且不能直接执行 shell、不能直接调用调度 Skill,所有建议必须经过确定性 PolicyGuard 校验。
当前实现是单机本地 Agent,node_id 默认是 local。代码中已经保留 node_id、hardware_fingerprint、policy_version、decision_id、created_at、expires_at 等字段,便于未来演进到中央控制器,但本仓库尚未实现多台 openEuler 节点控制。
node_id
local
hardware_fingerprint
policy_version
decision_id
created_at
expires_at
agent/perception.py
agent/decision.py
model/model/scene_classifier.joblib
raw_top3
voted_top3
stable_label
agent/mapping.py
scheduler_mapping.json
agent/skills/cpu_sched_skill.py
agent/action.py
SchedulerController
agent/supervisor/
sqlite3
validated
bootstrap
默认配置 LLM_SUPERVISOR_ENABLED = False。在 LLM 关闭时,系统保持原 ASA 本地行为:采样、分类、时间投票、映射、可选 sched_ext 切换。
LLM_SUPERVISOR_ENABLED = False
开启 LLM 路径后,实时循环仍然每秒采样。常规高置信场景不调用 DeepSeek;只有 TriggerGate 命中以下事件时才提交后台 LLM 请求:
LLM 请求在线程池后台执行,不阻塞每秒采样循环。LLM 返回后先检查上下文是否过期,再经过 PolicyGuard。超时、网络/API 错误、空响应、非法 JSON、非法调度器、PolicyGuard 拒绝都会回退到本地快速路径。
DeepSeek 使用 OpenAI 兼容客户端,base_url 为 https://api.deepseek.com,默认模型为 deepseek-v4-flash。生产环境建议使用环境变量:
base_url
https://api.deepseek.com
deepseek-v4-flash
export DEEPSEEK_API_KEY="你的 DeepSeek API Key"
当前 agent/config.py 中保留了测试用 key 以便本地快速验证。公开提交、比赛归档或生产部署前应删除明文 key,并只使用环境变量或密钥管理系统。
agent/config.py
启动后端:
python dashboard/backend/main.py
启动前端:
cd dashboard/frontend npm install npm run dev
浏览器打开:
http://127.0.0.1:5173
Dashboard 的三个控制按钮有固定顺序:
关闭 Benchmark Recognition 时,Scheduler Switch 和 LLM Path 会同时关闭。
以下步骤用于真机验证,不应把 mock 单元测试结果解释为 openEuler 真实调度成功。
cat /etc/os-release uname -a python3 --version
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt
ls /sys/kernel/sched_ext/state which scx_cake || true which scx_lavd || true which scx_rusty || true which scx_bpfland || true
需要 root 权限、启用 sched_ext 的内核,以及可执行的 scx 调度器二进制。不同 openEuler 内核构建可能需要额外安装或编译 scx 工具。
python model/train.py ls model/model/scene_classifier.joblib
python run_agent.py
python dashboard/backend/main.py cd dashboard/frontend npm run dev
在 Dashboard 中按顺序启用 Benchmark Recognition、Scheduler Switch、LLM Path。没有 root 或 scx 二进制时,切换会失败并写入失败经验,但这不代表调度器真实性能结果。
tail -f runtime/agent/decision_history.jsonl sqlite3 runtime/agent/supervisor_memory.sqlite3 ".tables"
关注 decision_id,它用于关联决策、切换、评估和经验写入。
建议在相同硬件、相同 openEuler 版本、相同 workload 顺序、相同采样时长下比较四组:
每组至少记录:
evaluation/score.py
decision_history.jsonl
switched=true
llm_trigger.triggered=true
benchmark_required
Python 全量测试:
pytest test -q
Python 语法编译检查:
python -m py_compile run_agent.py agent/config.py agent/perception.py agent/decision.py agent/mapping.py agent/memory.py agent/action.py agent/runtime_state.py agent/skills/base.py agent/skills/cpu_sched_skill.py model/realtime.py model/train.py evaluation/evaluator.py evaluation/score.py dashboard/backend/services/agent_service.py dashboard/backend/main.py agent/supervisor/types.py agent/supervisor/deepseek_client.py agent/supervisor/async_runtime.py agent/supervisor/trigger_gate.py agent/supervisor/candidate_builder.py agent/supervisor/policy_guard.py agent/supervisor/experience_store.py agent/supervisor/feedback.py
前端构建:
cd dashboard/frontend npm run build
这些自动化测试主要验证代码契约、回退逻辑、Dashboard 状态展示和 mock 调度路径;不能替代 openEuler 真机上的 sched_ext 效果验证。
run_agent.py
dashboard/backend/
dashboard/frontend/
docs/central_controller_evolution.md
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
openEuler ASA + LLM Enhanced Scheduler Agent
本项目实现一个面向 openEuler 的自适应 CPU 调度 Agent。系统以 ASA 快速闭环为主路径:实时采集系统指标,使用本地分类器输出场景概率,经过时间加权投票得到稳定场景,再通过场景到 sched_ext 调度器的映射执行切换。新增的 LLM 监督层只在异常或不确定事件触发时介入,并且不能直接执行 shell、不能直接调用调度 Skill,所有建议必须经过确定性 PolicyGuard 校验。
当前实现是单机本地 Agent,
node_id默认是local。代码中已经保留node_id、hardware_fingerprint、policy_version、decision_id、created_at、expires_at等字段,便于未来演进到中央控制器,但本仓库尚未实现多台 openEuler 节点控制。核心能力
agent/perception.py采集 CPU、内存、IO、网络和进程相关特征。agent/decision.py调用model/model/scene_classifier.joblib,输出完整概率分布、raw_top3、raw confidence/margin/entropy。voted_top3、voted confidence/margin/entropy、stable_label,并防止全零向量直接 argmax。agent/mapping.py和scheduler_mapping.json作为场景到调度器映射的事实来源,最终切换仍由agent/skills/cpu_sched_skill.py调用agent/action.py中的SchedulerController完成。agent/supervisor/提供数据契约、触发门、候选生成、DeepSeek 客户端、异步执行、PolicyGuard、经验存储和性能反馈闭环。sqlite3保存在线观察和离线 benchmark 经验;检索默认只使用validated和可信bootstrap,支持经过验证的负面经验。快速路径与 LLM 慢速路径
默认配置
LLM_SUPERVISOR_ENABLED = False。在 LLM 关闭时,系统保持原 ASA 本地行为:采样、分类、时间投票、映射、可选 sched_ext 切换。开启 LLM 路径后,实时循环仍然每秒采样。常规高置信场景不调用 DeepSeek;只有 TriggerGate 命中以下事件时才提交后台 LLM 请求:
LLM 请求在线程池后台执行,不阻塞每秒采样循环。LLM 返回后先检查上下文是否过期,再经过 PolicyGuard。超时、网络/API 错误、空响应、非法 JSON、非法调度器、PolicyGuard 拒绝都会回退到本地快速路径。
DeepSeek 配置
DeepSeek 使用 OpenAI 兼容客户端,
base_url为https://api.deepseek.com,默认模型为deepseek-v4-flash。生产环境建议使用环境变量:当前
agent/config.py中保留了测试用 key 以便本地快速验证。公开提交、比赛归档或生产部署前应删除明文 key,并只使用环境变量或密钥管理系统。Dashboard
启动后端:
启动前端:
浏览器打开:
Dashboard 的三个控制按钮有固定顺序:
关闭 Benchmark Recognition 时,Scheduler Switch 和 LLM Path 会同时关闭。
openEuler 24.03-LTS-SP4 真实联调
以下步骤用于真机验证,不应把 mock 单元测试结果解释为 openEuler 真实调度成功。
需要 root 权限、启用 sched_ext 的内核,以及可执行的 scx 调度器二进制。不同 openEuler 内核构建可能需要额外安装或编译 scx 工具。
在 Dashboard 中按顺序启用 Benchmark Recognition、Scheduler Switch、LLM Path。没有 root 或 scx 二进制时,切换会失败并写入失败经验,但这不代表调度器真实性能结果。
关注
decision_id,它用于关联决策、切换、评估和经验写入。消融实验
建议在相同硬件、相同 openEuler 版本、相同 workload 顺序、相同采样时长下比较四组:
A. 默认 EEVDF
B. 原始 ASA 本地快速路径
C. 每次循环调用 LLM
D. 事件触发式双层架构
每组至少记录:
evaluation/score.py的用户体验导向评分,必要时补充 workload KPI。decision_history.jsonl中switched=true。llm_trigger.triggered=true次数 / 总轮数。benchmark_required,以及后续 benchmark 证据是否改善选择。测试
Python 全量测试:
Python 语法编译检查:
前端构建:
这些自动化测试主要验证代码契约、回退逻辑、Dashboard 状态展示和 mock 调度路径;不能替代 openEuler 真机上的 sched_ext 效果验证。
关键文件
run_agent.py:实时 Agent 主循环。agent/config.py:全局配置、LLM 开关、触发阈值、策略参数。agent/perception.py:实时系统指标采集。agent/decision.py:分类器概率输出和时间加权投票。agent/mapping.py:场景到调度器映射。agent/action.py:sched_ext/scx 调度器真实切换控制。agent/skills/cpu_sched_skill.py:ASA 快速路径和 Supervisor 接入点。agent/supervisor/:LLM 监督层、PolicyGuard、经验库和反馈闭环。evaluation/score.py:性能评分函数。dashboard/backend/:Dashboard API。dashboard/frontend/:Dashboard UI。docs/central_controller_evolution.md:未来中央控制器演进说明。