Prhub

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

原始 PR 作者 Godmook 合并时间 2026-04-02 12:46 文件变更 5 提交数 18 评论 21 代码增减 +787 / -5

执行摘要

融合温度缩放与 softmax 采样内核,减少解码延迟。

PR body中提到:'The standard sampling path in sampler.py executes temperature scaling and softmax as two separate CUDA kernels... This is called on every decode step and incurs:

  • 2 kernel launches (~10us overhead each) - 6 global memory passes over the full tensor. For large-vocab models (Llama 3 128K, Qwen 152K), this becomes a meaningful bottleneck in the decode latency budget.'

建议工程师精读fused_sampling.py以学习Triton内核设计和自动调优策略,关注条件阈值选择和预热机制。性能优化显著,适用于性能敏感场景,值得作为内核优化案例参考。

讨论亮点

核心讨论包括:1. DarkSharpness指出sampler.py中try/except ImportError不必要,Godmook修正为直接导入;2. DarkSharpness询问与flashinfer.sampling.softmax的性能比较,Godmook提供基准数据,显示融合内核在批量较大时更优(如bs=512, vocab=128K时2.55x速度up);3. BBuf建议将导入移到文件顶部,Godmook解释为保持非CUDA构建的可导入性。讨论中强调了数值精度对齐和预热机制的重要性。

实现拆解

实现包括:1. 新增python/sglang/srt/layers/fused_sampling.py文件,包含单通道(词汇表≤32768)和多通道(词汇表>32768)Triton融合内核,支持自动调优;2. 修改python/sglang/srt/layers/sampler.py,添加条件逻辑在批量大小≥128时使用融合内核(_FUSED_SAMPLING_BATCH_THRESHOLD=128),否则回退到PyTorch原生路径;3. 新增测试文件test/registered/sampling/test_fused_temperature_softmax.py和基准文件benchmark/kernels/bench_fused_temperature_softmax.py;4. 在python/sglang/srt/model_executor/model_runner.py中添加预热函数_warmup_fused_sampling(),在服务器启动时编译和调优内核。

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

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

关键符号

fused_temperature_softmax fused_temperature_softmax_inplace warmup_fused_temperature_softmax _warmup_fused_sampling

评论区精华

导入错误处理 正确性

DarkSharpness 指出 sampler.py 中 try/except ImportError 不必要,因为 Triton 在 CUDA 平台总是存在

结论:Godmook 修正为直接导入,避免潜在错误 · 已解决

与 flashinfer 性能比较 性能

DarkSharpness 询问融合内核与 flashinfer.sampling.softmax 的性能差异,Godmook 提供基准数据

结论:融合内核在批量较大时(如 bs≥128)性能更优,决定采用 Triton 方案 · 已解决

导入位置优化 设计

BBuf 建议将导入移到文件顶部,Godmook 解释为保持非 CUDA 构建的可导入性

结论:保留条件导入,避免 Triton 依赖影响跨平台兼容性 · 已解决

风险与影响

技术风险:1. 数值精度差异可能影响结构化输出(如语法约束解码),已在提交历史中通过修正计算顺序解决;2. 自动调优的编译开销,对于大词汇表(如128K)首次调用需1.447秒,但通过预热机制避免运行时开销;3. 条件阈值(_FUSED_SAMPLING_BATCH_THRESHOLD=128)可能需针对不同硬件调优;4. 新内核依赖Triton,对非CUDA平台(如AMD、NPU)需回退到原生路径。

影响范围:所有使用标准采样路径的解码步骤,特别是大词汇表模型(如Llama 3 128K、Qwen 152K)。提升解码性能1.09x至4.46x,减少延迟,对高吞吐推理场景有益。对用户透明,无需配置更改。团队需维护新内核代码和测试,增加Triton依赖管理。

核心路径变更 自动调优开销 数值精度风险

关联 Issue

未识别关联 Issue

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

完整报告

PR #20501 分析报告

执行摘要

本PR通过融合温度缩放和softmax采样内核,将两个独立的CUDA内核合并为单个Triton内核,减少内核启动和内存访问开销,提升解码速度1.09x至4.46x。适用于大词汇表模型,影响核心解码路径,是性能优化的关键改进。

功能与动机

为什么做:标准采样路径中,温度缩放和softmax作为两个独立CUDA内核执行,每次解码步骤产生约10微秒的内核启动开销和6次全局内存访问,成为大词汇表模型(如Llama 3 128K、Qwen 152K)的解码延迟瓶颈。PR body明确提到:“For large-vocab models, this becomes a meaningful bottleneck in the decode latency budget.”

实现拆解

改动模块

  1. 新增融合内核 (python/sglang/srt/layers/fused_sampling.py):
    • 单通道内核(词汇表≤32768):一次加载整个词汇表到寄存器,减少内存访问。
    • 多通道内核(词汇表>32768):两通道在线softmax,支持自动调优。
    • 关键代码块:
      @triton.jit
      def _single_pass_temperature_softmax_kernel(...):
          x = (x / temp).to(tl.float32)
          x_max = tl.max(x, axis=0)
          exp_x = tl.exp(x - x_max)
          prob = exp_x / tl.sum(exp_x, axis=0)
      
  2. 修改采样路径 (python/sglang/srt/layers/sampler.py):
    • 添加条件逻辑,当批量大小≥128时使用融合内核,否则回退到PyTorch原生路径。
  3. 添加预热机制 (python/sglang/srt/model_executor/model_runner.py):
    • 在服务器启动时调用_warmup_fused_sampling(),编译和调优内核,避免运行时开销。
  4. 测试与基准:新增测试文件验证正确性,基准文件对比性能。

评论区精华

核心讨论线程

  1. 导入错误处理
    • DarkSharpness:“Why except ImportError here? On cuda platform, triton always exists.”
    • Godmook修正为直接导入,提升代码健壮性。
  2. 性能对比
    • DarkSharpness询问与flashinfer.sampling.softmax的比较。
    • Godmook提供基准数据,显示融合内核在批量较大时更优,例如bs=512、vocab=128K时速度提升2.55倍。
  3. 设计权衡
    • BBuf建议移动导入位置,Godmook解释为保持非CUDA构建兼容性,体现了跨平台设计考虑。

风险与影响

技术风险

  • 数值精度:早期版本因计算顺序差异导致结构化输出错误,已通过提交修正。
  • 编译开销:大词汇表内核首次编译需1.447秒,但预热机制缓解此问题。
  • 阈值调优:_FUSED_SAMPLING_BATCH_THRESHOLD=128可能需根据硬件调整。

影响评估

  • 用户:解码延迟降低,尤其受益于大词汇表和高吞吐场景。
  • 系统:减少GPU内核调度和内存带宽压力。
  • 团队:新增Triton内核维护,但测试覆盖完善。

关联脉络

与历史PR的关系

  • 近期PR如#21405(启用IndexCache)同样聚焦性能优化,显示仓库持续关注推理效率提升。
  • 其他PR(如#22146、#22148)涉及重构和一致性改进,但本PR独立于具体模型或模块,是通用的内核级优化。

演进趋势:本PR反映了SGLang项目在解码路径上通过内核融合减少开销的技术方向,可能为未来更多内核优化(如集成FlashInfer方案)铺平道路。

参与讨论