Model card and RUNTIME.md: add the INT8x2 research runtime's results

#2
by rajb3 - opened
Files changed (2) hide show
  1. README.md +11 -8
  2. 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
- speed needs our
176
- [custom CUDA runtime](https://github.com/ajbarryiii/wilderness-labs-stt/tree/main/finetune/parakeet-ternary/inference)
177
- on GitHub, not `load_ternary.py`. The runtime's compact
178
- mode uses 1.27 GB of process VRAM, 41.8% less than that build. All configurations, the 3 s and
179
- 30.04 s clips and the method are in [RUNTIME.md](RUNTIME.md).
 
 
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`. NVIDIA's published row, the difference and
196
- ratio rows and the scoring details are in [EVALUATION.md](EVALUATION.md).
 
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 the custom CUDA runtime on GitHub. They were
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.