[UX] Reduce startup log noise (#50590)
Signed-off-by: mgoin <mgoin64@gmail.com> Co-authored-by: OpenAI Codex <noreply@openai.com>
Michael Goin committed
Jul 31, 2026 at 16:04 UTC
90329913e945cb3ed515bd8e1712094cecb76a0c
9 files changed
+36
-50
vllm/config/vllm.py
+11
-16
@@ -1142,11 +1142,6 @@ class VllmConfig:
1142
else:
1143
self.scheduler_config.async_scheduling = True
1144
1145
- logger.info_once(
1146
- "Asynchronous scheduling is %s.",
1147
- "enabled" if self.scheduler_config.async_scheduling else "disabled",
1148
- )
1149
-
1145
if self.parallel_config.disable_nccl_for_dp_synchronization is None:
1146
if self.scheduler_config.async_scheduling:
1147
if self.parallel_config.data_parallel_size > 1 and (
@@ -1196,7 +1191,7 @@ class VllmConfig:
1191
)
1192
1193
if self.model_config is not None and self.model_config.enforce_eager:
1199
- logger.warning(
1194
+ logger.warning_once(
1195
"Enforce eager set, disabling torch.compile and CUDAGraphs. "
1196
"This is equivalent to setting -cc.mode=none -cc.cudagraph_mode=none"
1197
)
@@ -1204,7 +1199,7 @@ class VllmConfig:
1199
self.compilation_config.cudagraph_mode = CUDAGraphMode.NONE
1200
1201
if os.environ.get("TORCH_COMPILE_DISABLE") == "1":
1207
- logger.warning(
1202
+ logger.warning_once(
1203
"TORCH_COMPILE_DISABLE is set, disabling torch.compile. "
1204
"This is equivalent to setting -cc.mode=none"
1205
)
@@ -1249,7 +1244,7 @@ class VllmConfig:
1244
self.compilation_config.mode is not None
1245
and self.compilation_config.mode != CompilationMode.VLLM_COMPILE
1246
):
1252
- logger.warning(
1247
+ logger.warning_once(
1248
"Inductor compilation was disabled by user settings, "
1249
"optimizations settings that are only active during "
1250
"inductor compilation will be ignored."
@@ -1317,7 +1312,7 @@ class VllmConfig:
1312
and self.compilation_config.mode != CompilationMode.VLLM_COMPILE
1313
and not envs.VLLM_USE_BREAKABLE_CUDAGRAPH
1314
):
1320
- logger.info(
1315
+ logger.info_once(
1316
"Cudagraph mode %s is not compatible with compilation mode %s."
1317
"Overriding to NONE.",
1318
self.compilation_config.cudagraph_mode,
@@ -1331,7 +1326,7 @@ class VllmConfig:
1326
pass_config.enable_sp = True
1327
if pass_config.enable_sp:
1328
if self.parallel_config.tensor_parallel_size == 1:
1334
- logger.warning("Sequence Parallelism requires TP>1, disabling")
1329
+ logger.warning_once("Sequence Parallelism requires TP>1, disabling")
1330
pass_config.enable_sp = False
1331
pass_config.fuse_gemm_comms = False
1332
else:
@@ -1349,7 +1344,7 @@ class VllmConfig:
1344
)
1345
1346
if pass_config.sp_min_token_num is None:
1352
- logger.warning(
1347
+ logger.warning_once(
1348
"Model hidden_size too small for the SP "
1349
"threshold heuristic, disabling. To force SP, "
1350
"set pass_config.sp_min_token_num manually."
@@ -1428,7 +1423,7 @@ class VllmConfig:
1423
1424
# disable cudagraph when enforce eager execution
1425
if self.model_config is not None and self.model_config.enforce_eager:
1431
- logger.info("Cudagraph is disabled under eager mode")
1426
+ logger.info_once("Cudagraph is disabled under eager mode")
1427
self.compilation_config.cudagraph_mode = CUDAGraphMode.NONE
1428
# override related settings when enforce eager
1429
self.compilation_config.max_cudagraph_capture_size = 0
@@ -1463,7 +1458,7 @@ class VllmConfig:
1458
and self.model_config.architecture == "WhisperForConditionalGeneration"
1459
and os.environ.get("VLLM_WORKER_MULTIPROC_METHOD") != "spawn"
1460
):
1466
- logger.warning(
1461
+ logger.warning_once(
1462
"Whisper is known to have issues with "
1463
"forked workers. If startup is hanging, "
1464
"try setting 'VLLM_WORKER_MULTIPROC_METHOD' "
@@ -1475,7 +1470,7 @@ class VllmConfig:
1470
and self.kv_events_config.enable_kv_cache_events
1471
and not self.cache_config.enable_prefix_caching
1472
):
1478
- logger.warning(
1473
+ logger.warning_once(
1474
"KV cache events are on, but prefix caching is not enabled. "
1475
"Use --enable-prefix-caching to enable."
1476
)
@@ -1484,7 +1479,7 @@ class VllmConfig:
1479
and self.kv_events_config.publisher != "null"
1480
and not self.kv_events_config.enable_kv_cache_events
1481
):
1487
- logger.warning(
1482
+ logger.warning_once(
1483
"KV cache events are disabled, "
1484
"but the scheduler is configured to publish them. "
1485
"Modify KVEventsConfig.enable_kv_cache_events "
@@ -1522,7 +1517,7 @@ class VllmConfig:
1517
# the pass will operate on higher-level IR to avoid the issue.
1518
# TODO: https://github.com/vllm-project/vllm/issues/27894
1519
if self.compilation_config.mode != CompilationMode.VLLM_COMPILE:
1525
- logger.warning(
1520
+ logger.warning_once(
1521
"Sequence parallelism is enabled, but running in wrong "
1522
"vllm compile mode: %s.",
1523
self.compilation_config.mode,
vllm/distributed/device_communicators/custom_all_reduce.py
+3
-3
@@ -107,7 +107,7 @@ class CustomAllreduce:
107
if not custom_ar:
108
# disable because of missing custom allreduce library
109
# e.g. in a non-GPU environment
110
- logger.info(
110
+ logger.info_once(
111
"Custom allreduce is disabled because "
112
"of missing custom allreduce library"
113
)
@@ -130,7 +130,7 @@ class CustomAllreduce:
130
return
131
132
if world_size not in CustomAllreduce._SUPPORTED_WORLD_SIZES:
133
- logger.warning(
133
+ logger.warning_once(
134
"Custom allreduce is disabled due to an unsupported world"
135
" size: %d. Supported world sizes: %s. To silence this "
136
"warning, specify disable_custom_all_reduce=True explicitly.",
@@ -328,7 +328,7 @@ class CustomAllreduce:
328
329
def register_graph_buffers(self):
330
handle, offset = ops.get_graph_buffer_ipc_meta(self._ptr)
331
- logger.info("Registering %d cuda graph addresses", len(offset))
331
+ logger.debug("Registering %d cuda graph addresses", len(offset))
332
# We cannot directly use `dist.all_gather_object` here
333
# because it is incompatible with `gloo` backend under inference mode.
334
# see https://github.com/pytorch/pytorch/issues/126032 for details.
vllm/distributed/device_communicators/flashinfer_all_reduce.py
+2
-2
@@ -121,7 +121,7 @@ def _resolve_fi_ar_backend() -> tuple[str, bool]:
121
"""
122
backend = envs.VLLM_FLASHINFER_ALLREDUCE_BACKEND
123
if backend != "auto":
124
- logger.info_once(f"Using flashinfer allreduce backend: {backend}")
124
+ logger.debug_once("Using flashinfer allreduce backend: %s", backend)
125
return backend, False
126
127
# Default to mnnvl for both single- and multi-node setups. The mnnvl
@@ -134,7 +134,7 @@ def _resolve_fi_ar_backend() -> tuple[str, bool]:
134
backend = "mnnvl"
135
allow_trtllm_fallback = get_node_count() == 1
136
137
- logger.info_once(f"Auto-selected flashinfer allreduce backend: {backend}")
137
+ logger.debug_once("Auto-selected flashinfer allreduce backend: %s", backend)
138
return backend, allow_trtllm_fallback
139
140
vllm/model_executor/warmup/cutedsl_warmup.py
+5
-14
@@ -8,7 +8,6 @@
8
9
from __future__ import annotations
10
11
-import time
11
import weakref
12
from collections.abc import Callable, Hashable, Iterable
13
from dataclasses import dataclass
@@ -97,25 +96,17 @@ def _compile_cutedsl_warmup_units(
96
def cutedsl_warmup() -> None:
97
"""Run CuTeDSL compile providers before serving."""
98
if not current_platform.is_cuda():
100
- logger.info("Skipping CuTeDSL warmup on non-CUDA platform.")
99
+ logger.debug("Skipping CuTeDSL warmup on non-CUDA platform.")
100
return
101
102
compile_units = _collect_unique_compile_units(_iter_cutedsl_warmup_compile_units())
103
if not compile_units:
105
- logger.info("Skipping CuTeDSL warmup because no compile units were requested.")
104
+ logger.debug("Skipping CuTeDSL warmup because no compile units were requested.")
105
return
106
108
- unit_names = list(dict.fromkeys(unit.name for unit in compile_units))
109
- logger.info(
107
+ logger.info_once(
108
"Warming up CuTeDSL compile_units=%d names=%s.",
109
len(compile_units),
112
- unit_names,
113
- )
114
-
115
- start_time = time.perf_counter()
116
- compiled_count = _compile_cutedsl_warmup_units(compile_units)
117
- logger.info(
118
- "CuTeDSL warmup compiled %d units in %.2f s.",
119
- compiled_count,
120
- time.perf_counter() - start_time,
110
+ tuple(dict.fromkeys(unit.name for unit in compile_units)),
111
)
112
+ _compile_cutedsl_warmup_units(compile_units)
vllm/model_executor/warmup/kernel_warmup.py
+11
-11
@@ -84,12 +84,12 @@ def _warmup_ll_bf16_router_gemm(model: torch.nn.Module) -> None:
84
85
shapes = _ll_bf16_router_shapes_from_model(model)
86
if not shapes:
87
- logger.info(
87
+ logger.debug_once(
88
"Skipping ll_bf16 router GEMM warmup: no bf16 GateLinear shapes found."
89
)
90
return
91
92
- logger.info("Warming up ll_bf16 router GEMM kernels for shapes: %s.", shapes)
92
+ logger.info_once("Warming up ll_bf16 router GEMM kernels for shapes: %s.", shapes)
93
ll_bf16_gemm_kernel.warmup(
94
shapes=shapes,
95
m_values=_LL_BF16_WARMUP_M_RANGE,
@@ -163,7 +163,7 @@ def kernel_warmup(worker: "Worker", *, process_local_only: bool = False):
163
)
164
# FlashInfer autotune for Hopper (SM 9.0) and Blackwell (SM 10.0) GPUs
165
if enable_flashinfer_autotune is False:
166
- logger.info("Skipping FlashInfer autotune because it is disabled.")
166
+ logger.info_once("Skipping FlashInfer autotune because it is disabled.")
167
elif has_flashinfer() and current_platform.has_device_capability(90):
168
flashinfer_autotune(worker.model_runner)
169
@@ -188,7 +188,7 @@ def kernel_warmup(worker: "Worker", *, process_local_only: bool = False):
188
for group in groups
189
)
190
):
191
- logger.info("Warming up FlashInfer attention.")
191
+ logger.info_once("Warming up FlashInfer attention.")
192
# Warmup with mixed batch containing both prefill and decode tokens
193
# This is to warm up both prefill and decode attention kernels
194
worker.model_runner._dummy_run(
@@ -238,9 +238,9 @@ def flashinfer_autotune(runner: "GPUModelRunner") -> None:
238
autotune_kwargs: dict = {}
239
skip_ops = _flashinfer_autotune_skip_ops(runner)
240
if skip_ops:
241
- logger.info(
241
+ logger.info_once(
242
"Skipping FlashInfer autotuning for ops %s",
243
- sorted(skip_ops),
243
+ tuple(sorted(skip_ops)),
244
)
245
autotune_kwargs["skip_ops"] = skip_ops
246
@@ -265,7 +265,7 @@ def flashinfer_autotune(runner: "GPUModelRunner") -> None:
265
266
cache_path = resolve_flashinfer_autotune_file(runner)
267
if is_leader:
268
- logger.info("Using FlashInfer autotune cache file: %s", cache_path)
268
+ logger.info_once("Using FlashInfer autotune cache file: %s", cache_path)
269
270
# We skip EPLB here since we don't want to record dummy metrics.
271
# When autotuning with number of tokens m, flashinfer will autotune
@@ -296,9 +296,9 @@ def flashinfer_autotune(runner: "GPUModelRunner") -> None:
296
tune_results = world.broadcast_object(tune_results, src=0)
297
298
if tune_results is None:
299
- logger.warning(
300
- "No FlashInfer autotune cache entries found."
301
- "Falling back to default tactics."
299
+ logger.warning_once(
300
+ "No FlashInfer autotune cache entries found; "
301
+ "falling back to default tactics."
302
)
303
else:
304
write_flashinfer_autotune_cache(cache_path, tune_results)
@@ -306,7 +306,7 @@ def flashinfer_autotune(runner: "GPUModelRunner") -> None:
306
from flashinfer.autotuner import AutoTuner
307
308
AutoTuner.get().load_configs(str(cache_path))
309
- logger.info(
309
+ logger.info_once(
310
"FlashInfer autotune cache loaded on rank %d from %s.",
311
world.rank_in_group,
312
cache_path,
vllm/utils/system_utils.py
+1
-1
@@ -284,7 +284,7 @@ def kill_process_tree(pid: int):
284
# Adapted from: https://github.com/sgl-project/sglang/blob/v0.4.1/python/sglang/srt/utils.py#L630
285
def set_ulimit(target_soft_limit: int = 65535):
286
if sys.platform.startswith("win"):
287
- logger.info("Windows detected, skipping ulimit adjustment.")
287
+ logger.debug("Windows detected, skipping ulimit adjustment.")
288
return
289
290
import resource
vllm/v1/attention/backends/utils.py
+1
-1
@@ -87,7 +87,7 @@ def get_kv_cache_layout():
87
cache_layout: Literal["NHD", "HND"] | None = None
88
if _KV_CACHE_LAYOUT_OVERRIDE is not None:
89
cache_layout = _KV_CACHE_LAYOUT_OVERRIDE
90
- logger.info_once(
90
+ logger.debug_once(
91
"`_KV_CACHE_LAYOUT_OVERRIDE` variable detected. "
92
"Setting KV cache layout to %s.",
93
cache_layout,
vllm/v1/attention/selector.py
+1
-1
@@ -199,7 +199,7 @@ def _cached_get_attn_backend(
199
from vllm.v1.attention.backends.utils import set_kv_cache_layout
200
201
set_kv_cache_layout(required_layout)
202
- logger.info(
202
+ logger.info_once(
203
"Using %s KV cache layout for %s backend.",
204
required_layout,
205
backend.get_name(),
vllm/v1/worker/gpu/model_runner.py
+1
-1
@@ -305,7 +305,7 @@ class GPUModelRunner(LoRAModelRunnerMixin):
305
eplb_models_added = False
306
with DeviceMemoryProfiler() as m:
307
model_loader = get_model_loader(self.vllm_config.load_config)
308
- logger.info("Loading model from scratch...")
308
+ logger.info_once("Loading model from scratch...")
309
310
self.model = model_loader.load_model(
311
vllm_config=self.vllm_config, model_config=self.vllm_config.model_config