Prhub

#30448 Refactor FP4 quantization and remove deprecated JIT kernels

原始 PR 作者 b8zhong 合并时间 2026-07-14 09:22 文件变更 38 提交数 10 评论 10 代码增减 +122 / -5707

执行摘要

移除废弃的 NVFP4 JIT 内核及 CUTLASS MoE 后端

关联 Issue #28663 指出这些内核最初从 TRTLLM 移植,但现在 FlashInfer 已有更完善的版本,且不再提供特殊用途,因此可以删除以减少维护成本。PR 作者在评论中确认这些内核的性能已不再有优势,FlashInfer 的 cute-dsl 实现更快。

值得精读,特别是对于关注内核演进和代码清理的读者。展示了如何基于社区替代品逐步淘汰遗留内核,并在过程中处理测试、文档和配置的联动清理。设计决策(如使用早期断言拒绝未使用路径)值得借鉴。

讨论亮点
  1. BBuf 要求更多 benchmark 和 accuracy 结果:审核者要求提供 H100/H200/B200 等更多设备的性能数据和精度对比。作者 b8zhong 随后提供了 SM100 上的性能对比图,显示 FlashInfer cute-dsl 优于旧 JIT 内核,并确认 Performance 已无优势。
  2. 删除 --moe-runner-backend cutlass 选项的副作用检查:BBuf 询问是否有遗留文档或脚本仍引用该参数。作者回复所有引用已清理,旧文档目录 docs/ 即将整体删除。
  3. compressed_tensors NVFP4 MoE 路径切换问题:BBuf 指出切换到 FlashInfer 后,apply_router_weight_on_input=True 时会断言失败,建议早期拒绝或保留回退。作者回应已添加早期断言,确认该模式仅用于 Llama4,而 Llama4 使用 modelopt FP4 而非 compressed-tensors 路径,因此实际不会触发。

实现拆解

  1. 删除 sglang/jit_kernel/nvfp4.py:移除了全部 NVFP4 JIT 内核模块,包括量化(_jit_nvfp4_quant_module)、专家量化(_jit_nvfp4_expert_quant_module)、缩放 MM(_jit_nvfp4_scaled_mm_module)、块状 MoE(_jit_nvfp4_blockwise_moe_module)以及预热函数 prewarm_nvfp4_jit_modules
  2. 清理 MoE 后端:在 python/sglang/srt/layers/moe/cutlass_moe.py 中删除了 cutlass_moe_fp4 函数和对应的 cutlass 选项;在 server_args.py 中从 FP4_GEMM_RUNNER_BACKEND_CHOICES 中移除了 cutlass
  3. 更新量化路径:修改 python/sglang/srt/layers/quantization/modelopt_quant.pypython/sglang/multimodal_gen/runtime/layers/quantization/modelopt_quant.py,将 FP4 GEMM 后端选择硬编码为 FlashInfer 实现,移除对旧 JIT 内核的引用。
  4. 删除测试与基准:移除了 7 个相关测试文件和 3 个 benchmark 文件,例如 test_nvfp4_quant.pytest_nvfp4_gemm.pybench_fp4_quant.py 等。
  5. 更新文档:在 docs_new/docs/quantization.mdxserver_arguments.mdx 中删除废弃参数的说明。
文件 模块 状态 重要度
python/sglang/jit_kernel/nvfp4.py JIT 内核 removed 9.08
python/sglang/srt/layers/moe/cutlass_moe.py MoE 层 modified 7.54
python/sglang/srt/layers/quantization/modelopt_quant.py 量化层 modified 7.07
benchmark/kernels/quantization/bench_fp4_quant.py 基准测试 removed 8.25
test/registered/jit/test_nvfp4_quant.py 单元测试 removed 7.45

关键符号

prewarm_nvfp4_jit_modules cutlass_scaled_fp4_mm cutlass_moe_fp4 scaled_fp4_quant silu_and_mul_scaled_fp4_experts_quant_packed

关键源码片段

python/sglang/jit_kernel/nvfp4.py deletion

此文件是整个清理的核心,包含了所有 NVFP4 JIT 内核模块、预热函数和 CUDA 标志。完全删除该文件(636 行)消除了复杂度。

@torch.compiler.disable
def prewarm_nvfp4_jit_modules(
    *,
    include_expert_quant: bool = False,
    include_blockwise_moe: bool = False
) -> None:
    """在 torch.compile 追踪模型之前实例化 NVFP4 JIT 模块。"""
    _jit_nvfp4_quant_module() # 量化 JIT 模块
    _jit_nvfp4_scaled_mm_module() # 缩放 GEMM JIT 模块
    if include_expert_quant:
        _jit_nvfp4_expert_quant_module() # 专家量化(可选)
    if include_blockwise_moe:
        _jit_nvfp4_blockwise_moe_module() # 块状 MoE(可选)

评论区精华

删除 `--moe-runner-backend cutlass` 选项的副作用检查 正确性

BBuf 询问是否有遗留文档或脚本仍引用该参数。

结论:b8zhong 回复已全面清理所有引用,旧文档目录 docs/ 即将整体删除。 · 已解决

compressed_tensors NVFP4 MoE 路径切换到 FlashInfer 后 apply_router_weight_on_input 断言 正确性

BBuf 指出新路径在 `apply_router_weight_on_input=True` 时会断言,要求早期错误提示或回退。

结论:b8zhong 添加了断言并解释该模式实际未使用(Llama4 使用 modelopt FP4),因此没有实际影响。 · 已解决

风险与影响

  1. 依赖 FlashInfer 版本兼容性:所有 FP4 操作强制依赖 FlashInfer,若用户环境中的 FlashInfer 版本不支持 cute-dsl 或 CUTLASS 后端,可能导致运行时错误。
  2. 删除 cutlass_moe_fp4 影响未迁移配置:如果外部脚本仍设置 --moe-runner-backend cutlass,将失效,需确保文档和 migrate 指南已覆盖。
  3. compressed_tensors NVFP4 路径断言compressed_tensors_w4a4_nvfp4_moe.py 中的新路径在 apply_router_weight_on_input=True 时直接断言,若未来有模型使用该组合,可能崩溃。
  4. 测试删除降低回归覆盖:大量单元测试和基准测试被删除,可能遗漏量化或 GEMM 路径相关的回归。

影响范围:所有使用 NVFP4 量化的 Blackwell GPU(SM100+)用户。正面影响:代码量减少约 5.7k 行,降低维护成本;统一到社区维护的 FlashInfer 后端,有望获得持续的性能优化。负面影响:用户必须安装 FlashInfer 且版本满足要求;旧配置脚本可能需要更新。团队关注:需监控迁移后的性能回归和精度变化,确保 FlashInfer 版本与 SGLang 兼容。

Blackwell-only 路径变更 flashinfer 依赖强制 compressed_tensors 路径未完全测试 大量测试删除

关联 Issue

#28663 Deprecate and delete `--moe-runner-backend cutlass`, dense FP4 GEMM, FP4 quantization (in sgl-kernel)

完整报告

参与讨论