# SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project """Tests for autotuning Helion kernels, including disabled kernels with no configs.""" import pytest import torch from vllm.utils.import_utils import has_helion if not has_helion(): pytest.skip( "Helion is not installed. Install with: pip install vllm[helion]", allow_module_level=True, ) import helion import helion.language as hl from helion.autotuner.base_search import BaseSearch from tests.kernels.helion.helpers import dummy_kernel_registry from vllm.kernels.helion.register import create_helion_decorated_kernel def _add_kernel(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor: out = torch.empty_like(x) for tile in hl.tile(x.size()): out[tile] = x[tile] + y[tile] return out class NoCompileSearch(BaseSearch): """Autotuner that returns the default config without GPU compilation. Modeled after helion's test BasicSearch (pytorch/helion#1649). """ def autotune(self, *, skip_cache: bool = False): return self.config_spec.default_config() def _no_compile_autotuner_fn(bound_kernel, args, **kwargs): return NoCompileSearch(bound_kernel, args, **kwargs) class TestAutotuneDisabledKernel: """Test autotuning flow on disabled kernels (no platform configs).""" def setup_method(self): from vllm.kernels.helion.register import _REGISTERED_KERNELS self._saved_registry = dict(_REGISTERED_KERNELS) _REGISTERED_KERNELS.clear() def teardown_method(self): from vllm.kernels.helion.register import _REGISTERED_KERNELS _REGISTERED_KERNELS.clear() _REGISTERED_KERNELS.update(self._saved_registry) def test_autotune_disabled_kernel_produces_valid_config(self): """Register a kernel with no configs (disabled), run autotune, verify it produces a valid helion.Config.""" with dummy_kernel_registry(configs={}) as register: wrapper = register( "autotune_test_kernel", config_picker=lambda args, keys: "default", fake_impl=lambda *a, **kw: None, input_generator=lambda: { "small": ( torch.randn(4, 4, device="cuda"), torch.randn(4, 4, device="cuda"), ), }, )(_add_kernel) assert wrapper._disabled is True inputs = wrapper.get_inputs() assert "small" in inputs settings = helion.Settings() settings.autotuner_fn = _no_compile_autotuner_fn wrapper.helion_settings = settings config = wrapper.run_autotune(inputs["small"]) expected_default = ( create_helion_decorated_kernel(_add_kernel, helion_settings=settings) .bind(inputs["small"]) .config_spec.default_config() ) assert config == expected_default