{"record":{"id":"22ed354b559bf1d4","repo":"sgl-project/sglang","slug":"enable-linear-replayssm-requires-triton-or-heli","errorCode":null,"errorMessage":"--enable-linear-replayssm requires Triton, or Helion for KDA, as the linear-attn decode backend; got --linear-attn-decode-backend={decode!r}.","messagePattern":"--enable-linear-replayssm requires Triton, or Helion for KDA, as the linear-attn decode backend; got --linear-attn-decode-backend=(.+?)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/server_args.py","lineNumber":6935,"sourceCode":"            )\n\n        # ReplaySSM buffered decode guards. Runs on Triton, or Helion for KDA.\n        # cuda-graph is supported (slice 1b: CUDA-graph-safe static\n        # write-cursor buffers). The RADIX prefix cache is now supported (slice\n        # 2b: the decode kernel force-flushes the ring into temporal[slot] on\n        # the radix track boundary `seq_lens % mamba_track_interval == 0`, and\n        # the COW copy-into-slot path resets the ring cursor) -- so the\n        # --disable-radix-cache requirement is dropped.\n        #\n        # Slice 2b only wires the no_buffer mamba scheduler strategy (the\n        # default). The extra_buffer strategy donates the track snapshot via\n        # `donate_mamba_ping_pong_slot` with a separate ping-pong slot swap that\n        # does NOT route through MambaPool.copy_from, so the ReplaySSM ring\n        # cursor of the donated/kept slot would not be reset there. Handling\n        # that donation path is a follow-up; for now require no_buffer.\n        if cfg.enable_linear_replayssm:\n            if decode not in {\"triton\", \"helion\"}:\n                raise ValueError(\n                    \"--enable-linear-replayssm requires Triton, or Helion for \"\n                    \"KDA, as the linear-attn decode backend; got \"\n                    f\"--linear-attn-decode-backend={decode!r}.\"\n                )\n            from sglang.srt.arg_groups.overrides import (\n                mamba_extra_buffer_of,\n            )\n\n            if mamba_extra_buffer_of(resolved_view(self)):\n                raise ValueError(\n                    \"--enable-linear-replayssm requires --mamba-radix-cache-strategy \"\n                    \"no_buffer (the default); the extra_buffer ping-pong \"\n                    \"donation path is not yet supported (follow-up). Got \"\n                    f\"--mamba-radix-cache-strategy={cfg.mamba_radix_cache_strategy!r}.\"\n                )\n            if cfg.disaggregation_mode != \"null\":\n                # The disaggregated decode pool (HybridMambaDecodeReqToTokenPool)\n                # is not wired for the ReplaySSM ring, so the flag would silently","sourceCodeStart":6917,"sourceCodeEnd":6953,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/server_args.py#L6917-L6953","documentation":"The ReplaySSM buffered-decode feature (--enable-linear-replayssm) only works when the linear-attention decode backend is Triton, or Helion for KDA models. Any other --linear-attn-decode-backend (e.g. flashinfer) is rejected because the ReplaySSM ring replay is only implemented for those kernels.","triggerScenarios":"Passing --enable-linear-replayssm together with --linear-attn-decode-backend flashinfer (or any value outside {triton, helion}).","commonSituations":"Enabling ReplaySSM for throughput on a config that already selected flashinfer decode for GDN; mixing newer experimental flags with older tuned backend choices.","solutions":["Set --linear-attn-decode-backend triton (or helion for KDA models)","Or drop --enable-linear-replayssm if you must keep flashinfer decode"],"exampleFix":"# before\n--enable-linear-replayssm --linear-attn-decode-backend flashinfer\n# after\n--enable-linear-replayssm --linear-attn-decode-backend triton","handlingStrategy":"validation","validationCode":"REPLAYSSM_DECODE_OK = {\"triton\", \"helion\"}\ndef validate(decode_backend, enable_replayssm):\n    return not enable_replayssm or decode_backend in REPLAYSSM_DECODE_OK","typeGuard":"def replayssm_compatible_decode(b: str) -> bool: return b in {\"triton\", \"helion\"}","tryCatchPattern":null,"preventionTips":["Keep a compatibility matrix of experimental flags vs backends","Prefer removing flags rather than overriding backends when enabling ReplaySSM"],"tags":["sglang","replayssm","linear-attention","backend-validation"],"backgroundTag":"incompatible-backend-selection","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}