From af8501dcc791e1f7b3775e6d154dbe41896239d9 Mon Sep 17 00:00:00 2001 From: Taichang Zhou Date: Thu, 22 Jan 2026 22:46:06 +0800 Subject: [PATCH 1/3] debug Qwen TTS Signed-off-by: Taichang Zhou --- .../qwen3_tts/configuration_qwen3_tts.py | 11 ++++++++-- .../models/qwen3_tts/modeling_qwen3_tts.py | 22 ++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py b/vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py index dcf9d54ac..c7db33a59 100644 --- a/vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py +++ b/vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py @@ -504,12 +504,19 @@ class Qwen3TTSConfig(PretrainedConfig): self.tts_bos_token_id = tts_bos_token_id self.tts_eos_token_id = tts_eos_token_id + #TODO: remove these dummy values after + self.image_token_id = 0 # dummy image token id + self.video_token_id = 0 # dummy video token id + self.vision_start_token_id = 0 # dummy vision start token id + self.vision_config = PretrainedConfig() # dummy vision config + self.vision_config.spatial_merge_size = 1 + def get_text_config(self, **kwargs): # vLLM expects text config to expose hidden_size/num_attention_heads. # For Qwen3 TTS, the talker config is the text model config. config = self.talker_config - if hasattr(config, "rope_parameters"): - delattr(config, "rope_parameters") + # if hasattr(config, "rope_parameters"): + # delattr(config, "rope_parameters") return config diff --git a/vllm_omni/model_executor/models/qwen3_tts/modeling_qwen3_tts.py b/vllm_omni/model_executor/models/qwen3_tts/modeling_qwen3_tts.py index ac9844f89..aac14574a 100644 --- a/vllm_omni/model_executor/models/qwen3_tts/modeling_qwen3_tts.py +++ b/vllm_omni/model_executor/models/qwen3_tts/modeling_qwen3_tts.py @@ -426,7 +426,20 @@ def mel_spectrogram( mel_spec = dynamic_range_compression_torch(mel_spec) return mel_spec +def _compute_default_rope_parameters( + config, + device, +): + base = config.rope_theta + partial_rotary_factor = getattr(config, "partial_rotary_factor", 1.0) + head_dim = getattr(config, "head_dim", None) or config.hidden_size // config.num_attention_heads + dim = int(head_dim * partial_rotary_factor) + attention_factor = 1.0 # Unused in this type of RoPE + + # Compute the inverse frequencies + inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2, dtype=torch.int64).to(device=device, dtype=torch.float) / dim)) + return inv_freq, attention_factor class Qwen3TTSPreTrainedModel(PreTrainedModel): config_class = Qwen3TTSConfig @@ -500,7 +513,9 @@ class Qwen3TTSTalkerRotaryEmbedding(nn.Module): self.original_max_seq_len = config.max_position_embeddings self.config = config - self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type] + self.rope_init_fn: Callable = _compute_default_rope_parameters + if self.rope_type != "default": + self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type] inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device) self.register_buffer("inv_freq", inv_freq, persistent=False) @@ -536,7 +551,9 @@ class Qwen3TTSRotaryEmbedding(nn.Module): self.original_max_seq_len = config.max_position_embeddings self.config = config - self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type] + self.rope_init_fn: Callable = _compute_default_rope_parameters + if self.rope_type != "default": + self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type] inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device) self.register_buffer("inv_freq", inv_freq, persistent=False) @@ -1387,7 +1404,6 @@ class Qwen3TTSTalkerModel(Qwen3TTSTalkerTextPreTrainedModel): def __init__(self, config): super().__init__(config) - self.padding_idx = config.pad_token_id self.vocab_size = config.vocab_size self.layers = nn.ModuleList( [Qwen3TTSTalkerDecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)] From b6c846cc950dce24dc7f9fed9a196b4c5e21c817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E5=BF=97=E9=B9=8F?= Date: Mon, 2 Feb 2026 17:58:48 +0800 Subject: [PATCH 2/3] Add stage_init_timeout=300 (#1153) Signed-off-by: princepride --- .../offline_inference/stage_configs/bagel_mooncake_ci.yaml | 4 ++-- .../stage_configs/bagel_sharedmemory_ci.yaml | 4 ++-- tests/e2e/offline_inference/test_bagel_text2img.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/e2e/offline_inference/stage_configs/bagel_mooncake_ci.yaml b/tests/e2e/offline_inference/stage_configs/bagel_mooncake_ci.yaml index 4c6a67e8b..8c170dffd 100644 --- a/tests/e2e/offline_inference/stage_configs/bagel_mooncake_ci.yaml +++ b/tests/e2e/offline_inference/stage_configs/bagel_mooncake_ci.yaml @@ -12,7 +12,7 @@ stage_args: model_arch: BagelForConditionalGeneration worker_type: ar scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler - gpu_memory_utilization: 0.60 + gpu_memory_utilization: 0.35 enforce_eager: true trust_remote_code: true engine_output_type: text @@ -44,7 +44,7 @@ stage_args: max_batch_size: 1 engine_args: model_stage: dit - gpu_memory_utilization: 0.4 + gpu_memory_utilization: 0.55 enforce_eager: true trust_remote_code: true engine_output_type: image diff --git a/tests/e2e/offline_inference/stage_configs/bagel_sharedmemory_ci.yaml b/tests/e2e/offline_inference/stage_configs/bagel_sharedmemory_ci.yaml index 67ff7309f..ef605a3a3 100644 --- a/tests/e2e/offline_inference/stage_configs/bagel_sharedmemory_ci.yaml +++ b/tests/e2e/offline_inference/stage_configs/bagel_sharedmemory_ci.yaml @@ -12,7 +12,7 @@ stage_args: model_arch: BagelForConditionalGeneration worker_type: ar scheduler_cls: vllm_omni.core.sched.omni_ar_scheduler.OmniARScheduler - gpu_memory_utilization: 0.65 + gpu_memory_utilization: 0.35 enforce_eager: true trust_remote_code: true engine_output_type: text @@ -43,7 +43,7 @@ stage_args: max_batch_size: 1 engine_args: model_stage: dit - gpu_memory_utilization: 0.4 + gpu_memory_utilization: 0.55 enforce_eager: true trust_remote_code: true engine_output_type: image diff --git a/tests/e2e/offline_inference/test_bagel_text2img.py b/tests/e2e/offline_inference/test_bagel_text2img.py index 777af52a7..9aef47a74 100644 --- a/tests/e2e/offline_inference/test_bagel_text2img.py +++ b/tests/e2e/offline_inference/test_bagel_text2img.py @@ -161,7 +161,7 @@ def _generate_bagel_image(omni: Omni, prompt: str = DEFAULT_PROMPT) -> Image.Ima def test_bagel_text2img_shared_memory_connector(): """Test Bagel text2img with shared memory connector.""" config_path = str(Path(__file__).parent / "stage_configs" / "bagel_sharedmemory_ci.yaml") - omni = Omni(model="ByteDance-Seed/BAGEL-7B-MoT", stage_configs_path=config_path) + omni = Omni(model="ByteDance-Seed/BAGEL-7B-MoT", stage_configs_path=config_path, stage_init_timeout=300) try: generated_image = _generate_bagel_image(omni) @@ -288,7 +288,7 @@ def test_bagel_text2img_mooncake_connector(): http_port=MOONCAKE_HTTP_PORT, ) - omni = Omni(model="ByteDance-Seed/BAGEL-7B-MoT", stage_configs_path=temp_config_file) + omni = Omni(model="ByteDance-Seed/BAGEL-7B-MoT", stage_configs_path=temp_config_file, stage_init_timeout=300) generated_image = _generate_bagel_image(omni) _validate_pixels(generated_image) From 87c7b7e519b86a8344287e55d109355be6d33fff Mon Sep 17 00:00:00 2001 From: Taichang Zhou Date: Mon, 2 Feb 2026 21:52:10 +0800 Subject: [PATCH 3/3] Refactor comments and formatting in Qwen3 TTS configuration and modeling files for improved readability. Signed-off-by: Taichang Zhou --- .../models/qwen3_tts/configuration_qwen3_tts.py | 8 ++++---- .../model_executor/models/qwen3_tts/modeling_qwen3_tts.py | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py b/vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py index c7db33a59..dde690068 100644 --- a/vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py +++ b/vllm_omni/model_executor/models/qwen3_tts/configuration_qwen3_tts.py @@ -504,10 +504,10 @@ class Qwen3TTSConfig(PretrainedConfig): self.tts_bos_token_id = tts_bos_token_id self.tts_eos_token_id = tts_eos_token_id - #TODO: remove these dummy values after - self.image_token_id = 0 # dummy image token id - self.video_token_id = 0 # dummy video token id - self.vision_start_token_id = 0 # dummy vision start token id + # TODO: remove these dummy values after + self.image_token_id = 0 # dummy image token id + self.video_token_id = 0 # dummy video token id + self.vision_start_token_id = 0 # dummy vision start token id self.vision_config = PretrainedConfig() # dummy vision config self.vision_config.spatial_merge_size = 1 diff --git a/vllm_omni/model_executor/models/qwen3_tts/modeling_qwen3_tts.py b/vllm_omni/model_executor/models/qwen3_tts/modeling_qwen3_tts.py index 2bcc61031..1e759a8d2 100644 --- a/vllm_omni/model_executor/models/qwen3_tts/modeling_qwen3_tts.py +++ b/vllm_omni/model_executor/models/qwen3_tts/modeling_qwen3_tts.py @@ -428,6 +428,8 @@ def mel_spectrogram( mel_spec = dynamic_range_compression_torch(mel_spec) return mel_spec + + def _compute_default_rope_parameters( config, device, @@ -443,6 +445,7 @@ def _compute_default_rope_parameters( inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2, dtype=torch.int64).to(device=device, dtype=torch.float) / dim)) return inv_freq, attention_factor + class Qwen3TTSPreTrainedModel(PreTrainedModel): config_class = Qwen3TTSConfig base_model_prefix = "model"