diff --git a/backends/vulkan/op_registry.py b/backends/vulkan/op_registry.py index 855df9d2e74..0423805b85e 100644 --- a/backends/vulkan/op_registry.py +++ b/backends/vulkan/op_registry.py @@ -188,6 +188,8 @@ def register_ephemeral_ops(): exir_ops.edge.aten.exp.default, exir_ops.edge.aten.gelu.default, exir_ops.edge.aten.hardshrink.default, + exir_ops.edge.aten.hardsigmoid.default, + exir_ops.edge.aten.hardswish.default, exir_ops.edge.aten.hardtanh.default, exir_ops.edge.aten.neg.default, exir_ops.edge.aten.relu.default, diff --git a/backends/vulkan/partitioner/vulkan_partitioner.py b/backends/vulkan/partitioner/vulkan_partitioner.py index 75475643100..d3b2737517f 100644 --- a/backends/vulkan/partitioner/vulkan_partitioner.py +++ b/backends/vulkan/partitioner/vulkan_partitioner.py @@ -47,6 +47,13 @@ # pyre-ignore ops_not_to_decompose = [ torch.ops.aten.upsample_nearest2d.vec, + # Activation ops with native Vulkan shaders that PyTorch's default + # decomposition table would otherwise decompose into primitive ops. + # The decomposed paths produce NaN/Inf on some GPUs (e.g. PowerVR) + # due to constant tensor loading issues in the decomposed graph. + torch.ops.aten.hardsigmoid.default, + torch.ops.aten.hardswish.default, + torch.ops.aten.hardshrink.default, ] logger: logging.Logger = logging.getLogger("")