[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