stats.py 2.13 KB
Newer Older
1
from dataclasses import dataclass
2
from typing import TYPE_CHECKING, List
3
4

if TYPE_CHECKING:
5
    from vllm.outputs import RequestOutput
6
    from vllm.v1.engine import EngineCoreOutput
7
8
9
10
11
12
13
14
15
16
17


@dataclass
class SchedulerStats:
    """Stats associated with the scheduler."""

    num_running_reqs: int = 0
    num_waiting_reqs: int = 0

    # gpu_cache_usage: float = 0.0
    # gpu_prefix_cache_hit_rate: float = 0.0
18
19


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@dataclass
class RequestStateStats:
    """Stats that need to be tracked across delta updates."""

    num_generation_tokens: int = 0


@dataclass
class FinishedRequestStats:
    """Stats associated with a finished request."""

    num_prompt_tokens: int = 0
    num_generation_tokens: int = 0


35
36
37
38
39
40
41
class IterationStats:
    """Stats associated with a single set of EngineCoreOutputs."""

    def __init__(self, log_stats: bool):
        self.log_stats = log_stats
        self.num_generation_tokens = 0
        self.num_prompt_tokens = 0
42
        self.finished_requests: List[FinishedRequestStats] = []
43
44

    def update_from_output(self, output: "EngineCoreOutput",
45
46
                           is_prefilling: bool, prompt_len: int,
                           request_state_stats: RequestStateStats):
47
48
49
        if not self.log_stats:
            return

50
51
52
        num_new_generation_tokens = len(output.new_token_ids)

        self.num_generation_tokens += num_new_generation_tokens
53
54
55
56
57
        if is_prefilling:
            # This relies on the invariant that EngineCore does
            # not stream outputs for partially completed prefills
            # (scheduler.update_from_output makes EngineCoreOutput
            # iff num_computed_tokens == num_tokens).
58
            assert (num_new_generation_tokens > 0)
59
            self.num_prompt_tokens += prompt_len
60
61
62
63
64
65
66
67

        request_state_stats.num_generation_tokens += num_new_generation_tokens

    def update_from_finished_request(self, request_output: "RequestOutput",
                                     request_state_stats: RequestStateStats):
        self.finished_requests.append(
            FinishedRequestStats(len(request_output.prompt_token_ids),
                                 request_state_stats.num_generation_tokens))