Prhub

#25683 [diffusion] feat: layerwise NVTX markers for Nsight Systems profiling

原始 PR 作者 mispa-ms 合并时间 2026-05-26 11:24 文件变更 14 提交数 19 评论 14 代码增减 +942 / -128

执行摘要

为扩散模型添加逐层 NVTX 性能标记

扩散子系统缺乏逐层 NVTX 支持,导致 nsys 捕获只显示 CUDA kernel 时间线,没有逻辑结构;SRT LLM 侧已通过 --enable-layerwise-nvtx-marker 提供了类似能力。本 PR 将相同设计引入 multimodal_gen,使用户在运行 LLM 和扩散负载时获得一致的性能分析心智模型。

值得精读,尤其关注 maybe_nvtx_range 的异常安全设计(直接调用 range_push/range_pop 绕过 str.format 陷阱)以及 ComponentResidencyManager 中钩子生命周期与组件执行的集成方式。

讨论亮点

核心讨论围绕将 NVTX 钩子注册从 denoising 阶段提升为公用机制。mickqian 在 denoising.py 上评论建议将 _maybe_register_nvtx_hooks 推广到所有组件,促使作者重构为 ComponentResidencyManager 统一管理。后续测试失败(mock server_args 缺少字段、子类未调用 super().init 导致属性缺失)也被逐步修复,最终通过了 NV CI。

实现拆解

  1. 新建 python/sglang/multimodal_gen/runtime/utils/nvtx_pytorch_hooks.py,实现 maybe_nvtx_range 上下文管理器和 DiffusionNvtxHooks 类,通过 PyTorch forward pre/post hooks 在每个子模块调用时发出 NVTX 范围。
  2. ServerArgs 中添加 enable_layerwise_nvtx_marker 配置项。
  3. 重构 PipelineStage.__call__PipelineExecutor 子类,集成 NVTX 门控逻辑(_apply_nvtx_gate_should_use_stage_nvtx 等),使所有阶段自动参与 NVTX 标记。
  4. ComponentResidencyManager 中集成钩子生命周期管理,在组件使用时动态注册/注销钩子,并支持跨阶段隔离和重复模块去重。
  5. 新增单元测试 test_nvtx_pytorch_hooks.py,覆盖 maybe_nvtx_range 异常安全、钩子注册、去重、形状收集和 set_enabled 切换等场景。
文件 模块 状态 重要度
python/sglang/multimodal_gen/runtime/utils/nvtx_pytorch_hooks.py NVTX 钩子 added 9.13
python/sglang/multimodal_gen/runtime/pipelines_core/executors/pipeline_executor.py 执行器 modified 8.36
python/sglang/multimodal_gen/runtime/managers/memory_managers/component_manager.py 组件管理器 modified 8.35
python/sglang/multimodal_gen/test/unit/test_nvtx_pytorch_hooks.py 测试覆盖 added 8.05
python/sglang/multimodal_gen/runtime/pipelines_core/stages/base.py 阶段基类 modified 7.61

关键符号

maybe_nvtx_range DiffusionNvtxHooks.register_hooks DiffusionNvtxHooks.remove_hooks DiffusionNvtxHooks.set_enabled PipelineExecutor._run_stage_with_executor_hooks PipelineStage._apply_nvtx_gate ComponentResidencyManager._enable_nvtx_for_use

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

评论区精华

将 NVTX 钩子注册提升为通用工具 设计

mickqian 在 denoising.py 的 diff 中评论:"now that all components support layerwise-offload, could we make this a utility and apply to all components?"

结论:作者重构了设计,将钩子注册从 denoising 阶段迁移到 ComponentResidencyManager,通过 _enable_nvtx_for_use 在组件使用时动态注册,去掉了硬编码的 per-stage 钩子声明。 · 已解决

风险与影响

NVTX 钩子可能引入额外 CPU 开销,但通过 set_enabled() 默认关闭,仅在主动开启时生效。钩子生命周期与组件管理绑定,但已通过 remove_hooks 和实例跟踪处理了重用和删除场景。执行流重构合并了 before_stage/after_stage_run_stage_with_executor_hooks,可能影响非 NVTX 路径,但通过模块化设计降低了风险。

用户可通过 --enable-layerwise-nvtx-marker 开启,默认行为不变。开启后,Nsight Systems 捕获的 trace 会显示 stage、denoising step 和子模块的嵌套范围,帮助定位性能瓶颈。团队获得与 SRT 侧统一的性能分析方案,降低了维护两套 NVTX 工具的成本。

性能开销可控 钩子生命周期管理 执行流重构

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论