Whisper Resident Knots — Voice as Fast as Text
End-to-end audio processing in sub-200ms using the same memory-resident quantization (GKQ) that powers text inference.
Overview
Whisper resident knots apply the Monster Mesh + GKQ pattern to audio models:
- Compression: 20–30 MB quantized weights (from 8 GB full precision Whisper-base)
- Deployment: Three-tier polyglot (Python training → Rust native → WASM-SIMD edge)
- Latency: <200ms end-to-end (audio frame → embeddings or tokens)
- Hot path: Memory-resident 20 MB knot per pod; encode/decode in <100ms per layer
Architecture
Encoder Path (12 transformer layers)
Audio Frame [16 kHz PCM]
↓
FFT → Mel-spectrogram [80 features × T frames]
↓
Conv1D + Conv1D [reduce time dim]
↓
12 Transformer Blocks (attention + FFN)
├─ Quantized attention weights: U @ diag(Σ) @ V^T
├─ Quantized FFN weights: U @ diag(Σ) @ V^T
├─ Reconstruction: <50ms per layer (cold)
└─ Cache: <5ms per layer (warm)
↓
Encoder Output [seq_len × 512]Decoder Path (12 transformer layers)
Token ID (or <|startoftranscript|>)
↓
Token Embedding [51865 vocab]
↓
12 Transformer Blocks (self-attention + cross-attention + FFN)
├─ Self-attention: causal mask (cannot attend to future tokens)
├─ Cross-attention: attends to encoder output
├─ FFN: same quantized pattern
├─ Reconstruction: <50ms per layer (cold)
└─ Cache: <5ms per layer (warm)
↓
Output Logits [51865 vocab]
↓
Softmax → Token IDQuantization (GKQ for Audio)
Same three-tier compression as LLM quantization:
Tier 1: Spectral (SVD)
Each weight matrix W is decomposed into 3 components:
W ≈ U[:, :3] @ diag(Σ[:3]) @ V^T[:3, :]Impact: 26–32x compression (keep top-3 singular values)
Tier 2: Hierarchical Folding
Encode relative structure (differences) instead of absolute values.
Impact: 8x additional compression
Tier 3: Quantization
Delta-encode uint8 arrays:
u_q8[i]stores the difference from previous value- Dequantize:
u[i] = (uint8 / 255) * u_max
Impact: 8x additional compression
Total: 20–30 MB per model size:
- Whisper-base (74M params): 20 MB quantized
- Whisper-small (244M params): 40 MB quantized
- Whisper-medium (769M params): 80 MB quantized
- Whisper-large (1.5B params): 150 MB quantized
File Format (Binary Knot)
Binary layout for quantized Whisper layer:
[Header: 20 bytes]
d_out: u32 (4 bytes)
d_in: u32 (4 bytes)
u_max: f32 (4 bytes)
sigma_max: f32 (4 bytes)
v_max: f32 (4 bytes)
[Quantized Components]
u_q8: [d_out × 3] bytes (delta-encoded)
sigma_q8: [3] bytes (delta-encoded)
v_q8: [3 × d_in] bytes (delta-encoded)Total per layer: 20 + d_out×3 + 3 + d_in×3 bytes
Example (Whisper-base attention layer, 512×512):
20 (header) + 512×3 + 3 + 512×3 = 20 + 1536 + 3 + 1536 = 3095 bytesPolyglot Deployment
Tier 1: Python Training (Offline)
File: distributed-inference/quantize-whisper-weights.py
python3 quantize-whisper-weights.py \
--model whisper-base \
--output whisper-base-gkq.knotGenerates:
- Binary knot file (20 MB)
- Quantization statistics (compression ratio, expected reconstruction latency)
Tier 2: Rust Native (Pod Default)
File: open-source/x-gnosis/gnosis-uring/src/whisper_resident.rs
Implements:
WhisperResidentCache: encoder/decoder layer cachingencode_audio_frame(): process mel-spectrogram → encoder outputdecode_from_encoder(): process encoder output → token logits- C FFI exports for inter-language calls
pub struct WhisperResidentCache {
encoder_layers: HashMap<u32, QuantizedAudioLayer>,
decoder_layers: HashMap<u32, QuantizedAudioLayer>,
reconstruction_cache: HashMap<u32, (Vec<f32>, u64)>, // (weights, timestamp)
gpu_cache_size_mb: u64,
max_age_seconds: u64,
}
impl WhisperResidentCache {
pub fn encode_audio_frame(&mut self, audio_mel: &[f32], now_secs: u64) -> Option<Vec<f32>>
pub fn decode_from_encoder(&mut self, encoder_output: &[f32], now_secs: u64) -> Option<Vec<f32>>
}C FFI:
extern "C" fn whisper_cache_process_audio(
audio_mel: *const f32,
audio_len: u32,
output: *mut f32,
) -> u32Tier 3: WASM-SIMD Edge (Cloudflare Workers)
Files:
aether/src/wasm-simd/simd-kernel-whisper-reconstruct.caether/src/wasm-simd/whisper-reconstruct.ts
Implements:
whisper_reconstruct_layer(): SIMD dequantize + matmul (via WASM)whisper_apply_causal_mask(): vectorized attention maskingwhisper_mel_scale_simd(): log-scale mel-spectrograms
export class WhisperReconstructor {
reconstruct(layer: WhisperQuantizedLayer): Float32Array
applyAttentionMask(weights: Float32Array, seqLen: number): void
scaleMelSpectrogram(melMagnitude: Float32Array): Float32Array
getStats(): { hitRate: number; reconstructions: number; ... }
}Latency Breakdown
End-to-End Audio Processing
Target: <200ms (single audio frame → token)
Audio Capture/Preprocessing: 10 ms (buffer alignment, format conversion)
FFT + Mel-spectrogram: 10 ms (80 frequency bins × log scale)
Conv layers: 10 ms (2×1D conv on mel-spec)
Encoder (12 layers): 80 ms (cold path, first request)
- Layer 1: 50 ms (reconstruct u/sigma/v)
- Layer 2: 5 ms (cache hit)
- Layer 3: 5 ms (cache hit)
- ...
- Layer 12: 5 ms (cache hit)
Decoder (12 layers): 100 ms (depends on token sequence length)
- Layer 1: 50 ms (reconstruct)
- Layer 2: 5 ms (cache hit)
- ...
─────────
190 ms totalReconstruction Latency (Single Layer)
Cold path (memory-resident → GPU cache):
- Delta-decode U, Σ, V^T: 30 ms (SIMD dequantize)
- Matrix multiply: 15 ms (U @ diag(Σ) @ V^T)
- GPU transfer: 5 ms (PCIe) ───── 50 ms
Warm path (GPU cache hit):
- GPU memory access: <1 ms (direct fetch)
- No reconstruction needed
Cache Strategy
Layer Selection (LRU)
Each pod maintains:
- Encoder: 2 hot layers cached (recent frames)
- Decoder: 2 hot layers cached (generation so far)
- Age-based eviction: layers >3600s old are freed
Hit Rate Prediction
For streaming audio (continuous 1-frame-per-30ms):
Frame 0: miss (cold start, all 24 layers) → ~600 ms
Frame 1: hit for layers 0–1 → ~150 ms
Frame 2: hit for all cached layers → ~50 ms
Frame N: hit rate ~80% (4 cached / 24) → ~100 msIntegration with Monster Mesh
Whisper resident knots work alongside LLM resident knots in distributed topology:
┌─────────────────────────────────────────────┐
│ Monster Mesh (2–8 nodes) │
├─────────────────────────────────────────────┤
│ Node 0: LLM layers 0–39 │
│ - Quantized: 40 layers × 500 MB = 20 GB │
│ - Resident: 40 × 20 MB = 800 MB │
│ │
│ Node 1: LLM layers 40–79 + Whisper Encoder │
│ - LLM: 40 × 20 MB = 800 MB │
│ - Whisper-base: 12 × 1.7 MB = 20 MB │
│ │
│ Node 2: Whisper Decoder + Conditioning │
│ - Whisper decoder: 12 × 1.7 MB = 20 MB │
│ - Conditioning models: ~50 MB │
├─────────────────────────────────────────────┤
│ Total resident: ~1.7 GB (was 280 GB LLM + 8 GB Whisper)
└─────────────────────────────────────────────┘Request flow:
User Audio
↓
[Node 1] Whisper Encoder (resident) → encoder_output
↓
[Node 1 or 2] Whisper Decoder (resident) → transcription tokens
↓
[Node 0] LLM (resident) → understanding / responseDeployment Checklist
-
quantize-whisper-weights.pyruns for all model sizes -
whisper_resident.rscompiles in gnosis-uring - Integration tests pass: correctness, latency, cache behavior
- WASM kernel builds:
build-whisper-kernels.sh - TypeScript wrapper loads from KV:
whisper-reconstruct.ts - End-to-end test: audio frame → embeddings in <200ms
- Monster Mesh topology includes Whisper nodes
- Monitoring: cache hit rate, reconstruction latency, throughput
Benchmarks
Training Phase (Offline)
quantize-whisper-weights.py --model whisper-base
Input: Whisper-base full weights (290 MB)
Output: whisper-base-gkq.knot (20 MB)
Time: ~30 seconds (SVD of 74M parameters)
Compression: 14.5xInference Phase (Online)
Whisper-base end-to-end (single frame):
Encoding: 50–150 ms (cold→warm)
Decoding (30 tokens): 100 ms
Total: 150–250 ms
(vs. 500ms+ with full precision or CDN fetch)