A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 5, 06:00 UTC
[Core][Metrics] Remove `vllm:prompt_tokens_recomputed` metric (#38709)
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Mark McLoughlin committed
Apr 12, 2026 at 10:22 UTC
72ff142c37564790a11a186e64bbcaa1d4441142
3 files changed
+6
-27
tests/v1/metrics/test_stats.py
+3
-5
@@ -190,8 +190,7 @@ def test_prompt_token_stats_full_local_cache_recompute():
190
)
191
192
assert stats.computed == 1
193
- assert stats.local_cache_hit == 1000
194
- assert stats.recomputed_tokens == 1
193
+ assert stats.local_cache_hit == 999
194
195
196
def test_prompt_token_stats_full_external_transfer_recompute():
@@ -201,11 +200,10 @@ def test_prompt_token_stats_full_external_transfer_recompute():
200
# Case 6: Full external transfer (999 cached after reduction, 1 recomputed)
201
stats.update_from_output(
202
num_cached_tokens=999,
204
- num_external_computed_tokens=1000,
203
+ num_external_computed_tokens=999,
204
prompt_len=1000,
205
)
206
207
assert stats.computed == 1
208
assert stats.local_cache_hit == 0
210
- assert stats.external_kv_transfer == 1000
211
- assert stats.recomputed_tokens == 1
209
+ assert stats.external_kv_transfer == 999
vllm/v1/metrics/loggers.py
-11
@@ -622,16 +622,6 @@ class PrometheusStatLogger(AggregateStatLoggerBase):
622
counter_prompt_tokens_cached, per_engine_labelvalues
623
)
624
625
- # Recomputed tokens (last token recomputed when entire prompt is cached)
626
- counter_prompt_tokens_recomputed = self._counter_cls(
627
- name="vllm:prompt_tokens_recomputed",
628
- documentation="Number of cached tokens recomputed for forward pass.",
629
- labelnames=labelnames,
630
- )
631
- self.counter_prompt_tokens_recomputed = create_metric_per_engine(
632
- counter_prompt_tokens_recomputed, per_engine_labelvalues
633
- )
634
-
625
counter_generation_tokens = self._counter_cls(
626
name="vllm:generation_tokens",
627
documentation="Number of generation tokens processed.",
@@ -1122,7 +1112,6 @@ class PrometheusStatLogger(AggregateStatLoggerBase):
1112
pts.get_by_source(source)
1113
)
1114
self.counter_prompt_tokens_cached[engine_idx].inc(pts.cached_tokens)
1125
- self.counter_prompt_tokens_recomputed[engine_idx].inc(pts.recomputed_tokens)
1115
self.counter_generation_tokens[engine_idx].inc(
1116
iteration_stats.num_generation_tokens
1117
)
vllm/v1/metrics/stats.py
+3
-11
@@ -246,12 +246,11 @@ class PromptTokenStats:
246
local_cache_hit: Tokens from local prefix cache.
247
external_kv_transfer: Tokens from external KV transfer.
248
cached_tokens: Tokens skipped during prefill (from scheduler).
249
- recomputed_tokens: Cached tokens that were recomputed (see below).
249
total: Total prompt tokens.
250
251
Invariants:
253
- computed + local_cache_hit + external_kv_transfer - recomputed_tokens = total
254
- local_cache_hit + external_kv_transfer - recomputed_tokens = cached_tokens
252
+ computed + local_cache_hit + external_kv_transfer = total
253
+ local_cache_hit + external_kv_transfer = cached_tokens
254
"""
255
256
ALL_SOURCES: tuple[str, ...] = (
@@ -264,7 +263,6 @@ class PromptTokenStats:
263
local_cache_hit: int = 0
264
external_kv_transfer: int = 0
265
cached_tokens: int = 0
267
- recomputed_tokens: int = 0
266
total: int = 0
267
268
def update_from_output(
@@ -274,11 +272,6 @@ class PromptTokenStats:
272
prompt_len: int,
273
) -> None:
274
"""Update stats from a prefill output."""
277
- # When all tokens are cached, the scheduler reduces num_cached_tokens
278
- # by 1 to force the model to recompute the last token, since the model
279
- # needs at least one input token to run a forward pass.
280
- recomputed = 1 if (num_cached_tokens + 1 == prompt_len) else 0
281
-
275
self.computed += prompt_len - num_cached_tokens
276
self.external_kv_transfer += num_external_computed_tokens
277
# FIXME(yifan): local_cache_hit can go negative after preemption.
@@ -290,10 +283,9 @@ class PromptTokenStats:
283
# as a separate metric rather than reusing num_external_computed_tokens
284
# for metric directly.
285
self.local_cache_hit += max(
293
- 0, (num_cached_tokens + recomputed - num_external_computed_tokens)
286
+ 0, (num_cached_tokens - num_external_computed_tokens)
287
)
288
self.cached_tokens += num_cached_tokens
296
- self.recomputed_tokens += recomputed
289
self.total += prompt_len
290
291
def get_by_source(self, source: str) -> int: