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