Repository navigation
feat(server): serve recorded audio with AIPerf - #1707
Merged
Merged
Conversation
yizhuoz004
marked this pull request as ready for review
October 14, 2026 20:10
2 of 14 tasks
yizhuoz004
force-pushed
the
aiperf-asr
branch
from
October 14, 2026 23:41
1089b8f to
c4820c0
Compare
yizhuoz004
force-pushed
the
aiperf-asr
branch
from
October 15, 2026 00:53
59a3a80 to
c907f17
Compare
Dispatch complete WAV uploads through declared native transcription Tasks. Preserve audio identity, complete transcripts, admission, separate Task timing, and uploaded-file lifetime through cancellation and worker retirement. Reuse native media I/O and qualification mechanics. Add a pinned LibriSpeech input preparation command, meaningful native/HTTP regressions, and a concise published-client recipe without changing family math or numerical criteria. Refs: NVIDIA#1670 Signed-off-by: Yizhuo Zhang <yizhuoz@nvidia.com>
Signed-off-by: Yizhuo Zhang <yizhuoz@nvidia.com>
Signed-off-by: Yizhuo Zhang <yizhuoz@nvidia.com>
Signed-off-by: Yizhuo Zhang <yizhuoz@nvidia.com>
Use the checkpoint activation in the convolution stem and encoder/decoder MLPs. Evaluate exact GELU in FP32 before restoring the network dtype so half inputs retain the negative tail. Add real TensorRT/PyTorch activation regressions. Keep the existing transcription fixture, oracle, and zero-NED/zero-WER criteria unchanged. Signed-off-by: Yizhuo Zhang <yizhuoz@nvidia.com>
Disable TF32 operand rounding for the explicitly FP32 encoder, including the existing fp32_layers selector. Preserve the checkpoint, fixture, reference precision, and zero-NED/zero-WER criteria. Signed-off-by: Yizhuo Zhang <yizhuoz@nvidia.com>
Compute the output projection in FP32 with the checkpoint weights instead of rounding close candidates in FP16 before an FP32 cast. Keep decoder output precision without TF32 rounding and cover single-device and replicated TP heads. Add real TensorRT regressions for close candidates and failure-only native/reference precision diagnostics. Preserve the existing transcription fixture, reference, and strict numerical criteria. Signed-off-by: Yizhuo Zhang <yizhuoz@nvidia.com>
yizhuoz004
force-pushed
the
aiperf-asr
branch
from
October 15, 2026 02:24
c907f17 to
572e28d
Compare
18 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Background
Closes #1670; part of #1667. Serve complete prerecorded audio through the existing native server so pip-installed AIPerf can qualify real speech-to-text inference.
Exit Criteria
/v1/audio/transcriptionsinvokes a declared native transcription Task and returns the complete transcript.Implementation
ITranscriptionand public SDKSpeechTranscriptioncapabilities. Reuse native media I/O; family preprocessing, resampling, decoding, and model math remain family-owned.max_output_tokensis an explicit TRTMC extension passed through declared native configuration.python-multipartto optional serving/test dependencies.Public Task ABI, bundle format, numerical criteria, and checkpoint weights are unchanged. The Whisper family now honors checkpoint GELU in the convolution stem and encoder/decoder MLPs, evaluating its negative tail in FP32 before restoring the graph dtype. The explicitly FP32 encoder also disables TF32 operand rounding; the first checkpoint convolution RMSE against FP32 PyTorch drops from 6.37e-5 to 1.35e-7 on the same input. The decoder computes the output projection in FP32 before token selection, preserving close candidate differences that a cast after FP16 computation loses; TF32 is disabled for this FP32 boundary as well. Older Whisper bundles require rebuilding. The correction stays within the owning family; no sibling family implementation changes.
Change categories
Validation
Commands and Results
Tested head:
572e28db766daa0279e4dbec90e7f615420d732c; base:d45de067106482104fe0564edef4cf030ece772c. The worktree was clean for the fresh final corpus and published-client run after the GELU, FP32 encoder, and output projection corrections.PYTHONPATH=apps/server/python:apps/perf_serving:apps/aiperf_qual:core/builder:. \ python -m pytest apps/server/python/tests apps/perf_serving/tests -q --import-mode=importlib ctest --test-dir build --output-on-failure \ -R '^server_(worker|sdk_worker|sdk_worker_process|embedding_worker|ranking_worker|transcription_worker)$' PYTHONPATH=core/builder:apps/benchmark:. python -m pytest \ families/whisper/tests/test_e2e.py --e2e-model whisper-tiny-fp16 \ --e2e-testcase whisper-tiny-fp16 -q PYTHONPATH=core/builder:apps/benchmark:. python -m tools.community_ci source-quality --base github/main npm --prefix website run test:model-support npm --prefix website run build git diff --check github/main...HEADmax_wer_to_reference=0.1, maximum increase from reference0.02).Throughput uses the measured client request span. Audio seconds/s divides the sum of measured clip durations (457.625 seconds) by that span. Per-request RTF divides client latency or Task-call time in seconds by actual clip duration. Build/load/startup, verification, and warmup are excluded. Prototype runs are excluded from performance reporting.
Hardware, Environment, and Revisions
Current GPU serving/reference environment: PyTorch 2.12.0+cu130, Transformers 5.2.0, FastAPI 0.141.1, Pydantic 2.14.1, Uvicorn 0.52.4, python-multipart 0.0.32; published client AIPerf 0.13.0, preparation SoundFile 0.13.1.
One NVIDIA GB300; Linux aarch64; TensorRT 11.1.0.106; CUDA toolkit 13.3; driver 580.105.08; Python 3.12.3. Checkpoint
openai/whisper-tinyrevision169d4a4341b33bc18d8881c4b69c2e104e1cc0af, FP16 with the profile's FP32 encoder selector 0 and family-owned FP32 normalization/GELU arithmetic, FP32 output projection, TF32 disabled for the FP32 encoder and decoder output boundary, decoder context 128, output limit 120, one persistent replica. LibriSpeechopenslr/librispeech_asrrevision71cacbfb7e2354c4226d01e70d77d5fca3d04ba1, test-clean IDs6930-75918-0000through0009; complete clips range from 3.315 to 23.315 seconds. Reference uses the same checkpoint/inputs at its profile-declared FP32 precision. Bundle SHA-256:4b79f533903ca8b0a060298c427effe3c3e9fab640f09a7fb66c115647e4f9d1.Not Run / Remaining Gaps
Other ASR models, stereo and non-WAV input, streaming, translations, audio QA, and capacity sweeps are outside this recorded-clip pilot and have not been qualified. TP2/TP4 and Whisper BF16 were not rerun. The existing ASGI 2.4 disconnect test fails on the old minimum serving stack on main as well; this stage does not modify streaming behavior. ASR-specific minimum-version tests pass.
Contributor Self-Review
I reviewed family isolation, declared capabilities/configuration, PCM identity, complete outputs, request/resource lifetime, errors, timing boundaries, package/checkpoint/data pins, and evidence scope.
Notes For Future Readers
Review the upload lifetime/cancellation boundary, strict multipart schema, native Task dispatch, and input/output identity checks first. This stage qualifies one recorded-clip pilot. Other ASR models, codecs, stereo input, streaming, translated speech, audio QA, and capacity sweeps require separate evidence. The 50-request run is an integration example, not a statistical performance gate; it establishes no incremental TTFT/ITL or parallel GPU batching. Generated reports, clips, bundles, and environment state are excluded from this PR.
Risk level
Risk: medium. The change adds an upload endpoint, resource cleanup, and family-local Whisper activation/FP32 encoder/logit corrections requiring bundle rebuilds; native/HTTP regressions and real family/client qualification cover those paths. Merge requires all current-head checks, including the protected internal premerge gate.