Prhub

#25632 Introduce SchedulerLogprobResultProcessor to own logprob state

原始 PR 作者 fzyzcjy 合并时间 2026-05-18 18:43 文件变更 4 提交数 1 评论 1 代码增减 +100 / -26

执行摘要

为 logprob 状态创建独立处理器组件

这是为后续将 logprob 处理逻辑物理迁移到独立组件所做的准备(PR body 明确指出 'Inplace prep for the introduce-logprob-result-processor mech move')。分离关注点、降低 scheduler.py 的复杂度,并让 logprob 状态以显式依赖的方式传递,是此次大规模调度器重构的目标。

建议合并后关注后续 PR(#25633 等)以了解完整迁移脉络。本次重构模式值得借鉴:先引入空数据类作为状态容器、再转换方法签名、最后通过提交链物理移动代码。

讨论亮点

本 PR 无实质 review 讨论,只有一个机器人发出的每日配额提醒,与变更无关。作者自行审查并合并。

实现拆解

  1. 创建新类骨架:在 scheduler_components/logprob_result_processor.py 中新建 SchedulerLogprobResultProcessor 数据类(@dataclass,frozen,slots),包含 server_argsmodel_config 两个只读字段。

  2. 注册到调度器:在 scheduler.pyScheduler.__init__ 中导入并实例化 self.logprob_result_processor = SchedulerLogprobResultProcessor(server_args=..., model_config=...),插入位置紧挨 self.is_initializing = False 之前。

  3. 方法签名改造:在 scheduler_output_processor_mixin.py 中将 9 个 logprob 相关方法(_initialize_empty_logprob_containersadd_logprob_return_valuesadd_input_logprob_return_values_is_multi_item_scoringcalculate_num_input_logprobs_calculate_relevant_tokens_len_process_input_token_ids_logprobs_process_input_top_logprobs_process_input_token_logprobs)加上 @staticmethod,并把第一个参数的类型标注改为 SchedulerLogprobResultProcessor;方法体保持不变。

  4. 调用点调整:在 scheduler_output_processor_mixin.py 自身以及 disaggregation/prefill.py 中的每次调用,都添加 self.logprob_result_processor 作为第一个实参;静态方法内部对同 Mixin 其他静态方法的调用改为 SchedulerOutputProcessorMixin.<method>(self, ...) 形式。

整个 PR 只做机械改造,不引入新逻辑。

文件 模块 状态 重要度
python/sglang/srt/managers/scheduler_components/logprob_result_processor.py 调度器 added 6.84
python/sglang/srt/managers/scheduler_output_processor_mixin.py 调度器 modified 8.58
python/sglang/srt/managers/scheduler.py 调度器 modified 5.25
python/sglang/srt/disaggregation/prefill.py 分离式预填充 modified 3.83

关键符号

SchedulerLogprobResultProcessor _initialize_empty_logprob_containers add_logprob_return_values add_input_logprob_return_values _is_multi_item_scoring calculate_num_input_logprobs _calculate_relevant_tokens_len _process_input_token_ids_logprobs _process_input_top_logprobs _process_input_token_logprobs

关键源码片段

python/sglang/srt/managers/scheduler_components/logprob_result_processor.py core-logic

新建的 logprob 状态宿主类,本次重构的核心产出

# python/sglang/srt/managers/scheduler_components/logprob_result_processor.py
# 新建文件:定义 logprob 结果处理器骨架,用于后续承载 logprob 状态与方法from __future__ import annotationsfrom dataclasses import dataclassfrom sglang.srt.configs.model_config import ModelConfig
from sglang.srt.server_args import ServerArgs
​
​
@dataclass(kw_only=True, slots=True, frozen=True)
class SchedulerLogprobResultProcessor:
    """
    目前仅持有 server_args 与 model_config,
    后续会将 logprob 处理方法物理迁移到此组件。
    """
    server_args: ServerArgs
    model_config: ModelConfig
python/sglang/srt/managers/scheduler_output_processor_mixin.py core-logic

核心改动文件:logprob 方法全部转为 @staticmethod,self 类型变更为新处理器

# python/sglang/srt/managers/scheduler_output_processor_mixin.py
# 展示方法签名的静态化改造模式@staticmethod
def _process_input_top_logprobs(
    # self 类型从 Scheduler 改为 SchedulerLogprobResultProcessor
    self: "SchedulerLogprobResultProcessor",
    req: Req,
) -> None:
    """Process input top logprobs."""
    if req.top_logprobs_num <= 0:
        return
​
    # 旧调用 self._is_multi_item_scoring(req) 改为显式类名调用
    is_multi_item_scoring = SchedulerOutputProcessorMixin._is_multi_item_scoring(
        self, req
    )
​
    req.input_top_logprobs_val = [] if is_multi_item_scoring else [None]
    req.input_top_logprobs_idx = [] if is_multi_item_scoring else [None]

评论区精华

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

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

风险与影响

低风险。所有变更均为结构性,方法体字节完全一致,没有任何控制流或数值计算的改动。唯一潜在问题是:若未来 SchedulerOutputProcessorMixin 类被重命名或移除,静态方法内的显式引用(如 SchedulerOutputProcessorMixin._is_multi_item_scoring)会失效,但这是后续重构的正常代价。现有测试应能覆盖该路径。

影响范围仅限调度器模块和分离式预填充模块。对用户无感知,不影响推理性能。对开发团队而言,这是调度器职责拆分的关键一步——logprob 状态从隐式 self 依赖变为显式参数传递,为后续物理迁移到独立文件打下基础。

依赖后续 PR 完成迁移 静态方法显式引用 Mixin 类名存在脆弱性

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论