[Feature] Add --cpu-distributed-timeout-seconds CLI Option for CPU Process Group Timeout (#42968)

Signed-off-by: fangyuchu <fangyuchu@qq.com>
Signed-off-by: zWaNg3 <389750525@qq.com>
Co-authored-by: zWaNg3 <389750525@qq.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
fangyuchu
2026-05-21 15:42:07 -07:00
committed by GitHub
co-authored by zWaNg3 mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
parent 0f66623b0d
commit e26e1f0928
4 changed files with 33 additions and 1 deletions
+4
View File
@@ -292,6 +292,10 @@ class ParallelConfig:
timeout parameter. If None, PyTorch's default timeout is used (600s for NCCL).
Increase this for multi-node setups where model downloads may be slow."""
cpu_distributed_timeout_seconds: int | None = None
"""Timeout (in seconds) for cpu communication groups. If None, PyTorch's
default timeout is used (1800s for gloo)."""
world_size: int = Field(init=False)
"""world_size is TPxPP, it affects the number of workers we create."""
+7 -1
View File
@@ -335,6 +335,10 @@ class GroupCoordinator:
self_device_group = None
self_cpu_group = None
from vllm.distributed.utils import get_cpu_distributed_timeout_or_none
timeout = get_cpu_distributed_timeout_or_none()
for ranks in group_ranks:
device_group = torch.distributed.new_group(
ranks, backend=torch_distributed_backend
@@ -342,7 +346,9 @@ class GroupCoordinator:
# a group with `gloo` backend, to allow direct coordination between
# processes through the CPU.
with suppress_stdout():
cpu_group = torch.distributed.new_group(ranks, backend="gloo")
cpu_group = torch.distributed.new_group(
ranks, backend="gloo", timeout=timeout
)
if self.rank in ranks:
self.ranks = ranks
self.world_size = len(ranks)
+14
View File
@@ -491,6 +491,16 @@ def get_cached_tcp_store_client(host: str, port: int) -> TCPStore:
return TCPStore(host, port, is_master=False, wait_for_workers=False)
def get_cpu_distributed_timeout_or_none() -> timedelta | None:
from vllm.config import get_current_vllm_config_or_none
vllm_config = get_current_vllm_config_or_none()
if vllm_config is None:
return None
timeout_seconds = vllm_config.parallel_config.cpu_distributed_timeout_seconds
return timedelta(seconds=timeout_seconds) if timeout_seconds is not None else None
def init_gloo_process_group(
prefix_store: PrefixStore,
group_rank: int,
@@ -570,6 +580,10 @@ def stateless_init_torch_distributed_process_group(
init_method = get_tcp_uri(host, port)
backend = Backend(backend) # it is basically string
timeout = _get_default_timeout(backend)
if backend == "gloo":
gloo_timeout = get_cpu_distributed_timeout_or_none()
if gloo_timeout is not None:
timeout = gloo_timeout
if listen_socket is not None:
store = create_tcp_store(
+8
View File
@@ -456,6 +456,9 @@ class EngineArgs:
nnodes: int = ParallelConfig.nnodes
node_rank: int = ParallelConfig.node_rank
distributed_timeout_seconds: int | None = ParallelConfig.distributed_timeout_seconds
cpu_distributed_timeout_seconds: int | None = (
ParallelConfig.cpu_distributed_timeout_seconds
)
numa_bind: bool = ParallelConfig.numa_bind
numa_bind_nodes: list[int] | None = ParallelConfig.numa_bind_nodes
numa_bind_cpus: list[str] | None = ParallelConfig.numa_bind_cpus
@@ -951,6 +954,10 @@ class EngineArgs:
"--distributed-timeout-seconds",
**parallel_kwargs["distributed_timeout_seconds"],
)
parallel_group.add_argument(
"--cpu-distributed-timeout-seconds",
**parallel_kwargs["cpu_distributed_timeout_seconds"],
)
parallel_group.add_argument("--numa-bind", **parallel_kwargs["numa_bind"])
parallel_group.add_argument(
"--numa-bind-nodes", **parallel_kwargs["numa_bind_nodes"]
@@ -1950,6 +1957,7 @@ class EngineArgs:
nnodes=self.nnodes,
node_rank=self.node_rank,
distributed_timeout_seconds=self.distributed_timeout_seconds,
cpu_distributed_timeout_seconds=self.cpu_distributed_timeout_seconds,
data_parallel_master_ip=data_parallel_address,
data_parallel_rpc_port=data_parallel_rpc_port,
data_parallel_backend=self.data_parallel_backend,