Skip to content

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

@iliujunn

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions