@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 7fe255889e
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 9, 18:15 UTC

[Misc] Log vLLM logo when starting server (#32796)

Signed-off-by: Nick Hill <nickhill123@gmail.com>

Nick Hill committed Jan 22, 2026 at 19:15 UTC 7fe255889e583102ec4da454071686f0ad5880b9
5 files changed +50 -4
vllm/entrypoints/grpc_server.py
+3 -2
@@ -30,6 +30,7 @@ from grpc_reflection.v1alpha import reflection
30
31 from vllm import SamplingParams, TextPrompt, TokensPrompt
32 from vllm.engine.arg_utils import AsyncEngineArgs
33 +from vllm.entrypoints.utils import log_version_and_model
34 from vllm.grpc import vllm_engine_pb2, vllm_engine_pb2_grpc
35 from vllm.logger import init_logger
36 from vllm.outputs import RequestOutput
@@ -408,8 +409,8 @@ async def serve_grpc(args: argparse.Namespace):
409 Args:
410 args: Parsed command line arguments
411 """
411 - logger.info("vLLM gRPC server version %s", VLLM_VERSION)
412 - logger.info("args: %s", args)
412 + log_version_and_model(logger, VLLM_VERSION, args.model)
413 + logger.info("vLLM gRPC server args: %s", args)
414
415 start_time = time.time()
416
vllm/entrypoints/openai/api_server.py
+2 -1
@@ -63,6 +63,7 @@ from vllm.entrypoints.serve.tokenize.serving import OpenAIServingTokenization
63 from vllm.entrypoints.utils import (
64 cli_env_setup,
65 log_non_default_args,
66 + log_version_and_model,
67 process_lora_modules,
68 sanitize_message,
69 )
@@ -867,7 +868,7 @@ def setup_server(args):
868 """Validate API server args, set up signal handler, create socket
869 ready to serve."""
870
870 - logger.info("vLLM API server version %s", VLLM_VERSION)
871 + log_version_and_model(logger, VLLM_VERSION, args.model)
872 log_non_default_args(args)
873
874 if args.tool_parser_plugin and len(args.tool_parser_plugin) > 3:
vllm/entrypoints/utils.py
+29 -1
@@ -6,6 +6,8 @@ import dataclasses
6 import functools
7 import os
8 from argparse import Namespace
9 +from logging import Logger
10 +from string import Template
11 from typing import TYPE_CHECKING, Any
12
13 import regex as re
@@ -13,8 +15,9 @@ from fastapi import Request
15 from fastapi.responses import JSONResponse, StreamingResponse
16 from starlette.background import BackgroundTask, BackgroundTasks
17
18 +from vllm import envs
19 from vllm.engine.arg_utils import EngineArgs
17 -from vllm.logger import init_logger
20 +from vllm.logger import current_formatter_type, init_logger
21 from vllm.platforms import current_platform
22 from vllm.utils.argparse_utils import FlexibleArgumentParser
23
@@ -295,3 +298,28 @@ def process_lora_modules(
298 def sanitize_message(message: str) -> str:
299 # Avoid leaking memory address from object reprs
300 return re.sub(r" at 0x[0-9a-f]+>", ">", message)
301 +
302 +
303 +def log_version_and_model(lgr: Logger, version: str, model_name: str) -> None:
304 + if envs.VLLM_DISABLE_LOG_LOGO or (formatter := current_formatter_type(lgr)) is None:
305 + message = "vLLM server version %s, serving model %s"
306 + else:
307 + logo_template = Template(
308 + "\n ${w}█ █ █▄ ▄█${r}\n"
309 + " ${o}▄▄${r} ${b}▄█${r} ${w}█ █ █ ▀▄▀ █${r} version ${w}%s${r}\n"
310 + " ${o}█${r}${b}▄█▀${r} ${w}█ █ █ █${r} model ${w}%s${r}\n"
311 + " ${b}▀▀${r} ${w}▀▀▀▀▀ ▀▀▀▀▀ ▀ ▀${r}\n"
312 + )
313 + colors = {
314 + "w": "\033[97;1m", # white
315 + "o": "\033[93m", # orange
316 + "b": "\033[94m", # blue
317 + "r": "\033[0m", # reset
318 + }
319 + if formatter != "color":
320 + # monochrome logo (no ansi escape codes)
321 + colors = dict.fromkeys(colors, "")
322 +
323 + message = logo_template.substitute(colors)
324 +
325 + lgr.info(message, version, model_name)
vllm/envs.py
+3
@@ -249,6 +249,7 @@ if TYPE_CHECKING:
249 VLLM_USE_V2_MODEL_RUNNER: bool = False
250 VLLM_LOG_MODEL_INSPECTION: bool = False
251 VLLM_DEBUG_MFU_METRICS: bool = False
252 + VLLM_DISABLE_LOG_LOGO: bool = False
253
254
255 def get_default_cache_root():
@@ -1610,6 +1611,8 @@ environment_variables: dict[str, Callable[[], Any]] = {
1611 "VLLM_DEBUG_MFU_METRICS": lambda: bool(
1612 int(os.getenv("VLLM_DEBUG_MFU_METRICS", "0"))
1613 ),
1614 + # Disable logging of vLLM logo at server startup time.
1615 + "VLLM_DISABLE_LOG_LOGO": lambda: bool(int(os.getenv("VLLM_DISABLE_LOG_LOGO", "0"))),
1616 }
1617
1618 # --8<-- [end:env-vars-definition]
vllm/logger.py
+13
@@ -17,6 +17,7 @@ from types import MethodType
17 from typing import Any, Literal, cast
18
19 import vllm.envs as envs
20 +from vllm.logging_utils import ColoredFormatter, NewLineFormatter
21
22 _FORMAT = (
23 f"{envs.VLLM_LOGGING_PREFIX}%(levelname)s %(asctime)s "
@@ -224,6 +225,18 @@ def suppress_logging(level: int = logging.INFO) -> Generator[None, Any, None]:
225 logging.disable(current_level)
226
227
228 +def current_formatter_type(lgr: Logger) -> Literal["color", "newline", None]:
229 + while lgr is not None:
230 + if lgr.handlers and len(lgr.handlers) == 1 and lgr.handlers[0].name == "vllm":
231 + formatter = lgr.handlers[0].formatter
232 + if isinstance(formatter, ColoredFormatter):
233 + return "color"
234 + if isinstance(formatter, NewLineFormatter):
235 + return "newline"
236 + lgr = lgr.parent
237 + return None
238 +
239 +
240 # The root logger is initialized when the module is imported.
241 # This is thread-safe as the module is only imported once,
242 # guaranteed by the Python GIL.