Prhub

#26551 Remove dead fields and always-False plumbing across SB / FB / LogitsMetadata

原始 PR 作者 hnyls2002 合并时间 2026-05-28 18:15 文件变更 7 提交数 2 评论 1 代码增减 +3 / -99

执行摘要

清理 ScheduleBatch/ForwardBatch/LogitsMetadata 死字段与始终 -False 逻辑

PR body 指出 'has_stream' 自 2024 年 (#1652) 最后一个读取者移除后已变成只写字段,但仍在 init/filter/merge 中持续维护;'temp_scaled_logprobs' 和 'top_p_normalized_logprobs' 自 2025 年 3 月 (#3988) 引入后从未被任何生产者设置为 True,相关条件分支始终执行默认的 log_softmax 路径。清理这些死字段和管道可以减少维护负担,避免误导未来开发者。

建议其他模块的维护者参考本 PR 的方法:当发现字段仅被写入而不被读取,或标志始终为默认值且无生产者时,应积极清理。本 PR 的清理过程规范(先确认使用历史,再分批提交),值得借鉴。

讨论亮点

该 PR 未引发实质性 Review 讨论。gemini-code-assist 的自动审查评论表示“我没有需要提供的反馈”,未提出任何问题。

实现拆解

  1. Commit 1:移除 ScheduleBatch 死字段 - 删除 has_stream 字段声明及其在 init_newfilter_batchmerge_batch 中的赋值代码。
    - 删除 temp_scaled_logprobstop_p_normalized_logprobs 字段声明(这些字段之前从未在 SB 中被读取或写入,仅作为副本存在)。
    - 涉及文件:python/sglang/srt/managers/schedule_batch.py,删除 10 行。

  2. Commit 2:移除始终为 False 的 temp_scaled_logprobs / top_p_normalized_logprobs 管道 - 移除 LogitsMetadataForwardBatch 中的同名 bool 字段。
    - 删除 LogitsProcessor._expand_metadata_for_logprobs 方法(该方法仅根据标志展开 temperature/top_p 张量,从未实际生效)。
    - 删除 logprob.py 中的 compute_temp_top_p_normalized_logprobs 函数,该函数包含温度缩放和 top-p 归一化的条件分支,现在其在 LogitsProcessor.process_input_logprobsprocess_input_logprobs_by_chunk 中的调用点直接替换为 torch.nn.functional.log_softmax
    - 清理 piecewise_cuda_graph_runner.pytwo_batch_overlap.py 中为 LogitsMetadata 构造传递这些字段的 kwarg 代码。
    - 删除 test_eagle_infer_b.py 中从未被服务端处理的 "temp_scaled_logprobs": True 配置项。
    - 涉及文件:logits_processor.pylogprob.pyforward_batch_info.pypiecewise_cuda_graph_runner.pytwo_batch_overlap.pytest_eagle_infer_b.py

文件 模块 状态 重要度
python/sglang/srt/layers/logits_processor.py 日志处理器 modified 6.85
python/sglang/srt/layers/utils/logprob.py logprob 工具 modified 6.71
python/sglang/srt/managers/schedule_batch.py 调度批处理 modified 5.34
python/sglang/srt/model_executor/forward_batch_info.py 前向批信息 modified 4.7
python/sglang/srt/model_executor/piecewise_cuda_graph_runner.py 分段 CUDA 图 modified 4.3
python/sglang/srt/batch_overlap/two_batch_overlap.py 批重叠 modified 4.09
test/registered/spec/eagle/test_eagle_infer_b.py 测试 modified 2.88

关键符号

_expand_metadata_for_logprobs compute_temp_top_p_normalized_logprobs

关键源码片段

python/sglang/srt/layers/logits_processor.py core-logic

核心变更点:移除 _expand_metadata_for_logprobs 方法调用,将 process_input_logprobs 和 process_input_logprobs_by_chunk 中的 compute_temp_top_p_normalized_logprobs 替换为直接 log_softmax,清理 LogitsMetadata 中的 bool 标志字段。

# 文件 : python/sglang/srt/layers/logits_processor.py
# process_input_logprobs_by_chunk 中的关键变更:
# 原代码根据 temp_scaled_logprobs/top_p_normalized_logprobs 标志
# 从 logits_metadata 提取 per-token temperature/top_p,
# 并调用 compute_temp_top_p_normalized_logprobs。
# 由于这两个标志始终为 False,直接使用 log_softmax。# 之前(删除的代码):
# chunk_temperature = (
# logits_metadata.temperature[global_indices]
# if logits_metadata.temp_scaled_logprobs
# and logits_metadata.temperature is not None
# else None
# )
# chunk_top_p = (
# logits_metadata.top_p[global_indices]
# if logits_metadata.top_p_normalized_logprobs
# and logits_metadata.top_p is not None
# else None
# )
# chunk_input_logprobs = compute_temp_top_p_normalized_logprobs(
# chunk_input_logprobs, logits_metadata, chunk_top_p, chunk_temperature
# )# 现在直接 log_softmax:
chunk_input_logprobs = torch.nn.functional.log_softmax(
    chunk_input_logprobs, dim=-1
)# process_input_logprobs 中也做了同样的替换。
python/sglang/srt/layers/utils/logprob.py core-logic

移除了 compute_temp_top_p_normalized_logprobs 函数,该函数包含温度缩放和 top-p 归一化的死分支,以及其对 LogitsMetadata 的依赖。

# 文件 : python/sglang/srt/layers/utils/logprob.py
# 整个函数被移除,因为从未被真正启用:
#
# def compute_temp_top_p_normalized_logprobs(
# last_logits, logits_metadata, top_p=None, temperature=None
# ) -> torch.Tensor:
# """
# 原本会根据 temp_scaled_logprobs / top_p_normalized_logprobs
# 决定是否应用温度缩放或 top-p 归一化。
# 由于两个标志始终为 False,始终走 else 分支 log_softmax。
# """
# ... # 全部删除
#
# 现在导入列表中不再包含该函数,调用方直接调用 torch.nn.functional.log_softmax。

评论区精华

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

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

风险与影响

低风险。变更确认了所有移除的字段和分支均无生产者写入或无读取者。潜在风险包括:(1)如果某些外部模块通过 Python 反射(如 hasattrgetattr、pickle)间接依赖这些字段,但根据代码库结构可能性极低;(2)has_stream 字段虽然当前无读,但未来可能被重新用于流式功能,但本 PR 已清理所有写入,未来需要时可基于 Req.stream 重新实现。整体而言,这是安全的死代码清理。

对用户:无任何功能变化,API 行为和输出不变。
对系统:移除了无意义的条件判断和字段赋值,带来极微小的性能提升(减少条件分支和内存占用)。
对团队:代码库更清晰,减少了误导性标志,降低了未来维护的认知负担。

无行为变更 低风险 纯死代码删除

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论