{"record":{"id":"1884cb912fb10d5b","repo":"sgl-project/sglang","slug":"layer-id-layer-id-is-not-a-sparse-attention-laye","errorCode":null,"errorMessage":"layer_id={layer_id} is not a sparse attention layer; sparse layers: {list(self.sparse_layer_id_mapping.keys())}","messagePattern":"layer_id=(.+?) is not a sparse attention layer; sparse layers: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/mem_cache/memory_pool.py","lineNumber":4975,"sourceCode":"        if mapped_id is None:\n            raise ValueError(\n                f\"layer_id={layer_id} does not have an index V cache \"\n                f\"(either dense, or in the K-only group). \"\n                f\"index_kv layers: {list(self.index_kv_layer_id_mapping.keys())}\"\n            )\n        return self.index_kv_pool.get_kv_buffer(mapped_id)\n\n    def get_index_k_buffer(self, layer_id: int) -> torch.Tensor:\n        self._wait_for_layer(layer_id)\n        # First try the K-only pool; fall back to the index_kv pool's K side\n        # so callers that just need K work for both sparse subgroups.\n        mapped_id = self.index_k_layer_id_mapping.get(layer_id)\n        if mapped_id is not None:\n            return self.index_k_pool.get_key_buffer(mapped_id)\n        mapped_id = self.index_kv_layer_id_mapping.get(layer_id)\n        if mapped_id is not None:\n            return self.index_kv_pool.get_key_buffer(mapped_id)\n        raise ValueError(\n            f\"layer_id={layer_id} is not a sparse attention layer; \"\n            f\"sparse layers: {list(self.sparse_layer_id_mapping.keys())}\"\n        )\n\n    def set_kv_buffer(\n        self,\n        layer: RadixAttention,\n        loc: torch.Tensor,\n        cache_k: torch.Tensor,\n        cache_v: torch.Tensor,\n        k_scale: Optional[float] = None,\n        v_scale: Optional[float] = None,\n    ) -> None:\n        \"\"\"Write main K/V at `loc`. Works for any layer (dense or sparse).\n\n        Scale semantics follow MHATokenToKVPool: None means unit scale;\n        a non-None scale is applied with an in-place div_ before the fp8 cast.\n        \"\"\"","sourceCodeStart":4957,"sourceCodeEnd":4993,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/mem_cache/memory_pool.py#L4957-L4993","documentation":"MiniMaxSparseKVPool.get_key_buffer raised because the layer_id appears in neither index_k_layer_id_mapping (K-only sparse group) nor index_kv_layer_id_mapping (index K+V group) — i.e. it is not a sparse attention layer at all, so the sparse pool has no key buffer for it.","triggerScenarios":"Calling get_key_buffer on the sparse pool with a dense-attention layer id; or a layer-id enumeration mismatch where the sparse layer sets were built from a different layer ordering than the caller uses.","commonSituations":"Custom attention backends or profiling code iterating every layer through the sparse pool; model config changes that moved layers between dense and sparse groups; off-by-one or absolute-vs-remapped layer id confusion.","solutions":["Check membership in index_k_layer_id_mapping / index_kv_layer_id_mapping before calling; dense layers must use main_pool.get_key_buffer","Verify the sparse layer lists used to build the pool match the model's actual layer partition","Use absolute layer ids consistently (no remapped compact ids) when calling this API"],"exampleFix":"// before\nk = sparse_pool.get_key_buffer(layer_id)  # dense layer -> ValueError\n// after\nif layer_id in sparse_pool.index_k_layer_id_mapping or layer_id in sparse_pool.index_kv_layer_id_mapping:\n    k = sparse_pool.get_key_buffer(layer_id)\nelse:\n    k = sparse_pool.main_pool.get_key_buffer(layer_id)","handlingStrategy":"validation","validationCode":"if layer_id not in sparse_pool.index_k_layer_id_mapping and layer_id not in sparse_pool.index_kv_layer_id_mapping:\n    k = sparse_pool.main_pool.get_key_buffer(layer_id)  # dense layer","typeGuard":"def is_sparse_layer(sparse_pool, layer_id: int) -> bool:\n    return layer_id in sparse_pool.index_k_layer_id_mapping or layer_id in sparse_pool.index_kv_layer_id_mapping","tryCatchPattern":null,"preventionTips":["Branch dense vs sparse before buffer access","Keep layer ids absolute and consistent between pool construction and callers"],"tags":["kv-cache","sparse-attention","layer-id","mapping","minimax","sglang"],"backgroundTag":"invalid-layer-id-mapping","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}