From 4c21d4173358b45500769a95776500a34bf04589 Mon Sep 17 00:00:00 2001 From: Marceli Fylcek Date: Tue, 1 Sep 2026 03:19:52 +0200 Subject: [PATCH] [XPU] Route activation CustomOps to SYCL kernels (#53734) Signed-off-by: Marceli Fylcek Co-authored-by: Claude Opus 5 (1M context) Co-authored-by: Kunshang Ji --- vllm/model_executor/layers/activation.py | 26 ++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/vllm/model_executor/layers/activation.py b/vllm/model_executor/layers/activation.py index eb8fcb0962..159c521cee 100644 --- a/vllm/model_executor/layers/activation.py +++ b/vllm/model_executor/layers/activation.py @@ -87,7 +87,7 @@ class FatreluAndMul(CustomOp): def __init__(self, threshold: float = 0.0): super().__init__() self.threshold = threshold - if current_platform.is_cuda_alike(): + if current_platform.is_cuda_alike() or current_platform.is_xpu(): self.op = torch.ops._C.fatrelu_and_mul elif current_platform.is_cpu(): self._forward_method = self.forward_native @@ -106,6 +106,9 @@ class FatreluAndMul(CustomOp): self.op(out, x, self.threshold) return out + def forward_xpu(self, x: torch.Tensor) -> torch.Tensor: + return self.forward_cuda(x) + # --8<-- [start:silu_and_mul] @CustomOp.register("silu_and_mul") @@ -171,7 +174,7 @@ class SituAndMul(CustomOp): super().__init__(compile_native=compile_native) self.beta = float(beta) self.linear_beta = None if linear_beta is None else float(linear_beta) - if current_platform.is_cuda_alike(): + if current_platform.is_cuda_alike() or current_platform.is_xpu(): self.op = torch.ops._C.situ_and_mul def forward_native(self, x: torch.Tensor) -> torch.Tensor: @@ -184,7 +187,7 @@ class SituAndMul(CustomOp): return (gate * up).to(x.dtype) def forward_cuda(self, x: torch.Tensor) -> torch.Tensor: - # Fused CUDA kernel: writes straight to `out`, no fp32 temporaries. + # Fused CUDA/XPU kernel: writes straight to `out`, no fp32 temporaries. # linear_beta<=0 signals "unset" to the kernel (up passed through). d = x.shape[-1] // 2 out = torch.empty(x.shape[:-1] + (d,), dtype=x.dtype, device=x.device) @@ -194,7 +197,7 @@ class SituAndMul(CustomOp): return out def forward_xpu(self, x: torch.Tensor) -> torch.Tensor: - return self.forward_native(x) + return self.forward_cuda(x) @CustomOp.register("silu_and_mul_with_clamp") @@ -503,6 +506,9 @@ class SwigluOAIAndMul(CustomOp): torch.ops._C.swigluoai_and_mul(out, x, self.alpha, self.limit) return out + def forward_xpu(self, x: torch.Tensor) -> torch.Tensor: + return self.forward_cuda(x) + def extra_repr(self) -> str: return f"alpha={repr(self.alpha)}, limit={repr(self.limit)}" @@ -541,6 +547,13 @@ class SwigluStepAndMul(CustomOp): swiglustep_and_mul_triton(out, x, self.limit) return out + def forward_xpu(self, x: torch.Tensor) -> torch.Tensor: + d = x.shape[-1] // 2 + output_shape = x.shape[:-1] + (d,) + out = torch.empty(output_shape, dtype=x.dtype, device=x.device) + torch.ops._C.swiglustep_and_mul(out, x, self.limit) + return out + def extra_repr(self) -> str: return f"limit={repr(self.limit)}" @@ -656,6 +669,8 @@ class ReLUSquaredActivation(CustomOp): super().__init__(compile_native=compile_native) if current_platform.is_cuda_alike(): self.op = torch.ops._C.relu_squared + elif current_platform.is_xpu(): + self.op = torch.ops._C.relu2_no_mul def forward_native(self, x: torch.Tensor) -> torch.Tensor: """PyTorch-native implementation equivalent to forward().""" @@ -666,6 +681,9 @@ class ReLUSquaredActivation(CustomOp): self.op(out, x) return out + def forward_xpu(self, x: torch.Tensor) -> torch.Tensor: + return self.forward_cuda(x) + # --8<-- [start:xielu] @CustomOp.register("xielu")