{"record":{"id":"b456376fa5b3851e","repo":"sgl-project/sglang","slug":"flashkdakernel-only-supports-prefill-extend","errorCode":null,"errorMessage":"FlashKDAKernel only supports prefill (extend)","messagePattern":"FlashKDAKernel only supports prefill \\(extend\\)","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/layers/attention/linear/kernels/kda_flashkda.py","lineNumber":99,"sourceCode":"    Requires an SM90+ GPU with the ``flash_kda`` package.\n    \"\"\"\n\n    def decode(\n        self,\n        q: torch.Tensor,\n        k: torch.Tensor,\n        v: torch.Tensor,\n        a: torch.Tensor,\n        b: torch.Tensor,\n        *,\n        A_log: torch.Tensor,\n        dt_bias: torch.Tensor,\n        ssm_states: torch.Tensor,\n        cache_indices: torch.Tensor,\n        query_start_loc: torch.Tensor,\n        **kwargs,\n    ) -> torch.Tensor:\n        raise NotImplementedError(\"FlashKDAKernel only supports prefill (extend)\")\n\n    def extend(\n        self,\n        q: torch.Tensor,\n        k: torch.Tensor,\n        v: torch.Tensor,\n        g: torch.Tensor,\n        beta: torch.Tensor,\n        *,\n        ssm_states: torch.Tensor,\n        cache_indices: torch.Tensor,\n        query_start_loc: torch.Tensor,\n        A_log: Optional[torch.Tensor] = None,\n        dt_bias: Optional[torch.Tensor] = None,\n        lower_bound: Optional[float] = None,\n        extend_seq_lens_cpu: Optional[list] = None,\n        is_spec_decode: bool = False,\n        return_intermediate_states: bool = False,","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/layers/attention/linear/kernels/kda_flashkda.py#L81-L117","documentation":"FlashKDAKernel wraps a chunked prefill kernel only; it intentionally implements extend() and raises NotImplementedError from decode(). Decode must be routed to a different backend.","triggerScenarios":"Calling decode() on FlashKDAKernel — e.g. a dispatcher bug or manual use that routes the decode phase to the flashkda backend.","commonSituations":"Misconfigured backend selection that applies flashkda to all phases instead of prefill-only.","solutions":["Route decode to a decode-capable kernel (flashinfer recurrent_kda, triton, or helion)","Keep flashkda as the prefill backend only","Check the KDA dispatcher config for a per-phase backend split"],"exampleFix":"# before\nkernel = FlashKDAKernel(); out = kernel.decode(q,k,v,...)\n# after\ndecode_kernel = TritonKDAKernel(); out = decode_kernel.decode(q,k,v,...)","handlingStrategy":"type-guard","validationCode":"if phase == 'decode':\n    assert not isinstance(kernel, FlashKDAKernel), 'flashkda is prefill-only'","typeGuard":"def kernel_supports_decode(kernel) -> bool:\n    return type(kernel).decode.__code__ is not FlashKDAKernel.decode.__code__","tryCatchPattern":null,"preventionTips":["Route phases through the standard dispatcher","Document prefill-only kernels in custom config"],"tags":["sglang","flashkda","kda","decode","not-implemented"],"backgroundTag":"unsupported-operation","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}