执行摘要
- 一句话:H3 新增 SageAttention packed varlen 路径并解锁后端,提速约 5-7%
- 推荐动作:值得精读。重点关注 _sage_packed 的双路径设计:如何用 dense kernel 模拟 varlen、如何用 _trailing_padding_used_len 识别 H3 特定打包布局、以及 padding 置零的技巧。对后续在 diffusion runtime 中接入其他 attention 后端有直接参考价值。
功能与动机
PR body 明确说明两点:一是 H3 attention 总是以 packed Q/K/V 调用 forward_varlen(cu_seqlens,约 3.8 万 tokens/step),而 sage_attn 后端只实现了 dense forward(),运行时直接 NotImplementedError;二是 SageAttention 暴露的是快速的 dense sageattn(),其 Triton sageattn_varlen 在 H3 长度序列上太慢(40.90s vs 本 PR 的 29.93s),因此需要把 packed 输入重新路由到 dense kernel。原 admission 和 pipeline 校验中拒绝 sage_attn 的理由是 'the current packed varlen path does not preserve model output',本 PR 用 fast path 解决了该保留问题。
实现拆解
- 新增 varlen 入口与打包路由:在
python/sglang/multimodal_gen/runtime/layers/attention/backends/sage_attn.py 中新增 _trailing_padding_used_len() 纯函数,识别 H3 的 (0, used, total) 三元组打包布局(要求 start 为 0、used 小于 total、total 等于总 token 数、used 等于 max_seqlen);新增 forward_varlen() 作为 varlen 统一入口,优先使用 cu_seqlens_host 避免 GPU-CPU 同步,并对 QKV 做 contiguous() 预处理后交给 _sage_packed()。
- 双模式
_sage_packed():fast path 在检测到 H3 单文档尾部 padding 时,将 [0, used) 切片提升 batch 维后调用现有 dense forward()(即 sageattn),padding 尾部用 torch.zeros_like 置零,依赖下游 masked 行保持 inactive;若 used 等于总 token 数则直接返回。兜底路径按 bounds 逐段调用 dense forward,与 SDPA varlen 后端的分段循环模式一致。forward() 本身保持不变,其他模型的 dense Sage 路径不受影响。
- 解锁 SAGE_ATTN:
python/sglang/multimodal_gen/configs/models/dits/minimax_h3.py 的 _supported_attention_backends 加入 AttentionBackendEnum.SAGE_ATTN;python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/release_metadata.py 的 MiniMaxH3PartitionAdmissionStage.forward 删除对 sage_attn 的拒绝分支;python/sglang/multimodal_gen/configs/pipeline_configs/minimax_h3.py 的 validate_server_args 同步删除拒绝逻辑,但 quality="high" 的严格 4xH200 部署校验仍然保留。
- 测试配套:
python/sglang/multimodal_gen/test/unit/test_minimax_h3_admission.py 将原先 "sage_attn 应拒绝" 的断言改为 "sage_attn 应正常通过",同时保留 quality="high"/"ultra" 的拒绝路径覆盖。本 PR 未新增 forward_varlen 数值正确性的单元测试。
关键文件:
python/sglang/multimodal_gen/runtime/layers/attention/backends/sage_attn.py(模块 注意力后端;类别 source;类型 core-logic;符号 _trailing_padding_used_len, forward_varlen, _sage_packed): 核心实现:新增 forward_varlen 与 _sage_packed,用 dense sageattn 桥接 H3 的 packed varlen 调用,是本 PR 的主变更。
python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/release_metadata.py(模块 准入控制;类别 source;类型 data-contract): 移除 admission 阶段对 SAGE_ATTN 的拒绝分支,是解锁后端的入口之一。
python/sglang/multimodal_gen/configs/pipeline_configs/minimax_h3.py(模块 管线配置;类别 source;类型 core-logic): validate_server_args 删除对 sage_attn 的启动期拒绝,与 admission 改动配套。
python/sglang/multimodal_gen/configs/models/dits/minimax_h3.py(模块 模型配置;类别 source;类型 data-contract): 将 SAGE_ATTN 加入受支持后端集合,是模型侧的 data-contract 变更。
python/sglang/multimodal_gen/test/unit/test_minimax_h3_admission.py(模块 单元测试;类别 test;类型 test-coverage): 更新准入测试:sage_attn 从期望拒绝改为期望通过,验证解锁行为。
关键符号:_trailing_padding_used_len, forward_varlen, _sage_packed
评论区精华
本 PR 没有实质性的 review 评论,reviewer mickqian 直接 APPROVED,并通过 issue 评论 /tag-and-rerun-ci 重跑 CI。设计权衡主要在 PR body 中呈现:Triton varlen 路径太慢所以弃用,改用 dense sageattn 裁剪复用;trailing-padding fast path 明确假设 H3 的 bounds=(0, used, total) 布局。
风险与影响
- 风险:正确性风险:fast path 强依赖 H3 的 bounds=(0, used, total) 且 used==max_seqlen 打包约定,若未来打包布局变化(多文档 packing 或非 64 对齐)会静默回退到分段循环,行为不同但不会崩溃;padding 行置零依赖下游 masked 计算,需确保所有下游算子都带 mask。性能风险:分段循环逐段 launch dense kernel,多文档 batch 下性能可能较差;forward_varlen 的 contiguous() 在非连续张量时带来额外拷贝;cu_seqlens_host 为 None 时 tolist() 引入 GPU-CPU 同步。回归风险:forward() 未改动,其他模型不受影响,但移除 admission 拒绝后所有用户都能以 SAGE_ATTN 启动 H3。测试缺口:缺少 forward_varlen 与 FA3/SDPA 的数值对比测试,PR 中 PSNR 27.7 dB 只是近似参考。
- 影响:用户侧:H3 模型可直接选用 SageAttention,H200 上 denoise 约 5%、steady step 约 7% 提速,H20/L20/A100/4090 据 PR 描述更有竞争力。系统侧:新增一个注意力后端的 varlen 接入模式,为后续其他 packed 模型复用 Sage 铺路。团队侧:该模式(裁剪 fast path + 分段兜底)可作为 diffusion attention 后端的参考实现。
- 风险标记:核心注意力路径变更, fast path 依赖 H3 打包约定, 缺少 forward_varlen 数值正确性测试, 移除 admission 拒绝
关联脉络
- PR #33667 [diffusion] Pack Ulysses Q/K/V input all-to-all into one collective + reusable a2a staging buffers: 同属 H3/diffusion attention 数据排布优化,且该 PR 修改了 test_minimax_h3_dit_contract.py,与本 PR 的 packed varlen 路径相关联。
- PR #29027 [NPU] Adding a fast layernorm for diffusion models and fix BSA: 同为 diffusion attention 后端演进,展示了 attention 后端可插拔化方向。
- PR #30683 [Diffusion] Batch GLM-Image AR requests: 同属 multimodal_gen 管线性能演进,与该 PR 一起体现 diffusion runtime 在调度与注意力层面的持续优化。
参与讨论