diff --git a/vllm/entrypoints/llm.py b/vllm/entrypoints/llm.py index 892e5035ab..349091f4b7 100644 --- a/vllm/entrypoints/llm.py +++ b/vllm/entrypoints/llm.py @@ -898,6 +898,12 @@ class LLM(BeamSearchOfflineMixin, PoolingOfflineMixin, OfflineInferenceMixin): def finish_weight_update(self) -> None: """Finish the current weight update.""" self.llm_engine.collective_rpc("finish_weight_update") + # Invalidate cached state computed with the old weights so it isn't + # reused for subsequent requests: + # - prefix cache: KV blocks computed with the old weights + # - encoder cache: multimodal embeddings keyed only by mm_hash + self.llm_engine.reset_prefix_cache() + self.llm_engine.reset_encoder_cache() def __repr__(self) -> str: """Return a transformers-style hierarchical view of the model.""" diff --git a/vllm/v1/engine/async_llm.py b/vllm/v1/engine/async_llm.py index 419e15163a..26b3f53d2c 100644 --- a/vllm/v1/engine/async_llm.py +++ b/vllm/v1/engine/async_llm.py @@ -1109,3 +1109,9 @@ class AsyncLLM(EngineClient): async def finish_weight_update(self) -> None: """Finish the current weight update.""" await self.collective_rpc("finish_weight_update") + # Invalidate cached state computed with the old weights so it isn't + # reused for subsequent requests: + # - prefix cache: KV blocks computed with the old weights + # - encoder cache: multimodal embeddings keyed only by mm_hash + await self.reset_prefix_cache() + await self.reset_encoder_cache()