sequence.py 3.24 KB
Newer Older
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
"""Sequence and its related classes."""
4

5
from dataclasses import dataclass
6
from typing import TYPE_CHECKING, Any
Woosuk Kwon's avatar
Woosuk Kwon committed
7

8
9
import torch

10
if TYPE_CHECKING:
11
    from vllm.v1.worker.kv_connector_model_runner_mixin import KVConnectorOutput
12
13
else:
    KVConnectorOutput = Any
14

15
VLLM_TOKEN_ID_ARRAY_TYPE = "l"
16

17
18
VLLM_INVALID_TOKEN_ID = -1

19

20
21
22
23
@dataclass
class RequestMetrics:
    """Metrics associated with a request.

24
    Attributes:
25
26
27
28
29
        arrival_time: The time when the request arrived.
        first_scheduled_time: The time when the request was first scheduled.
        first_token_time: The time when the first token was generated.
        time_in_queue: The time the request spent in the queue.
        finished_time: The time when the request was finished.
30
31
32
33
34
35
36
        scheduler_time: The time spent in the scheduler when this request was
                        being considered by the scheduler.
        model_forward_time: The time spent in the model forward pass when this
                            request was in the batch.
        model_execute_time: The time spent in the model execute function. This
                            will include model forward, block/sync across
                            workers, cpu-gpu sync time and sampling time.
37
    """
38

39
40
    arrival_time: float
    last_token_time: float
41
42
43
44
45
46
47
    first_scheduled_time: float | None
    first_token_time: float | None
    time_in_queue: float | None
    finished_time: float | None = None
    scheduler_time: float | None = None
    model_forward_time: float | None = None
    model_execute_time: float | None = None
48
49


50
51
52
# cannot use msgspec.Struct here because Dynamo does not support it
@dataclass
class IntermediateTensors:
53
54
55
    """For all pipeline stages except the last, we need to return the hidden
    states and residuals to be sent to the next stage. This data structure
    contains the hidden states and residuals for a request.
56

57
    Each stage also needs to handle its own kv_connector_output.
58
59
    """

60
    tensors: dict[str, torch.Tensor]
61
    kv_connector_output: KVConnectorOutput | None
62

63
64
65
66
67
68
69
    def __init__(self, tensors):
        # manually define this function, so that
        # Dynamo knows `IntermediateTensors()` comes from this file.
        # Otherwise, dataclass will generate this function by evaluating
        # a string, and we will lose the information about the source file.
        self.tensors = tensors

70
    def __getitem__(self, key: str | slice):
71
72
73
74
75
        if isinstance(key, str):
            return self.tensors[key]
        elif isinstance(key, slice):
            return self.__class__({k: v[key] for k, v in self.tensors.items()})

76
    def __setitem__(self, key: str, value: torch.Tensor):
77
78
        self.tensors[key] = value

79
80
81
    def items(self):
        return self.tensors.items()

82
83
84
85
    def __len__(self):
        return len(self.tensors)

    def __eq__(self, other: object):
86
87
88
89
        if not isinstance(other, self.__class__):
            return False
        if self.tensors.keys() != other.tensors.keys():
            return False
90
        return all(torch.equal(self.tensors[k], other.tensors[k]) for k in self.tensors)
91
92
93

    def __repr__(self) -> str:
        return f"IntermediateTensors(tensors={self.tensors})"