Prhub

#22046 Revert "[Kernel] Fuse temperature + softmax in sampling for decode speedup"

原始 PR 作者 BBuf 合并时间 2026-04-03 21:32 文件变更 5 提交数 1 评论 1 代码增减 +5 / -787

执行摘要

回滚融合采样内核,恢复标准 PyTorch 温度缩放和 softmax 操作。

PR body 仅声明 'Reverts sgl-project/sglang#20501',未提供具体原因。关联Issue #20501 描述了原PR的动机是减少解码延迟,但回滚的动机在材料中未明确说明,可能涉及融合内核的正确性、性能或兼容性问题。

建议技术管理者关注此次回滚背后的根本原因(如性能评估或bug发现),以及是否计划后续优化。工程师可精读以理解融合内核的潜在问题,并学习代码回滚和性能权衡的决策过程。

讨论亮点

review中仅有一条来自gemini-code-assist[bot]的评论,指出sampler.py中'# In-place op to save memory'注释具有误导性,因为torch.softmax并非原地操作,且logits[:] = ... 导致冗余数据复制。建议直接赋值结果以避免拷贝。该评论未在材料中显示是否被采纳,PR已合并。

实现拆解

实现上,本PR移除了五个文件:融合内核实现(fused_sampling.py)、基准测试(bench_fused_temperature_softmax.py)和单元测试(test_fused_temperature_softmax.py)。在python/sglang/srt/layers/sampler.py中,删除了融合内核的条件调用,恢复为标准的logits.div_(sampling_info.temperatures)后接torch.softmax。在python/sglang/srt/model_executor/model_runner.py中,移除了_warmup_fused_sampling函数及其调用。

文件 模块 状态 重要度
python/sglang/srt/layers/fused_sampling.py sampling removed 8.0
python/sglang/srt/layers/sampler.py sampling modified 7.0
test/registered/sampling/test_fused_temperature_softmax.py testing removed 5.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

forward in python/sglang/srt/layers/sampler.py _warmup_fused_sampling in python/sglang/srt/model_executor/model_runner.py

评论区精华

优化 softmax 操作的内存使用 style

gemini-code-assist[bot] 评论指出注释 '# In-place op to save memory' 具有误导性,因为 torch.softmax 不是原地操作,且 logits[:] = ... 导致冗余数据复制。建议直接赋值结果以避免拷贝,提升效率。

结论:未在材料中显示是否采纳该建议,评论状态为 COMMENTED。 · 待处理

风险与影响

风险包括:1) 性能回归:移除融合内核可能增加解码延迟,尤其对大词汇量模型(如Llama 3 128K);2) 正确性风险:恢复原始代码需确保与融合内核行为一致,sampler.py中的变更直接影响采样逻辑;3) 测试覆盖减少:移除了针对融合内核的单元测试,降低了采样路径的测试完整性;4) 预热逻辑移除:model_runner.py中移除_warmup_fused_sampling可能影响模型启动时的内核编译性能。

对用户:解码速度可能下降,影响推理吞吐量,特别是对于大型模型部署。对系统:简化了代码库,减少了自定义Triton内核的维护复杂性和潜在bug,可能提升稳定性。对团队:需要重新评估性能优化策略,并可能在未来引入替代方案;此次回滚揭示了性能调优的迭代过程。

性能回归 测试覆盖减少 核心路径变更

关联 Issue

#20501 [Kernel] Fuse temperature + softmax in sampling for decode speedup

完整报告

执行摘要

本PR回滚了先前引入的融合temperature+softmax Triton内核,恢复了PyTorch原生操作。此变更可能影响解码性能,特别是对大词汇量模型,但简化了代码结构并可能解决原内核的问题,背后原因未在材料中明确说明。

功能与动机

原PR #20501旨在通过内核融合减少解码延迟,将temperature scaling和softmax合并为单个Triton内核以降低kernel启动开销和内存访问。本PR将其回滚,动机仅由PR body中的“Reverts sgl-project/sglang#20501”暗示,可能源于融合内核在实际运行中的正确性、性能或兼容性问题,但具体原因未在提供的材料中详述。

实现拆解

主要变更涉及以下文件:

  • python/sglang/srt/layers/fused_sampling.py:完全移除,删除了融合内核的Triton实现。
  • python/sglang/srt/layers/sampler.py:恢复标准采样路径,代码如下:

    logits.div_(sampling_info.temperatures)
    logits[:] = torch.softmax(logits, dim=-1)
    probs = logits
    

    移除了原条件调用融合内核的逻辑。

  • python/sglang/srt/model_executor/model_runner.py:移除_warmup_fused_sampling函数及其调用,简化预热流程。

  • benchmark/kernels/bench_fused_temperature_softmax.pytest/registered/sampling/test_fused_temperature_softmax.py:移除相关基准测试和单元测试。

评论区精华

review中仅有gemini-code-assist[bot]的一条评论:

“The comment # In-place op to save memory is misleading because torch.softmax is not an in-place operation and still requires a temporary allocation of the same size as the input. Additionally, logits[:] = ... performs a redundant data copy into the existing buffer. To improve efficiency, you can avoid the copy by assigning the result of softmax directly to probs and updating the reference in logits_output.next_token_logits.”

该评论指出了代码风格和性能优化点,但未涉及回滚原因,且状态为未解决。

风险与影响

  • 性能风险:回滚后,解码步骤恢复为两个独立的CUDA内核(div_和softmax),可能增加延迟,尤其对于vocab size大的模型(如128K词汇)。
  • 正确性风险:sampler.py的变更需确保与融合内核输出一致,避免采样偏差。
  • 测试风险:移除单元测试减少了采样路径的覆盖,可能隐藏回归问题。
  • 影响范围:用户可能体验到推理速度下降;系统代码更简洁,但失去性能优化;团队需评估后续优化策略。

关联脉络

本PR直接回滚PR #20501,该PR是近期性能优化线的一部分。结合历史PR分析(如#21511为AMD启用FP8优化、#19246为NPU优化GLM4.7),可见团队持续进行硬件特定和通用性能调优。此次回滚可能表明融合内核在特定场景下未达预期,或引入了不稳定因素,建议关注后续是否有替代优化方案出现。

参与讨论