{"record":{"id":"761451d799a5d8de","repo":"sgl-project/sglang","slug":"dcp-comm-backend-fi-a2a-delegates-the-exchange-t","errorCode":null,"errorMessage":"--dcp-comm-backend fi_a2a delegates the exchange to FlashInfer's MNNVL All-to-All kernel, which requires an NVIDIA CUDA platform with SM90+ and MNNVL fabric memory (e.g. GB200 NVL72). The authoritative fabric probe runs at model-runner init; use 'a2a' or 'ag_rs' on clusters without MNNVL.","messagePattern":"--dcp-comm-backend fi_a2a delegates the exchange to FlashInfer's MNNVL All-to-All kernel, which requires an NVIDIA CUDA platform with SM90\\+ and MNNVL fabric memory \\(e\\.g\\. GB200 NVL72\\)\\. The authoritative fabric probe runs at model-runner init; use 'a2a' or 'ag_rs' on clusters without MNNVL\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/server_args.py","lineNumber":4269,"sourceCode":"        handle_pd_disaggregation(self)\n\n    def _handle_dcp_validation(self):\n        cfg = resolving_view(self)\n        if cfg.dcp_size < 1:\n            raise ValueError(\n                \"Decode context parallel size (--dcp-size / \"\n                \"--decode-context-parallel-size) must be >= 1, but got \"\n                f\"dcp_size={cfg.dcp_size}.\"\n            )\n        if cfg.dcp_comm_backend in (\"a2a\", \"fi_a2a\") and cfg.dcp_size <= 1:\n            raise ValueError(\n                f\"--dcp-comm-backend {cfg.dcp_comm_backend} only affects the \"\n                \"decode context-parallel attention reduction and therefore \"\n                \"requires --dcp-size / --decode-context-parallel-size > 1, but \"\n                f\"got dcp_size={cfg.dcp_size}.\"\n            )\n        if cfg.dcp_comm_backend == \"fi_a2a\" and not is_cuda():\n            raise ValueError(\n                \"--dcp-comm-backend fi_a2a delegates the exchange to FlashInfer's \"\n                \"MNNVL All-to-All kernel, which requires an NVIDIA CUDA platform \"\n                \"with SM90+ and MNNVL fabric memory (e.g. GB200 NVL72). The \"\n                \"authoritative fabric probe runs at model-runner init; use 'a2a' \"\n                \"or 'ag_rs' on clusters without MNNVL.\"\n            )\n        if cfg.dcp_replicate_q_proj:\n            if cfg.dcp_size <= 1:\n                raise ValueError(\"--dcp-replicate-q-proj requires --dcp-size > 1.\")\n            if cfg.dcp_comm_backend not in (\"a2a\", \"fi_a2a\"):\n                raise ValueError(\n                    \"--dcp-replicate-q-proj only applies to the a2a/fi_a2a DCP \"\n                    \"communication backend (it removes the head-dim Q all-gather); \"\n                    f\"got --dcp-comm-backend={cfg.dcp_comm_backend}.\"\n                )\n\n    def _handle_load_balance_method(self):\n        cfg = resolving_view(self)","sourceCodeStart":4251,"sourceCodeEnd":4287,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/server_args.py#L4251-L4287","documentation":"ServerArgs validation error raised when --dcp-comm-backend is set to fi_a2a on a non-CUDA platform. fi_a2a delegates the decode context-parallel token exchange to FlashInfer's MNNVL All-to-All kernel, which only exists on NVIDIA SM90+ hardware with MNNVL fabric memory (e.g. GB200 NVL72). SGLang rejects it up front because the kernel cannot run elsewhere.","triggerScenarios":"Launching the server with --dcp-comm-backend fi_a2a (and --dcp-size > 1) on a machine where is_cuda() is false, e.g. AMD ROCm, CPU-only, or any non-NVIDIA accelerator platform.","commonSituations":"Porting a DCP configuration from a GB200/NVL72 cluster to an A100/H100 or AMD cluster; test configs copied from MNNVL docs; running unit tests on non-CUDA CI runners with the flag set.","solutions":["Switch to a portable backend: --dcp-comm-backend a2a or --dcp-comm-backend ag_rs","Only keep fi_a2a on SM90+ machines with MNNVL fabric memory (GB200 NVL72); verify with nvidia-smi architecture and fabric visibility","Gate the flag in your launch script on the detected platform (torch.cuda.is_available() and compute capability >= 9.0)"],"exampleFix":"# before\npython -m sglang.launch_server --dcp-size 4 --dcp-comm-backend fi_a2a\n# after\npython -m sglang.launch_server --dcp-size 4 --dcp-comm-backend a2a","handlingStrategy":"validation","validationCode":"import torch\n\ndef dcp_backend_ok() -> str:\n    cuda = torch.cuda.is_available()\n    cap = torch.cuda.get_device_capability(0)[0] if cuda else 0\n    return \"fi_a2a\" if cuda and cap >= 9 else \"a2a\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Derive --dcp-comm-backend from detected hardware instead of hardcoding it","Reserve fi_a2a for GB200/NVL72-class SM90+ systems with MNNVL fabric","Default to a2a or ag_rs in shared cluster configs"],"tags":["sglang","distributed","dcp","flashinfer","mnnvl","hardware-requirement"],"backgroundTag":"unsupported-hardware-platform","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}