Prhub

#25717 Move the retract-decode ratio estimation onto the new-token-ratio tracker

原始 PR 作者 fzyzcjy 合并时间 2026-05-19 09:19 文件变更 2 提交数 1 评论 1 代码增减 +24 / -9

执行摘要

将 retract-decode 比率计算移到新 token 比率跟踪器

PR 说明中明确:该计算仅依赖于请求批次的已解码 token 数和采样参数 max_new_tokens,与重试状态机无关,且计算结果由 NewTokenRatioTracker 消费。将计算逻辑移到 tracker 中,使 new_token_ratio 的完整生命周期集中表达在同一类型上。

可以审批。改动清晰且低风险。如果团队时间允许,建议为 estimate_new_token_ratio_after_retract 添加单元测试,以保证未来重构的安全性。

讨论亮点

该 PR 无 review 评论。由于是单一作者的纯粹重构,且逻辑完全等价,未引发讨论。

实现拆解

  1. new_token_ratio_tracker.py 中添加 from __future__ import annotationsTYPE_CHECKING 导入,以避免运行时循环依赖。
  2. NewTokenRatioTracker 类中新增 estimate_new_token_ratio_after_retract 静态方法,接收 Sequence[Req] 参数,计算并返回新的 token 比率估计值。
  3. schedule_batch.py 的导入部分添加 NewTokenRatioTracker 的导入。
  4. retract_decode 方法末尾的 9 行内联计算替换为单行调用:NewTokenRatioTracker.estimate_new_token_ratio_after_retract(self.reqs)
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler_components/new_token_ratio_tracker.py 调度器 modified 7.01
python/sglang/srt/managers/schedule_batch.py 调度器 modified 6.02

关键符号

estimate_new_token_ratio_after_retract

关键源码片段

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

新增静态方法 estimate_new_token_ratio_after_retract,并添加 TYPE_CHECKING 导入以避免循环依赖。

from __future__ import annotationsfrom dataclasses import dataclass
from typing import TYPE_CHECKING, Sequencefrom sglang.srt.environ import envs
from sglang.srt.server_args import ServerArgs# 仅在类型检查时导入 Req,避免运行时循环依赖
if TYPE_CHECKING:
    from sglang.srt.managers.schedule_batch import Req
​
​
@dataclass(slots=True, kw_only=True)
class NewTokenRatioTracker:
    init: float
    min: float
    decay: float
    current: float
​
    @classmethod
    def from_server_args(cls, server_args: ServerArgs) -> "NewTokenRatioTracker":
        # 根据环境变量和 server_args 计算初始、最小和衰减值
        init = min(
            envs.SGLANG_INIT_NEW_TOKEN_RATIO.get()
            * server_args.schedule_conservativeness,
            1.0,
        )
        min_ratio = min(
            init * envs.SGLANG_MIN_NEW_TOKEN_RATIO_FACTOR.get(),
            1.0,
        )
        decay = (init - min_ratio) / envs.SGLANG_NEW_TOKEN_RATIO_DECAY_STEPS.get()
        return cls(init=init, min=min_ratio, decay=decay, current=init)
​
    def decay_step(self) -> None:
        """衰减当前比率"""
        self.current = max(self.current - self.decay, self.min)
​
    def reset(self) -> None:
        """重置为初始比率"""
        self.current = self.init
​
    @staticmethod
    def estimate_new_token_ratio_after_retract(reqs: Sequence[Req]) -> float:
        """
        根据请求批次的已解码 token 数和 max_new_tokens 估计 retract 后的新 token 比率。
        """
        # 计算批次内所有请求已解码 token 总数
        total_decoded_tokens = sum(len(r.output_ids) for r in reqs)
        # 计算批次内所有请求最大新 token 总数
        total_max_new_tokens = sum(r.sampling_params.max_new_tokens for r in reqs)
​
        # 估计比率 = ( 已解码 token + retract 步骤数 * 请求数 ) / ( 最大新 token + 1)
        new_estimate_ratio = (
            total_decoded_tokens + envs.SGLANG_RETRACT_DECODE_STEPS.get() * len(reqs)
        ) / (
            total_max_new_tokens + 1
        ) # 避免除零
        new_estimate_ratio = min(1.0, new_estimate_ratio)
        return new_estimate_ratio

评论区精华

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

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

风险与影响

风险极低。变更本质上是纯抽取重构,计算逻辑完全等价。但需注意:如果未来 NewTokenRatioTrackerReq 类型发生变更,需确保 estimate_new_token_ratio_after_retract 方法同步更新。未添加专用测试,可考虑在后续补上。

对用户无直接影响。对系统而言,retract_decode 的调用 Scheduler 行为不变。对团队来说,降低了 schedule_batch.py 的复杂度,提高了可维护性。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论