涉及文件: src/sage/runtime/scheduler.py、src/sage/runtime/base_environment.py、src/sage/runtime/environments.py
问题描述:
NodeSelector.get_all_nodes() 的实现始终返回单节点列表,节点资源数据全部来自本地 os.cpu_count()、环境变量 SAGE_AVAILABLE_MEMORY、SAGE_AVAILABLE_GPU,而非实时监控:
- 不反映 GPU 的实际使用情况(
available_gpu 从环境变量读取,不会因推理负载而变化)。
- 多 worker 同时执行时,
node_task_count 不跨进程同步,同一节点的多个进程各自维护一份副本,select_best_node 的 task 计数总是从 0 开始。
BaseScheduler.decision_history 是无界 list,每次调度决策追加一条,长时间运行会持续增长直至 OOM。
LocalEnvironment._wait_for_completion() 中有硬编码的 max_wait_time = 12000.0(约 3.3 小时),没有暴露给用户配置,且超时后只是 logger.warning 而不是抛出可被调用方感知的错误。
PlacementDecision 数据结构中有 target_node 字段,但 LocalEnvironment 的 submit_job 路径完全忽略这个字段,placement 决策从未被实际执行。
需要明确和修复的内容:
NodeSelector 目前只适合单机场景,应明确其适用边界。如果 SAGE 打算支持多节点调度,应定义 NodeRegistryInterface(注册/注销/心跳/查询节点列表的协议),NodeSelector 的 get_all_nodes() 应调用该接口而非硬编码本地状态。
- 修复
decision_history 的无界增长问题:改为有界循环缓冲(deque(maxlen=N))。
- 修复
PlacementDecision.target_node 被构造但从未被 submit_job 使用的问题:要么删除该字段,要么接入实际的 placement 路由逻辑。
_wait_for_completion() 的超时值应可通过环境配置或参数传入,超时后应设置 job status 为合理的终态而不仅是日志警告。
任务目标: 让 NodeSelector 和 LocalEnvironment 的调度行为可观测、无内存泄漏,并为后续支持多节点场景定义清晰的扩展点,而不是在当前单机实现上做过多假设。
完成标准: decision_history 改为有界缓冲,PlacementDecision.target_node 要么被接入实际路由,要么删除;_wait_for_completion() 超时值可配置且超时后 job 状态有明确终态;多节点扩展点有清晰的接口定义(哪怕当前实现仍是单机)。
父 Issue: #1484
涉及文件:
src/sage/runtime/scheduler.py、src/sage/runtime/base_environment.py、src/sage/runtime/environments.py问题描述:
NodeSelector.get_all_nodes()的实现始终返回单节点列表,节点资源数据全部来自本地os.cpu_count()、环境变量SAGE_AVAILABLE_MEMORY、SAGE_AVAILABLE_GPU,而非实时监控:available_gpu从环境变量读取,不会因推理负载而变化)。node_task_count不跨进程同步,同一节点的多个进程各自维护一份副本,select_best_node的 task 计数总是从 0 开始。BaseScheduler.decision_history是无界list,每次调度决策追加一条,长时间运行会持续增长直至 OOM。LocalEnvironment._wait_for_completion()中有硬编码的max_wait_time = 12000.0(约 3.3 小时),没有暴露给用户配置,且超时后只是logger.warning而不是抛出可被调用方感知的错误。PlacementDecision数据结构中有target_node字段,但LocalEnvironment的submit_job路径完全忽略这个字段,placement 决策从未被实际执行。需要明确和修复的内容:
NodeSelector目前只适合单机场景,应明确其适用边界。如果 SAGE 打算支持多节点调度,应定义NodeRegistryInterface(注册/注销/心跳/查询节点列表的协议),NodeSelector的get_all_nodes()应调用该接口而非硬编码本地状态。decision_history的无界增长问题:改为有界循环缓冲(deque(maxlen=N))。PlacementDecision.target_node被构造但从未被submit_job使用的问题:要么删除该字段,要么接入实际的 placement 路由逻辑。_wait_for_completion()的超时值应可通过环境配置或参数传入,超时后应设置 job status 为合理的终态而不仅是日志警告。任务目标: 让
NodeSelector和LocalEnvironment的调度行为可观测、无内存泄漏,并为后续支持多节点场景定义清晰的扩展点,而不是在当前单机实现上做过多假设。完成标准:
decision_history改为有界缓冲,PlacementDecision.target_node要么被接入实际路由,要么删除;_wait_for_completion()超时值可配置且超时后 job 状态有明确终态;多节点扩展点有清晰的接口定义(哪怕当前实现仍是单机)。父 Issue: #1484