Move lora request validation to tokenizer_manager from server (#18962)
Co-authored-by: Satyam Kumar <satyamk@linkedin.com>
This commit is contained in:
@@ -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]:
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user