Prhub

#29535 [scheduler] Add scheduler metrics reporter init hook

原始 PR 作者 yinghai 合并时间 2026-06-29 00:59 文件变更 1 提交数 1 评论 3 代码增减 +48 / -33

执行摘要

为调度器新增可覆写的指标初始化钩子

PR body 明确指出需要“Route Scheduler metrics reporter construction through an overridable init hook”,并说明“Allow subclasses to provide specialized reporter implementations without mutating module globals”。当前代码将 metrics 构造逻辑内联在 __init__ 中,子类若要改变行为需要覆盖整个 __init__ 或修改全局变量,不够灵活。

该 PR 设计简单直接,适合快速合入。值得其他模块参考的解耦手法:将 __init__ 中可定制的部分提取为 protected 方法,提高子类扩展性而不破坏 Liskov 替换原则。建议精读 init_metrics_collectorinit_metrics_reporter 两个方法的签名设计,对于未来需要自定义观测能力的场景很有价值。

讨论亮点

该 PR 仅 3 条评论,均为机器或 CI 辅助性评论,无实质技术讨论。review 评论数为 0,说明未引起争议。

实现拆解

  1. 提取 init_metrics_collector 方法:将原本内联在 __init__ 中的 SchedulerMetricsCollector.init_new(...) 调用和 self.metrics_collector_context / self.metrics_collector 赋值移到新方法 init_metrics_collector 中,该方法接收 tp_rank, pp_rank, dp_rank 参数,保持原有逻辑不变。
  2. 提取 init_hisparse_coordinator 方法:将原来在 __init__if self.enable_hisparse: 块内的 self.hisparse_coordinator = self.tp_worker.model_runner.hisparse_coordinator; self.hisparse_coordinator.set_decode_producer_stream(...) 逻辑封装成 init_hisparse_coordinator 方法。
  3. 提取 init_metrics_reporter 方法:将 SchedulerMetricsReporter 的构造和赋值过程提取为 init_metrics_reporter 方法。
  4. 移除冗余字段初始化:将 self.hisparse_coordinator: Optional[HiSparseCoordinator] = Noneself.gracefully_exit = Falseself.mm_receiver = None 等字段声明从 __init__ 中移除,整理到各自所属的初始化方法中。
  5. 调整 __init__ 调用顺序:在原来内联的位置替换为对应的方法调用,保持整体初始化流程不变。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py 调度器 modified 7.45

关键符号

init_metrics_collector init_hisparse_coordinator init_metrics_reporter

关键源码片段

python/sglang/srt/managers/scheduler.py core-logic

唯一变更文件,核心重构所在。将三个 metrics 相关对象的初始化从 `__init__` 内联代码提取为独立方法。

def init_metrics_collector(
    self, tp_rank: int, pp_rank: int, dp_rank: Optional[int]
) -> None:
    """Override to customize metrics collector construction."""
    # 原本内联在 __init__ 中,现提取为独立方法
    self.metrics_collector_context = SchedulerMetricsCollector.init_new(
        server_args=self.server_args,
        ps=self.ps,
        tp_rank=tp_rank,
        pp_rank=pp_rank,
        dp_rank=dp_rank,
        enable_priority_scheduling=self.enable_priority_scheduling,
        enable_lora=self.enable_lora,
        enable_hierarchical_cache=self.enable_hierarchical_cache,
    )
    self.metrics_collector = self.metrics_collector_context.collector
​
​
def init_hisparse_coordinator(self) -> None:
    """Override to customize hisparse coordinator setup."""
    if self.enable_hisparse:
        # Coordinator 在 ModelRunner.initialize() 中创建,在 CUDA graph capture 之前
        self.hisparse_coordinator = self.tp_worker.model_runner.hisparse_coordinator
        self.hisparse_coordinator.set_decode_producer_stream(self.forward_stream)
​
​
def init_metrics_reporter(
    self, tp_rank: int, pp_rank: int, dp_rank: Optional[int]
) -> None:
    """Override to customize metrics reporter construction."""
    self.metrics_reporter = SchedulerMetricsReporter(
        scheduler=self,
        tp_rank=tp_rank,
        pp_rank=pp_rank,
        dp_rank=dp_rank,
        metrics_collector_context=self.metrics_collector_context,
        metrics_collector=self.metrics_collector,
    )

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

低风险。本质是纯重构,不改变任何业务逻辑:init_metrics_collectorinit_metrics_reporterinit_hisparse_coordinator 内部的代码与原来完全一致,只是移到了子方法中。但存在以下微小风险:

  • 如果子类重写 __init__ 并直接引用了原来的内联代码,可能因字段移动导致 AttributeError(但此类子类较少)。
  • 移除了 self.hisparse_coordinator: Optional[HiSparseCoordinator] = None 等字段声明,如果子类在 __init__ 的早期位置依赖这些字段存在(在父类 __init__ 完成前),可能会出问题。不过从代码看这些字段的初始赋值时机并未提前。

影响范围小。只改动了一个文件 python/sglang/srt/managers/scheduler.py,且仅是方法级重构,对用户和系统无功能影响。团队内需要自定义 metrics 的开发者现在可以继承 Scheduler 并仅重写这三个方法,而无需覆盖整个 __init__,降低了耦合和维护成本。

低风险重构

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论