Repository navigation
[MOSS-TTS] Fast pcm convert and first-frame codec in stage0 - #8640
Conversation
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
|
This PR appears to belong to: docs/design/module/ar_runtime.md, docs/design/module/model_integration.md. Module owners: @tzhouam @fake0fan @Gaohan123 Routing: @tzhouam via module of the changed files, semantic router, CODEOWNERS; @fake0fan via module of the changed files; @Gaohan123 via module of the changed files @gcanlin, please review your own changes and leave a short self-review comment describing what you checked. PRs without author self-review may not be assigned a reviewer. Please take a look when you have a chance. If you would like an automated review, mention @vllm-omni-review-bot in a comment. |
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Omni ReviewBot triage noteAutomated triage of commit
These are automated triage suggestions only — the final decision belongs to the maintainers. |
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
|
@Sy0307 I have reviewed the agent code. Most of them are clean now. PTAL. |
Omni ReviewBot routing recordAssigned Strict on zcode (GLM-5.3-Flash) under experiment |
Keep the shared load_codec() used by Stage0 and Stage1, and retain vllm-project#7556's BF16 decode LUT on both CUDA and NPU. Validation: 33 CPU tests passed; 8 skipped and 4 deselected. Applicable pre-commit checks passed on the conflict-resolved file. GPU/NPU audio parity and performance were not remeasured after merging. AI assistance: Codex resolved the merge conflict and ran local checks. Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Sy0307
left a comment
There was a problem hiding this comment.
Requesting changes for the E2E-confirmed stop-condition regression. The two code findings are attached inline.
Documentation still describes removed paths — recipes/OpenMOSS/MOSS-TTS.md:184 and lines 379–387.
The recipe still describes the below-32-active-stream fast path, Stage1-specific first-chunk graphs and gating, batch limit 16, and eager MTP as the default, although this PR removes those mechanisms or changes their defaults. These instructions lead users to tune behavior that no longer exists and omit the additional decoder resources introduced in Stage0. Please update both sections to describe the Stage0 first-frame path, its actual executor/TP/PP requirements, current defaults, and resource cost.
Validation scope: the stop finding was reproduced through the real speech HTTP endpoint on H200 using unmodified source, with the stop IDs configured in the Stage0 deployment YAML. The decoder finding was verified during actual single-GPU initialization with MultiprocExecutor; TP>1 and PP>1 were not tested. The documentation finding is based on code/documentation comparison.
| # preserving max_tokens and avoiding a second MTP for that frame. | ||
| rows = [row for row in self._completing_rows if input_batch.req_ids[row] in early.waiting] | ||
| if rows: | ||
| self._run_local_eager_mtp(input_batch, rows, set(rows)) |
There was a problem hiding this comment.
With Stage0 stop_token_ids=[151656] and max_tokens>1, the first audio-slot token should terminate generation, but this path publishes audio before the stop decision is processed. H200 HTTP E2E tests returned an extra 80 ms of PCM in 15/15 requests on both ad135eed (C128) and 142a60db (capacity 16), while the pre-PR base produced no audio. Please gate publication on the canonical stop decision, or disable early publication for these constraints; audio already delivered to the client cannot be retracted.
| # First audio is part of the MRV2 streaming slot-state path. Load it | ||
| # here so its weights and graphs count toward model memory profiling. | ||
| model_config = self.vllm_config.model_config | ||
| if ( |
There was a problem hiding this comment.
This initialization predicate does not match the sink-binding requirements: with Stage0 MultiprocExecutor, TP=1 and PP=1, the decoder is initialized even though _bind_first_audio_sink returns False. Actual H200 initialization confirmed approximately 1.98 GiB of decoder parameter weights, excluding buffers and graph memory, plus capture of 19 first-frame graph buckets. Please use a shared capability check for decoder initialization and sink binding so configurations without a sender do not allocate these unused resources.
…tion Keep requests whose first audio-slot token can terminate generation on the canonical delivery path. Cover the effective EOS, explicit stop IDs, token and context limits, and constraints that can change the first token. Default requests retain the prefill MTP and Stage0 first-frame path. Validation: 103 CPU tests passed. H200 speech HTTP checks changed 28/31 stop requests with an extra 80 ms frame to 0/31; max_tokens=1 also emits zero PCM. The API retains its existing no-audio error response. Matched default C64/C128 performance checks are running separately. AI assistance: Codex implemented the guard and ran the checks. Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Use the same TP/PP and executor-class requirements for decoder loading and sink binding. MultiprocExecutor no longer loads unused Stage0 codec weights or captures first-frame graphs; UniProcExecutor subclasses retain the existing path. Update the recipe's removed Stage1 fast-path description with the current execution order, requirements, defaults and memory cost. Validation: 92 CPU tests and applicable pre-commit checks passed. Actual H200 TP=PP=1 MultiprocExecutor initialization skipped Stage0 first-frame loading/capture. HTTP audio checks passed for streaming/non-streaming PCM, cancellation, slot reuse and 33 seeded plus 33 unseeded concurrent requests. TP/PP>1 capability cases were covered on CPU only. AI assistance: Codex implemented the shared check and ran validation. Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
Sy0307
left a comment
There was a problem hiding this comment.
LGTM and have checked all issues fixed.
Accept the deletion of MOSS-TTS tests removed in vllm-project#8640. Route platform marks that landed on main through hardware_test / hardware_marks so the stricter check-mark hook stays clean. Co-authored-by: Cursor <cursoragent@cursor.com>
…ject#8640) Signed-off-by: Canlin Guo <canlinguosdu@gmail.com>
prefill → wait for next scheduling step → first-frame MTP → first-frame codec → sendtoprefill → first-frame MTP → first-frame codec → send. Cache the codes and audio embedding for the next decode step, avoiding duplicate MTP computation while preserving output length and CUDA Graph execution.H200, BF16, MPS, prefix cache enabled; full SeedTTS EN1088 voice cloning, output length 256. Two warm rounds per concurrency; cold round excluded. Main uses the previously measured base
a46e9aae7.File-reference benchmark (H200, 2026-10-09)
PR head
ad135eedc, one H200 (GPU 6), BF16, MPS and prefix cache enabled;moss_tts_local_mrv2_optimized.yaml, with server CPU affinity 48–79. Full SeedTTS EN1088 per round, output length 256; all 3,264 requests succeeded, with no failures. The first C64 pass warms the reference caches; subsequent rows use the warmed server.Run from this PR checkout, with the server allowing
--allowed-local-media-path /root/vllm-omni-workspace:PYTHONPATH="$PWD" \ VLLM_OMNI_BENCH_AUDIO_SAMPLE_RATE=48000 \ VLLM_OMNI_BENCH_AUDIO_CHANNELS=2 \ OMP_NUM_THREADS=1 \ taskset -c 80-95 /root/vllm-omni-workspace/.venv/bin/python benchmarks/tts/bench_tts.py \ --host 127.0.0.1 \ --port 8124 \ --model OpenMOSS-Team/MOSS-TTS-Local-Transformer-v1.5 \ --task voice_clone \ --locale en \ --dataset-path /root/vllm-omni-workspace/seedtts_testset \ --num-prompts 1088 \ --concurrency 64 64 128 \ --output-len 256 \ --output-dir /root/vllm-omni-workspace/moss-pr8232-perf-20261008/artifacts/pr_file_ref_gpu6_20261009 \ -- --seed-tts-file-ref-audioReference audio is already stored on the server.
--seed-tts-file-ref-audiosends afile://URI instead of embedding the WAV as base64 in every request, reducing HTTP request-body handling and frontend queueing. These are separate measurements using file references; the original inline-audio results above are retained.