Automatic Speech Recognition
NeMo
English
speech
audio
NeMo
parakeet
TDT
FastConformer
quantization
ternary
bitnet
quantization-aware-training
knowledge-distillation
Eval Results (legacy)
Instructions to use rajb3/kea-t with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- NeMo
How to use rajb3/kea-t with NeMo:
import nemo.collections.asr as nemo_asr asr_model = nemo_asr.models.ASRModel.from_pretrained("rajb3/kea-t") transcriptions = asr_model.transcribe(["file.wav"]) - Notebooks
- Google Colab
- Kaggle
Model card and RUNTIME.md: add the INT8x2 research runtime's results
#2
by rajb3 - opened
- README.md +11 -8
- RUNTIME.md +77 -3
README.md
CHANGED
|
@@ -171,12 +171,14 @@ quantization-aware training (QAT) with distillation from the original model. Its
|
|
| 171 |
|
| 172 |
The original's size is NVIDIA's `.nemo` file, and its WER is the FP32 model as we scored it.
|
| 173 |
The speed rows are warm batch-one transcription on one RTX 5090 at a 400 W power limit, Kea-T
|
| 174 |
-
in expanded mode against our own optimized BF16 build of the original (not stock NeMo). That
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
|
|
|
|
|
|
| 180 |
|
| 181 |
## Results
|
| 182 |
|
|
@@ -192,8 +194,9 @@ test bundle. TED-LIUM isn't in that bundle, so the mean covers the other seven s
|
|
| 192 |
Voice is shown on its own. Decoding is greedy in strict FP32, and both the references and the
|
| 193 |
outputs go through the Whisper English text normalizer. Our scoring of the FP32 original
|
| 194 |
reproduces NVIDIA's published numbers within 0.09 points per set. Kea-T was scored once, on the
|
| 195 |
-
model rebuilt from this exact `export.safetensors`
|
| 196 |
-
|
|
|
|
| 197 |
|
| 198 |
## How it was trained
|
| 199 |
|
|
|
|
| 171 |
|
| 172 |
The original's size is NVIDIA's `.nemo` file, and its WER is the FP32 model as we scored it.
|
| 173 |
The speed rows are warm batch-one transcription on one RTX 5090 at a 400 W power limit, Kea-T
|
| 174 |
+
in expanded mode against our own optimized BF16 build of the original (not stock NeMo). That speed
|
| 175 |
+
needs our [custom CUDA runtime](https://github.com/ajbarryiii/wilderness-labs-stt/tree/main/finetune/parakeet-ternary/inference)
|
| 176 |
+
on GitHub, not `load_ternary.py`. The runtime's compact mode uses 1.27 GB of process VRAM, 41.8%
|
| 177 |
+
less than that build. All configurations, the 3 s and 30.04 s clips and the method are in
|
| 178 |
+
[RUNTIME.md](RUNTIME.md). Our research runtime with two-part INT8 activations is faster still: at
|
| 179 |
+
10 s, 4.30 ms (25.9% lower than the BF16 build) and about 1.33 J (about 30% less), measured in a
|
| 180 |
+
later session, so the energy comparison is approximate
|
| 181 |
+
([details](RUNTIME.md#research-runtime-with-int8x2-activations)).
|
| 182 |
|
| 183 |
## Results
|
| 184 |
|
|
|
|
| 194 |
Voice is shown on its own. Decoding is greedy in strict FP32, and both the references and the
|
| 195 |
outputs go through the Whisper English text normalizer. Our scoring of the FP32 original
|
| 196 |
reproduces NVIDIA's published numbers within 0.09 points per set. Kea-T was scored once, on the
|
| 197 |
+
model rebuilt from this exact `export.safetensors`; on our development sets, both GPU runtimes give
|
| 198 |
+
the same mean WER as FP32 decoding (6.09%). NVIDIA's published row, the difference and ratio rows
|
| 199 |
+
and the scoring details are in [EVALUATION.md](EVALUATION.md).
|
| 200 |
|
| 201 |
## How it was trained
|
| 202 |
|
RUNTIME.md
CHANGED
|
@@ -58,9 +58,10 @@ a 400 W power limit:
|
|
| 58 |
|
| 59 |
Both ternary modes use the weights in this repository and keep the non-ternary
|
| 60 |
tensors in floating point. Both run the ternary matrices on INT8 Tensor Cores, with
|
| 61 |
-
each activation split into three residual INT8 components, int32 accumulation and
|
| 62 |
FP32 outputs, and both run a fused FP32 prediction/joint decoder, with NeMo's greedy
|
| 63 |
-
TDT loop in conditional CUDA graphs.
|
|
|
|
| 64 |
|
| 65 |
## Method
|
| 66 |
|
|
@@ -94,8 +95,81 @@ has usage and reproduction steps, and
|
|
| 94 |
[rtx5090.json](https://github.com/ajbarryiii/wilderness-labs-stt/blob/main/finetune/parakeet-ternary/inference/results/rtx5090.json)
|
| 95 |
has the evidence, including p95 latency, every window and the GPU clocks.
|
| 96 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
## Limitations
|
| 98 |
|
| 99 |
-
The runtime results apply only to
|
| 100 |
measured on one RTX 5090 at a 400 W limit, warm, at batch one, with one clip per
|
| 101 |
length. Other GPUs, batch sizes, cold starts and host energy were not measured.
|
|
|
|
| 58 |
|
| 59 |
Both ternary modes use the weights in this repository and keep the non-ternary
|
| 60 |
tensors in floating point. Both run the ternary matrices on INT8 Tensor Cores, with
|
| 61 |
+
each activation split into three residual INT8 components ("x3"), int32 accumulation and
|
| 62 |
FP32 outputs, and both run a fused FP32 prediction/joint decoder, with NeMo's greedy
|
| 63 |
+
TDT loop in conditional CUDA graphs. Our research runtime uses two components ("x2"); see
|
| 64 |
+
[below](#research-runtime-with-int8x2-activations).
|
| 65 |
|
| 66 |
## Method
|
| 67 |
|
|
|
|
| 95 |
[rtx5090.json](https://github.com/ajbarryiii/wilderness-labs-stt/blob/main/finetune/parakeet-ternary/inference/results/rtx5090.json)
|
| 96 |
has the evidence, including p95 latency, every window and the GPU clocks.
|
| 97 |
|
| 98 |
+
## Research runtime with INT8x2 activations
|
| 99 |
+
|
| 100 |
+
Our [research runtime](https://github.com/ajbarryiii/wilderness-labs-stt/blob/main/finetune/parakeet-binary/gpu1bit/README.md)
|
| 101 |
+
runs the expanded mode above with each activation split into two residual INT8 components
|
| 102 |
+
instead of three, with the same weights. Speed measured with our research runtime on an RTX 5090;
|
| 103 |
+
the runtime code is published for reference and is not packaged for general use.
|
| 104 |
+
|
| 105 |
+
Warm batch-one transcription of the same clips on one RTX 5090 at a 400 W power limit. The Kea-T
|
| 106 |
+
rows were measured side by side in one session; the original's rows are the earlier session's
|
| 107 |
+
(see [Method and comparing across sessions](#method-and-comparing-across-sessions)):
|
| 108 |
+
|
| 109 |
+
| Clip | Configuration | Latency (ms) | Process VRAM (GB) | GPU energy (J) | Avg GPU power (W) |
|
| 110 |
+
| --- | --- | ---: | ---: | ---: | ---: |
|
| 111 |
+
| 3 s | Original FP32 — NeMo | 10.37 | 3.41 | 2.98 | 283 |
|
| 112 |
+
| 3 s | Original BF16 — optimized by Wilderness Labs | 4.25 | 2.11 | 1.15 | 271 |
|
| 113 |
+
| 3 s | Kea-T expanded, x3 activations | 2.72 | 1.74 | 0.73 | 268 |
|
| 114 |
+
| 3 s | **Kea-T expanded, x2 activations (research runtime)** | 2.67 | 1.74 | 0.66 | 247 |
|
| 115 |
+
| 10 s | Original FP32 — NeMo | 18.74 | 3.49 | 5.75 | 304 |
|
| 116 |
+
| 10 s | Original BF16 — optimized by Wilderness Labs | 5.81 | 2.18 | 1.90 | 326 |
|
| 117 |
+
| 10 s | Kea-T expanded, x3 activations | 4.46 | 1.89 | 1.51 | 338 |
|
| 118 |
+
| 10 s | **Kea-T expanded, x2 activations (research runtime)** | 4.30 | 1.89 | 1.33 | 310 |
|
| 119 |
+
| 30.04 s | Original FP32 — NeMo | 36.30 | 3.67 | 13.17 | 362 |
|
| 120 |
+
| 30.04 s | Original BF16 — optimized by Wilderness Labs | 11.56 | 2.35 | 4.48 | 386 |
|
| 121 |
+
| 30.04 s | Kea-T expanded, x3 activations | 10.51 | 2.23 | 3.81 | 362 |
|
| 122 |
+
| 30.04 s | **Kea-T expanded, x2 activations (research runtime)** | 9.88 | 2.24 | 3.50 | 354 |
|
| 123 |
+
|
| 124 |
+
At 10 s, against our BF16 build, x2 has 25.9% lower latency, 13.4% lower process VRAM and uses
|
| 125 |
+
about 30% less GPU energy. Its latency saving is roughly constant per transcription (1.6, 1.5 and
|
| 126 |
+
1.7 ms at 3, 10 and 30.04 s), while the energy saving grows with clip length (about 0.49, 0.56
|
| 127 |
+
and 0.98 J). **Original FP32 — NeMo** is NVIDIA's checkpoint run by NeMo in strict FP32, with
|
| 128 |
+
NeMo's full CUDA-graph decoder.
|
| 129 |
+
|
| 130 |
+
### x2 against x3, side by side
|
| 131 |
+
|
| 132 |
+
The two expanded runtimes differ only in the number of activation components; x3 is the
|
| 133 |
+
expanded configuration of the results above. They were measured in the same session on 24
|
| 134 |
+
development utterances (8 each with target lengths of 3, 10 and 30 s). Each value is the median
|
| 135 |
+
of the per-utterance changes; in parentheses, the utterances where x2 was lower:
|
| 136 |
+
|
| 137 |
+
| Scope | GPU energy | Latency |
|
| 138 |
+
| --- | ---: | ---: |
|
| 139 |
+
| Full transcription | 10.1% less (24 of 24) | 3.0% lower (24 of 24) |
|
| 140 |
+
| Encoder only | 9.7% less (24 of 24) | 7.0% lower (24 of 24) |
|
| 141 |
+
|
| 142 |
+
x2 makes two INT8 passes per matrix instead of three, and the average power during full
|
| 143 |
+
transcription fell from 335 W to 304 W. The same comparisons on 24 test utterances agree within
|
| 144 |
+
0.4 points.
|
| 145 |
+
|
| 146 |
+
### Recognition with x2
|
| 147 |
+
|
| 148 |
+
On the full development sets (22,418 utterances, batch one), the runtime's mean WER is 6.0853%
|
| 149 |
+
with x2 and 6.0856% with x3; FP32 decoding of this export gives 6.0856%. The test sets were not
|
| 150 |
+
re-scored with the runtime, so the card's test WERs are from FP32 decoding.
|
| 151 |
+
|
| 152 |
+
### Method and comparing across sessions
|
| 153 |
+
|
| 154 |
+
Each Kea-T configuration ran in two fresh processes, in opposite configuration orders; the table
|
| 155 |
+
shows their mean. The two processes agreed exactly on process VRAM. Otherwise the method is the
|
| 156 |
+
one above.
|
| 157 |
+
|
| 158 |
+
The original's rows were measured with the same clips, protocol, GPU and driver in the earlier
|
| 159 |
+
session, not side by side with x2. Kea-T's x3 runtimes, remeasured on the same clips against
|
| 160 |
+
their earlier records, show how well the numbers carry over: they agreed within 1% on latency but
|
| 161 |
+
only within 8% on energy, and the expanded runtime's process VRAM was identical. The latency and
|
| 162 |
+
memory comparisons are therefore solid, and the energy comparison is approximate.
|
| 163 |
+
|
| 164 |
+
### Requirements of the research runtime
|
| 165 |
+
|
| 166 |
+
It runs on SM120 GPUs (RTX 5090) only and was measured with torch 2.11.0+cu128, triton 3.6.0,
|
| 167 |
+
nemo_toolkit 3.0.0 and Python 3.13.
|
| 168 |
+
[RESULTS.md](https://github.com/ajbarryiii/wilderness-labs-stt/blob/main/finetune/parakeet-binary/gpu1bit/RESULTS.md)
|
| 169 |
+
has the evidence.
|
| 170 |
+
|
| 171 |
## Limitations
|
| 172 |
|
| 173 |
+
The runtime results apply only to our runtimes on GitHub. They were
|
| 174 |
measured on one RTX 5090 at a 400 W limit, warm, at batch one, with one clip per
|
| 175 |
length. Other GPUs, batch sizes, cold starts and host energy were not measured.
|