@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 7234fe2685
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 14, 23:45 UTC

[Misc] Rework process titles (#21780)

Signed-off-by: Nick Hill <nhill@redhat.com>

Nick Hill committed Jul 29, 2025 at 06:14 UTC 7234fe26858f2c621901494c307c90e65fe35340
7 files changed +48 -26
vllm/entrypoints/cli/serve.py
+4 -2
@@ -21,7 +21,7 @@ from vllm.entrypoints.utils import (VLLM_SUBCMD_PARSER_EPILOG,
21 from vllm.executor.multiproc_worker_utils import _add_prefix
22 from vllm.logger import init_logger
23 from vllm.usage.usage_lib import UsageContext
24 -from vllm.utils import FlexibleArgumentParser, bind_process_name, get_tcp_uri
24 +from vllm.utils import FlexibleArgumentParser, get_tcp_uri
25 from vllm.v1.engine.core import EngineCoreProc
26 from vllm.v1.engine.utils import CoreEngineProcManager, launch_core_engines
27 from vllm.v1.executor.abstract import Executor
@@ -77,7 +77,7 @@ def run_headless(args: argparse.Namespace):
77
78 if args.api_server_count > 1:
79 raise ValueError("api_server_count can't be set in headless mode")
80 - bind_process_name("APIServer_Headless")
80 + # set_process_title("Headless_ProcManager")
81 # Create the EngineConfig.
82 engine_args = vllm.AsyncEngineArgs.from_cli_args(args)
83 usage_context = UsageContext.OPENAI_API_SERVER
@@ -140,6 +140,8 @@ def run_multi_api_server(args: argparse.Namespace):
140 num_api_servers = args.api_server_count
141 assert num_api_servers > 0
142
143 + # set_process_title("ProcManager")
144 +
145 if num_api_servers > 1:
146 setup_multiprocess_prometheus()
147
vllm/entrypoints/openai/api_server.py
+12 -4
@@ -11,6 +11,7 @@ import multiprocessing
11 import os
12 import signal
13 import socket
14 +import sys
15 import tempfile
16 import uuid
17 from argparse import Namespace
@@ -94,15 +95,15 @@ from vllm.entrypoints.openai.serving_transcription import (
95 from vllm.entrypoints.openai.tool_parsers import ToolParserManager
96 from vllm.entrypoints.utils import (cli_env_setup, load_aware_call,
97 log_non_default_args, with_cancellation)
98 +from vllm.executor.multiproc_worker_utils import _add_prefix
99 from vllm.logger import init_logger
100 from vllm.reasoning import ReasoningParserManager
101 from vllm.transformers_utils.config import (
102 maybe_register_config_serialize_by_value)
103 from vllm.transformers_utils.tokenizer import MistralTokenizer
104 from vllm.usage.usage_lib import UsageContext
103 -from vllm.utils import (Device, FlexibleArgumentParser, bind_process_name,
104 - get_open_zmq_ipc_path, is_valid_ipv6_address,
105 - set_ulimit)
105 +from vllm.utils import (Device, FlexibleArgumentParser, get_open_zmq_ipc_path,
106 + is_valid_ipv6_address, set_process_title, set_ulimit)
107 from vllm.v1.metrics.prometheus import get_prometheus_registry
108 from vllm.version import __version__ as VLLM_VERSION
109
@@ -1805,6 +1806,13 @@ def setup_server(args):
1806
1807 async def run_server(args, **uvicorn_kwargs) -> None:
1808 """Run a single-worker API server."""
1809 +
1810 + # Add process-specific prefix to stdout and stderr.
1811 + process_name = "APIServer"
1812 + pid = os.getpid()
1813 + _add_prefix(sys.stdout, process_name, pid)
1814 + _add_prefix(sys.stderr, process_name, pid)
1815 +
1816 listen_address, sock = setup_server(args)
1817 await run_server_worker(listen_address, sock, args, **uvicorn_kwargs)
1818
@@ -1820,7 +1828,7 @@ async def run_server_worker(listen_address,
1828 ToolParserManager.import_tool_parser(args.tool_parser_plugin)
1829
1830 server_index = client_config.get("client_index", 0) if client_config else 0
1823 - bind_process_name("APIServer", str(server_index))
1831 + set_process_title("APIServer", str(server_index))
1832 # Load logging config for uvicorn if specified
1833 log_config = load_log_config(args.log_config_file)
1834 if log_config is not None:
vllm/utils/__init__.py
+12 -4
@@ -3282,14 +3282,22 @@ def has_deep_gemm() -> bool:
3282 return _has_module("deep_gemm")
3283
3284
3285 -def bind_process_name(name: str, suffix: str = "") -> None:
3286 - """Bind the process name to a specific name with an optional suffix.
3285 +def set_process_title(name: str,
3286 + suffix: str = "",
3287 + append: bool = False) -> None:
3288 + """
3289 + Set the current process title to a specific name with an
3290 + optional suffix.
3291
3292 Args:
3289 - name: The base name to bind the process to.
3293 + name: The title to assign to the current process.
3294 suffix: An optional suffix to append to the base name.
3295 + append: Whether to append to the existing process title.
3296 """
3292 - name = f"{envs.VLLM_PROCESS_NAME_PREFIX}::{name}"
3297 if suffix:
3298 name = f"{name}_{suffix}"
3299 + if append:
3300 + name = f"{setproctitle.getproctitle()}_{name}"
3301 + else:
3302 + name = f"{envs.VLLM_PROCESS_NAME_PREFIX}::{name}"
3303 setproctitle.setproctitle(name)
vllm/v1/engine/coordinator.py
+3 -4
@@ -10,11 +10,10 @@ import zmq
10
11 from vllm.config import ParallelConfig
12 from vllm.logger import init_logger
13 -from vllm.utils import get_mp_context, make_zmq_socket
13 +from vllm.utils import get_mp_context, make_zmq_socket, set_process_title
14 from vllm.v1.engine import EngineCoreOutputs, EngineCoreRequestType
15 from vllm.v1.serial_utils import MsgpackDecoder
16 -from vllm.v1.utils import (bind_process_name, get_engine_client_zmq_addr,
17 - shutdown)
16 +from vllm.v1.utils import get_engine_client_zmq_addr, shutdown
17
18 logger = init_logger(__name__)
19
@@ -119,7 +118,7 @@ class DPCoordinatorProc:
118 def __init__(self,
119 engine_count: int,
120 min_stats_update_interval_ms: int = 100):
122 - bind_process_name(self.__class__.__name__)
121 + set_process_title("DPCoordinator")
122 self.ctx = zmq.Context()
123
124 self.engines = [EngineState() for _ in range(engine_count)]
vllm/v1/engine/core.py
+4 -3
@@ -26,8 +26,8 @@ from vllm.lora.request import LoRARequest
26 from vllm.tasks import POOLING_TASKS, SupportedTask
27 from vllm.transformers_utils.config import (
28 maybe_register_config_serialize_by_value)
29 -from vllm.utils import (bind_process_name, make_zmq_socket,
30 - resolve_obj_by_qualname)
29 +from vllm.utils import (make_zmq_socket, resolve_obj_by_qualname,
30 + set_process_title)
31 from vllm.v1.core.kv_cache_utils import (get_kv_cache_config,
32 unify_kv_cache_configs)
33 from vllm.v1.core.sched.interface import SchedulerInterface
@@ -425,7 +425,6 @@ class EngineCoreProc(EngineCore):
425 client_handshake_address: Optional[str] = None,
426 engine_index: int = 0,
427 ):
428 - bind_process_name(self.__class__.__name__, f"{engine_index}")
428 self.input_queue = queue.Queue[tuple[EngineCoreRequestType, Any]]()
429 self.output_queue = queue.Queue[Union[tuple[int, EngineCoreOutputs],
430 bytes]]()
@@ -630,11 +629,13 @@ class EngineCoreProc(EngineCore):
629 parallel_config: ParallelConfig = kwargs[
630 "vllm_config"].parallel_config
631 if parallel_config.data_parallel_size > 1 or dp_rank > 0:
632 + set_process_title("DPEngineCore", str(dp_rank))
633 # Set data parallel rank for this engine process.
634 parallel_config.data_parallel_rank = dp_rank
635 parallel_config.data_parallel_rank_local = local_dp_rank
636 engine_core = DPEngineCoreProc(*args, **kwargs)
637 else:
638 + set_process_title("EngineCore")
639 engine_core = EngineCoreProc(*args, **kwargs)
640
641 engine_core.run_busy_loop()
vllm/v1/executor/multiproc_executor.py
+10 -6
@@ -30,8 +30,8 @@ from vllm.distributed.kv_transfer.kv_connector.utils import KVOutputAggregator
30 from vllm.executor.multiproc_worker_utils import (
31 _add_prefix, set_multiprocessing_worker_envs)
32 from vllm.logger import init_logger
33 -from vllm.utils import (bind_process_name, get_distributed_init_method,
34 - get_loopback_ip, get_mp_context, get_open_port)
33 +from vllm.utils import (get_distributed_init_method, get_loopback_ip,
34 + get_mp_context, get_open_port, set_process_title)
35 from vllm.v1.executor.abstract import Executor, FailureCallback
36 from vllm.v1.outputs import ModelRunnerOutput
37 from vllm.worker.worker_base import WorkerWrapperBase
@@ -376,10 +376,14 @@ class WorkerProc:
376 }
377 wrapper.init_worker(all_kwargs)
378 self.worker = wrapper
379 - bind_process_name(
380 - self.worker.worker.__class__.__name__,
381 - f"TP{self.rank}_DP{vllm_config.parallel_config.data_parallel_rank}"
382 - )
379 +
380 + pp_size = vllm_config.parallel_config.pipeline_parallel_size
381 + tp_size = vllm_config.parallel_config.tensor_parallel_size
382 + pp_str = f"PP{rank // tp_size}" if pp_size > 1 else ""
383 + tp_str = f"TP{rank % tp_size}" if tp_size > 1 else ""
384 + suffix = f"{pp_str}{'_' if pp_str and tp_str else ''}{tp_str}"
385 + if suffix:
386 + set_process_title(suffix, append=True)
387 pid = os.getpid()
388 _add_prefix(sys.stdout, f"VllmWorker rank={rank}", pid)
389 _add_prefix(sys.stderr, f"VllmWorker rank={rank}", pid)
vllm/v1/utils.py
+3 -3
@@ -15,8 +15,8 @@ import torch
15 from vllm.logger import init_logger
16 from vllm.usage.usage_lib import (UsageContext, is_usage_stats_enabled,
17 usage_message)
18 -from vllm.utils import (bind_process_name, get_open_port,
19 - get_open_zmq_ipc_path, get_tcp_uri, kill_process_tree)
18 +from vllm.utils import (get_open_port, get_open_zmq_ipc_path, get_tcp_uri,
19 + kill_process_tree)
20
21 if TYPE_CHECKING:
22 from vllm.v1.engine.coordinator import DPCoordinator
@@ -144,7 +144,7 @@ class APIServerProcessManager:
144 self.listen_address = listen_address
145 self.sock = sock
146 self.args = args
147 - bind_process_name(self.__class__.__name__)
147 +
148 # Start API servers
149 spawn_context = multiprocessing.get_context("spawn")
150 self.processes: list[BaseProcess] = []