@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 26dd972adb
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 15, 18:30 UTC

[FEAT]Support reset prefix cache by specified device (#15003)

maobaolong committed Mar 20, 2025 at 01:54 UTC 26dd972adb4bd318c60ddccf21dd7a2862b8dfb6
15 files changed +49 -34
vllm/core/block/cpu_gpu_block_allocator.py
+4 -2
@@ -341,8 +341,10 @@ class CpuGpuBlockAllocator(DeviceAwareBlockAllocator):
341 assert device in self._allocators
342 return self._allocators[device].get_prefix_cache_hit_rate()
343
344 - def reset_prefix_cache(self) -> bool:
345 - """Reset prefix cache for all devices."""
344 + def reset_prefix_cache(self, device: Optional[Device] = None) -> bool:
345 + """Reset prefix cache for specified or all devices."""
346 + if device:
347 + return self._allocators[device].reset_prefix_cache()
348 success = True
349 for allocator in self._allocators.values():
350 success = success and allocator.reset_prefix_cache()
vllm/core/block/interfaces.py
+1 -1
@@ -305,7 +305,7 @@ class DeviceAwareBlockAllocator(ABC):
305 pass
306
307 @abstractmethod
308 - def reset_prefix_cache(self) -> bool:
308 + def reset_prefix_cache(self, device: Optional[Device] = None) -> bool:
309 """Reset prefix cache."""
310 pass
311
vllm/core/block_manager.py
+2 -2
@@ -456,8 +456,8 @@ class SelfAttnBlockSpaceManager(BlockSpaceManager):
456 def get_prefix_cache_hit_rate(self, device: Device) -> float:
457 return self.block_allocator.get_prefix_cache_hit_rate(device)
458
459 - def reset_prefix_cache(self) -> bool:
460 - return self.block_allocator.reset_prefix_cache()
459 + def reset_prefix_cache(self, device: Optional[Device] = None) -> bool:
460 + return self.block_allocator.reset_prefix_cache(device)
461
462 def _can_swap(self,
463 seq_group: SequenceGroup,
vllm/core/interfaces.py
+3 -3
@@ -2,7 +2,7 @@
2
3 import enum
4 from abc import ABC, abstractmethod
5 -from typing import List
5 +from typing import List, Optional
6 from typing import Sequence as GenericSequence
7 from typing import Tuple
8
@@ -125,8 +125,8 @@ class BlockSpaceManager(ABC):
125 pass
126
127 @abstractmethod
128 - def reset_prefix_cache(self) -> bool:
129 - """Reset prefix cache for all devices."""
128 + def reset_prefix_cache(self, device: Optional[Device] = None) -> bool:
129 + """Reset prefix cache for specified or all devices."""
130 pass
131
132 @abstractmethod
vllm/core/placeholder_block_space_manager.py
+2 -2
@@ -1,6 +1,6 @@
1 # SPDX-License-Identifier: Apache-2.0
2
3 -from typing import List, Tuple
3 +from typing import List, Optional, Tuple
4
5 from vllm.core.interfaces import AllocStatus, BlockSpaceManager
6 from vllm.sequence import Sequence, SequenceGroup
@@ -92,7 +92,7 @@ class PlaceholderBlockSpaceManager(BlockSpaceManager):
92 def get_prefix_cache_hit_rate(self, device: Device) -> float:
93 return -1
94
95 - def reset_prefix_cache(self) -> bool:
95 + def reset_prefix_cache(self, device: Optional[Device] = None) -> bool:
96 return True
97
98 def get_num_cached_tokens(self, seq: Sequence) -> int:
vllm/core/scheduler.py
+2 -2
@@ -634,8 +634,8 @@ class Scheduler:
634 def get_prefix_cache_hit_rate(self, device: Device) -> float:
635 return self.block_manager.get_prefix_cache_hit_rate(device)
636
637 - def reset_prefix_cache(self) -> bool:
638 - return self.block_manager.reset_prefix_cache()
637 + def reset_prefix_cache(self, device: Optional[Device] = None) -> bool:
638 + return self.block_manager.reset_prefix_cache(device)
639
640 def get_num_unfinished_seq_groups(self) -> int:
641 return len(self.waiting) + len(self.running) + len(self.swapped)
vllm/engine/async_llm_engine.py
+4 -3
@@ -35,7 +35,7 @@ from vllm.sampling_params import SamplingParams
35 from vllm.sequence import ExecuteModelRequest
36 from vllm.transformers_utils.tokenizer import AnyTokenizer
37 from vllm.usage.usage_lib import UsageContext
38 -from vllm.utils import deprecate_kwargs, weak_bind
38 +from vllm.utils import Device, deprecate_kwargs, weak_bind
39
40 logger = init_logger(__name__)
41 ENGINE_ITERATION_TIMEOUT_S = envs.VLLM_ENGINE_ITERATION_TIMEOUT_S
@@ -1216,8 +1216,9 @@ class AsyncLLMEngine(EngineClient):
1216 async def stop_profile(self) -> None:
1217 self.engine.stop_profile()
1218
1219 - async def reset_prefix_cache(self) -> None:
1220 - self.engine.reset_prefix_cache()
1219 + async def reset_prefix_cache(self,
1220 + device: Optional[Device] = None) -> None:
1221 + self.engine.reset_prefix_cache(device)
1222
1223 async def sleep(self, level: int = 1) -> None:
1224 self.engine.sleep(level)
vllm/engine/llm_engine.py
+2 -2
@@ -955,12 +955,12 @@ class LLMEngine:
955 """
956 return self.scheduler[virtual_engine].has_unfinished_seqs()
957
958 - def reset_prefix_cache(self) -> bool:
958 + def reset_prefix_cache(self, device: Optional[Device] = None) -> bool:
959 """Reset prefix cache for all devices."""
960
961 success = True
962 for scheduler in self.scheduler:
963 - success = success and scheduler.reset_prefix_cache()
963 + success = success and scheduler.reset_prefix_cache(device)
964 return success
965
966 @staticmethod
vllm/engine/multiprocessing/__init__.py
+4 -3
@@ -13,7 +13,7 @@ from vllm.lora.request import LoRARequest
13 from vllm.outputs import RequestOutput
14 from vllm.prompt_adapter.request import PromptAdapterRequest
15 from vllm.sampling_params import SamplingParams
16 -from vllm.utils import deprecate_kwargs
16 +from vllm.utils import Device, deprecate_kwargs
17
18 VLLM_RPC_SUCCESS_STR = "SUCCESS"
19
@@ -123,8 +123,9 @@ class RPCUProfileRequest(Enum):
123 STOP_PROFILE = 2
124
125
126 -class RPCResetPrefixCacheRequest(Enum):
127 - RESET_PREFIX_CACHE = 1
126 +@dataclass
127 +class RPCResetPrefixCacheRequest:
128 + device: Device
129
130
131 class RPCSleepRequest(Enum):
vllm/engine/multiprocessing/client.py
+4 -3
@@ -47,7 +47,7 @@ from vllm.outputs import PoolingRequestOutput, RequestOutput
47 from vllm.prompt_adapter.request import PromptAdapterRequest
48 from vllm.sampling_params import SamplingParams
49 from vllm.transformers_utils.tokenizer_group import init_tokenizer_from_configs
50 -from vllm.utils import deprecate_kwargs
50 +from vllm.utils import Device, deprecate_kwargs
51
52 logger = init_logger(__name__)
53
@@ -684,11 +684,12 @@ class MQLLMEngineClient(EngineClient):
684 await self._send_one_way_rpc_request(
685 request=RPCUProfileRequest.STOP_PROFILE, socket=self.input_socket)
686
687 - async def reset_prefix_cache(self) -> None:
687 + async def reset_prefix_cache(self,
688 + device: Optional[Device] = None) -> None:
689 """Reset the prefix cache"""
690
691 await self._send_one_way_rpc_request(
691 - request=RPCResetPrefixCacheRequest.RESET_PREFIX_CACHE,
692 + request=RPCResetPrefixCacheRequest(device),
693 socket=self.input_socket)
694
695 async def sleep(self, level: int = 1) -> None:
vllm/engine/protocol.py
+3 -2
@@ -18,7 +18,7 @@ from vllm.pooling_params import PoolingParams
18 from vllm.prompt_adapter.request import PromptAdapterRequest
19 from vllm.sampling_params import BeamSearchParams, SamplingParams
20 from vllm.transformers_utils.tokenizer import AnyTokenizer
21 -from vllm.utils import collect_from_async_generator, random_uuid
21 +from vllm.utils import Device, collect_from_async_generator, random_uuid
22
23 logger = init_logger(__name__)
24
@@ -274,7 +274,8 @@ class EngineClient(ABC):
274 ...
275
276 @abstractmethod
277 - async def reset_prefix_cache(self) -> None:
277 + async def reset_prefix_cache(self,
278 + device: Optional[Device] = None) -> None:
279 """Reset the prefix cache"""
280 ...
281
vllm/entrypoints/llm.py
+4 -3
@@ -42,7 +42,8 @@ from vllm.transformers_utils.tokenizer import (AnyTokenizer, MistralTokenizer,
42 get_cached_tokenizer)
43 from vllm.transformers_utils.tokenizer_group import TokenizerGroup
44 from vllm.usage.usage_lib import UsageContext
45 -from vllm.utils import Counter, deprecate_args, deprecate_kwargs, is_list_of
45 +from vllm.utils import (Counter, Device, deprecate_args, deprecate_kwargs,
46 + is_list_of)
47
48 logger = init_logger(__name__)
49
@@ -1187,8 +1188,8 @@ class LLM:
1188 def stop_profile(self) -> None:
1189 self.llm_engine.stop_profile()
1190
1190 - def reset_prefix_cache(self) -> bool:
1191 - return self.llm_engine.reset_prefix_cache()
1191 + def reset_prefix_cache(self, device: Optional[Device] = None) -> bool:
1192 + return self.llm_engine.reset_prefix_cache(device)
1193
1194 def sleep(self, level: int = 1):
1195 """
vllm/entrypoints/openai/api_server.py
+7 -3
@@ -85,7 +85,7 @@ from vllm.logger import init_logger
85 from vllm.transformers_utils.config import (
86 maybe_register_config_serialize_by_value)
87 from vllm.usage.usage_lib import UsageContext
88 -from vllm.utils import (FlexibleArgumentParser, get_open_zmq_ipc_path,
88 +from vllm.utils import (Device, FlexibleArgumentParser, get_open_zmq_ipc_path,
89 is_valid_ipv6_address, set_ulimit)
90 from vllm.version import __version__ as VLLM_VERSION
91
@@ -677,8 +677,12 @@ if envs.VLLM_SERVER_DEV_MODE:
677 Reset the prefix cache. Note that we currently do not check if the
678 prefix cache is successfully reset in the API server.
679 """
680 - logger.info("Resetting prefix cache...")
681 - await engine_client(raw_request).reset_prefix_cache()
680 + device = None
681 + device_str = raw_request.query_params.get("device")
682 + if device_str is not None:
683 + device = Device[device_str.upper()]
684 + logger.info("Resetting prefix cache with specific %s...", str(device))
685 + await engine_client(raw_request).reset_prefix_cache(device)
686 return Response(status_code=200)
687
688 @router.post("/sleep")
vllm/v1/engine/async_llm.py
+5 -2
@@ -24,7 +24,7 @@ from vllm.sampling_params import RequestOutputKind, SamplingParams
24 from vllm.transformers_utils.tokenizer import AnyTokenizer
25 from vllm.transformers_utils.tokenizer_group import init_tokenizer_from_configs
26 from vllm.usage.usage_lib import UsageContext
27 -from vllm.utils import cdiv, kill_process_tree
27 +from vllm.utils import Device, cdiv, kill_process_tree
28 from vllm.v1.engine.core_client import EngineCoreClient
29 from vllm.v1.engine.output_processor import OutputProcessor
30 from vllm.v1.engine.parallel_sampling import ParentRequest
@@ -398,7 +398,10 @@ class AsyncLLM(EngineClient):
398 async def stop_profile(self) -> None:
399 await self.engine_core.profile_async(False)
400
401 - async def reset_prefix_cache(self) -> None:
401 + async def reset_prefix_cache(self,
402 + device: Optional[Device] = None) -> None:
403 + if device == Device.CPU:
404 + raise ValueError("Not supported on CPU.")
405 await self.engine_core.reset_prefix_cache_async()
406
407 async def sleep(self, level: int = 1) -> None:
vllm/v1/engine/llm_engine.py
+2 -1
@@ -20,6 +20,7 @@ from vllm.sampling_params import SamplingParams
20 from vllm.transformers_utils.tokenizer_group import (
21 BaseTokenizerGroup, init_tokenizer_from_configs)
22 from vllm.usage.usage_lib import UsageContext
23 +from vllm.utils import Device
24 from vllm.v1.engine.core_client import EngineCoreClient
25 from vllm.v1.engine.output_processor import OutputProcessor
26 from vllm.v1.engine.parallel_sampling import ParentRequest
@@ -226,7 +227,7 @@ class LLMEngine:
227 def stop_profile(self):
228 self.engine_core.profile(False)
229
229 - def reset_prefix_cache(self):
230 + def reset_prefix_cache(self, device: Optional[Device] = None):
231 self.engine_core.reset_prefix_cache()
232
233 def sleep(self, level: int = 1):