From 46dced64ea5a3cf345464b1cf5392f9b6682cfae Mon Sep 17 00:00:00 2001 From: Qiaolin Yu Date: Thu, 5 Mar 2026 14:50:40 -0800 Subject: [PATCH] Adjust padding size to improve triton_kernels moe performance (#19174) --- .../fused_moe_triton/triton_kernels_moe.py | 22 +++++++++++++++---- .../sglang/srt/layers/quantization/mxfp4.py | 8 +++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/python/sglang/srt/layers/moe/fused_moe_triton/triton_kernels_moe.py b/python/sglang/srt/layers/moe/fused_moe_triton/triton_kernels_moe.py index e14ffe950..b7e6cd7b5 100644 --- a/python/sglang/srt/layers/moe/fused_moe_triton/triton_kernels_moe.py +++ b/python/sglang/srt/layers/moe/fused_moe_triton/triton_kernels_moe.py @@ -271,7 +271,9 @@ def triton_kernel_fused_experts_with_bias( # feature check assert inplace is False, "Inplace is not supported in new triton MoE kernel" - E, _, _ = w1.shape + M, K = hidden_states.shape + E, _, N = w1.shape + n_expts_act = routing_data.n_expts_act if global_num_experts == -1: global_num_experts = E @@ -292,7 +294,16 @@ def triton_kernel_fused_experts_with_bias( 2, ) - intermediate_cache = matmul_ogs( + intermediate_cache = torch.empty( + (1, M * n_expts_act, N // 2), + device=hidden_states.device, + dtype=hidden_states.dtype, + ) + output = torch.empty( + (1, M, K), device=hidden_states.device, dtype=hidden_states.dtype + ) + + matmul_ogs( hidden_states, w1, b1, @@ -301,14 +312,17 @@ def triton_kernel_fused_experts_with_bias( precision_config=w1_pcg, gammas=routing_data.gate_scal if apply_router_weight_on_input else None, fused_activation=act, + y=intermediate_cache, ) - return matmul_ogs( - intermediate_cache, + matmul_ogs( + intermediate_cache.view(M * n_expts_act, N // 2), w2, b2, routing_data, scatter_indx=scatter_indx, precision_config=w2_pcg, gammas=None if apply_router_weight_on_input else routing_data.gate_scal, + y=output, ) + return output.view(M, K) diff --git a/python/sglang/srt/layers/quantization/mxfp4.py b/python/sglang/srt/layers/quantization/mxfp4.py index 81c326966..8a0ec4729 100644 --- a/python/sglang/srt/layers/quantization/mxfp4.py +++ b/python/sglang/srt/layers/quantization/mxfp4.py @@ -335,6 +335,7 @@ class Mxfp4MoEMethod(FusedMoEMethodBase): scale_dtype = torch.uint8 self.with_bias = with_bias mxfp4_block = 32 + triton_kernels_padding_alignment = 64 # pad the intermediate size to be a multiple of 2 * mxfp4_block # for to hold non-uniform sharded tensor as well as swizzling @@ -347,7 +348,7 @@ class Mxfp4MoEMethod(FusedMoEMethodBase): hidden_size = round_up(hidden_size, 256) else: intermediate_size_per_partition_after_pad = round_up( - intermediate_size_per_partition, 64 + intermediate_size_per_partition, triton_kernels_padding_alignment ) elif _use_aiter: @@ -362,11 +363,8 @@ class Mxfp4MoEMethod(FusedMoEMethodBase): - layer.intermediate_size_per_partition ) elif has_triton_kernels: - # TODO: this is a hack to make - # intermediate_size_per_partition_after_pad the same as the - # per_rank_intermediate_size during weight loading intermediate_size_per_partition_after_pad = round_up( - intermediate_size_per_partition, mxfp4_block + intermediate_size_per_partition, triton_kernels_padding_alignment ) self.intermediate_size_per_partition = intermediate_size_per_partition_after_pad