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, 05:30 UTC
[Core] Enable command line logging for LLMEngine (#25610)
Co-authored-by: Ye (Charlotte) Qi <yeq@meta.com> Signed-off-by: Zhuohan Li <zhuohan123@gmail.com>
Zhuohan Li committed
Sep 25, 2025 at 15:31 UTC
8c435c9bcea818fa5a748fec0f8289505447001e
2 files changed
+31
-9
vllm/v1/engine/llm_engine.py
+31
-8
@@ -1,6 +1,7 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
+import time
5
from collections.abc import Mapping
6
from copy import copy
7
from typing import Any, Callable, Optional, Union
@@ -31,8 +32,7 @@ from vllm.v1.engine.output_processor import OutputProcessor
32
from vllm.v1.engine.parallel_sampling import ParentRequest
33
from vllm.v1.engine.processor import Processor
34
from vllm.v1.executor.abstract import Executor
34
-from vllm.v1.metrics.loggers import (PrometheusStatLogger, StatLoggerBase,
35
- StatLoggerFactory)
35
+from vllm.v1.metrics.loggers import StatLoggerFactory, StatLoggerManager
36
from vllm.v1.metrics.reader import Metric, get_metrics_snapshot
37
from vllm.v1.metrics.stats import IterationStats
38
from vllm.v1.worker.worker_base import WorkerBase
@@ -74,9 +74,6 @@ class LLMEngine:
74
self.cache_config = vllm_config.cache_config
75
76
self.log_stats = log_stats
77
- self.stat_logger: Optional[StatLoggerBase] = None
78
- if self.log_stats:
79
- self.stat_logger = PrometheusStatLogger(vllm_config)
77
78
executor_backend = (
79
self.vllm_config.parallel_config.distributed_executor_backend)
@@ -122,6 +119,15 @@ class LLMEngine:
119
log_stats=self.log_stats,
120
)
121
122
+ self.logger_manager: Optional[StatLoggerManager] = None
123
+ if self.log_stats:
124
+ self.logger_manager = StatLoggerManager(
125
+ vllm_config=vllm_config,
126
+ custom_stat_loggers=stat_loggers,
127
+ enable_default_loggers=log_stats,
128
+ )
129
+ self.logger_manager.log_engine_initialized()
130
+
131
if not multiprocess_mode:
132
# for v0 compatibility
133
self.model_executor = self.engine_core.engine_core.model_executor # type: ignore
@@ -269,10 +275,13 @@ class LLMEngine:
275
self.engine_core.abort_requests(processed_outputs.reqs_to_abort)
276
277
# 4) Record stats
272
- if self.stat_logger is not None:
278
+ if self.logger_manager is not None:
279
assert outputs.scheduler_stats is not None
274
- self.stat_logger.record(scheduler_stats=outputs.scheduler_stats,
275
- iteration_stats=iteration_stats)
280
+ self.logger_manager.record(
281
+ scheduler_stats=outputs.scheduler_stats,
282
+ iteration_stats=iteration_stats,
283
+ )
284
+ self.do_log_stats_with_interval()
285
286
return processed_outputs.request_outputs
287
@@ -315,6 +324,20 @@ class LLMEngine:
324
325
return self.tokenizer
326
327
+ def do_log_stats(self) -> None:
328
+ """Log stats if logging is enabled."""
329
+ if self.logger_manager:
330
+ self.logger_manager.log()
331
+
332
+ def do_log_stats_with_interval(self) -> None:
333
+ """Log stats when the time interval has passed."""
334
+ now = time.time()
335
+ if not hasattr(self, "_last_log_time"):
336
+ self._last_log_time = now
337
+ if now - self._last_log_time >= envs.VLLM_LOG_STATS_INTERVAL:
338
+ self.do_log_stats()
339
+ self._last_log_time = now
340
+
341
def add_lora(self, lora_request: LoRARequest) -> bool:
342
"""Load a new LoRA adapter into the engine for future requests."""
343
return self.engine_core.add_lora(lora_request)
vllm/v1/metrics/loggers.py
-1
@@ -90,7 +90,6 @@ class LoggingStatLogger(StatLoggerBase):
90
iteration_stats: Optional[IterationStats],
91
engine_idx: int = 0):
92
"""Log Stats to standard output."""
93
-
93
if iteration_stats:
94
self._track_iteration_stats(iteration_stats)
95