@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 1d0c0d209c
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 7, 02:45 UTC

[Misc] Lazy import registered processors (#36024)

Signed-off-by: Isotr0py <mozf@mail2.sysu.edu.cn> Co-authored-by: Roger Wang <hey@rogerw.io>

Isotr0py committed Mar 6, 2026 at 22:06 UTC 1d0c0d209c3de3be2d54cd70c2618472a2fe4929
15 files changed +68 -51
tests/models/registry.py
+2 -5
@@ -1020,18 +1020,15 @@ _MULTIMODAL_EXAMPLE_MODELS = {
1020 min_transformers_version="4.57",
1021 ),
1022 "Qwen3ASRForConditionalGeneration": _HfExamplesInfo(
1023 - "Qwen/Qwen3-ASR-1.7B",
1023 + "Qwen/Qwen3-ASR-0.6B",
1024 max_model_len=4096,
1025 min_transformers_version="4.57",
1026 - is_available_online=False,
1026 ),
1027 "Qwen3ASRRealtimeGeneration": _HfExamplesInfo(
1029 - "Qwen/Qwen3-ASR-1.7B",
1028 + "Qwen/Qwen3-ASR-0.6B",
1029 max_model_len=4096,
1030 min_transformers_version="4.57",
1032 - enforce_eager=True,
1031 hf_overrides={"architectures": ["Qwen3ASRRealtimeGeneration"]},
1034 - is_available_online=False,
1032 ),
1033 "RForConditionalGeneration": _HfExamplesInfo("YannQi/R-4B", trust_remote_code=True),
1034 "SkyworkR1VChatModel": _HfExamplesInfo(
vllm/model_executor/models/deepseek_vl2.py
+1 -2
@@ -48,7 +48,6 @@ from vllm.transformers_utils.configs.deepseek_vl2 import (
48 MlpProjectorConfig,
49 VisionEncoderConfig,
50 )
51 -from vllm.transformers_utils.processors.deepseek_vl2 import DeepseekVLV2Processor
51 from vllm.utils.tensor_schema import TensorSchema, TensorShape
52 from vllm.utils.torch_utils import set_default_torch_dtype
53
@@ -160,7 +159,7 @@ class DeepseekVL2ProcessingInfo(BaseProcessingInfo):
159 return self.ctx.get_hf_config(DeepseekVLV2Config)
160
161 def get_hf_processor(self, **kwargs: object):
163 - return self.ctx.get_hf_processor(DeepseekVLV2Processor, **kwargs)
162 + return self.ctx.get_hf_processor(**kwargs)
163
164 def get_supported_mm_limits(self) -> Mapping[str, int | None]:
165 return {"image": None}
vllm/model_executor/models/fireredasr2.py
+1 -1
@@ -41,7 +41,7 @@ from vllm.multimodal.processing import (
41 PromptUpdateDetails,
42 )
43 from vllm.transformers_utils.processor import cached_processor_from_config
44 -from vllm.transformers_utils.processors.fireredasr2_processor import (
44 +from vllm.transformers_utils.processors.fireredasr2 import (
45 FireRedASR2FeatureExtractor,
46 )
47 from vllm.utils.tensor_schema import TensorSchema, TensorShape
vllm/model_executor/models/funasr.py
+1 -1
@@ -50,7 +50,7 @@ from vllm.multimodal.processing import (
50 PromptUpdate,
51 )
52 from vllm.transformers_utils.processor import cached_processor_from_config
53 -from vllm.transformers_utils.processors.funasr_processor import FunASRFeatureExtractor
53 +from vllm.transformers_utils.processors.funasr import FunASRFeatureExtractor
54 from vllm.utils.tensor_schema import TensorSchema, TensorShape
55
56 from .interfaces import (
vllm/transformers_utils/processor.py
+31 -1
@@ -20,7 +20,9 @@ from transformers.video_processing_utils import BaseVideoProcessor
20 from typing_extensions import TypeVar
21
22 from vllm.logger import init_logger
23 +from vllm.transformers_utils import processors
24 from vllm.transformers_utils.gguf_utils import is_gguf
25 +from vllm.transformers_utils.repo_utils import get_hf_file_to_dict
26 from vllm.transformers_utils.utils import convert_model_repo_to_path
27 from vllm.utils.func_utils import get_allowed_kwarg_only_overrides
28
@@ -139,6 +141,22 @@ def _merge_mm_kwargs(
141 return allowed_kwargs
142
143
144 +def get_processor_cls_name_from_config(
145 + processor_name: str,
146 + revision: str | None = "main",
147 +) -> str | None:
148 + config_file = [
149 + "processor_config.json",
150 + "preprocessor_config.json",
151 + "tokenizer_config.json",
152 + ]
153 + for file in config_file:
154 + config = get_hf_file_to_dict(file, processor_name, revision=revision)
155 + if config and "processor_class" in config:
156 + return config["processor_class"]
157 + return None
158 +
159 +
160 def get_processor(
161 processor_name: str,
162 *args: Any,
@@ -152,8 +170,20 @@ def get_processor(
170 revision = "main"
171 try:
172 processor_name = convert_model_repo_to_path(processor_name)
173 + registered_cls_name = get_processor_cls_name_from_config(
174 + processor_name, revision=revision
175 + )
176 + registered_processor_cls = (
177 + getattr(processors, registered_cls_name, None)
178 + if registered_cls_name
179 + else None
180 + )
181 + registered_processor_cls = cast(type[_P] | None, registered_processor_cls)
182 + # Use registered processor class when it's available
183 + # and explicit processor_cls is not set.
184 if isinstance(processor_cls, tuple) or processor_cls == ProcessorMixin:
156 - processor = AutoProcessor.from_pretrained(
185 + _processor_cls = registered_processor_cls or AutoProcessor
186 + processor = _processor_cls.from_pretrained(
187 processor_name,
188 *args,
189 revision=revision,
vllm/transformers_utils/processors/__init__.py
+28 -10
@@ -8,16 +8,20 @@ reasons:
8 - There is a need to override the existing processor to support vLLM.
9 """
10
11 -from vllm.transformers_utils.processors.bagel import BagelProcessor
12 -from vllm.transformers_utils.processors.deepseek_vl2 import DeepseekVLV2Processor
13 -from vllm.transformers_utils.processors.fireredasr2_processor import (
14 - FireRedASR2Processor,
15 -)
16 -from vllm.transformers_utils.processors.funasr_processor import FunASRProcessor
17 -from vllm.transformers_utils.processors.hunyuan_vl import HunYuanVLProcessor
18 -from vllm.transformers_utils.processors.hunyuan_vl_image import HunYuanVLImageProcessor
19 -from vllm.transformers_utils.processors.ovis import OvisProcessor
20 -from vllm.transformers_utils.processors.ovis2_5 import Ovis2_5Processor
11 +import importlib
12 +
13 +_CLASS_TO_MODULE: dict[str, str] = {
14 + "BagelProcessor": "vllm.transformers_utils.processors.bagel",
15 + "DeepseekVLV2Processor": "vllm.transformers_utils.processors.deepseek_vl2",
16 + "FireRedASR2Processor": "vllm.transformers_utils.processors.fireredasr2",
17 + "FunASRProcessor": "vllm.transformers_utils.processors.funasr",
18 + "HunYuanVLProcessor": "vllm.transformers_utils.processors.hunyuan_vl",
19 + "HunYuanVLImageProcessor": "vllm.transformers_utils.processors.hunyuan_vl_image",
20 + "OvisProcessor": "vllm.transformers_utils.processors.ovis",
21 + "Ovis2_5Processor": "vllm.transformers_utils.processors.ovis2_5",
22 + "Qwen3ASRProcessor": "vllm.transformers_utils.processors.qwen3_asr",
23 +}
24 +
25
26 __all__ = [
27 "BagelProcessor",
@@ -28,4 +32,18 @@ __all__ = [
32 "HunYuanVLImageProcessor",
33 "OvisProcessor",
34 "Ovis2_5Processor",
35 + "Qwen3ASRProcessor",
36 ]
37 +
38 +
39 +def __getattr__(name: str):
40 + if name in _CLASS_TO_MODULE:
41 + module_name = _CLASS_TO_MODULE[name]
42 + module = importlib.import_module(module_name)
43 + return getattr(module, name)
44 +
45 + raise AttributeError(f"module 'processors' has no attribute '{name}'")
46 +
47 +
48 +def __dir__():
49 + return sorted(list(__all__))
vllm/transformers_utils/processors/bagel.py
-4
@@ -3,7 +3,6 @@
3 # Copyright 2025 Bytedance Ltd. and/or its affiliates.
4 """BAGEL processor for image and text inputs."""
5
6 -from transformers import AutoProcessor
6 from transformers.feature_extraction_utils import BatchFeature
7 from transformers.image_utils import ImageInput
8 from transformers.processing_utils import ProcessingKwargs, ProcessorMixin, Unpack
@@ -79,6 +78,3 @@ class BagelProcessor(ProcessorMixin):
78 tokenizer_input_names = self.tokenizer.model_input_names
79 image_processor_input_names = self.image_processor.model_input_names
80 return list(dict.fromkeys(tokenizer_input_names + image_processor_input_names))
82 -
83 -
84 -AutoProcessor.register("BagelProcessor", BagelProcessor)
vllm/transformers_utils/processors/deepseek_ocr.py
+1 -4
@@ -8,7 +8,7 @@ from typing import Literal
8 import torch
9 import torchvision.transforms as T
10 from PIL import Image, ImageOps
11 -from transformers import AutoProcessor, BatchFeature, LlamaTokenizerFast
11 +from transformers import BatchFeature, LlamaTokenizerFast
12 from transformers.processing_utils import ProcessorMixin
13
14 # TODO(Isotr0py): change modes for variants
@@ -453,6 +453,3 @@ class DeepseekOCRProcessor(ProcessorMixin):
453 num_image_tokens,
454 image_shapes,
455 )
456 -
457 -
458 -AutoProcessor.register("DeepseekOCRProcessor", DeepseekOCRProcessor)
vllm/transformers_utils/processors/deepseek_vl2.py
+1 -4
@@ -29,7 +29,7 @@ from typing import Any
29 import torch
30 import torchvision.transforms as T
31 from PIL import Image, ImageOps
32 -from transformers import AutoProcessor, BatchFeature, LlamaTokenizerFast
32 +from transformers import BatchFeature, LlamaTokenizerFast
33 from transformers.processing_utils import ProcessorMixin
34
35
@@ -401,6 +401,3 @@ class DeepseekVLV2Processor(ProcessorMixin):
401 images_spatial_crop,
402 num_image_tokens,
403 )
404 -
405 -
406 -AutoProcessor.register("DeepseekVLV2Processor", DeepseekVLV2Processor)
vllm/transformers_utils/processors/fireredasr2.py renamed
-2
@@ -8,7 +8,6 @@ import torch
8 import torch.nn.functional as F
9 from transformers import (
10 AutoFeatureExtractor,
11 - AutoProcessor,
11 BatchFeature,
12 )
13 from transformers.feature_extraction_sequence_utils import SequenceFeatureExtractor
@@ -345,4 +344,3 @@ class FireRedASR2Processor(ProcessorMixin):
344 AutoFeatureExtractor.register(
345 "FireRedASR2FeatureExtractor", FireRedASR2FeatureExtractor
346 )
348 -AutoProcessor.register("FireRedASR2Processor", FireRedASR2Processor)
vllm/transformers_utils/processors/funasr.py renamed
-2
@@ -9,7 +9,6 @@ import torchaudio.compliance.kaldi as kaldi
9 from torch.nn.utils.rnn import pad_sequence
10 from transformers import (
11 AutoFeatureExtractor,
12 - AutoProcessor,
12 BatchFeature,
13 )
14 from transformers.feature_extraction_sequence_utils import SequenceFeatureExtractor
@@ -503,4 +502,3 @@ class FunASRProcessor(ProcessorMixin):
502
503
504 AutoFeatureExtractor.register("FunASRFeatureExtractor", FunASRFeatureExtractor)
506 -AutoProcessor.register("FunASRProcessor", FunASRProcessor)
vllm/transformers_utils/processors/hunyuan_vl.py
-4
@@ -5,7 +5,6 @@
5
6 import numpy as np
7 import torch
8 -from transformers import AutoProcessor
8 from transformers.feature_extraction_utils import BatchFeature
9 from transformers.image_utils import ImageInput
10 from transformers.processing_utils import ProcessorMixin
@@ -225,6 +224,3 @@ def split_image_into_patch_blocks(
224 patches = img.reshape(-1, 3, patch_size, patch_size)
225
226 return patches
228 -
229 -
230 -AutoProcessor.register("HunYuanVLProcessor", HunYuanVLProcessor)
vllm/transformers_utils/processors/ovis.py
+1 -4
@@ -26,7 +26,7 @@ from functools import cached_property
26
27 import PIL
28 import torch
29 -from transformers import AutoProcessor, BatchFeature
29 +from transformers import BatchFeature
30 from transformers.image_utils import ImageInput
31 from transformers.processing_utils import ProcessingKwargs, ProcessorMixin, Unpack
32 from transformers.tokenization_utils_base import PreTokenizedInput, TextInput
@@ -453,6 +453,3 @@ class OvisProcessor(ProcessorMixin):
453 dict.fromkeys(tokenizer_input_names + image_processor_input_names)
454 )
455 return names_from_processor + ["second_per_grid_ts"]
456 -
457 -
458 -AutoProcessor.register("OvisProcessor", OvisProcessor)
vllm/transformers_utils/processors/ovis2_5.py
+1 -4
@@ -6,7 +6,7 @@ from functools import cached_property
6 import numpy as np
7 import PIL
8 import torch
9 -from transformers import AutoProcessor, BatchFeature
9 +from transformers import BatchFeature
10 from transformers.image_utils import ImageInput
11 from transformers.processing_utils import ProcessingKwargs, ProcessorMixin, Unpack
12 from transformers.tokenization_utils_base import PreTokenizedInput, TextInput
@@ -476,6 +476,3 @@ class Ovis2_5Processor(ProcessorMixin):
476 visual_placeholders,
477 torch.tensor([[grid_t, grid_h, grid_w]]),
478 )
479 -
480 -
481 -AutoProcessor.register("Ovis2_5Processor", Ovis2_5Processor)
vllm/transformers_utils/processors/qwen3_asr.py
-3
@@ -227,6 +227,3 @@ class Qwen3ASRProcessor(ProcessorMixin):
227 + ["feature_attention_mask"]
228 )
229 )
230 -
231 -
232 -AutoProcessor.register("Qwen3ASRProcessor", Qwen3ASRProcessor)