diff --git a/tests/distributed/test_comm_ops.py b/tests/distributed/test_comm_ops.py index 78aee1efd1..a896c627c6 100644 --- a/tests/distributed/test_comm_ops.py +++ b/tests/distributed/test_comm_ops.py @@ -462,8 +462,8 @@ def test_flashinfer_standalone_workspace_size( @pytest.mark.parametrize( ("node_count", "is_blackwell", "expected"), [ - (1, False, ("trtllm", False)), - (1, True, ("trtllm", False)), + (1, False, ("mnnvl", True)), + (1, True, ("mnnvl", True)), (2, False, (None, False)), (2, True, ("mnnvl", False)), ], diff --git a/vllm/distributed/device_communicators/flashinfer_all_reduce.py b/vllm/distributed/device_communicators/flashinfer_all_reduce.py index 22bcbb775a..0fd096861e 100644 --- a/vllm/distributed/device_communicators/flashinfer_all_reduce.py +++ b/vllm/distributed/device_communicators/flashinfer_all_reduce.py @@ -156,10 +156,12 @@ def _resolve_fi_ar_backend(group: ProcessGroup) -> tuple[str | None, bool]: node_count = _node_count(group) if node_count == 1: - # TRTLLM supports single-node allreduce on Hopper and Blackwell. Do not - # create an MNNVL workspace when the process group is node-local. - backend = "trtllm" - allow_trtllm_fallback = False + # MNNVL decodes faster than TRTLLM on single-node NVSwitch systems + # (about 3-5% throughput at TP4/TP8 on H200 and B200). Fall back to + # TRTLLM where the node lacks NVSwitch multicast and MNNVL cannot + # create its workspace. + backend = "mnnvl" + allow_trtllm_fallback = True elif current_platform.has_device_capability(100): # MNNVL requires Blackwell-class GPUs and is the only supported # FlashInfer backend for a multi-node allreduce process group.