Support piecewise cuda graph for dsv3 fp4 (#15531)
This commit is contained in:
@@ -41,7 +41,13 @@ from sglang.srt.layers.moe.token_dispatcher.standard import (
|
||||
StandardDispatcher,
|
||||
StandardDispatchOutput,
|
||||
)
|
||||
from sglang.srt.layers.moe.topk import StandardTopKOutput, TopKOutput, TopKOutputChecker
|
||||
from sglang.srt.layers.moe.topk import (
|
||||
BypassedTopKOutput,
|
||||
StandardTopKOutput,
|
||||
TopKConfig,
|
||||
TopKOutput,
|
||||
TopKOutputChecker,
|
||||
)
|
||||
from sglang.srt.layers.moe.utils import RoutingMethodType
|
||||
from sglang.srt.layers.quantization.base_config import (
|
||||
FusedMoEMethodBase,
|
||||
@@ -1210,16 +1216,21 @@ class FlashInferFP4MoE(FusedMoE):
|
||||
return hs_fp4, hs_sf
|
||||
|
||||
def forward(self, hidden_states: torch.Tensor, topk_output: TopKOutput):
|
||||
assert TopKOutputChecker.format_is_bypassed(
|
||||
topk_output
|
||||
), "Only bypassed topk output is supported for flashinfer fp4 moe"
|
||||
|
||||
if is_in_piecewise_cuda_graph():
|
||||
assert TopKOutputChecker.format_is_standard(
|
||||
topk_output
|
||||
), "Only standard topk output is supported for piecewise cuda graph"
|
||||
return torch.ops.sglang.moe_forward_piecewise_cuda_graph_impl(
|
||||
hidden_states,
|
||||
topk_output.topk_weights,
|
||||
topk_output.topk_ids,
|
||||
topk_output.router_logits,
|
||||
self.layer_id,
|
||||
return (
|
||||
torch.ops.sglang.flashinfer_fp4_moe_forward_piecewise_cuda_graph_impl(
|
||||
hidden_states,
|
||||
topk_output.router_logits,
|
||||
topk_output.topk_config.top_k,
|
||||
topk_output.topk_config.topk_group,
|
||||
topk_output.topk_config.num_expert_group,
|
||||
topk_output.topk_config.correction_bias,
|
||||
self.layer_id,
|
||||
)
|
||||
)
|
||||
else:
|
||||
return self.forward_impl(hidden_states, topk_output)
|
||||
@@ -1343,9 +1354,52 @@ def moe_forward_piecewise_cuda_graph_impl_fake(
|
||||
return torch.empty_like(hidden_states)
|
||||
|
||||
|
||||
def flashinfer_fp4_moe_forward_piecewise_cuda_graph_impl(
|
||||
hidden_states: torch.Tensor,
|
||||
router_logits: torch.Tensor,
|
||||
top_k: int,
|
||||
topk_group: Optional[int],
|
||||
num_expert_group: Optional[int],
|
||||
correction_bias: Optional[torch.Tensor],
|
||||
layer_id: int,
|
||||
) -> torch.Tensor:
|
||||
topk_output = BypassedTopKOutput(
|
||||
hidden_states=hidden_states,
|
||||
router_logits=router_logits,
|
||||
topk_config=TopKConfig(
|
||||
top_k=top_k,
|
||||
topk_group=topk_group,
|
||||
num_expert_group=num_expert_group,
|
||||
correction_bias=correction_bias,
|
||||
),
|
||||
)
|
||||
forward_context = get_forward_context()
|
||||
moe_layer = forward_context.moe_layers[layer_id]
|
||||
return moe_layer.forward_impl(hidden_states, topk_output)
|
||||
|
||||
|
||||
def flashinfer_fp4_moe_forward_piecewise_cuda_graph_impl_fake(
|
||||
hidden_states: torch.Tensor,
|
||||
router_logits: torch.Tensor,
|
||||
top_k: int,
|
||||
topk_group: Optional[int],
|
||||
num_expert_group: Optional[int],
|
||||
correction_bias: Optional[torch.Tensor],
|
||||
layer_id: int,
|
||||
) -> torch.Tensor:
|
||||
return torch.empty_like(hidden_states)
|
||||
|
||||
|
||||
direct_register_custom_op(
|
||||
op_name="moe_forward_piecewise_cuda_graph_impl",
|
||||
op_func=moe_forward_piecewise_cuda_graph_impl,
|
||||
mutates_args=[],
|
||||
fake_impl=moe_forward_piecewise_cuda_graph_impl_fake,
|
||||
)
|
||||
|
||||
direct_register_custom_op(
|
||||
op_name="flashinfer_fp4_moe_forward_piecewise_cuda_graph_impl",
|
||||
op_func=flashinfer_fp4_moe_forward_piecewise_cuda_graph_impl,
|
||||
mutates_args=[],
|
||||
fake_impl=flashinfer_fp4_moe_forward_piecewise_cuda_graph_impl_fake,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user