[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