Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8193787cc | ||
|
|
6d39fb25aa | ||
|
|
21f0986fd4 | ||
|
|
35a423c9bd |
No files matched your search
@@ -173,6 +173,9 @@ steps:
|
|||||||
- vllm_omni/model_executor/stage_input_processors/qwen3_tts.py
|
- vllm_omni/model_executor/stage_input_processors/qwen3_tts.py
|
||||||
- vllm_omni/deploy/qwen3_tts.yaml
|
- vllm_omni/deploy/qwen3_tts.yaml
|
||||||
commands:
|
commands:
|
||||||
|
# 40m (was 20m): post-rebase runs take 9-12 min warm, but cold-cache
|
||||||
|
# runs exceed 20m and were killed without failure output (a cold run
|
||||||
|
# died at 25.2m wall under the old limit).
|
||||||
- |
|
- |
|
||||||
timeout 40m bash -c "
|
timeout 40m bash -c "
|
||||||
export VLLM_LOGGING_LEVEL=DEBUG
|
export VLLM_LOGGING_LEVEL=DEBUG
|
||||||
@@ -200,6 +203,9 @@ steps:
|
|||||||
- vllm_omni/model_executor/stage_input_processors/qwen3_tts.py
|
- vllm_omni/model_executor/stage_input_processors/qwen3_tts.py
|
||||||
- vllm_omni/deploy/qwen3_tts.yaml
|
- vllm_omni/deploy/qwen3_tts.yaml
|
||||||
commands:
|
commands:
|
||||||
|
# 40m (was 20m): post-rebase runs take 9-13 min warm, but cold-cache
|
||||||
|
# runs exceed 20m and were killed without failure output (a cold run
|
||||||
|
# died at 25.2m wall under the old limit).
|
||||||
- |
|
- |
|
||||||
timeout 40m bash -c "
|
timeout 40m bash -c "
|
||||||
export VLLM_LOGGING_LEVEL=DEBUG
|
export VLLM_LOGGING_LEVEL=DEBUG
|
||||||
@@ -262,10 +268,13 @@ steps:
|
|||||||
- vllm_omni/entrypoints/openai/tts_adapters/indextts2.py
|
- vllm_omni/entrypoints/openai/tts_adapters/indextts2.py
|
||||||
- vllm_omni/config/pipeline_registry.py
|
- vllm_omni/config/pipeline_registry.py
|
||||||
- vllm_omni/model_executor/models/registry.py
|
- vllm_omni/model_executor/models/registry.py
|
||||||
timeout_in_minutes: 60
|
# 40m/35m (was 20m/20m): post-rebase runs take a steady ~12.5 min warm,
|
||||||
|
# but a cold run was killed at 20.7m under the old limit with no
|
||||||
|
# failure output; the rebase-time raise to 60m/45m was oversized.
|
||||||
|
timeout_in_minutes: 40
|
||||||
commands:
|
commands:
|
||||||
- |
|
- |
|
||||||
timeout 45m bash -c "
|
timeout 35m bash -c "
|
||||||
export VLLM_LOGGING_LEVEL=DEBUG
|
export VLLM_LOGGING_LEVEL=DEBUG
|
||||||
pytest -s -v tests/e2e/online_serving/test_indextts2.py tests/e2e/offline_inference/test_indextts2.py -m 'advanced_model and cuda' --run-level 'advanced_model'
|
pytest -s -v tests/e2e/online_serving/test_indextts2.py tests/e2e/offline_inference/test_indextts2.py -m 'advanced_model and cuda' --run-level 'advanced_model'
|
||||||
"
|
"
|
||||||
@@ -290,6 +299,8 @@ steps:
|
|||||||
- vllm_omni/model_executor/models/qwen3_omni/
|
- vllm_omni/model_executor/models/qwen3_omni/
|
||||||
- vllm_omni/model_executor/stage_input_processors/qwen3_omni.py
|
- vllm_omni/model_executor/stage_input_processors/qwen3_omni.py
|
||||||
- vllm_omni/deploy/qwen3_omni_moe.yaml
|
- vllm_omni/deploy/qwen3_omni_moe.yaml
|
||||||
|
# 50m (was 30m): post-rebase runs take 15-21 min warm; 30m left no
|
||||||
|
# headroom for cold-cache runs, which were killed without output.
|
||||||
timeout_in_minutes: 50
|
timeout_in_minutes: 50
|
||||||
commands:
|
commands:
|
||||||
- pytest -s -v tests/e2e/offline_inference/test_qwen3_omni.py tests/e2e/online_serving/test_qwen3_omni.py -m 'advanced_model and cuda' --run-level 'advanced_model'
|
- pytest -s -v tests/e2e/offline_inference/test_qwen3_omni.py tests/e2e/online_serving/test_qwen3_omni.py -m 'advanced_model and cuda' --run-level 'advanced_model'
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ steps:
|
|||||||
if: build.env("NIGHTLY") == "1" || build.pull_request.labels includes "nightly-test" || build.pull_request.labels includes "omni-test"
|
if: build.env("NIGHTLY") == "1" || build.pull_request.labels includes "nightly-test" || build.pull_request.labels includes "omni-test"
|
||||||
steps:
|
steps:
|
||||||
- label: ":full_moon: Omni · Function Test with H100"
|
- label: ":full_moon: Omni · Function Test with H100"
|
||||||
|
# 120m (was 90m): post-rebase nightlies (#2474/#2486) run 59-71 min —
|
||||||
|
# too close to the old 90m ceiling, which #2444 already hit (killed at
|
||||||
|
# 90.8m with no failure output).
|
||||||
timeout_in_minutes: 120
|
timeout_in_minutes: 120
|
||||||
commands:
|
commands:
|
||||||
- pytest -sv tests/e2e --run-level "full_model" -m "full_model and H100 and omni" --ignore=tests/e2e/accuracy --ignore=tests/e2e/online_serving/test_qwen3_omni_multi_replicas.py
|
- pytest -sv tests/e2e --run-level "full_model" -m "full_model and H100 and omni" --ignore=tests/e2e/accuracy --ignore=tests/e2e/online_serving/test_qwen3_omni_multi_replicas.py
|
||||||
@@ -153,7 +156,10 @@ steps:
|
|||||||
|
|
||||||
- label: ":full_moon: Omni · Perf Test · No Async Chunk"
|
- label: ":full_moon: Omni · Perf Test · No Async Chunk"
|
||||||
key: nightly-omni-performance-no-async-chunk
|
key: nightly-omni-performance-no-async-chunk
|
||||||
timeout_in_minutes: 300
|
# 180m: post-rebase nightlies (#2474/#2486) run 41-44 min; the
|
||||||
|
# rebase-time raise to 300m targeted a pre-rebase 179.4m outlier and
|
||||||
|
# is no longer needed.
|
||||||
|
timeout_in_minutes: 180
|
||||||
commands:
|
commands:
|
||||||
- export BENCHMARK_DIR=tests/dfx/perf/results
|
- export BENCHMARK_DIR=tests/dfx/perf/results
|
||||||
- |
|
- |
|
||||||
@@ -376,7 +382,10 @@ steps:
|
|||||||
if: build.env("NIGHTLY") == "1" || build.pull_request.labels includes "nightly-test" || build.pull_request.labels includes "tts-test"
|
if: build.env("NIGHTLY") == "1" || build.pull_request.labels includes "nightly-test" || build.pull_request.labels includes "tts-test"
|
||||||
steps:
|
steps:
|
||||||
- label: ":full_moon: TTS · Function Test with L4"
|
- label: ":full_moon: TTS · Function Test with L4"
|
||||||
timeout_in_minutes: 120
|
# 90m: post-rebase nightlies (#2474/#2486) run ~27 min; the rebase-time
|
||||||
|
# raise to 120m targeted pre-rebase 72-87 min runs and is no longer
|
||||||
|
# needed.
|
||||||
|
timeout_in_minutes: 90
|
||||||
commands:
|
commands:
|
||||||
- export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1"
|
- export VLLM_ALLOW_LONG_MAX_MODEL_LEN="1"
|
||||||
- export VLLM_USE_DEEP_GEMM="0"
|
- export VLLM_USE_DEEP_GEMM="0"
|
||||||
@@ -861,7 +870,10 @@ steps:
|
|||||||
|
|
||||||
|
|
||||||
- label: ":full_moon: Diffusion X2I(&A&T) · Function Test with L4"
|
- label: ":full_moon: Diffusion X2I(&A&T) · Function Test with L4"
|
||||||
timeout_in_minutes: 120
|
# 60m: post-rebase nightlies (#2474/#2486) run ~18 min; the rebase-time
|
||||||
|
# raise to 120m targeted pre-rebase 48-58 min runs and is no longer
|
||||||
|
# needed.
|
||||||
|
timeout_in_minutes: 60
|
||||||
commands:
|
commands:
|
||||||
- pytest -sv tests/e2e/ -k "not test_wan and not test_bagel_expansion and not hunyuan" -m "full_model and diffusion and L4" --run-level "full_model" --ignore=tests/e2e/accuracy
|
- pytest -sv tests/e2e/ -k "not test_wan and not test_bagel_expansion and not hunyuan" -m "full_model and diffusion and L4" --run-level "full_model" --ignore=tests/e2e/accuracy
|
||||||
agents:
|
agents:
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ def _make_minimal_talker(
|
|||||||
"""
|
"""
|
||||||
model = Qwen3TTSTalkerForConditionalGeneration.__new__(Qwen3TTSTalkerForConditionalGeneration)
|
model = Qwen3TTSTalkerForConditionalGeneration.__new__(Qwen3TTSTalkerForConditionalGeneration)
|
||||||
model.talker_config = SimpleNamespace(codec_pad_id=7, num_code_groups=16)
|
model.talker_config = SimpleNamespace(codec_pad_id=7, num_code_groups=16)
|
||||||
model._embedding_dtype = torch.bfloat16
|
|
||||||
if tts_pad_embed is None:
|
if tts_pad_embed is None:
|
||||||
tts_pad_embed = torch.zeros((1, 4), dtype=torch.bfloat16)
|
tts_pad_embed = torch.zeros((1, 4), dtype=torch.bfloat16)
|
||||||
model._tts_pad_embed = tts_pad_embed
|
model._tts_pad_embed = tts_pad_embed
|
||||||
@@ -42,7 +41,6 @@ def _make_minimal_talker(
|
|||||||
def _default_raise(**_kwargs):
|
def _default_raise(**_kwargs):
|
||||||
raise AssertionError("build_prompt_embeds was not stubbed in this test")
|
raise AssertionError("build_prompt_embeds was not stubbed in this test")
|
||||||
|
|
||||||
model._embedding_dtype = torch.bfloat16
|
|
||||||
model._prompt_builder = SimpleNamespace(
|
model._prompt_builder = SimpleNamespace(
|
||||||
build_prompt_embeds=build_prompt_embeds if build_prompt_embeds is not None else _default_raise,
|
build_prompt_embeds=build_prompt_embeds if build_prompt_embeds is not None else _default_raise,
|
||||||
)
|
)
|
||||||
@@ -83,7 +81,6 @@ def _make_minimal_builder(
|
|||||||
builder._codec_embed = lambda ids: torch.zeros((*ids.shape, 4), device=ids.device)
|
builder._codec_embed = lambda ids: torch.zeros((*ids.shape, 4), device=ids.device)
|
||||||
builder._residual_code_embeddings = lambda: []
|
builder._residual_code_embeddings = lambda: []
|
||||||
builder._speaker_encoder = None
|
builder._speaker_encoder = None
|
||||||
builder._embedding_dtype = torch.bfloat16
|
|
||||||
builder._tts_pad_embed_buffer = (
|
builder._tts_pad_embed_buffer = (
|
||||||
tts_pad_embed if tts_pad_embed is not None else torch.zeros((1, 4), dtype=torch.bfloat16)
|
tts_pad_embed if tts_pad_embed is not None else torch.zeros((1, 4), dtype=torch.bfloat16)
|
||||||
)
|
)
|
||||||
@@ -92,7 +89,6 @@ def _make_minimal_builder(
|
|||||||
)
|
)
|
||||||
builder._speaker_cache = None
|
builder._speaker_cache = None
|
||||||
builder._text_tokenizer = None
|
builder._text_tokenizer = None
|
||||||
builder._embedding_dtype = torch.bfloat16
|
|
||||||
builder._ref_audio_artifact_cache_max_entries = 256
|
builder._ref_audio_artifact_cache_max_entries = 256
|
||||||
builder._ref_audio_artifact_cache = OrderedDict()
|
builder._ref_audio_artifact_cache = OrderedDict()
|
||||||
builder._resampler_cache = OrderedDict()
|
builder._resampler_cache = OrderedDict()
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import os
|
|
||||||
import time
|
import time
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
from typing import Any
|
from typing import Any
|
||||||
@@ -20,21 +19,12 @@ _STATS_INTERVAL_S = 1.0
|
|||||||
# (the state ``OmniSchedulingCoordinator`` records via ``_waiting_since``)
|
# (the state ``OmniSchedulingCoordinator`` records via ``_waiting_since``)
|
||||||
# before the scheduler force-fails it. Defends against stuck consumer-side
|
# before the scheduler force-fails it. Defends against stuck consumer-side
|
||||||
# requests when the producer drops a full-payload, send fails, or recv
|
# requests when the producer drops a full-payload, send fails, or recv
|
||||||
# never arrives. Override per-deployment via
|
# never arrives. A value <= 0 disables the safety net.
|
||||||
# VLLM_OMNI_INPUT_WAIT_TIMEOUT_S; set <=0 to disable the safety net.
|
|
||||||
#
|
#
|
||||||
# Scope: this constant only covers the full-payload coordinator path
|
# Scope: this constant only covers the full-payload coordinator path
|
||||||
# (``input_coordinator``). The async-chunk path uses
|
# (``input_coordinator``). The async-chunk path uses
|
||||||
# ``chunk_transfer_adapter`` and is not affected by this constant.
|
# ``chunk_transfer_adapter`` and is not affected by this constant.
|
||||||
_INPUT_WAIT_TIMEOUT_RAW = os.environ.get("VLLM_OMNI_INPUT_WAIT_TIMEOUT_S", "600")
|
DEFAULT_INPUT_WAIT_TIMEOUT_S: float = 600.0
|
||||||
try:
|
|
||||||
DEFAULT_INPUT_WAIT_TIMEOUT_S: float = float(_INPUT_WAIT_TIMEOUT_RAW)
|
|
||||||
except ValueError:
|
|
||||||
logger.warning(
|
|
||||||
"Invalid VLLM_OMNI_INPUT_WAIT_TIMEOUT_S=%r; falling back to 600 seconds.",
|
|
||||||
_INPUT_WAIT_TIMEOUT_RAW,
|
|
||||||
)
|
|
||||||
DEFAULT_INPUT_WAIT_TIMEOUT_S = 600.0
|
|
||||||
|
|
||||||
|
|
||||||
class OmniSchedulerMixin:
|
class OmniSchedulerMixin:
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ from vllm_omni.diffusion.models.dreamzero.utils import (
|
|||||||
)
|
)
|
||||||
from vllm_omni.diffusion.models.schedulers.scheduling_flow_unipc_multistep import FlowUniPCMultistepScheduler
|
from vllm_omni.diffusion.models.schedulers.scheduling_flow_unipc_multistep import FlowUniPCMultistepScheduler
|
||||||
from vllm_omni.diffusion.worker.request_batch import DiffusionRequestBatch
|
from vllm_omni.diffusion.worker.request_batch import DiffusionRequestBatch
|
||||||
|
from vllm_omni.platforms import current_omni_platform
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
MAX_DREAMZERO_SESSIONS = 64
|
MAX_DREAMZERO_SESSIONS = 64
|
||||||
@@ -610,12 +611,12 @@ class DreamZeroPipeline(nn.Module, CFGParallelMixin):
|
|||||||
latents: tuple[torch.Tensor, torch.Tensor],
|
latents: tuple[torch.Tensor, torch.Tensor],
|
||||||
do_true_cfg: bool,
|
do_true_cfg: bool,
|
||||||
) -> tuple[torch.Tensor, torch.Tensor]:
|
) -> tuple[torch.Tensor, torch.Tensor]:
|
||||||
"""Post-step sync: .contiguous() + cuda.synchronize()"""
|
"""Post-step sync: .contiguous() + platform synchronize."""
|
||||||
latents = tuple(t.contiguous() for t in latents)
|
latents = tuple(t.contiguous() for t in latents)
|
||||||
if do_true_cfg and get_classifier_free_guidance_world_size() > 1:
|
if do_true_cfg and get_classifier_free_guidance_world_size() > 1:
|
||||||
device = next((t.device for t in latents if t.is_cuda), None)
|
# Platform-dispatched sync (not torch.cuda directly) so DreamZero
|
||||||
if device is not None:
|
# keeps working on non-CUDA hardware (XPU/NPU, see PR #4399).
|
||||||
torch.cuda.current_stream(device).synchronize()
|
current_omni_platform.synchronize()
|
||||||
return latents
|
return latents
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
|
|||||||
@@ -83,7 +83,13 @@ class _DiffusionVllmModelConfig:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def is_diffusion(self) -> bool:
|
def is_diffusion(self) -> bool:
|
||||||
return False
|
# Duck-types ``vllm.config.ModelConfig.is_diffusion``, which detects
|
||||||
|
# *discrete diffusion (dLLM) text models* via ``hf_config.canvas_length``
|
||||||
|
# and gates dLLM-only scheduler/spec-decode paths in vLLM. Omni's DiT
|
||||||
|
# pipelines run in their own engine and must never enable those paths,
|
||||||
|
# so mirror the upstream check (False for every DiT model) instead of
|
||||||
|
# leaving the attribute missing.
|
||||||
|
return getattr(self.hf_config, "canvas_length", None) is not None
|
||||||
|
|
||||||
|
|
||||||
def _make_diffusion_vllm_model_config(od_config: OmniDiffusionConfig) -> _DiffusionVllmModelConfig:
|
def _make_diffusion_vllm_model_config(od_config: OmniDiffusionConfig) -> _DiffusionVllmModelConfig:
|
||||||
|
|||||||
@@ -302,6 +302,11 @@ class Qwen3TTSPromptEmbedsBuilder:
|
|||||||
artifacts. ``0`` disables the cache.
|
artifacts. ``0`` disables the cache.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# The embedding path always runs in bf16 regardless of the configured
|
||||||
|
# model dtype (mirrors ``Qwen3TTSTalkerForConditionalGeneration``).
|
||||||
|
# Class attribute so test stubs built via ``__new__`` inherit it.
|
||||||
|
_embedding_dtype = torch.bfloat16
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
@@ -329,7 +334,6 @@ class Qwen3TTSPromptEmbedsBuilder:
|
|||||||
self._tts_pad_embed_buffer = tts_pad_embed
|
self._tts_pad_embed_buffer = tts_pad_embed
|
||||||
self._encode_ref_audio_batch_fn = encode_ref_audio_batch
|
self._encode_ref_audio_batch_fn = encode_ref_audio_batch
|
||||||
self._speaker_cache = speaker_cache
|
self._speaker_cache = speaker_cache
|
||||||
self._embedding_dtype = torch.bfloat16
|
|
||||||
|
|
||||||
self._text_tokenizer: Any | None = None
|
self._text_tokenizer: Any | None = None
|
||||||
|
|
||||||
|
|||||||
@@ -266,6 +266,11 @@ class Qwen3TTSTalkerForConditionalGeneration(nn.Module):
|
|||||||
"""vLLM-AR talker: step-wise layer-0 codec decoding.
|
"""vLLM-AR talker: step-wise layer-0 codec decoding.
|
||||||
Predicts residual codebooks (1..Q-1) into `audio_codes` and streams text via `tailing_text_hidden`."""
|
Predicts residual codebooks (1..Q-1) into `audio_codes` and streams text via `tailing_text_hidden`."""
|
||||||
|
|
||||||
|
# The embedding path always runs in bf16 regardless of the configured
|
||||||
|
# model dtype (encoder weights are cast to bf16 in ``__init__``). Class
|
||||||
|
# attribute so test stubs built via ``__new__`` inherit it.
|
||||||
|
_embedding_dtype = torch.bfloat16
|
||||||
|
|
||||||
hf_to_vllm_mapper = WeightsMapper(
|
hf_to_vllm_mapper = WeightsMapper(
|
||||||
orig_to_new_prefix={
|
orig_to_new_prefix={
|
||||||
# Talker backbone (Qwen3 decoder-only).
|
# Talker backbone (Qwen3 decoder-only).
|
||||||
@@ -443,7 +448,6 @@ class Qwen3TTSTalkerForConditionalGeneration(nn.Module):
|
|||||||
torch.zeros(1, int(self.talker_config.hidden_size), dtype=model_dtype),
|
torch.zeros(1, int(self.talker_config.hidden_size), dtype=model_dtype),
|
||||||
persistent=False,
|
persistent=False,
|
||||||
)
|
)
|
||||||
self._embedding_dtype = torch.bfloat16
|
|
||||||
|
|
||||||
tokenizer_config = Qwen3TTSTokenizerV2Config.from_pretrained(
|
tokenizer_config = Qwen3TTSTokenizerV2Config.from_pretrained(
|
||||||
self.model_path,
|
self.model_path,
|
||||||
|
|||||||
Reference in new issue
Block a user