rebase 2025/02/16

Qwen3 Omni offline/online passed

Signed-off-by: tzhouam <tzhouam@connect.ust.hk>
This commit is contained in:
tzhouam committed 2026-02-16 03:21:21 +00:00
1 parent 93eeb1a4c8
commit b867bacd24
9 files changed
+28 -32

No files matched your search

+2 -2
View File
@@ -14,11 +14,11 @@ RUN apt-get update && \
# Install vLLM wheel for the specific commit
# URL format: https://wheels.vllm.ai/<commit_hash>/
# 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
+2
View File
@@ -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,
+4 -2
View File
@@ -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,
+5 -7
View File
@@ -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"),
+4 -8
View File
@@ -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,
)
+3
View File
@@ -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)
+7 -11
View File
@@ -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)
+1 -1
View File
@@ -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
-1
View File
@@ -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,