@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 6da0078523
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

[Feat] Allow custom naming of vLLM processes (#21445)

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>

Chauncey committed Jul 24, 2025 at 18:15 UTC 6da0078523d42575ff9a369dbf3546f8989ceb52
10 files changed +46 -17
requirements/common.txt
+1
@@ -48,3 +48,4 @@ scipy # Required for phi-4-multimodal-instruct
48 ninja # Required for xgrammar, rocm, tpu, xpu
49 pybase64 # fast base64 implementation
50 cbor2 # Required for cross-language serialization of hashable objects
51 +setproctitle # Used to set process names for better debugging and monitoring
requirements/docs.txt
+1
@@ -22,6 +22,7 @@ pillow
22 psutil
23 pybase64
24 pydantic
25 +setproctitle
26 torch
27 transformers
28 zmq
vllm/entrypoints/cli/serve.py
+2 -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, get_tcp_uri
24 +from vllm.utils import FlexibleArgumentParser, bind_process_name, 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 -
80 + bind_process_name("APIServer_Headless")
81 # Create the EngineConfig.
82 engine_args = vllm.AsyncEngineArgs.from_cli_args(args)
83 usage_context = UsageContext.OPENAI_API_SERVER
vllm/entrypoints/openai/api_server.py
+4 -3
@@ -101,8 +101,9 @@ from vllm.transformers_utils.config import (
101 maybe_register_config_serialize_by_value)
102 from vllm.transformers_utils.tokenizer import MistralTokenizer
103 from vllm.usage.usage_lib import UsageContext
104 -from vllm.utils import (Device, FlexibleArgumentParser, get_open_zmq_ipc_path,
105 - is_valid_ipv6_address, set_ulimit)
104 +from vllm.utils import (Device, FlexibleArgumentParser, bind_process_name,
105 + get_open_zmq_ipc_path, is_valid_ipv6_address,
106 + set_ulimit)
107 from vllm.v1.metrics.prometheus import get_prometheus_registry
108 from vllm.version import __version__ as VLLM_VERSION
109
@@ -1804,7 +1805,7 @@ async def run_server_worker(listen_address,
1805 ToolParserManager.import_tool_parser(args.tool_parser_plugin)
1806
1807 server_index = client_config.get("client_index", 0) if client_config else 0
1807 -
1808 + bind_process_name("APIServer", str(server_index))
1809 # Load logging config for uvicorn if specified
1810 log_config = load_log_config(args.log_config_file)
1811 if log_config is not None:
vllm/envs.py
+6
@@ -985,6 +985,12 @@ environment_variables: dict[str, Callable[[], Any]] = {
985 # Used to force set up loopback IP
986 "VLLM_LOOPBACK_IP":
987 lambda: os.getenv("VLLM_LOOPBACK_IP", ""),
988 +
989 + # Used to set the process name prefix for vLLM processes.
990 + # This is useful for debugging and monitoring purposes.
991 + # The default value is "VLLM".
992 + "VLLM_PROCESS_NAME_PREFIX":
993 + lambda: os.getenv("VLLM_PROCESS_NAME_PREFIX", "VLLM"),
994 }
995
996 # --8<-- [end:env-vars-definition]
vllm/utils/__init__.py
+14
@@ -58,6 +58,7 @@ import numpy as np
58 import numpy.typing as npt
59 import psutil
60 import regex as re
61 +import setproctitle
62 import torch
63 import torch.types
64 import yaml
@@ -3278,3 +3279,16 @@ def has_deep_gemm() -> bool:
3279 """Whether the optional `deep_gemm` package is available."""
3280
3281 return _has_module("deep_gemm")
3282 +
3283 +
3284 +def bind_process_name(name: str, suffix: str = "") -> None:
3285 + """Bind the process name to a specific name with an optional suffix.
3286 +
3287 + Args:
3288 + name: The base name to bind the process to.
3289 + suffix: An optional suffix to append to the base name.
3290 + """
3291 + name = f"{envs.VLLM_PROCESS_NAME_PREFIX}::{name}"
3292 + if suffix:
3293 + name = f"{name}_{suffix}"
3294 + setproctitle.setproctitle(name)
vllm/v1/engine/coordinator.py
+6 -5
@@ -13,7 +13,8 @@ from vllm.logger import init_logger
13 from vllm.utils import get_mp_context, make_zmq_socket
14 from vllm.v1.engine import EngineCoreOutputs, EngineCoreRequestType
15 from vllm.v1.serial_utils import MsgpackDecoder
16 -from vllm.v1.utils import get_engine_client_zmq_addr, shutdown
16 +from vllm.v1.utils import (bind_process_name, get_engine_client_zmq_addr,
17 + shutdown)
18
19 logger = init_logger(__name__)
20
@@ -79,7 +80,7 @@ class DPCoordinator:
80
81 context = get_mp_context()
82 self.proc: multiprocessing.Process = context.Process(
82 - target=CoordinatorProc.run_coordinator,
83 + target=DPCoordinatorProc.run_coordinator,
84 name="VLLM_DP_Coordinator",
85 kwargs={
86 "engine_count": parallel_config.data_parallel_size,
@@ -113,12 +114,12 @@ class EngineState:
114 self.request_counts = [0, 0] # [waiting, running]
115
116
116 -class CoordinatorProc:
117 +class DPCoordinatorProc:
118
119 def __init__(self,
120 engine_count: int,
121 min_stats_update_interval_ms: int = 100):
121 -
122 + bind_process_name(self.__class__.__name__)
123 self.ctx = zmq.Context()
124
125 self.engines = [EngineState() for _ in range(engine_count)]
@@ -137,7 +138,7 @@ class CoordinatorProc:
138 back_publish_address: str,
139 min_stats_update_interval_ms: int = 100,
140 ):
140 - coordinator = CoordinatorProc(
141 + coordinator = DPCoordinatorProc(
142 engine_count=engine_count,
143 min_stats_update_interval_ms=min_stats_update_interval_ms)
144 try:
vllm/v1/engine/core.py
+3 -1
@@ -25,7 +25,8 @@ from vllm.logging_utils.dump_input import dump_engine_exception
25 from vllm.lora.request import LoRARequest
26 from vllm.transformers_utils.config import (
27 maybe_register_config_serialize_by_value)
28 -from vllm.utils import make_zmq_socket, resolve_obj_by_qualname
28 +from vllm.utils import (bind_process_name, make_zmq_socket,
29 + resolve_obj_by_qualname)
30 from vllm.v1.core.kv_cache_utils import (get_kv_cache_config,
31 unify_kv_cache_configs)
32 from vllm.v1.core.sched.interface import SchedulerInterface
@@ -411,6 +412,7 @@ class EngineCoreProc(EngineCore):
412 client_handshake_address: Optional[str] = None,
413 engine_index: int = 0,
414 ):
415 + bind_process_name(self.__class__.__name__, f"{engine_index}")
416 self.input_queue = queue.Queue[tuple[EngineCoreRequestType, Any]]()
417 self.output_queue = queue.Queue[Union[tuple[int, EngineCoreOutputs],
418 bytes]]()
vllm/v1/executor/multiproc_executor.py
+6 -3
@@ -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 (get_distributed_init_method, get_loopback_ip,
34 - get_mp_context, get_open_port)
33 +from vllm.utils import (bind_process_name, get_distributed_init_method,
34 + get_loopback_ip, get_mp_context, get_open_port)
35 from vllm.v1.executor.abstract import Executor, FailureCallback
36 from vllm.v1.outputs import ModelRunnerOutput
37 from vllm.worker.worker_base import WorkerWrapperBase
@@ -365,7 +365,10 @@ class WorkerProc:
365 }
366 wrapper.init_worker(all_kwargs)
367 self.worker = wrapper
368 -
368 + bind_process_name(
369 + self.worker.worker.__class__.__name__,
370 + f"TP{self.rank}_DP{vllm_config.parallel_config.data_parallel_rank}"
371 + )
372 pid = os.getpid()
373 _add_prefix(sys.stdout, f"VllmWorker rank={rank}", pid)
374 _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 (get_open_port, get_open_zmq_ipc_path, get_tcp_uri,
19 - kill_process_tree)
18 +from vllm.utils import (bind_process_name, get_open_port,
19 + get_open_zmq_ipc_path, get_tcp_uri, 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 -
147 + bind_process_name(self.__class__.__name__)
148 # Start API servers
149 spawn_context = multiprocessing.get_context("spawn")
150 self.processes: list[BaseProcess] = []