StephennFernandes's picture
Anuvani-Diarization 1.0.0
63dd946
|
Raw History Blame Contribute Delete
14.7 kB
# TensorRT for the diarization networks
What TensorRT offers and demands for the two networks (pruned WavLM-Large + Conformer segmentation; fbank + ResNet34
voiceprints): typing, precision, shape profiles, attention, normalisation, the ONNX operators the front ends need,
build settings, portability and accuracy tools. Facts carry the TensorRT release they come from: 10.5 (Triton 24.10),
10.11 (25.06), 10.16 (26.05) or 11.x (documentation set 11.4.0, dated 5 October 2026). Checked 9 October 2026.
## Which TensorRT each image carries
- Triton 24.10 ships TensorRT 10.5.0.18, 25.06 ships 10.11.0.33 and 26.05 ships 10.16.1.11 [25], so none of these images
carries TensorRT 11 (inference); 15-triton-image-versions.md covers the images.
## Strong typing: TensorRT 10 against TensorRT 11
- Strongly typed: "TensorRT's optimizer will statically infer intermediate tensor types based on the network input
types and the operator specifications". Weakly typed: the optimiser "can substitute different precisions for tensors
... if it increases performance", defaulting to FP32 for floating-point operations [26].
- In TensorRT 10 strong typing is opt-in: `NetworkDefinitionCreationFlag.STRONGLY_TYPED`, or `trtexec --stronglyTyped`,
with which "builder precision flags such as `--int8` or `--best` ... is not allowed" [7].
- TensorRT 10.12 deprecated the weak-typing APIs: BuilderFlag kINT8, kFP8, kFP16, kBF16, the two precision-constraint
flags, `ILayer::setPrecision` and `ILayer::setOutputType` [2]. They still work in 10.5 and 10.11.
- TensorRT 11.0: "Strongly typed networks are now the default" and "Weak typing is no longer supported"; the
per-precision BuilderFlags (kFP16, kBF16, kFP8, kINT8, kINT4, kFP4, kOBEY/kPREFER_PRECISION_CONSTRAINTS),
`setType`, `setDynamicRange`, `setPrecision` and `setOutputType` were removed, as were implicit quantisation and
`IInt8Calibrator` [1].
- trtexec in 11.x removed `--fp16`, `--bf16`, `--int8`, `--fp8`, `--int4`, `--best`, `--precisionConstraints`,
`--layerPrecisions`, `--layerOutputTypes` and `--calib`; `--stronglyTyped` is a no-op; CUDA graphs, spin-wait and the
separate profile run are on by default [4, 6]. The replacement for `--fp16` is ModelOpt AutoCast on the ONNX file
(`python -m modelopt.onnx.autocast --onnx_path model.onnx`), or Cast nodes / `addCast` placed by hand [3, 4].
- `kTF32` survives: it "is permitted as it controls TF32 Tensor Core usage for FP32 types" [5].
## Precision on the target GPUs
- Support matrix (same rows in every 10.x release and in 11.4): compute capability 8.6 supports FP32, TF32, FP16, BF16
and INT8, with FP8 and FP4 not applicable; 7.5 (T4) supports FP32, FP16 and INT8, with TF32 and BF16 not
applicable [8].
- TF32 is on by default: "TF32, enabled by default in TensorRT, uses an 8-bit exponent and a 10-bit mantissa" [9];
`BuilderFlag.TF32` "Allow (but not require) computations on tensors of type DataType.FLOAT to use TF32", enabled by
default [10]. Turn it off with `trtexec --noTF32` ("default is to enable tf32, in addition to fp32") [6] or
`config.clear_flag(trt.BuilderFlag.TF32)`, which is what Polygraphy does [22].
## Optimisation profiles for the window batch
- A profile gives MIN, OPT and MAX dimensions per input (`trtexec --minShapes= --optShapes= --maxShapes=` [6, 7]);
OPT is the shape the auto-tuner optimises for, and "Some operations have tactics that only work for MIN=OPT=MAX, so
when these values differ, the tactic is disabled"; memory use can change sharply with the three values [12].
- Each execution context must use its own optimisation profile; with dynamic inputs the profile index must not be in
use by another live context; select it with `setOptimizationProfileAsync(index, stream)` [12].
## Attention and normalisation
- Fusion target: softmax(Q·Kᵀ ⊗ mask)·V, built with `IAttention` (recommended; Q or K pre-multiplied by the attention
scale, or both by its square root) or with MatMul, Softmax and MatMul layers [14]. `IAttention` arrived in 10.14.1 [16].
- Fused attention on SM75-SM90: FP16 with 16 ≤ H ≤ 256 and H % 8 == 0, no sequence-length limit;
BF16 on SM80+ with the same head rule; INT8 only for H in {16, 32, 64} and S ≤ 512; FP8 on SM89+ only [15]. The
tables have no FP32 or TF32 column [14, 15]. An `IAttention` with no fused kernel fails the build unless
`setDecomposable` is called [15]. Check with `trtexec --loadEngine=model.engine --profilingVerbosity=detailed
--dumpLayerInfo --skipInference` and look for the `mha` op [14].
- ONNX `LayerNormalization` is supported for FP32, FP16 and BF16, first output only [17]. PyTorch 2.1.1 emits it from
its opset-17 exporter (`aten::layer_norm`) [27]; the 10.5 parser accepts opsets 9 to 20 [17].
- `INormalizationLayer`: "The compute precision defaults to DataType::kFLOAT32", a setting that exists "to avoid
overflow errors ... in mixed precision mode"; a strongly typed network rejects `setComputePrecision` "since the
compute precision is typically controlled by casting the input tensors"; deprecated in 10.16 [13].
## Convolutions and the front ends
- TensorRT 10.0 disabled and deprecated the cuDNN and cuBLAS tactic sources [11]; in 10.16.1 cuBLAS, cuBLASLt and
cuDNN are off by default, edge-mask and JIT convolutions on [10]. TensorRT 11.0 dropped plugins that need cuDNN [1].
- 1-D convolutions (the 7-layer waveform front end): the 10.5 parser unsqueezes a rank-3 Conv input to 2-D ("Expand
spatial dims from 1D to 2D") and squeezes back [18].
- Fbank operators: ONNX `DFT` is unsupported in the 10.5 and 10.11 matrices and supported in 11.3 through a
cuFFT-backed plugin (axis -2; FP16/BF16 need power-of-two lengths) [17]. `STFT` is FP32-only in 10.x (initialiser
frame_step and window, real input), FP32/FP16/BF16 in 11.3 [17], and the 10.5 parser builds it "via decomposion into
1D convs" [18]. `MelWeightMatrix` is unsupported throughout [17].
- `kaldi.fbank` runs `torch.fft.rfft`, `abs`, `pow(2)`, a `torch.mm` with the mel banks and `max(eps).log()` [28];
pyannote's WeSpeaker wrapper maps it over windows with `torch.vmap` [29].
## Build settings and portability
- The timing cache is "specific to the targeted device, CUDA, TensorRT versions, and BuilderConfig parameters that
can change the layer implementation, such as BuilderFlag::kTF32 or BuilderFlag::kREFIT" [19]; save and load it with
`--timingCacheFile=<file>` [6]. Optimisation level: default 3, valid 0 to 5; lower builds much faster but the engine
can be slower, higher builds longer and can find better tactics [6, 19].
- "By default, TensorRT engines are compatible only with the version of TensorRT used to build them" and "only
compatible with the type of device where they were built" [20]. Version-compatible engines (`--versionCompatible`)
embed a lean runtime, run TensorRT 10 engines on an 11 runtime, and "can be slower" [20, 6]. Hardware compatibility
`kAMPERE_PLUS` (10.5 trtexec: `none|ampere+`) drops architecture-specific tactics; `kSAME_COMPUTE_CAPABILITY` (11.x)
is generally faster than `kAMPERE_PLUS` [20, 6].
## Checking accuracy with Polygraphy
- `polygraphy run model.onnx --trt --onnxrt --input-shapes X:[...]` compares TensorRT with ONNX-Runtime; `--atol`,
`--rtol` and `--check-error-stat elemwise|mean|median|max` set the test [21]. Per-layer: `--trt-outputs mark all
--onnx-outputs mark all` (10.5) or `'*'` (11.3), which "can sometimes perturb the generated engine" [21].
- Polygraphy leaves TF32 off unless `--tf32` is given ("TF32 is disabled by default") [22], the opposite of trtexec [6].
- `polygraphy debug precision` ("[EXPERIMENTAL] Iteratively mark layers to run in a higher precision") sets
`layer.precision` [23], an API TensorRT 11 removed [1], so it needs TensorRT 10 (inference).
## Unverified
- Whether `torch.onnx` 2.1.1 exports `torch.fft.rfft` or `torch.vmap` (no rfft symbolic in opsets 9, 13, 17; rest unread).
- The fused-attention table as printed for TensorRT 10.5 itself ([14] is the 10.x set at 10.16.1).
- Whether WavLM's gated relative position bias, an additive per-head T x T term, still matches the fusion pattern.
## What this means for the diarization model
- Engines must be built with the TensorRT of the serving image, on the GPU model that will run them: 10.5.0.18 for
24.10, rebuilt for 10.16.1.11 if serving moves to 26.05 (inference from [20, 25]). A T4 has no TF32 or BF16 path
[8].
- An "FP32" engine is TF32 unless built with `--noTF32`, and even then it is a different kernel set from PyTorch 2.1.1,
so TensorRT belongs to the faster lane, never the exact lane (inference from [6, 9]).
- WavLM's head size is 64 (1024 / 16 heads upstream [24]), inside the FP16 fused range and, on SM80+, the BF16 range;
799 frames are above the INT8 limit of 512 [15]. Per-layer head counts of 0 to 10 give a different attention shape
per layer, and the four attention-free layers have nothing to fuse (inference).
- Keep the fbank in PyTorch FP32 and hand the ResNet34 engine (B, frames, 80) features: DFT is unsupported in the
10.x parser and the vmap export is unverified (inference from [17, 28, 29]).
- Profile the window batch with OPT = 8 (one block) and MAX = the largest packed request; a static profile of exactly
8 keeps MIN=OPT=MAX tactics; two CUDA streams need two TensorRT execution contexts and two profiles (inference from
[12]). Localise divergence with Polygraphy per-layer comparisons against ONNX-Runtime FP32; DER decides (inference).
## Sources
1. TensorRT 11.0.0 Release Notes - https://docs.nvidia.com/deeplearning/tensorrt/latest/getting-started/release-notes-11/11.0.0.html - TensorRT 11.0.0.
2. TensorRT 10.12.0 Release Notes - https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/getting-started/release-notes-10/10.12.0.html - TensorRT 10.12.0.
3. Migrating from TensorRT 10.x to 11.x - https://docs.nvidia.com/deeplearning/tensorrt/latest/api/migration/tensorrt-10x-to-11x.html - TensorRT 11.x (docs 11.4.0).
4. trtexec migration 10.x to 11.x - https://docs.nvidia.com/deeplearning/tensorrt/latest/api/migration/tensorrt-10x-to-11x-trtexec.html - TensorRT 11.x.
5. Precision Control - https://docs.nvidia.com/deeplearning/tensorrt/latest/inference-library/precision-control.html - TensorRT 11.x (docs 11.4.0).
6. trtexec help text, samples/common/sampleOptions.cpp - https://github.com/NVIDIA/TensorRT/blob/release/10.5/samples/common/sampleOptions.cpp and https://github.com/NVIDIA/TensorRT/blob/release/11.3/samples/common/sampleOptions.cpp - TensorRT OSS release/10.5 and release/11.3.
7. trtexec README - https://github.com/NVIDIA/TensorRT/blob/release/10.5/samples/trtexec/README.md - release/10.5.
8. Support Matrix, GPU architecture and precision support - https://docs.nvidia.com/deeplearning/tensorrt/latest/getting-started/support-matrix.html and https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/getting-started/support-matrix.html - TensorRT 11.4.0 and 10.0.0 EA to 10.16.1.
9. Accuracy Considerations - https://docs.nvidia.com/deeplearning/tensorrt/latest/inference-library/accuracy-considerations.html - TensorRT 11.4.0.
10. Python API, BuilderConfig - https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/_static/python-api/infer/Core/BuilderConfig.html - TensorRT 10.16.1.
11. TensorRT 10.0.0 EA Release Notes - https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/getting-started/release-notes-10/10.0.0-ea.html - TensorRT 10.0.0 EA.
12. Dynamic Shapes: Core Concepts - https://docs.nvidia.com/deeplearning/tensorrt/latest/inference-library/dynamic-shapes-basics.html - TensorRT 11.4.0.
13. INormalizationLayer (C++ API; Python API Layers page) - https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/_static/c-api/classnvinfer1_1_1_i_normalization_layer.html and https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/_static/python-api/infer/Graph/Layers.html - TensorRT 10.16.1.
14. Working with Transformers (multi-head attention fusion) - https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/inference-library/work-with-transformers.html - TensorRT 10.x docs set (10.16.1).
15. Fused Attention - https://docs.nvidia.com/deeplearning/tensorrt/latest/inference-library/transformers-fused-attention.html - TensorRT 11.4.0.
16. TensorRT 10.14.1 Release Notes - https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/getting-started/release-notes-10/10.14.1.html - TensorRT 10.14.1.
17. onnx-tensorrt Supported ONNX Operators - https://github.com/onnx/onnx-tensorrt/blob/10.5-GA/docs/operators.md (header reads TensorRT 10.4, opsets 9-20), https://github.com/onnx/onnx-tensorrt/blob/10.11-GA/docs/operators.md (10.11, opsets 9-23), https://github.com/onnx/onnx-tensorrt/blob/main/docs/operators.md (11.3, opsets 9-24).
18. onnx-tensorrt Conv and STFT importers - https://github.com/onnx/onnx-tensorrt/blob/10.5-GA/onnxOpImporters.cpp - branch 10.5-GA.
19. Optimizing Builder Performance - https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/performance/builder-performance.html - TensorRT 10.x docs set (10.16.1).
20. Engine Compatibility - https://docs.nvidia.com/deeplearning/tensorrt/latest/inference-library/engine-compatibility.html - TensorRT 11.4.0.
21. Polygraphy example, Comparing Frameworks - https://github.com/NVIDIA/TensorRT/blob/release/10.5/tools/Polygraphy/examples/cli/run/01_comparing_frameworks/README.md and the release/11.3 copy - release/10.5 and release/11.3.
22. Polygraphy CreateConfig source - https://github.com/NVIDIA/TensorRT/blob/release/11.3/tools/Polygraphy/polygraphy/backend/trt/config.py - release/11.3.
23. Polygraphy debug precision source - https://github.com/NVIDIA/TensorRT/blob/release/11.3/tools/Polygraphy/polygraphy/tools/debug/subtool/precision.py - release/11.3.
24. microsoft/wavlm-large config.json - https://huggingface.co/microsoft/wavlm-large/blob/main/config.json - main branch.
25. Triton release notes 24.10, 25.06, 26.05 - https://docs.nvidia.com/deeplearning/triton-inference-server/release-notes/rel-24-10.html, .../rel-25-06.html, .../rel-26-05.html - those releases.
26. TensorRT capabilities, Strong Typing vs Weak Typing - https://docs.nvidia.com/deeplearning/tensorrt/10.x.x/architecture/capabilities.html - TensorRT 10.x docs set (10.16.1).
27. PyTorch ONNX exporter, symbolic_opset17.py - https://github.com/pytorch/pytorch/blob/v2.1.1/torch/onnx/symbolic_opset17.py - PyTorch v2.1.1.
28. torchaudio kaldi.py - https://github.com/pytorch/audio/blob/v2.1.1/torchaudio/compliance/kaldi.py - torchaudio v2.1.1.
29. pyannote WeSpeaker wrapper - https://github.com/pyannote/pyannote-audio/blob/3.1.1/pyannote/audio/models/embedding/wespeaker/__init__.py - pyannote-audio 3.1.1.