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

关键符号

fused_temperature_softmax fused_temperature_softmax_inplace warmup_fused_temperature_softmax _warmup_fused_sampling

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

评论区精华

导入错误处理 正确性

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 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论