main
py 97 lines 3.3 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 import logging
5
6 import pytest
7 import regex as re
8
9 from tests.entrypoints.multimodal.conftest import TEST_IMAGE_ASSETS
10 from vllm import LLM
11 from vllm.entrypoints.chat_utils import ChatCompletionMessageParam
12 from vllm.v1.metrics import loggers as stat_loggers
13 from vllm.v1.metrics.reader import Counter, Metric
14
15
16 def _make_messages(image_url: str) -> list[ChatCompletionMessageParam]:
17 return [
18 {
19 "role": "user",
20 "content": [
21 {
22 "type": "image_url",
23 "image_url": {"url": image_url},
24 },
25 ],
26 }
27 ]
28
29
30 def _get_counter_value(metrics: list[Metric], name: str):
31 metric = next(m for m in metrics if m.name == name)
32 assert isinstance(metric, Counter)
33 return metric.value
34
35
36 def _get_mm_cache_stats(metrics: list[Metric]):
37 mm_cache_queries = _get_counter_value(metrics, "vllm:mm_cache_queries")
38 mm_cache_hits = _get_counter_value(metrics, "vllm:mm_cache_hits")
39
40 return mm_cache_queries, mm_cache_hits
41
42
43 def _get_mm_cache_log(llm: LLM, caplog_vllm: pytest.LogCaptureFixture) -> float:
44 caplog_vllm.clear()
45 with caplog_vllm.at_level(logging.INFO, logger=stat_loggers.__name__):
46 llm.llm_engine.do_log_stats()
47
48 assert len(caplog_vllm.records) == 1
49 msg = caplog_vllm.records[0].getMessage()
50
51 assert "MM cache hit rate" in msg
52 match = re.search(r"MM cache hit rate: ([0-9.]+)%", msg)
53 assert match is not None
54 return float(match.group(1))
55
56
57 @pytest.mark.parametrize("image_urls", [TEST_IMAGE_ASSETS[:2]], indirect=True)
58 @pytest.mark.parametrize("mm_processor_cache_type", ["lru", "shm"])
59 def test_mm_cache_stats(
60 num_gpus_available,
61 image_urls,
62 mm_processor_cache_type,
63 caplog_vllm,
64 vllm_runner,
65 ):
66 with vllm_runner(
67 "llava-hf/llava-1.5-7b-hf",
68 max_model_len=4096,
69 max_num_seqs=5,
70 enforce_eager=True,
71 mm_processor_cache_type=mm_processor_cache_type,
72 disable_log_stats=False,
73 limit_mm_per_prompt={"image": 2},
74 ) as runner:
75 runner.llm.chat(_make_messages(image_urls[0]))
76 assert _get_mm_cache_stats(runner.llm.get_metrics()) == (1, 0)
77 assert _get_mm_cache_log(runner.llm, caplog_vllm) == pytest.approx(0.0)
78
79 runner.llm.chat(_make_messages(image_urls[1]))
80 assert _get_mm_cache_stats(runner.llm.get_metrics()) == (2, 0)
81 assert _get_mm_cache_log(runner.llm, caplog_vllm) == pytest.approx(0.0)
82
83 runner.llm.chat(_make_messages(image_urls[0]))
84 assert _get_mm_cache_stats(runner.llm.get_metrics()) == (3, 1)
85 assert _get_mm_cache_log(runner.llm, caplog_vllm) == pytest.approx(33.3)
86
87 # NOTE: This only resets hit rate stats in CachingMetrics
88 # The raw queries and hits counts remain unaffected
89 runner.llm.reset_mm_cache()
90
91 runner.llm.chat(_make_messages(image_urls[0]))
92 assert _get_mm_cache_stats(runner.llm.get_metrics()) == (4, 1)
93 assert _get_mm_cache_log(runner.llm, caplog_vllm) == pytest.approx(0.0)
94
95 runner.llm.chat(_make_messages(image_urls[1]))
96 assert _get_mm_cache_stats(runner.llm.get_metrics()) == (5, 1)
97 assert _get_mm_cache_log(runner.llm, caplog_vllm) == pytest.approx(0.0)