Skip to content

[CI] Refresh Voxtral-4B-TTS perf baselines from a clean window - #6032

Merged
Gaohan123 merged 3 commits into
vllm-project:mainfrom
linyueqian:fix/voxtral-perf-baselines
Aug 15, 2026
Merged

Gaohan123 merged 3 commits into
vllm-project:mainfrom
linyueqian:fix/voxtral-perf-baselines

Conversation

@linyueqian

@linyueqian linyueqian commented Aug 11, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Nightly CI has reported a Voxtral-4B-TTS perf regression on H100 (#5967): audio_throughput -12.20% and median_audio_rtf -6.74%. It is not a regression. The baselines it compares against were averaged over a window that includes three nights when Voxtral output was broken, and the resulting audio_throughput target is unreachable by construction.

This refreshes all eight Voxtral H100 baselines in tests/dfx/perf/tests/test_tts.json to the plain mean of the 31 clean nightlies (2026-07-08 .. 2026-08-09). Metadata only, no runtime code changes.

Why the current baselines are wrong

#5231 set them as the plain mean of the seven nightlies 2026-07-05..07-11. All eight values reproduce exactly as that mean. Three of those nights sit inside a nine-night window when Voxtral emitted unrelated, over-long audio:

mean_audio_duration_s, stress cell (request_rate=2.0, n=100):

night 06-27 06-28 06-29 06-30 .. 07-06 07-07 07-08 07-09
mean audio s 5.05 5.16 7.47 7.36 - 7.37 7.35 5.13 5.24

Boundary nightlies map to 1b318d11d..c45ac74d4 (contains #4527) and 7ab50965e..267b49b88 (heads with #4954). The anomaly is Voxtral-only: Qwen3-TTS Base/CustomVoice, VoxCPM2 and Higgs mean_audio_duration_s are flat across the same window.

The stress baseline is unreachable, not merely unobserved

100 prompts at request_rate=2.0 means 99 inter-arrival gaps, so the arrival span alone is 49.5 s and wall clock cannot be shorter (observed 50.63-50.96 s). At the correct 5.138 s/prompt, audio_throughput is capped at 100 x 5.138 / 49.5 = 10.380 even against an infinitely fast server. Hitting 11.7605 requires 5.821 s/prompt at that bound; the largest per-prompt mean in 31 clean nights is 5.333 s, and only the #4527 window reaches 7.47 s.

Clean-window statistics (31 nightlies):

cell / metric old baseline clean mean +/- sd clean range 08-09 value vs old vs clean mean
rr=2.0 audio_throughput 11.7605 10.1186 +/- 0.2003 9.6387 - 10.4642 10.3253 -12.20% +2.04%
c=1 median_audio_rtf 0.1241 0.1277 +/- 0.0030 0.1209 - 0.1365 0.1325 -6.74% +3.77%

The flagged night is one of the better ones on record.

Before / after

Recomputing the pass/fail verdict for every clean nightly against the same measured values, old baselines vs new:

threshold metric old new
10% rr=2.0 audio_throughput 31/31 nightlies flagged 0/31
10% c=8 median_audio_rtf 11/31 1/31
10% all 8 metrics x 31 nightlies 62/248 12/248
5% all 8 metrics x 31 nightlies 103/248 25/248

The stress-cell check fired on every single clean night. Note this is not "loosen until green": 12 pairs still flag at 10% after the change, mostly c=8 median_audio_ttfp_ms (6/31, the one genuinely noisy cell at 10.2% CV), so real outlier nights stay detectable.

New baselines

cell metric old new
c=1 n=20 median_audio_ttfp_ms 82.1886 82.6344
c=1 n=20 median_audio_rtf 0.1241 0.1277
c=8 n=80 median_audio_ttfp_ms 160.9168 170.3737
c=8 n=80 median_audio_rtf 0.1907 0.2076
c=8 n=80 audio_throughput 39.2332 37.0834
rr=2.0 n=100 median_audio_ttfp_ms 100.1265 101.0293
rr=2.0 n=100 median_audio_rtf 0.1437 0.1498
rr=2.0 n=100 audio_throughput 11.7605 10.1186

Plain mean over the clean window, the estimator used in #5231 and #5774. Medians differ by at most 2.5%, so the choice is not load-bearing.

Testing

Ran the CI harness against the patched spec on 1x H20 (voxtral entry only):

pytest -s -v tests/dfx/perf/scripts/run_benchmark.py --test-config-file <spec>
3 passed in 278.73s
  • c=1 n=20: 20/20 completed, 0 failed
  • c=8 n=80: 80/80 completed, 0 failed
  • rr=2.0 n=100: 100/100 completed, 0 failed
  • every emitted result JSON carries the patched value, hardware-nested H100 bucket resolved to the per-sweep scalar
  • is_hardware_nested_baseline and resolve_baseline_for_sweep(raw, sweep_index=0) return the patched scalars for all three cells

H20 independently corroborates the ceiling: the stress cell measured mean_audio_duration_s = 5.384 with audio_throughput = 10.576, and 2.0 x 5.384 = 10.77. Absolute throughput on H20 is not comparable to an H100 baseline, so those numbers are reported for completeness only; the H100 baselines come from the archived nightlies.

Live audio length is 4.9-5.4 s/prompt across both runs, matching the clean regime and never the 7.37 s the old baseline was built from.

Follow-ups, not in this PR

Closes #5967

The eight Voxtral H100 baselines in tests/dfx/perf/tests/test_tts.json were set
in vllm-project#5231 as the plain mean of the seven nightlies 2026-07-05..07-11. Three of
those nights fall inside a nine-night window (nightlies 06-29..07-07) when
Voxtral emitted unrelated, over-long audio: vllm-project#4527 moved the inter-stage codec
feedback under codes.audio while tts_preprocess still read top-level audio, so
decode lost its previous audio-code embeddings. vllm-project#4954 fixed that and closed
vllm-project#4949. mean_audio_duration_s on the stress cell reads 5.05-5.16 s before the
window, 7.35-7.47 s inside it, and 5.13 s again from the first nightly after
the fix. The anomaly is Voxtral-only; Qwen3-TTS, VoxCPM2 and Higgs are flat
across the same window.

Because the stress cell is rate-pinned, audio_throughput is essentially
request_rate x mean_audio_duration, so the inflated duration inflated the
baseline directly. The resulting 11.7605 target sits above the arithmetic
ceiling of that configuration: 100 prompts at 2.0 req/s span 49.5 s, so at the
correct 5.138 s/prompt the ceiling is 10.380 even against an infinitely fast
server. Measured values have been 9.64-10.47 on all 31 nightlies since the fix
landed, so the check reported a regression on every one of them.

Refresh all eight baselines to the plain mean of those 31 clean nightlies
(2026-07-08..08-09), the same estimator used in vllm-project#5231 and vllm-project#5774. Metadata only;
no runtime code changes.

Closes vllm-project#5967

Signed-off-by: Yueqian Lin <linyueqian@outlook.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Credits must be used to enable repository wide code reviews.

@hsliuustc0106 hsliuustc0106 added CI/CD codes related to changes to CI/CD tts code related to tts models labels Aug 12, 2026
@linyueqian linyueqian added the ready label to trigger buildkite CI label Aug 12, 2026

@congw729 congw729 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@Gaohan123 Gaohan123 removed the ready label to trigger buildkite CI label Aug 15, 2026
@Gaohan123 Gaohan123 added the ready label to trigger buildkite CI label Aug 15, 2026

@Gaohan123 Gaohan123 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thanks

@Gaohan123
Gaohan123 enabled auto-merge (squash) August 15, 2026 11:30
@Gaohan123
Gaohan123 merged commit 555336e into vllm-project:main Aug 15, 2026
7 of 9 checks passed
khairulkabir1661 pushed a commit to khairulkabir1661/vllm-omni that referenced this pull request Sep 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CI/CD codes related to changes to CI/CD ready label to trigger buildkite CI tts code related to tts models

Projects

None yet

4 participants