{"record":{"id":"551fa381a17e66e8","repo":"sgl-project/sglang","slug":"pd-disagg-pp-1-not-supported-for-minimax-sparse-i-551fa3","errorCode":null,"errorMessage":"PD disagg: PP>1 not supported for MiniMax sparse index yet.","messagePattern":"PD disagg: PP>1 not supported for MiniMax sparse index yet\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/disaggregation/mori/conn.py","lineNumber":1379,"sourceCode":"        dst_state_indices: npt.NDArray[np.int32],\n        src_state_mem_descs: List[MemoryDesc],\n        src_state_item_lens: List[int],\n        dst_state_mem_descs: List[MemoryDesc],\n        state_type: str,\n    ) -> List[TransferStatus]:\n        # TP mismatch check for non-MLA SWA\n        if (\n            state_type == \"swa\"\n            and not self.is_mla_backend\n            and peer_info.decode_tp_size != self.attn_tp_size\n        ):\n            raise RuntimeError(\n                f\"PD state transfer does not support TP-mismatched non-MLA SWA models \"\n                f\"(prefill_tp_size={self.attn_tp_size}, decode_tp_size={peer_info.decode_tp_size})\"\n            )\n        if state_type == \"minimax_index_k\":\n            if self.pp_size is not None and self.pp_size > 1:\n                raise RuntimeError(\n                    \"PD disagg: PP>1 not supported for MiniMax sparse index yet.\"\n                )\n            if peer_info.decode_tp_size != self.attn_tp_size:\n                raise RuntimeError(\n                    \"PD disagg: heterogeneous TP not supported for MiniMax sparse index yet.\"\n                )\n\n        common_len = min(src_state_indices.size, dst_state_indices.size)\n        if (\n            state_type == \"c128_state\"\n            and common_len == 0\n            and src_state_indices.size == 0\n            and dst_state_indices.size == 0\n        ):\n            return []\n        if common_len == 0 and max(src_state_indices.size, dst_state_indices.size) > 0:\n            raise RuntimeError(\n                f\"No overlapping state indices for state_type={state_type}\"","sourceCodeStart":1361,"sourceCodeEnd":1397,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/disaggregation/mori/conn.py#L1361-L1397","documentation":"MiniMax sparse index (minimax_index_k) state transfer does not support pipeline parallelism: if pp_size > 1 on the prefill side, the sender aborts. The sparse index is a single global structure that has no per-PP-rank partitioning in the transfer path yet.","triggerScenarios":"send_state with state_type=='minimax_index_k' while self.pp_size is set and greater than 1 (prefill launched with --pp-size 2 or more on a MiniMax sparse-attention model).","commonSituations":"Scaling MiniMax prefill capacity with pipeline parallelism in a PD-disaggregated deployment; works with TP-only but fails once PP is added.","solutions":["Remove pipeline parallelism (--pp-size 1) on the MiniMax prefill/decode instances","Scale with TP instead of PP for MiniMax sparse-attention models under disagg","Wait for upstream support of PP-partitioned MiniMax sparse index transfer"],"exampleFix":"# before\n--disaggregation-prefill --pp-size 2\n\n# after\n--disaggregation-prefill --pp-size 1 --tp 8","handlingStrategy":"validation","validationCode":"if \"minimax_index_k\" in (kv_args.state_types or []):\n    assert not (conn.pp_size and conn.pp_size > 1), (\n        \"MiniMax sparse index requires pp_size == 1\"\n    )\n","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep --pp-size 1 for MiniMax sparse-attention models under disagg","Scale MiniMax prefill with TP, not PP"],"tags":["disaggregation","minimax","pipeline-parallel","sparse-attention","unsupported-feature"],"backgroundTag":"unsupported-parallel-config","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}