main
py 59 lines 1.68 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 """The `get_language_model` cache must not own the models it keys on.
4
5 A strong-keyed module-level dict pins every model ever loaded in the process
6 for the life of the interpreter. In-process teardown
7 (``VLLM_ENABLE_V1_MULTIPROCESSING=0``) then keeps the weights -- and the KV
8 cache aliased onto the model's layers -- resident after engine shutdown.
9 """
10
11 import gc
12 import weakref
13
14 import pytest
15 import torch.nn as nn
16
17 from vllm.model_executor.models.interfaces import _language_model_by_module
18
19 pytestmark = pytest.mark.cpu_test
20
21
22 class _LanguageModel(nn.Module):
23 def embed_input_ids(self, input_ids): # pragma: no cover - never called
24 raise NotImplementedError
25
26
27 class _MultiModalModel(nn.Module):
28 def __init__(self):
29 super().__init__()
30 self.language_model = _LanguageModel()
31
32
33 def test_cache_is_weak_keyed():
34 assert isinstance(_language_model_by_module, weakref.WeakKeyDictionary)
35
36
37 def test_cached_entry_does_not_pin_the_model():
38 model = _MultiModalModel()
39 _language_model_by_module[model] = model.language_model
40 ref = weakref.ref(model)
41
42 del model
43 gc.collect()
44
45 assert ref() is None, (
46 "the get_language_model cache is keeping the model alive; in-process "
47 "engine shutdown will not release its weights or KV cache"
48 )
49
50
51 def test_cached_entry_is_dropped_with_its_key():
52 model = _MultiModalModel()
53 _language_model_by_module[model] = model.language_model
54 assert model in _language_model_by_module
55
56 del model
57 gc.collect()
58
59 assert not any(isinstance(k, _MultiModalModel) for k in _language_model_by_module)