[Profiler] Stamp vLLM version/commit into torch profiler trace metadata (#51389)

Signed-off-by: Elvir Crncevic <elvircrn@gmail.com>

Elvir Crnčević committed Aug 7, 2026 at 22:29 UTC 99950b0b86463867bfaa210b7da56d7ce41eb35a
1 file changed +32
vllm/profiler/wrapper.py
+32
@@ -1,6 +1,7 @@
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 +import json
5 from abc import ABC, abstractmethod
6 from collections.abc import Callable
7 from contextlib import nullcontext
@@ -9,6 +10,7 @@ from typing import Literal
10 import torch
11 from typing_extensions import override
12
13 +import vllm.version
14 from vllm.config import ProfilerConfig
15 from vllm.config.profiler import _is_uri_path
16 from vllm.logger import init_logger
@@ -235,6 +237,7 @@ class TorchProfilerWrapper(WorkerProfiler):
237 profiler_config.wait_iterations + profiler_config.warmup_iterations - 1,
238 0,
239 )
240 + self._version_metadata_added = False
241
242 def _build_profiler_table(
243 self,
@@ -258,9 +261,36 @@ class TorchProfilerWrapper(WorkerProfiler):
261 with open(profiler_out_file, "w") as f:
262 print(table, file=f)
263
264 + def _maybe_add_version_metadata(self) -> None:
265 + """Stamp the vLLM version (which embeds the git commit) into the trace.
266 +
267 + add_metadata_json is a no-op until Kineto is initialized, which with a
268 + schedule only happens after the WAIT phase, so stamp once it's live.
269 + """
270 + if self._version_metadata_added:
271 + return
272 + # None while the schedule is still in the WAIT phase.
273 + if self.profiler.profiler is None:
274 + return
275 + try:
276 + self.profiler.add_metadata_json(
277 + "vllm_version", json.dumps(vllm.version.__version__)
278 + )
279 + self.profiler.add_metadata_json(
280 + "vllm_version_tuple",
281 + json.dumps([str(p) for p in vllm.version.__version_tuple__]),
282 + )
283 + except Exception as e:
284 + logger.warning("Failed to add vLLM version to profiler metadata: %s", e)
285 + # Mark done even on failure, to avoid retrying every step.
286 + self._version_metadata_added = True
287 +
288 @override
289 def _start(self) -> None:
290 self.profiler.start()
291 + # No-schedule case: Kineto is live immediately. With a schedule this
292 + # no-ops and _profiler_step stamps it once WAIT ends.
293 + self._maybe_add_version_metadata()
294
295 @override
296 def _stop(self) -> None:
@@ -296,6 +326,8 @@ class TorchProfilerWrapper(WorkerProfiler):
326 """
327 if self._uses_schedule:
328 self.profiler.step()
329 + # Stamp once the schedule leaves WAIT and Kineto is live.
330 + self._maybe_add_version_metadata()
331 # Track warmup steps - only count active steps toward max_iterations
332 if self._warmup_steps_remaining > 0:
333 self._warmup_steps_remaining -= 1