From 99950b0b86463867bfaa210b7da56d7ce41eb35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elvir=20Crn=C4=8Devi=C4=87?= Date: Fri, 7 Aug 2026 22:29:59 +0200 Subject: [PATCH] [Profiler] Stamp vLLM version/commit into torch profiler trace metadata (#51389) Signed-off-by: Elvir Crncevic --- vllm/profiler/wrapper.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/vllm/profiler/wrapper.py b/vllm/profiler/wrapper.py index 201b450784..6e3403708b 100644 --- a/vllm/profiler/wrapper.py +++ b/vllm/profiler/wrapper.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project +import json from abc import ABC, abstractmethod from collections.abc import Callable from contextlib import nullcontext @@ -9,6 +10,7 @@ from typing import Literal import torch from typing_extensions import override +import vllm.version from vllm.config import ProfilerConfig from vllm.config.profiler import _is_uri_path from vllm.logger import init_logger @@ -235,6 +237,7 @@ class TorchProfilerWrapper(WorkerProfiler): profiler_config.wait_iterations + profiler_config.warmup_iterations - 1, 0, ) + self._version_metadata_added = False def _build_profiler_table( self, @@ -258,9 +261,36 @@ class TorchProfilerWrapper(WorkerProfiler): with open(profiler_out_file, "w") as f: print(table, file=f) + def _maybe_add_version_metadata(self) -> None: + """Stamp the vLLM version (which embeds the git commit) into the trace. + + add_metadata_json is a no-op until Kineto is initialized, which with a + schedule only happens after the WAIT phase, so stamp once it's live. + """ + if self._version_metadata_added: + return + # None while the schedule is still in the WAIT phase. + if self.profiler.profiler is None: + return + try: + self.profiler.add_metadata_json( + "vllm_version", json.dumps(vllm.version.__version__) + ) + self.profiler.add_metadata_json( + "vllm_version_tuple", + json.dumps([str(p) for p in vllm.version.__version_tuple__]), + ) + except Exception as e: + logger.warning("Failed to add vLLM version to profiler metadata: %s", e) + # Mark done even on failure, to avoid retrying every step. + self._version_metadata_added = True + @override def _start(self) -> None: self.profiler.start() + # No-schedule case: Kineto is live immediately. With a schedule this + # no-ops and _profiler_step stamps it once WAIT ends. + self._maybe_add_version_metadata() @override def _stop(self) -> None: @@ -296,6 +326,8 @@ class TorchProfilerWrapper(WorkerProfiler): """ if self._uses_schedule: self.profiler.step() + # Stamp once the schedule leaves WAIT and Kineto is live. + self._maybe_add_version_metadata() # Track warmup steps - only count active steps toward max_iterations if self._warmup_steps_remaining > 0: self._warmup_steps_remaining -= 1