From b867bacd24dd42f5f60c8730d64cad365ef3972a Mon Sep 17 00:00:00 2001 From: tzhouam Date: Mon, 16 Feb 2026 03:21:21 +0000 Subject: [PATCH] rebase 2025/02/16 Qwen3 Omni offline/online passed Signed-off-by: tzhouam --- docker/Dockerfile.ci | 4 ++-- vllm_omni/config/model.py | 2 ++ vllm_omni/engine/arg_utils.py | 6 ++++-- vllm_omni/engine/input_processor.py | 12 +++++------- vllm_omni/entrypoints/async_omni_llm.py | 12 ++++-------- vllm_omni/entrypoints/omni_llm.py | 3 +++ vllm_omni/entrypoints/omni_stage.py | 18 +++++++----------- vllm_omni/entrypoints/openai/serving_chat.py | 2 +- vllm_omni/request.py | 1 - 9 files changed, 28 insertions(+), 32 deletions(-) diff --git a/docker/Dockerfile.ci b/docker/Dockerfile.ci index 560661761..9560a0dc8 100644 --- a/docker/Dockerfile.ci +++ b/docker/Dockerfile.ci @@ -14,11 +14,11 @@ RUN apt-get update && \ # Install vLLM wheel for the specific commit # URL format: https://wheels.vllm.ai// -# Current vLLM wheel commit: 2d5be1dd5ce2e44dfea53ea03ff61143da5137eb +# Current vLLM wheel commit: d5fe3f702c2f4392515cdfde6fd0442271c74dda # Note: --prerelease=allow is required because nightly/commit wheels use # pre-release version numbers (e.g. 2.10.0.dev...) which uv ignores by default, # causing it to fall back to the older stable release from PyPI. -RUN uv pip install --system --upgrade --force-reinstall --prerelease=allow vllm --extra-index-url https://wheels.vllm.ai/2d5be1dd5ce2e44dfea53ea03ff61143da5137eb +RUN uv pip install --system --upgrade --force-reinstall --prerelease=allow vllm --extra-index-url https://wheels.vllm.ai/d5fe3f702c2f4392515cdfde6fd0442271c74dda RUN uv pip uninstall --system nvidia-cublas-cu12 diff --git a/vllm_omni/config/model.py b/vllm_omni/config/model.py index a9ffa015f..80dcaf7b6 100644 --- a/vllm_omni/config/model.py +++ b/vllm_omni/config/model.py @@ -97,6 +97,7 @@ class OmniModelConfig(ModelConfig): def __post_init__( self, # Multimodal config init vars + language_model_only: bool, limit_mm_per_prompt: dict[str, int | dict[str, int]] | None, enable_mm_embeds: bool | None, media_io_kwargs: dict[str, dict[str, Any]] | None, @@ -113,6 +114,7 @@ class OmniModelConfig(ModelConfig): ) -> None: # Call parent's __post_init__ to handle all standard ModelConfig initialization super().__post_init__( + language_model_only=language_model_only, limit_mm_per_prompt=limit_mm_per_prompt, enable_mm_embeds=enable_mm_embeds, media_io_kwargs=media_io_kwargs, diff --git a/vllm_omni/engine/arg_utils.py b/vllm_omni/engine/arg_utils.py index 6f14aa264..e005b8f2f 100644 --- a/vllm_omni/engine/arg_utils.py +++ b/vllm_omni/engine/arg_utils.py @@ -110,6 +110,7 @@ class OmniEngineArgs(EngineArgs): # Keep compatibility when async args are constructed from partial payloads. limit_mm_per_prompt = getattr(self, "limit_mm_per_prompt", {}) + language_model_only = getattr(self, "language_model_only", False) enable_mm_embeds = getattr(self, "enable_mm_embeds", False) interleave_mm_strings = getattr(self, "interleave_mm_strings", False) media_io_kwargs = getattr(self, "media_io_kwargs", {}) @@ -163,6 +164,7 @@ class OmniEngineArgs(EngineArgs): skip_tokenizer_init=self.skip_tokenizer_init, enable_prompt_embeds=self.enable_prompt_embeds, served_model_name=self.served_model_name, + language_model_only=language_model_only, limit_mm_per_prompt=limit_mm_per_prompt, enable_mm_embeds=enable_mm_embeds, interleave_mm_strings=interleave_mm_strings, @@ -177,7 +179,6 @@ class OmniEngineArgs(EngineArgs): mm_encoder_tp_mode=mm_encoder_tp_mode, mm_encoder_attn_backend=mm_encoder_attn_backend, pooler_config=self.pooler_config, - logits_processor_pattern=self.logits_processor_pattern, generation_config=self.generation_config, override_generation_config=self.override_generation_config, enable_sleep_mode=self.enable_sleep_mode, @@ -266,6 +267,7 @@ class AsyncOmniEngineArgs(AsyncEngineArgs): # Keep compatibility when async args are constructed from partial payloads. limit_mm_per_prompt = getattr(self, "limit_mm_per_prompt", {}) + language_model_only = getattr(self, "language_model_only", False) enable_mm_embeds = getattr(self, "enable_mm_embeds", False) interleave_mm_strings = getattr(self, "interleave_mm_strings", False) media_io_kwargs = getattr(self, "media_io_kwargs", {}) @@ -319,6 +321,7 @@ class AsyncOmniEngineArgs(AsyncEngineArgs): skip_tokenizer_init=self.skip_tokenizer_init, enable_prompt_embeds=self.enable_prompt_embeds, served_model_name=self.served_model_name, + language_model_only=language_model_only, limit_mm_per_prompt=limit_mm_per_prompt, enable_mm_embeds=enable_mm_embeds, interleave_mm_strings=interleave_mm_strings, @@ -333,7 +336,6 @@ class AsyncOmniEngineArgs(AsyncEngineArgs): mm_encoder_tp_mode=mm_encoder_tp_mode, mm_encoder_attn_backend=mm_encoder_attn_backend, pooler_config=self.pooler_config, - logits_processor_pattern=self.logits_processor_pattern, generation_config=self.generation_config, override_generation_config=self.override_generation_config, enable_sleep_mode=self.enable_sleep_mode, diff --git a/vllm_omni/engine/input_processor.py b/vllm_omni/engine/input_processor.py index 99dc71cc4..29c74e2a9 100644 --- a/vllm_omni/engine/input_processor.py +++ b/vllm_omni/engine/input_processor.py @@ -90,12 +90,11 @@ class OmniInputProcessor(InputProcessor): vllm_config: VllmConfig, mm_registry: MultiModalRegistry = MULTIMODAL_REGISTRY, ): - super().__init__(vllm_config, mm_registry) + super().__init__(vllm_config, mm_registry=mm_registry) self.input_preprocessor = OmniInputPreprocessor( - self.model_config, - vllm_config.observability_config, - mm_registry, - mm_processor_cache=self.mm_processor_cache, + vllm_config=vllm_config, + renderer=self.renderer, + mm_registry=mm_registry, ) def process_inputs( @@ -194,7 +193,7 @@ class OmniInputProcessor(InputProcessor): processed_inputs=processed_inputs, ) - eos_token_id = self.input_preprocessor.get_eos_token_id() + eos_token_id = self.renderer.get_eos_token_id() encoder_inputs, decoder_inputs = split_enc_dec_inputs(processed_inputs) self._validate_model_inputs(encoder_inputs, decoder_inputs) @@ -281,7 +280,6 @@ class OmniInputProcessor(InputProcessor): mm_features=mm_features, sampling_params=sampling_params, pooling_params=pooling_params, - eos_token_id=eos_token_id, arrival_time=arrival_time, lora_request=lora_request, cache_salt=decoder_inputs.get("cache_salt"), diff --git a/vllm_omni/entrypoints/async_omni_llm.py b/vllm_omni/entrypoints/async_omni_llm.py index 02d175ad0..d63e4f154 100644 --- a/vllm_omni/entrypoints/async_omni_llm.py +++ b/vllm_omni/entrypoints/async_omni_llm.py @@ -9,7 +9,7 @@ import torch from vllm.config import VllmConfig from vllm.logger import init_logger from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalRegistry -from vllm.tokenizers import cached_tokenizer_from_config +from vllm.renderers import renderer_from_config from vllm.tracing import init_tracer from vllm.transformers_utils.config import maybe_register_config_serialize_by_value from vllm.usage.usage_lib import UsageContext @@ -106,21 +106,17 @@ class AsyncOmniLLM(AsyncLLM): "enabling logging without default stat loggers" ) - if self.model_config.skip_tokenizer_init: - tokenizer = None - else: - # Tokenizer (+ ensure liveness if running in another process). - tokenizer = cached_tokenizer_from_config(model_config=vllm_config.model_config) - # InputProcessor (converts Inputs --> EngineCoreRequests). self.input_processor = OmniInputProcessor( vllm_config=vllm_config, mm_registry=mm_registry, ) + self.renderer = renderer_from_config(self.vllm_config) + # OutputProcessor (converts EngineCoreOutputs --> RequestOutput). self.output_processor = MultimodalOutputProcessor( - tokenizer=tokenizer, + tokenizer=self.renderer.tokenizer, log_stats=self.log_stats, engine_core_output_type=engine_args.engine_output_type, ) diff --git a/vllm_omni/entrypoints/omni_llm.py b/vllm_omni/entrypoints/omni_llm.py index 118a0ba7f..7b990e9d0 100644 --- a/vllm_omni/entrypoints/omni_llm.py +++ b/vllm_omni/entrypoints/omni_llm.py @@ -173,6 +173,9 @@ class OmniLLM(LLM): self.supported_tasks = supported_tasks + # Keep parity with vLLM's LLM initialization fields so inherited + # generate/chat preprocessing paths work as expected. + self.renderer = self.llm_engine.renderer # Load the Input/Output processor plugin if any io_processor_plugin = self.llm_engine.model_config.io_processor_plugin self.io_processor = get_io_processor(self.llm_engine.vllm_config, io_processor_plugin) diff --git a/vllm_omni/entrypoints/omni_stage.py b/vllm_omni/entrypoints/omni_stage.py index 6c9723b6b..bf6bf0e6c 100644 --- a/vllm_omni/entrypoints/omni_stage.py +++ b/vllm_omni/entrypoints/omni_stage.py @@ -67,20 +67,16 @@ def _sequential_init_lock(engine_args: dict[str, Any], stage_init_timeout: int = """ from vllm_omni.worker.gpu_memory_utils import is_process_scoped_memory_available - nvml_available = is_process_scoped_memory_available() - pid_host = detect_pid_host() - - if nvml_available and pid_host: - logger.info( + if is_process_scoped_memory_available() and detect_pid_host(): + logger.debug( "NVML process-scoped memory available and PID host is available — concurrent init is safe, skipping locks" ) yield return else: - logger.info( - "Using sequential init locks (nvml_available=%s, pid_host=%s)", - nvml_available, - pid_host, + logger.debug( + "NVML unavailable or PID host is not available (usually inside a container, " + "--pid=host is not set in docker run command) — using sequential init locks" ) from vllm_omni.platforms import current_omni_platform @@ -205,7 +201,7 @@ def _sequential_init_lock(engine_args: dict[str, Any], stage_init_timeout: int = def _resolve_worker_cls(engine_args: dict[str, Any]) -> None: - worker_type = engine_args.get("worker_type", None) + worker_type = engine_args.pop("worker_type", None) if not worker_type: return if engine_args.get("worker_cls"): @@ -1127,7 +1123,7 @@ async def _stage_worker_async( usage_context=usage_context, engine_args=omni_engine_args, disable_log_stats=bool( - engine_args.get("disable_log_stats", True) or getattr(omni_engine_args, "disable_log_stats", True) + engine_args.get("disable_log_stats", False) or getattr(omni_engine_args, "disable_log_stats", False) ), ) omni_stage.set_async_engine(stage_engine) diff --git a/vllm_omni/entrypoints/openai/serving_chat.py b/vllm_omni/entrypoints/openai/serving_chat.py index 4271d799e..b45b4069f 100644 --- a/vllm_omni/entrypoints/openai/serving_chat.py +++ b/vllm_omni/entrypoints/openai/serving_chat.py @@ -13,7 +13,7 @@ import torch from fastapi import Request from PIL import Image from pydantic import TypeAdapter -from vllm.renderers.protocol import BaseRenderer +from vllm.renderers import BaseRenderer from vllm_omni.entrypoints.async_omni import AsyncOmni from vllm_omni.entrypoints.openai.protocol.chat_completion import OmniChatCompletionResponse diff --git a/vllm_omni/request.py b/vllm_omni/request.py index a869fa23c..3ec325316 100644 --- a/vllm_omni/request.py +++ b/vllm_omni/request.py @@ -82,7 +82,6 @@ class OmniRequest(Request): mm_features=request.mm_features, sampling_params=request.sampling_params, pooling_params=request.pooling_params, - eos_token_id=request.eos_token_id, arrival_time=request.arrival_time, lora_request=request.lora_request, cache_salt=request.cache_salt,