Skip to content

vllm.model_executor.warmup.jit_warmup

Shared interfaces and tracing helpers for explicit JIT warmup keys.

Classes:

  • JitWarmupRegistry

    Collect and compile JIT kernels selected during runner setup.

  • VllmJitKernel

    Kernel wrapper that owns dispatch, warmup keys, and compilation.

  • WarmupIntRange

    Expand integers with range semantics or a custom monotonic progression.

Functions:

  • zip_inputs

    Group row-wise dispatch inputs that should be expanded in lockstep.

JitWarmupRegistry

Collect and compile JIT kernels selected during runner setup.

Methods:

  • activate

    Collect registrations made in this context.

  • register

    Register a kernel with the active registry, if one exists.

  • warmup

    Expand registrations and compile each wrapper/key pair once.

Source code in vllm/model_executor/warmup/jit_warmup.py
class JitWarmupRegistry:
    """Collect and compile JIT kernels selected during runner setup."""

    _active: ContextVar[JitWarmupRegistry | None] = ContextVar(
        "active_jit_warmup_registry",
        default=None,
    )

    def __init__(self, vllm_config: Any) -> None:
        self.vllm_config = vllm_config
        self._registrations: dict[
            VllmJitKernel[Any],
            list[tuple[tuple[Any, ...], dict[str, Any]]],
        ] = {}

    @contextmanager
    def activate(self) -> Iterator[None]:
        """Collect registrations made in this context."""
        token = self._active.set(self)
        try:
            yield
        finally:
            self._active.reset(token)

    @classmethod
    def register(
        cls,
        kernel: VllmJitKernel[Any],
        *args: Any,
        **kwargs: Any,
    ) -> None:
        """Register a kernel with the active registry, if one exists."""
        registry = cls._active.get()
        if registry is not None:
            registry._add(kernel, args, kwargs)

    def _add(
        self,
        kernel: VllmJitKernel[Any],
        args: tuple[Any, ...],
        kwargs: dict[str, Any],
    ) -> None:
        registrations = self._registrations.setdefault(kernel, [])
        # Every layer of a deep model appends an identical (args, kwargs) here
        # (e.g. a 61-layer DSA model registers the same pack (dtype, pad_value)
        # 61 times); each expands to the same compile keys, so tracing
        # get_warmup_keys once per distinct registration is sufficient. Dedup on
        # identity-or-equality -- identity short-circuits shared singletons like
        # vllm_config before any deep __eq__.
        if any(
            _same_registration(registered, (args, kwargs))
            for registered in registrations
        ):
            return
        registrations.append((args, kwargs))

    def __len__(self) -> int:
        return sum(len(registrations) for registrations in self._registrations.values())

    def warmup(self) -> None:
        """Expand registrations and compile each wrapper/key pair once."""
        from tqdm import tqdm

        from vllm.distributed import is_global_first_rank

        kernel_items: list[tuple[VllmJitKernel[Any], dict[Any, None]]] = []
        for kernel, registrations in self._registrations.items():
            compile_keys: dict[Any, None] = {}
            for args, kwargs in registrations:
                if (
                    not args
                    and not kwargs
                    and inspect.signature(kernel.get_warmup_keys).parameters
                ):
                    args = (self.vllm_config,)
                for compile_key in kernel.get_warmup_keys(*args, **kwargs):
                    compile_keys[compile_key] = None
            if compile_keys:
                kernel_items.append((kernel, compile_keys))

        if not kernel_items:
            return

        total_keys = sum(len(compile_keys) for _, compile_keys in kernel_items)
        with tqdm(
            kernel_items,
            desc=f"JIT kernel warmup ({total_keys} compile keys)",
            disable=not is_global_first_rank(),
            dynamic_ncols=True,
            unit="kernel",
        ) as progress:
            for kernel, compile_keys in progress:
                progress.set_postfix_str(
                    f"{kernel.__class__.__name__} ({len(compile_keys)} keys)",
                    refresh=False,
                )
                for compile_key in compile_keys:
                    kernel.compile(compile_key)

activate()

Collect registrations made in this context.

Source code in vllm/model_executor/warmup/jit_warmup.py
@contextmanager
def activate(self) -> Iterator[None]:
    """Collect registrations made in this context."""
    token = self._active.set(self)
    try:
        yield
    finally:
        self._active.reset(token)

register(kernel, *args, **kwargs) classmethod

Register a kernel with the active registry, if one exists.

Source code in vllm/model_executor/warmup/jit_warmup.py
@classmethod
def register(
    cls,
    kernel: VllmJitKernel[Any],
    *args: Any,
    **kwargs: Any,
) -> None:
    """Register a kernel with the active registry, if one exists."""
    registry = cls._active.get()
    if registry is not None:
        registry._add(kernel, args, kwargs)

warmup()

Expand registrations and compile each wrapper/key pair once.

Source code in vllm/model_executor/warmup/jit_warmup.py
def warmup(self) -> None:
    """Expand registrations and compile each wrapper/key pair once."""
    from tqdm import tqdm

    from vllm.distributed import is_global_first_rank

    kernel_items: list[tuple[VllmJitKernel[Any], dict[Any, None]]] = []
    for kernel, registrations in self._registrations.items():
        compile_keys: dict[Any, None] = {}
        for args, kwargs in registrations:
            if (
                not args
                and not kwargs
                and inspect.signature(kernel.get_warmup_keys).parameters
            ):
                args = (self.vllm_config,)
            for compile_key in kernel.get_warmup_keys(*args, **kwargs):
                compile_keys[compile_key] = None
        if compile_keys:
            kernel_items.append((kernel, compile_keys))

    if not kernel_items:
        return

    total_keys = sum(len(compile_keys) for _, compile_keys in kernel_items)
    with tqdm(
        kernel_items,
        desc=f"JIT kernel warmup ({total_keys} compile keys)",
        disable=not is_global_first_rank(),
        dynamic_ncols=True,
        unit="kernel",
    ) as progress:
        for kernel, compile_keys in progress:
            progress.set_postfix_str(
                f"{kernel.__class__.__name__} ({len(compile_keys)} keys)",
                refresh=False,
            )
            for compile_key in compile_keys:
                kernel.compile(compile_key)

VllmJitKernel

Bases: Generic[CompileKeyT], ABC

Kernel wrapper that owns dispatch, warmup keys, and compilation.

Methods:

  • compile

    Compile one warmup key.

  • dispatch

    Build one compile key from one concrete dispatch point.

  • get_warmup_keys

    Return compile keys that should be warmed for this kernel.

  • register_warmup

    Register this kernel with the active runner's warmup registry.

  • warmup

    Compile this kernel's warmup keys.

Source code in vllm/model_executor/warmup/jit_warmup.py
class VllmJitKernel(Generic[CompileKeyT], ABC):
    """Kernel wrapper that owns dispatch, warmup keys, and compilation."""

    CompileKey: type[CompileKeyT]

    def __init__(self) -> None:
        self._dispatch_trace = _trace_compile_key_dispatch(self.dispatch)
        self._compiled_cache: dict[Any, Any] = {}

    def compile_key(self, kwargs: Mapping[str, Any]) -> CompileKeyT:
        return self._dispatch_trace.compile_key(self.CompileKey, kwargs)

    def _get_or_compile(
        self,
        compile_key: CompileKeyT,
        *,
        runtime_context: Mapping[str, Any] | None = None,
    ) -> Any:
        """Return a cached executor, compiling it on a monitored cache miss."""
        if compile_key not in self._compiled_cache:
            self.compile(compile_key)

        try:
            return self._compiled_cache[compile_key]
        except KeyError as exc:
            details = [f"compile_key={compile_key!r}"]
            if runtime_context:
                details.append(f"runtime_context={dict(runtime_context)!r}")
            raise RuntimeError(
                f"{type(self).__name__}.compile(...) did not cache its JIT "
                f"executor ({', '.join(details)})"
            ) from exc

    def _trace_dispatch(
        self, dispatch: CompileKeyDispatchFn[CompileKeyT]
    ) -> Callable[..., list[CompileKeyT]]:
        compile_key_dispatch_trace = _trace_compile_key_dispatch(dispatch)

        def traced(
            *input_groups: _WarmupInputRows,
            _when: WarmupPredicateFn | None = None,
            **kwargs: WarmupValues,
        ) -> list[CompileKeyT]:
            for group in input_groups:
                if not isinstance(group, _WarmupInputRows):
                    raise TypeError(
                        "_trace_dispatch positional arguments must be "
                        "zip_inputs(...) groups"
                    )
            predicate_trace = (
                _trace_warmup_predicate(_when) if _when is not None else None
            )
            predicate_only_names: frozenset[str] = frozenset()
            if predicate_trace is not None:
                compile_key_fields = frozenset(
                    field.name for field in fields(cast(Any, self.CompileKey))
                )
                predicate_only_names = (
                    predicate_trace.input_names
                    - compile_key_dispatch_trace.input_names
                    - compile_key_fields
                )
            # Unmatched **kwargs fields also belong to the expansion space.
            available_names = set(kwargs).union(
                *(group.rows[0] for group in input_groups)
            )
            input_names = compile_key_dispatch_trace.input_names_for(available_names)
            if predicate_trace is not None:
                input_names = input_names | predicate_trace.input_names
            expanded_input_groups = tuple(
                _expand_warmup_input_rows(group.rows, input_names)
                for group in input_groups
            )
            # Expand independent keyword inputs into cartesian-product axes.
            expanded_kwarg_axes = tuple(
                (name, _expand_warmup_values(value))
                for name, value in kwargs.items()
                if name in input_names
            )
            dispatch_value_axes = (
                *expanded_input_groups,
                *(values for _, values in expanded_kwarg_axes),
            )
            input_group_count = len(expanded_input_groups)
            kwarg_names = tuple(name for name, _ in expanded_kwarg_axes)
            compile_keys: dict[CompileKeyT, None] = {}
            for dispatch_value_set in itertools.product(*dispatch_value_axes):
                dispatch_values = _merge_warmup_kwargs(
                    (
                        *dispatch_value_set[:input_group_count],
                        dict(
                            zip(
                                kwarg_names,
                                dispatch_value_set[input_group_count:],
                            )
                        ),
                    )
                )
                if predicate_trace is not None and not predicate_trace.matches(
                    dispatch_values
                ):
                    continue
                compile_key = compile_key_dispatch_trace.compile_key(
                    self.CompileKey,
                    {
                        name: value
                        for name, value in dispatch_values.items()
                        if name not in predicate_only_names
                    },
                )
                compile_keys[compile_key] = None
            return list(compile_keys)

        return traced

    @abstractmethod
    def dispatch(self, **kwargs: Any) -> CompileKeyT:
        """Build one compile key from one concrete dispatch point."""
        raise NotImplementedError

    @abstractmethod
    def get_warmup_keys(self, *args: Any, **kwargs: Any) -> list[CompileKeyT]:
        """Return compile keys that should be warmed for this kernel."""
        raise NotImplementedError

    @abstractmethod
    def compile(self, compile_key: CompileKeyT) -> None:
        """Compile one warmup key."""
        raise NotImplementedError

    def register_warmup(self, *args: Any, **kwargs: Any) -> None:
        """Register this kernel with the active runner's warmup registry."""
        JitWarmupRegistry.register(self, *args, **kwargs)

    def warmup(self, *args: Any, **kwargs: Any) -> None:
        """Compile this kernel's warmup keys."""
        for compile_key in self.get_warmup_keys(*args, **kwargs):
            self.compile(compile_key)

_get_or_compile(compile_key, *, runtime_context=None)

Return a cached executor, compiling it on a monitored cache miss.

Source code in vllm/model_executor/warmup/jit_warmup.py
def _get_or_compile(
    self,
    compile_key: CompileKeyT,
    *,
    runtime_context: Mapping[str, Any] | None = None,
) -> Any:
    """Return a cached executor, compiling it on a monitored cache miss."""
    if compile_key not in self._compiled_cache:
        self.compile(compile_key)

    try:
        return self._compiled_cache[compile_key]
    except KeyError as exc:
        details = [f"compile_key={compile_key!r}"]
        if runtime_context:
            details.append(f"runtime_context={dict(runtime_context)!r}")
        raise RuntimeError(
            f"{type(self).__name__}.compile(...) did not cache its JIT "
            f"executor ({', '.join(details)})"
        ) from exc

compile(compile_key) abstractmethod

Compile one warmup key.

Source code in vllm/model_executor/warmup/jit_warmup.py
@abstractmethod
def compile(self, compile_key: CompileKeyT) -> None:
    """Compile one warmup key."""
    raise NotImplementedError

dispatch(**kwargs) abstractmethod

Build one compile key from one concrete dispatch point.

Source code in vllm/model_executor/warmup/jit_warmup.py
@abstractmethod
def dispatch(self, **kwargs: Any) -> CompileKeyT:
    """Build one compile key from one concrete dispatch point."""
    raise NotImplementedError

get_warmup_keys(*args, **kwargs) abstractmethod

Return compile keys that should be warmed for this kernel.

Source code in vllm/model_executor/warmup/jit_warmup.py
@abstractmethod
def get_warmup_keys(self, *args: Any, **kwargs: Any) -> list[CompileKeyT]:
    """Return compile keys that should be warmed for this kernel."""
    raise NotImplementedError

register_warmup(*args, **kwargs)

Register this kernel with the active runner's warmup registry.

Source code in vllm/model_executor/warmup/jit_warmup.py
def register_warmup(self, *args: Any, **kwargs: Any) -> None:
    """Register this kernel with the active runner's warmup registry."""
    JitWarmupRegistry.register(self, *args, **kwargs)

warmup(*args, **kwargs)

Compile this kernel's warmup keys.

Source code in vllm/model_executor/warmup/jit_warmup.py
def warmup(self, *args: Any, **kwargs: Any) -> None:
    """Compile this kernel's warmup keys."""
    for compile_key in self.get_warmup_keys(*args, **kwargs):
        self.compile(compile_key)

WarmupIntRange dataclass

Expand integers with range semantics or a custom monotonic progression.

Source code in vllm/model_executor/warmup/jit_warmup.py
@dataclass(frozen=True)
class WarmupIntRange:
    """Expand integers with range semantics or a custom monotonic progression."""

    start: int
    stop: int
    step: int = 1
    advance: Callable[[int], int] | None = None

_WarmupInputRows dataclass

Warmup dispatch inputs expanded in lockstep.

Source code in vllm/model_executor/warmup/jit_warmup.py
@dataclass(frozen=True)
class _WarmupInputRows:
    """Warmup dispatch inputs expanded in lockstep."""

    rows: tuple[Mapping[str, WarmupValues], ...]

_same_registration(left, right)

True if two (args, kwargs) registrations are equivalent.

Source code in vllm/model_executor/warmup/jit_warmup.py
def _same_registration(
    left: tuple[tuple[Any, ...], dict[str, Any]],
    right: tuple[tuple[Any, ...], dict[str, Any]],
) -> bool:
    """True if two ``(args, kwargs)`` registrations are equivalent."""
    left_args, left_kwargs = left
    right_args, right_kwargs = right
    if len(left_args) != len(right_args) or left_kwargs.keys() != right_kwargs.keys():
        return False
    return all(
        _same_value(x, y) for x, y in zip(left_args, right_args, strict=True)
    ) and all(_same_value(left_kwargs[k], right_kwargs[k]) for k in left_kwargs)

_same_value(left, right)

True if two registration values are the same object or compare equal.

Identity is checked first so shared singletons (e.g. vllm_config, torch dtypes) short-circuit before any potentially deep or non-boolean __eq__.

Source code in vllm/model_executor/warmup/jit_warmup.py
def _same_value(left: Any, right: Any) -> bool:
    """True if two registration values are the same object or compare equal.

    Identity is checked first so shared singletons (e.g. ``vllm_config``, torch
    dtypes) short-circuit before any potentially deep or non-boolean ``__eq__``.
    """
    if left is right:
        return True
    try:
        return bool(left == right)
    except (TypeError, ValueError, RuntimeError):
        return False

zip_inputs(*rows)

Group row-wise dispatch inputs that should be expanded in lockstep.

Source code in vllm/model_executor/warmup/jit_warmup.py
def zip_inputs(*rows: Mapping[str, WarmupValues]) -> _WarmupInputRows:
    """Group row-wise dispatch inputs that should be expanded in lockstep."""
    if not rows:
        raise ValueError("zip_inputs requires at least one dispatch input row")
    if not all(isinstance(row, Mapping) for row in rows):
        raise ValueError("zip_inputs rows must be mappings")

    first_names = frozenset(rows[0])
    if not first_names:
        raise ValueError("zip_inputs rows require at least one dispatch input name")
    if not all(isinstance(name, str) for name in first_names):
        raise ValueError("zip_inputs dispatch input names must be strings")

    input_rows: list[Mapping[str, WarmupValues]] = []
    for row in rows:
        names = frozenset(row)
        if names != first_names:
            raise ValueError("zip_inputs rows must use the same dispatch input names")
        input_rows.append(dict(row))

    return _WarmupInputRows(rows=tuple(input_rows))