[Misc] Remove Dynin-Omni and dots.tts support (#7655)

Signed-off-by: wangyu <410167048@qq.com>
Signed-off-by: Yueqian Lin <linyueqian@outlook.com>
Co-authored-by: Yueqian Lin <linyueqian@outlook.com>
This commit is contained in:
wangyuandYueqian Lin authored and GitHub committed 2026-09-20 00:28:29 -07:00
1 parent 3f94c417be
commit 6a03e45c34
56 files changed
+133 -12749

No files matched your search

@@ -1,2 +0,0 @@
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
@@ -1,137 +0,0 @@
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
"""Regression tests for the dots.tts talker's stop-signal pairing and
per-request state lifecycle.
Pure-CPU tests on a bare talker (``__new__`` + the handful of attributes
the methods under test read) — no weights, no GPU, no engine. Mirrors
tests/model_executor/models/voxcpm2/test_talker_state_eviction.py.
"""
from __future__ import annotations
import functools
from types import SimpleNamespace
import pytest
pytestmark = [pytest.mark.core_model, pytest.mark.cpu]
torch = pytest.importorskip("torch")
_VOCAB_SIZE = 151672
@functools.lru_cache(maxsize=1)
def _dots_tts_talker_mod():
"""Defer talker import (pulls vLLM model_executor) until first use."""
from vllm_omni.model_executor.models.dots_tts.dots_tts_talker import (
DotsTTSForConditionalGeneration,
_RequestState,
)
return DotsTTSForConditionalGeneration, _RequestState
def _make_bare_talker():
DotsTTSForConditionalGeneration, _ = _dots_tts_talker_mod()
talker = DotsTTSForConditionalGeneration.__new__(DotsTTSForConditionalGeneration)
talker.config = SimpleNamespace(vocab_size=_VOCAB_SIZE)
talker._active_states = {}
talker._pending_requests = []
talker._results_queue = []
talker._audio_queue = []
talker._deferred_cleanup_ids = set()
talker._beta_trace = False
return talker
def _add_state(talker, req_id: str, *, is_stopping: bool = False):
_, _RequestState = _dots_tts_talker_mod()
state = _RequestState(request_id=req_id)
state.prefill_completed = True
state.is_stopping = is_stopping
talker._active_states[req_id] = state
return state
def _hidden(bsz: int) -> torch.Tensor:
return torch.zeros(bsz, 1536, dtype=torch.float32)
class TestComputeLogitsPairing:
"""compute_logits pairs _results_queue entries with batch rows
positionally, so every request must push exactly one entry per step —
including prefills, which push a (req_id, None) placeholder."""
def test_mixed_batch_prefill_placeholder_keeps_rows_aligned(self) -> None:
talker = _make_bare_talker()
_add_state(talker, "prefill-req")
decode_state = _add_state(talker, "decode-req", is_stopping=True)
decode_state.precomputed_stop_logits = torch.tensor([[0.1, 0.9]])
# Row 0 is the prefill (None placeholder), row 1 the stopping decode.
talker._results_queue = [
("prefill-req", None),
("decode-req", torch.tensor([[0.1, 0.9]])),
]
logits = talker.compute_logits(_hidden(2))
assert logits.shape == (2, _VOCAB_SIZE)
# Prefill row: forced continue.
assert logits[0, 0].item() == 1.0
assert logits[0, 1].item() == float("-inf")
# Stopping decode row: stop slot wins.
assert logits[1, 1].item() == 1.0
assert logits[1, 0].item() == 0.0
# Everything else stays masked.
assert logits[0, 2].item() == float("-inf")
assert logits[1, 2].item() == float("-inf")
# Queue drained.
assert talker._results_queue == []
def test_below_threshold_stop_logits_force_continue(self) -> None:
"""Raw (continue, stop) softmax must not reach the sampler: a
prob_stop in (0.5, 0.8] would flip greedy argmax even though
is_stopping stayed False (the 0.8-threshold contract)."""
talker = _make_bare_talker()
_add_state(talker, "req", is_stopping=False)
talker._results_queue = [("req", torch.tensor([[0.3, 0.7]]))]
logits = talker.compute_logits(_hidden(1))
assert logits[0, 0].item() == 1.0
assert logits[0, 1].item() == float("-inf")
def test_empty_queue_defaults_to_all_continue(self) -> None:
talker = _make_bare_talker()
logits = talker.compute_logits(_hidden(3))
assert torch.all(logits[:, 0] == 1.0)
assert torch.all(logits[:, 1] == float("-inf"))
class TestStateEviction:
"""on_requests_finished fires BEFORE forward(), so eviction must be
deferred to _flush_deferred_cleanup at the end of the step — the
finishing request's audio still drains through the current forward."""
def test_finished_request_survives_until_flush(self) -> None:
talker = _make_bare_talker()
_add_state(talker, "req-a")
_add_state(talker, "req-b")
talker.on_requests_finished(["req-a"])
assert "req-a" in talker._active_states # not evicted yet
talker._flush_deferred_cleanup()
assert "req-a" not in talker._active_states
assert "req-b" in talker._active_states
assert talker._deferred_cleanup_ids == set()
def test_unknown_request_id_is_ignored(self) -> None:
talker = _make_bare_talker()
talker.on_requests_finished(["never-seen"])
talker._flush_deferred_cleanup()
assert talker._active_states == {}
@@ -1,40 +0,0 @@
from __future__ import annotations
import pytest
from transformers import PreTrainedModel
from vllm_omni.model_executor.models.dynin_omni.dynin_omni_token2audio import (
_ensure_transformers_tied_weights_compat,
)
pytestmark = [pytest.mark.core_model, pytest.mark.cpu]
def test_transformers_tied_weights_compat(monkeypatch):
"""Compat shim must not permanently mutate ``PreTrainedModel``.
``monkeypatch.delattr(..., raising=False)`` is a no-op undo when the attr
was absent. ``_ensure_transformers_tied_weights_compat`` then assigns a
read-only ``property`` on the class that later PreTrainedModel subclasses
(e.g. qwen3 TTS mask-cache) can trip over with
``AttributeError: property ... has no setter``.
"""
monkeypatch.delattr(PreTrainedModel, "all_tied_weights_keys", raising=False)
_ensure_transformers_tied_weights_compat()
installed = PreTrainedModel.__dict__.get("all_tied_weights_keys")
assert installed is not None
# Re-own the installed descriptor through monkeypatch so teardown always
# removes/restores it, even when the attr did not exist before this test.
delattr(PreTrainedModel, "all_tied_weights_keys")
monkeypatch.setattr(PreTrainedModel, "all_tied_weights_keys", installed, raising=False)
model = PreTrainedModel.__new__(PreTrainedModel)
model._tied_weights_keys = ["decoder.weight"]
model._dynamic_tied_weights_keys = {"lm_head.weight": "decoder.weight"}
assert model.all_tied_weights_keys == {
"decoder.weight": None,
"lm_head.weight": "decoder.weight",
}
@@ -1,5 +1,5 @@
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
# SPDX-FileCopyrightText: Copyright contributors to the vLLM-Omni project
"""Unit tests for Qwen3-Omni streaming thinker→talker / talker→codec helpers (PR #2581)."""
from __future__ import annotations
@@ -356,7 +356,7 @@ def test_accumulator_concat_default_when_no_replace_keys() -> None:
class _StubMixin(OmniConnectorModelRunnerMixin):
def __init__(self):
self._pending_full_payload_send = {}
self._full_payload_replace_keys_cached = frozenset()
self._full_payload_replace_keys_cached: frozenset[str] = frozenset()
stub = _StubMixin()
stub.accumulate_full_payload_output(
@@ -415,51 +415,6 @@ def test_covo_audio_llm2code2wav_full_payload_smoke() -> None:
assert payload["meta"]["finished"].item() is True
def test_dynin_omni_token_only_smoke() -> None:
"""Smoke: dynin_omni token-only builders return placeholders."""
from vllm_omni.model_executor.stage_input_processors.dynin_omni import (
token2text_to_token2image_token_only,
)
class _Out:
def __init__(self, tids, mm=None):
self.token_ids = tids
self.multimodal_output = mm
class _Wrapper:
def __init__(self, tids, mm=None):
self.outputs = [_Out(tids, mm)]
self.request_id = "r0"
class _Stage:
def __init__(self, outs):
self.engine_outputs = outs
src = [_Wrapper([10, 11, 12])]
out = token2text_to_token2image_token_only([_Stage(src)], [0])
assert len(out) == 1
assert len(out[0]["prompt_token_ids"]) == 3
assert out[0]["additional_information"] is None
def test_dynin_omni_full_payload_smoke() -> None:
"""Smoke: dynin_omni producer-side payload builder returns nested OmniPayload + carries metadata."""
from types import SimpleNamespace
from vllm_omni.model_executor.stage_input_processors.dynin_omni import (
token2text_to_token2image_full_payload,
)
pooling = {"token_ids": [1, 2, 3]}
req = SimpleNamespace(output_token_ids=[], additional_information={"speaker": ["alice"]})
payload = token2text_to_token2image_full_payload(None, pooling, req)
assert payload is not None
assert payload["codes"]["audio"] == [1, 2, 3]
assert payload["meta"]["finished"].item() is True
# additional_information is normalized + carried forward (speaker stays list-wrapped).
assert payload.get("speaker") == ["alice"]
def test_qwen2_5_omni_talker2code2wav_token_only_smoke() -> None:
"""Smoke: qwen2_5_omni talker→code2wav token_only marker + boundary strip."""
from vllm_omni.model_executor.stage_input_processors.qwen2_5_omni import (