Prhub

#23979 Enable DeepGEMM PDL on by default

原始 PR 作者 b8zhong 合并时间 2026-06-05 05:13 文件变更 2 提交数 3 评论 6 代码增减 +4 / -0

执行摘要

默认启用 DeepGEMM PDL 优化

DeepGEMM 的 PDL 功能此前需要用户手动开启 (deep_gemm.set_pdl(True)),为了默认享受约 0.8% 的性能提升(基于 GPQA 评测),决定默认启用。PR body 明确说明“It's opt in. We need to turn it on”,且指出即使模块没有 set_pdl 导出也不会报错,因此可以安全合并。

该 PR 值得精读,展示了如何通过环境变量默认启用底层库优化,并保持向后兼容性。但应注意 CUDA context 问题已在后续修复,建议阅读时一并参考 PR#27671。设计上采用了"安全导入 + 特性检测"模式,值得在其他类似场景复用。

讨论亮点
  • @merrymercy 发现该实现会在所有 GPU 上创建 CUDA context 造成资源浪费,并在 PR#27671 中修复。作者 b8zhong 对此表示歉意并感谢。
  • 作者在 CI 评论中说明由于该 PR 影响所有 DeepGEMM GEMM 调用(SM90 和 SM100),因此运行了 extra CI 以确保无问题。

实现拆解

  1. 新增环境变量:在 python/sglang/srt/environ.pyEnvs 类中新增 SGLANG_DEEPGEMM_PDL = EnvBool(True),默认值为 True,位于 DeepGemm 配置段,紧邻 SGLANG_DEEPGEMM_SANITY_CHECK
  2. 模块导入时自动启用 PDL:在 python/sglang/srt/layers/deep_gemm_wrapper/entrypoint.py 中,当 ENABLE_JIT_DEEPGEMM 为真时,在 import deep_gemm 之后添加条件判断:如果 envs.SGLANG_DEEPGEMM_PDL.get() 为真且 deep_gemm 模块具有 set_pdl 属性,则调用 deep_gemm.set_pdl(True)。这样在首次加载 deep_gemm_wrapper 模块时即完成全局 PDL 启用。
文件 模块 状态 重要度
python/sglang/srt/layers/deep_gemm_wrapper/entrypoint.py DeepGEMM 包装 modified 5.96
python/sglang/srt/environ.py 环境配置 modified 5.15

关键源码片段

python/sglang/srt/layers/deep_gemm_wrapper/entrypoint.py core-logic

核心变更文件,在 deep_gemm 导入后添加 PDL 启用逻辑,影响所有后续 DeepGEMM kernel 调用

# python/sglang/srt/layers/deep_gemm_wrapper/entrypoint.py
if ENABLE_JIT_DEEPGEMM:
    import deep_gemm
    from deep_gemm.utils.layout import get_mn_major_tma_aligned_tensor # noqa: F401
​
    # 默认启用 PDL (Programmatic Dependent Launch) 以提升性能
    # 仅在环境变量 SGLANG_DEEPGEMM_PDL 为 True 且 deep_gemm 支持 set_pdl 时调用
    if envs.SGLANG_DEEPGEMM_PDL.get() and hasattr(deep_gemm, "set_pdl"):
        deep_gemm.set_pdl(True)
python/sglang/srt/environ.py configuration

新增 SGLANG_DEEPGEMM_PDL 环境变量,默认 True,允许用户关闭 PDL

# python/sglang/srt/environ.py ( 位于 DeepGemm 配置段 )
    SGLANG_USE_DEEPGEMM_BMM = EnvBool(False)
    SGLANG_DEEPGEMM_SANITY_CHECK = EnvBool(False)
    # 启用 DeepGEMM Programmatic Dependent Launch (PDL),默认 True
    SGLANG_DEEPGEMM_PDL = EnvBool(True)
    SGLANG_PP_PARALLEL_DEEPGEMM_WARMUP = EnvBool(False)

评论区精华

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

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

风险与影响

  • CUDA context 过早创建:原实现在导入时即调用 deep_gemm.set_pdl(True),可能导致在所有 GPU 上创建 CUDA context,浪费显存。此问题已在后续 PR#27671 中修复(将调用移至更晚阶段)。
  • 兼容性风险set_pdl 接口可能不存在于旧版 DeepGEMM 中,但代码中已有 hasattr 保护,不会报错,仅静默跳过。
  • 性能回归:尽管 PDL 预期提升约 0.8%,但若某些 GPU 或 kernel 配置下 PDL 有副作用,可能导致性能下降。由于默认开启,影响范围大。
  • 用户:默认获得 PDL 加速(约 0.8%),可通过设置环境变量 SGLANG_DEEPGEMM_PDL=0 关闭。
  • 系统:所有使用 DeepGEMM 的 kernel 调用(GEMM、MoE 等)均受影响,潜在影响显存使用和初始化时间。
  • 团队:需要跟进 CUDA context 问题的修复 PR#27671,并确保后续 CI 覆盖 PDL 开启/关闭两种模式。
CUDA context 过早创建 需要关注 PR#27671

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论