Signed-off-by: bk-201 <joy25810@foxmail.com>
This commit is contained in:
bk-201 2025-12-04 16:57:49 +00:00
parent c0cc07e7ee
commit 598052b04e
5 changed files with 29 additions and 31 deletions

View File

@ -11,6 +11,7 @@ import safetensors.torch
import torch import torch
from torch import nn from torch import nn
from vllm.config import VllmConfig
from vllm.config.lora import LoRAConfig, ModelConfig from vllm.config.lora import LoRAConfig, ModelConfig
from vllm.logger import init_logger from vllm.logger import init_logger
from vllm.lora.layers import ( from vllm.lora.layers import (
@ -42,6 +43,7 @@ from vllm.model_executor.utils import get_packed_modules_mapping
from vllm.multimodal import MULTIMODAL_REGISTRY from vllm.multimodal import MULTIMODAL_REGISTRY
from vllm.utils.cache import LRUCache from vllm.utils.cache import LRUCache
from vllm.utils.platform_utils import is_pin_memory_available from vllm.utils.platform_utils import is_pin_memory_available
from vllm.v1.worker.utils import MultiModalBudget
logger = init_logger(__name__) logger = init_logger(__name__)
@ -302,7 +304,7 @@ class LoRAModelManager:
max_num_batched_tokens: int, max_num_batched_tokens: int,
vocab_size: int, vocab_size: int,
lora_config: LoRAConfig, lora_config: LoRAConfig,
model_config: ModelConfig | None, vllm_config: VllmConfig,
device: torch.device, device: torch.device,
): ):
"""Create a LoRAModelManager and adapter for a given model. """Create a LoRAModelManager and adapter for a given model.
@ -340,7 +342,7 @@ class LoRAModelManager:
f" {self.model.__class__.__name__}." f" {self.model.__class__.__name__}."
self.packed_modules_mapping = get_packed_modules_mapping(self.model) self.packed_modules_mapping = get_packed_modules_mapping(self.model)
self._init_multimodal_config(model_config) self._init_multimodal_config(vllm_config)
self.is_pooling_model = is_pooling_model(self.model) self.is_pooling_model = is_pooling_model(self.model)
self.packed_modules: dict[str, list[str]] = {} self.packed_modules: dict[str, list[str]] = {}
self.modules: dict[str, BaseLayerWithLoRA] = {} self.modules: dict[str, BaseLayerWithLoRA] = {}
@ -351,7 +353,7 @@ class LoRAModelManager:
self.model.lora_manager = self self.model.lora_manager = self
def _init_multimodal_config(self, model_config): def _init_multimodal_config(self, vllm_config: VllmConfig):
# Used to indicate whether the model is a multimodal model # Used to indicate whether the model is a multimodal model
self.supports_mm: bool = ( self.supports_mm: bool = (
supports_multimodal(self.model) supports_multimodal(self.model)
@ -359,25 +361,27 @@ class LoRAModelManager:
# text modules (e.g. ChatGLM) # text modules (e.g. ChatGLM)
and hasattr(self.model, "get_mm_mapping") and hasattr(self.model, "get_mm_mapping")
) )
# For v0 compatibility
self.supports_mm_lora = False model_config: ModelConfig = vllm_config.model_config
if model_config is not None: self.info = MULTIMODAL_REGISTRY.create_processor(model_config).info
self.mm_registry = MULTIMODAL_REGISTRY self.supports_mm_lora = self.supports_mm and hasattr(
self.info = self.mm_registry.create_processor(model_config).info self.info, "get_num_mm_encoder_tokens"
self.supports_mm_lora = self.supports_mm and hasattr( )
self.info, "get_num_mm_encoder_tokens"
)
if not self.supports_mm_lora: if not self.supports_mm_lora:
return return
mm_budget = MultiModalBudget(
model_config,
vllm_config.scheduler_config,
MULTIMODAL_REGISTRY,
)
self.mm_mapping: MultiModelKeys = self.model.get_mm_mapping() self.mm_mapping: MultiModelKeys = self.model.get_mm_mapping()
self.mm_config = model_config.multimodal_config
limit_per_prompt: int = max(self.info.get_allowed_mm_limits().values()) limit_per_prompt: int = max(self.info.get_allowed_mm_limits().values())
# For vision tower # For vision tower
num_encoder_tokens = self.info.get_num_mm_encoder_tokens( num_encoder_tokens = self.info.get_num_mm_encoder_tokens(
self.max_num_batched_tokens mm_budget.get_encoder_budget()
) )
self.mm_punica_wrapper_mapping = { self.mm_punica_wrapper_mapping = {
name: get_punica_wrapper( name: get_punica_wrapper(
@ -911,7 +915,7 @@ class LRUCacheLoRAModelManager(LoRAModelManager):
max_num_batched_tokens: int, max_num_batched_tokens: int,
vocab_size: int, vocab_size: int,
lora_config: LoRAConfig, lora_config: LoRAConfig,
model_config: ModelConfig, vllm_config: VllmConfig,
device: torch.device, device: torch.device,
): ):
super().__init__( super().__init__(
@ -920,7 +924,7 @@ class LRUCacheLoRAModelManager(LoRAModelManager):
max_num_batched_tokens, max_num_batched_tokens,
vocab_size, vocab_size,
lora_config, lora_config,
model_config, vllm_config,
device, device,
) )
self._registered_adapters: LoRALRUCache = LoRALRUCache( self._registered_adapters: LoRALRUCache = LoRALRUCache(
@ -994,7 +998,7 @@ def create_lora_manager(
max_num_batched_tokens: int, max_num_batched_tokens: int,
vocab_size: int, vocab_size: int,
lora_config: LoRAConfig, lora_config: LoRAConfig,
model_config: ModelConfig, vllm_config: VllmConfig,
device: torch.device, device: torch.device,
lora_manager_cls: type[LoRAModelManager] = LoRAModelManager, lora_manager_cls: type[LoRAModelManager] = LoRAModelManager,
**kwargs, **kwargs,
@ -1008,7 +1012,7 @@ def create_lora_manager(
max_num_batched_tokens=max_num_batched_tokens, max_num_batched_tokens=max_num_batched_tokens,
vocab_size=vocab_size, vocab_size=vocab_size,
lora_config=lora_config, lora_config=lora_config,
model_config=model_config, vllm_config=vllm_config,
device=device, device=device,
**kwargs, **kwargs,
) )

View File

@ -6,7 +6,7 @@ from typing import Any, Literal
import torch import torch
from vllm.config import ModelConfig, VllmConfig from vllm.config import VllmConfig
from vllm.logger import init_logger from vllm.logger import init_logger
from vllm.lora.models import ( from vllm.lora.models import (
LoRAModel, LoRAModel,
@ -69,7 +69,7 @@ class WorkerLoRAManager:
def create_lora_manager( def create_lora_manager(
self, self,
model: torch.nn.Module, model: torch.nn.Module,
model_config: ModelConfig | None = None, vllm_config: VllmConfig,
) -> Any: ) -> Any:
lora_manager = create_lora_manager( lora_manager = create_lora_manager(
model, model,
@ -79,7 +79,7 @@ class WorkerLoRAManager:
lora_config=self.lora_config, lora_config=self.lora_config,
device=self.device, device=self.device,
lora_manager_cls=self._manager_cls, lora_manager_cls=self._manager_cls,
model_config=model_config, vllm_config=vllm_config,
) )
self._adapter_manager = lora_manager self._adapter_manager = lora_manager
return lora_manager.model return lora_manager.model
@ -212,7 +212,7 @@ class LRUCacheWorkerLoRAManager(WorkerLoRAManager):
def create_lora_manager( def create_lora_manager(
self, self,
model: torch.nn.Module, model: torch.nn.Module,
model_config: ModelConfig | None = None, vllm_config: VllmConfig,
) -> Any: ) -> Any:
lora_manager = create_lora_manager( lora_manager = create_lora_manager(
model, model,
@ -222,7 +222,7 @@ class LRUCacheWorkerLoRAManager(WorkerLoRAManager):
lora_config=self.lora_config, lora_config=self.lora_config,
device=self.device, device=self.device,
max_num_batched_tokens=self.max_num_batched_tokens, max_num_batched_tokens=self.max_num_batched_tokens,
model_config=model_config, vllm_config=vllm_config,
) )
self._adapter_manager = lora_manager self._adapter_manager = lora_manager
return lora_manager.model return lora_manager.model

View File

@ -1,6 +1,5 @@
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
import copy
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from collections.abc import Mapping from collections.abc import Mapping
from dataclasses import dataclass, field from dataclasses import dataclass, field
@ -59,7 +58,6 @@ class DummyDecoderData(NamedTuple):
prompt_token_ids: list[int] prompt_token_ids: list[int]
multi_modal_data: MultiModalKwargsItems multi_modal_data: MultiModalKwargsItems
multi_modal_placeholders: MultiModalPlaceholderDict multi_modal_placeholders: MultiModalPlaceholderDict
multi_modal_token_ids: list[int]
_I = TypeVar("_I", bound=BaseProcessingInfo) _I = TypeVar("_I", bound=BaseProcessingInfo)
@ -324,13 +322,10 @@ class MultiModalProfiler(Generic[_I]):
if total_len < seq_len: if total_len < seq_len:
prompt_token_ids.extend([0] * (seq_len - total_len)) prompt_token_ids.extend([0] * (seq_len - total_len))
multi_modal_token_ids = copy.deepcopy(prompt_token_ids)
return DummyDecoderData( return DummyDecoderData(
prompt_token_ids=prompt_token_ids, prompt_token_ids=prompt_token_ids,
multi_modal_data=mm_inputs["mm_kwargs"].require_data(), multi_modal_data=mm_inputs["mm_kwargs"].require_data(),
multi_modal_placeholders=mm_inputs["mm_placeholders"], multi_modal_placeholders=mm_inputs["mm_placeholders"],
multi_modal_token_ids=multi_modal_token_ids,
) )
def _get_mm_max_tokens( def _get_mm_max_tokens(

View File

@ -3620,7 +3620,7 @@ class GPUModelRunner(
) )
if self.lora_config: if self.lora_config:
self.model = self.load_lora_model( self.model = self.load_lora_model(
self.model, self.vllm_config, self.device, self.model_config self.model, self.vllm_config, self.device
) )
if hasattr(self, "drafter"): if hasattr(self, "drafter"):
logger.info_once("Loading drafter model...") logger.info_once("Loading drafter model...")

View File

@ -11,7 +11,7 @@ import numpy as np
import torch import torch
import torch.nn as nn import torch.nn as nn
from vllm.config import ModelConfig, VllmConfig from vllm.config import VllmConfig
from vllm.config.lora import LoRAConfig from vllm.config.lora import LoRAConfig
from vllm.logger import init_logger from vllm.logger import init_logger
from vllm.lora.layers import LoRAMapping, LoRAMappingType from vllm.lora.layers import LoRAMapping, LoRAMappingType
@ -33,7 +33,6 @@ class LoRAModelRunnerMixin:
model: nn.Module, model: nn.Module,
vllm_config: VllmConfig, vllm_config: VllmConfig,
device: torch.device, device: torch.device,
model_config: ModelConfig | None = None,
) -> nn.Module: ) -> nn.Module:
if not supports_lora(model): if not supports_lora(model):
raise ValueError(f"{model.__class__.__name__} does not support LoRA yet.") raise ValueError(f"{model.__class__.__name__} does not support LoRA yet.")
@ -44,7 +43,7 @@ class LoRAModelRunnerMixin:
device, device,
model.embedding_modules, model.embedding_modules,
) )
return self.lora_manager.create_lora_manager(model, model_config) return self.lora_manager.create_lora_manager(model, vllm_config)
def _set_active_loras( def _set_active_loras(
self, self,