Skip to content

Commit 6da0078

Browse files
[Feat] Allow custom naming of vLLM processes (#21445)
Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
1 parent 73e3949 commit 6da0078

File tree

10 files changed

+46
-17
lines changed

10 files changed

+46
-17
lines changed

requirements/common.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,4 @@ scipy # Required for phi-4-multimodal-instruct
4848
ninja # Required for xgrammar, rocm, tpu, xpu
4949
pybase64 # fast base64 implementation
5050
cbor2 # Required for cross-language serialization of hashable objects
51+
setproctitle # Used to set process names for better debugging and monitoring

requirements/docs.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pillow
2222
psutil
2323
pybase64
2424
pydantic
25+
setproctitle
2526
torch
2627
transformers
2728
zmq

vllm/entrypoints/cli/serve.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from vllm.executor.multiproc_worker_utils import _add_prefix
2222
from vllm.logger import init_logger
2323
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
2525
from vllm.v1.engine.core import EngineCoreProc
2626
from vllm.v1.engine.utils import CoreEngineProcManager, launch_core_engines
2727
from vllm.v1.executor.abstract import Executor
@@ -77,7 +77,7 @@ def run_headless(args: argparse.Namespace):
7777

7878
if args.api_server_count > 1:
7979
raise ValueError("api_server_count can't be set in headless mode")
80-
80+
bind_process_name("APIServer_Headless")
8181
# Create the EngineConfig.
8282
engine_args = vllm.AsyncEngineArgs.from_cli_args(args)
8383
usage_context = UsageContext.OPENAI_API_SERVER

vllm/entrypoints/openai/api_server.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@
101101
maybe_register_config_serialize_by_value)
102102
from vllm.transformers_utils.tokenizer import MistralTokenizer
103103
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)
106107
from vllm.v1.metrics.prometheus import get_prometheus_registry
107108
from vllm.version import __version__ as VLLM_VERSION
108109

@@ -1804,7 +1805,7 @@ async def run_server_worker(listen_address,
18041805
ToolParserManager.import_tool_parser(args.tool_parser_plugin)
18051806

18061807
server_index = client_config.get("client_index", 0) if client_config else 0
1807-
1808+
bind_process_name("APIServer", str(server_index))
18081809
# Load logging config for uvicorn if specified
18091810
log_config = load_log_config(args.log_config_file)
18101811
if log_config is not None:

vllm/envs.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,12 @@ def get_vllm_port() -> Optional[int]:
985985
# Used to force set up loopback IP
986986
"VLLM_LOOPBACK_IP":
987987
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"),
988994
}
989995

990996
# --8<-- [end:env-vars-definition]

vllm/utils/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import numpy.typing as npt
5959
import psutil
6060
import regex as re
61+
import setproctitle
6162
import torch
6263
import torch.types
6364
import yaml
@@ -3278,3 +3279,16 @@ def has_deep_gemm() -> bool:
32783279
"""Whether the optional `deep_gemm` package is available."""
32793280

32803281
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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
from vllm.utils import get_mp_context, make_zmq_socket
1414
from vllm.v1.engine import EngineCoreOutputs, EngineCoreRequestType
1515
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)
1718

1819
logger = init_logger(__name__)
1920

@@ -79,7 +80,7 @@ def __init__(self, parallel_config: ParallelConfig):
7980

8081
context = get_mp_context()
8182
self.proc: multiprocessing.Process = context.Process(
82-
target=CoordinatorProc.run_coordinator,
83+
target=DPCoordinatorProc.run_coordinator,
8384
name="VLLM_DP_Coordinator",
8485
kwargs={
8586
"engine_count": parallel_config.data_parallel_size,
@@ -113,12 +114,12 @@ def __init__(self):
113114
self.request_counts = [0, 0] # [waiting, running]
114115

115116

116-
class CoordinatorProc:
117+
class DPCoordinatorProc:
117118

118119
def __init__(self,
119120
engine_count: int,
120121
min_stats_update_interval_ms: int = 100):
121-
122+
bind_process_name(self.__class__.__name__)
122123
self.ctx = zmq.Context()
123124

124125
self.engines = [EngineState() for _ in range(engine_count)]
@@ -137,7 +138,7 @@ def run_coordinator(
137138
back_publish_address: str,
138139
min_stats_update_interval_ms: int = 100,
139140
):
140-
coordinator = CoordinatorProc(
141+
coordinator = DPCoordinatorProc(
141142
engine_count=engine_count,
142143
min_stats_update_interval_ms=min_stats_update_interval_ms)
143144
try:

vllm/v1/engine/core.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
from vllm.lora.request import LoRARequest
2626
from vllm.transformers_utils.config import (
2727
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)
2930
from vllm.v1.core.kv_cache_utils import (get_kv_cache_config,
3031
unify_kv_cache_configs)
3132
from vllm.v1.core.sched.interface import SchedulerInterface
@@ -411,6 +412,7 @@ def __init__(
411412
client_handshake_address: Optional[str] = None,
412413
engine_index: int = 0,
413414
):
415+
bind_process_name(self.__class__.__name__, f"{engine_index}")
414416
self.input_queue = queue.Queue[tuple[EngineCoreRequestType, Any]]()
415417
self.output_queue = queue.Queue[Union[tuple[int, EngineCoreOutputs],
416418
bytes]]()

vllm/v1/executor/multiproc_executor.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
from vllm.executor.multiproc_worker_utils import (
3131
_add_prefix, set_multiprocessing_worker_envs)
3232
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)
3535
from vllm.v1.executor.abstract import Executor, FailureCallback
3636
from vllm.v1.outputs import ModelRunnerOutput
3737
from vllm.worker.worker_base import WorkerWrapperBase
@@ -365,7 +365,10 @@ def __init__(
365365
}
366366
wrapper.init_worker(all_kwargs)
367367
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+
)
369372
pid = os.getpid()
370373
_add_prefix(sys.stdout, f"VllmWorker rank={rank}", pid)
371374
_add_prefix(sys.stderr, f"VllmWorker rank={rank}", pid)

vllm/v1/utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
from vllm.logger import init_logger
1616
from vllm.usage.usage_lib import (UsageContext, is_usage_stats_enabled,
1717
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)
2020

2121
if TYPE_CHECKING:
2222
from vllm.v1.engine.coordinator import DPCoordinator
@@ -144,7 +144,7 @@ def __init__(
144144
self.listen_address = listen_address
145145
self.sock = sock
146146
self.args = args
147-
147+
bind_process_name(self.__class__.__name__)
148148
# Start API servers
149149
spawn_context = multiprocessing.get_context("spawn")
150150
self.processes: list[BaseProcess] = []

0 commit comments

Comments
 (0)