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.