main
py 115 lines 3.89 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 import logging
5 from collections.abc import Sequence
6
7 import torch
8
9 from vllm.entrypoints.pooling.typing import AnyPoolingRequest
10 from vllm.entrypoints.serve.engine.typing import AnyRequest
11 from vllm.logger import init_logger
12 from vllm.lora.request import LoRARequest
13 from vllm.pooling_params import PoolingParams
14 from vllm.sampling_params import BeamSearchParams, SamplingParams
15
16 logger = init_logger(__name__)
17
18
19 class RequestLogger:
20 def __init__(self, *, max_log_len: int | None) -> None:
21 self.max_log_len = max_log_len
22
23 if not logger.isEnabledFor(logging.INFO):
24 logger.warning_once(
25 "`--enable-log-requests` is set but "
26 "the minimum log level is higher than INFO. "
27 "No request information will be logged."
28 )
29 elif not logger.isEnabledFor(logging.DEBUG):
30 logger.info_once(
31 "`--enable-log-requests` is set but "
32 "the minimum log level is higher than DEBUG. "
33 "Only limited information will be logged to minimize overhead. "
34 "To view more details, set `--log-level DEBUG`."
35 )
36
37 def log_inputs(
38 self,
39 request_id: str,
40 prompt: str | None,
41 prompt_token_ids: list[int] | None,
42 prompt_embeds: torch.Tensor | None,
43 params: SamplingParams | PoolingParams | BeamSearchParams | None,
44 lora_request: LoRARequest | None,
45 ) -> None:
46 if logger.isEnabledFor(logging.DEBUG):
47 max_log_len = self.max_log_len
48 if max_log_len is not None:
49 if prompt is not None:
50 prompt = prompt[:max_log_len]
51
52 if prompt_token_ids is not None:
53 prompt_token_ids = prompt_token_ids[:max_log_len]
54
55 logger.debug(
56 "Request %s details: prompt: %r, "
57 "prompt_token_ids: %s, "
58 "prompt_embeds shape: %s.",
59 request_id,
60 prompt,
61 prompt_token_ids,
62 prompt_embeds.shape if prompt_embeds is not None else None,
63 )
64
65 logger.info(
66 "Received request %s: params: %s, lora_request: %s.",
67 request_id,
68 params,
69 lora_request,
70 )
71
72 def log_request_body(self, request: AnyRequest | AnyPoolingRequest) -> None:
73 if logger.isEnabledFor(logging.DEBUG):
74 max_log_len = self.max_log_len if self.max_log_len is not None else -1
75 logger.debug(
76 "Request %s JSON body: %s",
77 getattr(request, "request_id", "N/A"),
78 request.model_dump_json(exclude_unset=True)[:max_log_len],
79 )
80
81 def log_outputs(
82 self,
83 request_id: str,
84 outputs: str,
85 output_token_ids: Sequence[int] | None,
86 finish_reason: str | None = None,
87 is_streaming: bool = False,
88 delta: bool = False,
89 ) -> None:
90 max_log_len = self.max_log_len
91 if max_log_len is not None and outputs is not None:
92 outputs = outputs[:max_log_len]
93
94 stream_info = ""
95 if is_streaming:
96 stream_info = " (streaming delta)" if delta else " (streaming complete)"
97
98 if logger.isEnabledFor(logging.DEBUG):
99 if max_log_len is not None and output_token_ids is not None:
100 output_token_ids = list(output_token_ids)[:max_log_len]
101
102 logger.debug(
103 "Generated response %s%s details: output_token_ids: %s",
104 request_id,
105 stream_info,
106 output_token_ids,
107 )
108
109 logger.info(
110 "Generated response %s%s: output: %r, finish_reason: %s",
111 request_id,
112 stream_info,
113 outputs,
114 finish_reason,
115 )