Move lora request validation to tokenizer_manager from server (#18962)

Co-authored-by: Satyam Kumar <satyamk@linkedin.com>
This commit is contained in:
satyamk7054
2026-02-19 05:03:19 -08:00
committed by GitHub
parent d07e8aa4a3
commit 963def7f26
7 changed files with 40 additions and 114 deletions

View File

@@ -70,19 +70,6 @@ class OpenAIServingBase(ABC):
# Fall back to explicit lora_path
return explicit_lora_path
def _validate_lora_enabled(self, adapter_name: str) -> None:
"""Check that LoRA is enabled before attempting to use an adapter.
Raises ValueError with actionable guidance if --enable-lora flag is missing.
Adapter existence is validated later by TokenizerManager.lora_registry.
"""
if not self.tokenizer_manager.server_args.enable_lora:
raise ValueError(
f"LoRA adapter '{adapter_name}' was requested, but LoRA is not enabled. "
"Please launch the server with --enable-lora flag and preload adapters "
"using --lora-paths or /load_lora_adapter endpoint."
)
async def handle_request(
self, request: OpenAIServingRequest, raw_request: Request
) -> Union[Any, StreamingResponse, ErrorResponse]:

View File

@@ -277,15 +277,6 @@ class OpenAIServingChat(OpenAIServingBase):
# Resolve LoRA adapter from model parameter or explicit lora_path
lora_path = self._resolve_lora_path(request.model, request.lora_path)
if lora_path:
first_adapter = (
lora_path
if isinstance(lora_path, str)
else next((a for a in lora_path if a), None)
)
if first_adapter:
self._validate_lora_enabled(first_adapter)
img_max_dynamic_patch, vid_max_dynamic_patch = _extract_max_dynamic_patch(
request
)

View File

@@ -98,14 +98,6 @@ class OpenAIServingCompletion(OpenAIServingBase):
# Resolve LoRA adapter from model parameter or explicit lora_path
lora_path = self._resolve_lora_path(request.model, request.lora_path)
if lora_path:
first_adapter = (
lora_path
if isinstance(lora_path, str)
else next((a for a in lora_path if a), None)
)
if first_adapter:
self._validate_lora_enabled(first_adapter)
adapted_request = GenerateReqInput(
**prompt_kwargs,

View File

@@ -128,14 +128,6 @@ class OpenAIServingEmbedding(OpenAIServingBase):
# Resolve LoRA adapter from model parameter or explicit lora_path
lora_path = self._resolve_lora_path(request.model, request.lora_path)
if lora_path:
first_adapter = (
lora_path
if isinstance(lora_path, str)
else next((a for a in lora_path if a), None)
)
if first_adapter:
self._validate_lora_enabled(first_adapter)
adapted_request = EmbeddingReqInput(
**prompt_kwargs,

View File

@@ -511,8 +511,7 @@ class TokenizerManager(TokenizerCommunicatorMixin, TokenizerManagerMultiItemMixi
await self.is_pause_cond.wait_for(lambda: not self.is_pause)
async with self.model_update_lock.reader_lock:
if self.server_args.enable_lora and obj.lora_path:
await self._resolve_lora_path(obj)
await self._validate_and_resolve_lora(obj)
# Tokenize the request and send it to the scheduler
if obj.is_single:
@@ -2213,6 +2212,27 @@ class TokenizerManager(TokenizerCommunicatorMixin, TokenizerManagerMultiItemMixi
if len(self.model_update_tmp) == self.server_args.dp_size:
self.model_update_result.set_result(self.model_update_tmp)
async def _validate_and_resolve_lora(
self, obj: Union[GenerateReqInput, EmbeddingReqInput]
) -> None:
if not obj.lora_path:
return
if not self.server_args.enable_lora:
first_adapter = (
obj.lora_path
if isinstance(obj.lora_path, str)
else next((a for a in obj.lora_path if a), None)
)
raise ValueError(
f"LoRA adapter '{first_adapter}' was requested, but LoRA is not enabled. "
"Please launch the server with --enable-lora flag and preload adapters "
"using --lora-paths or /load_lora_adapter endpoint."
)
await self._resolve_lora_path(obj)
async def _resolve_lora_path(self, obj: Union[GenerateReqInput, EmbeddingReqInput]):
if isinstance(obj.lora_path, str):
unique_lora_paths = set([obj.lora_path])