Skip to content

Issue 16:NodeSelector 单节点硬编码,分布式调度能力缺位 #1500

Description

@iliujunn

涉及文件: src/sage/runtime/scheduler.pysrc/sage/runtime/base_environment.pysrc/sage/runtime/environments.py

问题描述:

NodeSelector.get_all_nodes() 的实现始终返回单节点列表,节点资源数据全部来自本地 os.cpu_count()、环境变量 SAGE_AVAILABLE_MEMORYSAGE_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 字段,但 LocalEnvironmentsubmit_job 路径完全忽略这个字段,placement 决策从未被实际执行。

需要明确和修复的内容:

  • NodeSelector 目前只适合单机场景,应明确其适用边界。如果 SAGE 打算支持多节点调度,应定义 NodeRegistryInterface(注册/注销/心跳/查询节点列表的协议),NodeSelectorget_all_nodes() 应调用该接口而非硬编码本地状态。
  • 修复 decision_history 的无界增长问题:改为有界循环缓冲(deque(maxlen=N))。
  • 修复 PlacementDecision.target_node 被构造但从未被 submit_job 使用的问题:要么删除该字段,要么接入实际的 placement 路由逻辑。
  • _wait_for_completion() 的超时值应可通过环境配置或参数传入,超时后应设置 job status 为合理的终态而不仅是日志警告。

任务目标:NodeSelectorLocalEnvironment 的调度行为可观测、无内存泄漏,并为后续支持多节点场景定义清晰的扩展点,而不是在当前单机实现上做过多假设。

完成标准: decision_history 改为有界缓冲,PlacementDecision.target_node 要么被接入实际路由,要么删除;_wait_for_completion() 超时值可配置且超时后 job 状态有明确终态;多节点扩展点有清晰的接口定义(哪怕当前实现仍是单机)。


父 Issue: #1484

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions