sgl-project/sglang · error · KeyError

No '{backend.value}' backend registered for op {op!r}

Error message

No '{backend.value}' backend registered for op {op!r}

What it means

Registry.get_backend(op, backend) found no registered implementation for the requested op under the given backend, so collective/kernel dispatch cannot proceed.

Source

Thrown at python/sglang/kernels/registry.py:56

                        f"{other.target!r} != {spec.target!r}"
                    )
                return spec
        existing.append(spec)
        return spec

    def get(self, op: str) -> List[KernelSpec]:
        """All registered specs for ``op`` (empty list if none)."""
        return list(self._by_op.get(op, ()))

    def get_backend(self, op: str, backend: KernelBackend) -> KernelSpec:
        """The spec for ``op`` provided by ``backend``.

        Raises ``KeyError`` if no such implementation is registered.
        """
        for spec in self._by_op.get(op, ()):
            if spec.backend == backend:
                return spec
        raise KeyError(f"No '{backend.value}' backend registered for op {op!r}")

    def has(self, op: str) -> bool:
        return bool(self._by_op.get(op))

    def ops(self) -> List[str]:
        """Sorted list of all registered operator ids."""
        return sorted(self._by_op.keys())

    def all_specs(self) -> List[KernelSpec]:
        specs: List[KernelSpec] = []
        for op in self.ops():
            specs.extend(self._by_op[op])
        return specs


# Process-wide registry. Group packages register into this instance on import.
registry = KernelRegistry()

View on GitHub (pinned to 0132848349)

Solutions

  1. Ensure the module containing the registration is imported before get_backend (add to the package's registration entry point).
  2. Register the op for the backend being requested, or fall back to another registered backend via registry.has/ops().
  3. Check for typos in the op id string.

Example fix

// before
spec = registry.get_backend('my_op', Backend.CUDA)  # never registered
// after
from sglang.kernels.ops import my_op  # triggers registration
spec = registry.get_backend('my_op', Backend.CUDA)
Defensive patterns

Strategy: fallback

Validate before calling

if not registry.has(op):
    import sglang.kernels.ops  # ensure registrations ran

Try / catch

try:
    spec = registry.get_backend(op, backend)
except KeyError:
    spec = registry.get_backend(op, fallback_backend)

Prevention

When it happens

Trigger: Requesting e.g. Backend.TRITON for an op that only registered a Backend.CUDA implementation, or dispatching an op whose registration module was never imported (lazy import missing).

Common situations: Custom/allreduce init paths (initialize_model_parallel, custom allreduce node checks) querying backends before the registering module is imported; adding a new op id but forgetting to register it for all queried backends.

Related errors


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/13839df5238b5eb8. Report an issue: GitHub.