main
py 83 lines 2.85 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 import contextlib
5 import enum
6 import json
7
8 import torch
9
10 from vllm.config import VllmConfig
11 from vllm.logger import init_logger
12 from vllm.v1.core.sched.output import SchedulerOutput
13 from vllm.v1.metrics.stats import SchedulerStats
14 from vllm.version import __version__ as VLLM_VERSION
15
16 logger = init_logger(__name__)
17
18
19 def prepare_object_to_dump(obj) -> str:
20 if isinstance(obj, str):
21 return f"'{obj}'" # Double quotes
22 elif isinstance(obj, dict):
23 dict_str = ", ".join(
24 {f"{str(k)}: {prepare_object_to_dump(v)}" for k, v in obj.items()}
25 )
26 return f"{{{dict_str}}}"
27 elif isinstance(obj, list):
28 return f"[{', '.join([prepare_object_to_dump(v) for v in obj])}]"
29 elif isinstance(obj, set):
30 return f"[{', '.join([prepare_object_to_dump(v) for v in list(obj)])}]"
31 # return [prepare_object_to_dump(v) for v in list(obj)]
32 elif isinstance(obj, tuple):
33 return f"[{', '.join([prepare_object_to_dump(v) for v in obj])}]"
34 elif isinstance(obj, enum.Enum):
35 return repr(obj)
36 elif isinstance(obj, torch.Tensor):
37 # We only print the 'draft' of the tensor to not expose sensitive data
38 # and to get some metadata in case of CUDA runtime crashed
39 return f"Tensor(shape={obj.shape}, device={obj.device},dtype={obj.dtype})"
40 elif hasattr(obj, "anon_repr"):
41 return obj.anon_repr()
42 elif hasattr(obj, "__dict__"):
43 items = obj.__dict__.items()
44 dict_str = ", ".join(
45 [f"{str(k)}={prepare_object_to_dump(v)}" for k, v in items]
46 )
47 return f"{type(obj).__name__}({dict_str})"
48 else:
49 # Hacky way to make sure we can serialize the object in JSON format
50 try:
51 return json.dumps(obj)
52 except (TypeError, OverflowError):
53 return repr(obj)
54
55
56 def dump_engine_exception(
57 config: VllmConfig,
58 scheduler_output: SchedulerOutput,
59 scheduler_stats: SchedulerStats | None,
60 ):
61 # NOTE: ensure we can log extra info without risking raises
62 # unexpected errors during logging
63 with contextlib.suppress(Exception):
64 _dump_engine_exception(config, scheduler_output, scheduler_stats)
65
66
67 def _dump_engine_exception(
68 config: VllmConfig,
69 scheduler_output: SchedulerOutput,
70 scheduler_stats: SchedulerStats | None,
71 ):
72 logger.error(
73 "Dumping input data for V1 LLM engine (v%s) with config: %s, ",
74 VLLM_VERSION,
75 config,
76 )
77 try:
78 dump_obj = prepare_object_to_dump(scheduler_output)
79 logger.error("Dumping scheduler output for model execution: %s", dump_obj)
80 if scheduler_stats:
81 logger.error("Dumping scheduler stats: %s", scheduler_stats)
82 except Exception:
83 logger.exception("Error preparing object to dump")