{"record":{"id":"a969516cdd8b8050","repo":"sgl-project/sglang","slug":"conflicting-kernel-registration-for-op-spec-op-r","errorCode":null,"errorMessage":"Conflicting kernel registration for op {spec.op!r}, backend {spec.backend.value!r}: {other.target!r} != {spec.target!r}","messagePattern":"Conflicting kernel registration for op (.+?), backend (.+?): (.+?) != (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/kernels/registry.py","lineNumber":35,"sourceCode":"class KernelRegistry:\n    \"\"\"Maps ``\"<group>.<name>\"`` operator ids to their :class:`KernelSpec` list.\"\"\"\n\n    def __init__(self) -> None:\n        self._by_op: Dict[str, List[KernelSpec]] = defaultdict(list)\n\n    def register(self, spec: KernelSpec) -> KernelSpec:\n        \"\"\"Register ``spec``.\n\n        Re-registering an identical spec is idempotent so that module reloads\n        during tests remain safe. A different spec for the same ``(op,\n        backend)`` pair is rejected because silently replacing it makes the\n        selected implementation depend on import order.\n        \"\"\"\n        existing = self._by_op[spec.op]\n        for other in existing:\n            if other.backend == spec.backend:\n                if other != spec:\n                    raise ValueError(\n                        f\"Conflicting kernel registration for op {spec.op!r}, \"\n                        f\"backend {spec.backend.value!r}: \"\n                        f\"{other.target!r} != {spec.target!r}\"\n                    )\n                return spec\n        existing.append(spec)\n        return spec\n\n    def get(self, op: str) -> List[KernelSpec]:\n        \"\"\"All registered specs for ``op`` (empty list if none).\"\"\"\n        return list(self._by_op.get(op, ()))\n\n    def get_backend(self, op: str, backend: KernelBackend) -> KernelSpec:\n        \"\"\"The spec for ``op`` provided by ``backend``.\n\n        Raises ``KeyError`` if no such implementation is registered.\n        \"\"\"\n        for spec in self._by_op.get(op, ()):","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/kernels/registry.py#L17-L53","documentation":"The kernel registry forbids two different registrations for the same (op, backend) pair with different targets — the second, conflicting spec raises this so that implementation selection never depends on import order.","triggerScenarios":"Calling register_kernel twice for the same op id and backend with a different target function — e.g. a plugin overriding a built-in kernel, or duplicated registration after a module refactor/re-import.","commonSituations":"Custom backend plugins that re-register existing ops; stale imports after file moves causing the same spec to be registered with a relocated target; monkey-patching via registration instead of explicit override.","solutions":["Remove the duplicate registration; register each (op, backend) exactly once.","If overriding is intended, unregister/replace the existing spec first or use a distinct op id.","Check for re-imported modules or plugin entry points that duplicate built-in registrations."],"exampleFix":"// before\nregister_kernel(KernelSpec(op='allreduce', backend=Backend.TRITON, target=my_impl))\nregister_kernel(KernelSpec(op='allreduce', backend=Backend.TRITON, target=other_impl))  # conflict\n// after\nregister_kernel(KernelSpec(op='allreduce', backend=Backend.TRITON, target=my_impl))  # single registration","handlingStrategy":"try-catch","validationCode":"if registry.has(op) and any(s.backend == backend for s in registry._by_op.get(op, ())):\n    # already registered, skip","typeGuard":null,"tryCatchPattern":"try:\n    register_kernel(spec)\nexcept ValueError as e:\n    if 'Conflicting kernel registration' not in str(e): raise","preventionTips":["Register each (op, backend) once, in a dedicated registration module.","Guard plugins with a has/lookup check before registering."],"tags":["kernel-registry","duplicate-registration"],"backgroundTag":"duplicate-registration-conflict","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}