6.3 KiB
Quantization Specification
Document ID: SPEC-QUANT-001
Status: Draft
Date: 2026-04-20
Author: Research Stack Team
1. Overview
This specification defines the ternary weight quantization system for efficient neural network inference on WebGPU. The system achieves 10× memory reduction compared to FP16 while maintaining computational accuracy through fixed-point arithmetic.
2. Core Formulas
2.1 Ternary Weight Quantization
\tilde{W} = \text{RoundClip}\left(\frac{W}{\gamma + \epsilon}, -1, 1\right)
Where:
W: Original FP32/FP16 weight\gamma: Scaling factor (learned or fixed)\epsilon: Small constant for numerical stability (~2^{-12})\tilde{W} \in \{-1, 0, 1\}: Ternary quantized weight
Implementation Notes:
- Uses Q16_16 fixed-point arithmetic per AGENTS.md §1.4
- RoundClip operation: values
< 0.5 \to -1, values> 1.5 \to +1, else0 - 2 bits per weight (4 weights per byte when packed)
2.2 BitLinear Activation Scaling
\tilde{x} = \text{Clip}\left(x \times \frac{Q_b}{\eta + \epsilon}, -Q_b + \epsilon, Q_b - \epsilon\right)
Where:
x: Input activationQ_b: Bit width for quantization (typically 8 bits)\eta: Activation scaling factor\epsilon: Numerical stability constant
Dynamic Range:
- Preserves
[-Q_b, Q_b]range with $\epsilon$-margin for stability - Typical configuration:
Q_b = 8,\eta = 1.0,\epsilon = 2^{-12}
2.3 MLGRU Recurrence (MatMul-free)
h_t = f_t \odot h_{t-1} + (1 - f_t) \odot c_t
Properties:
- No matrix multiplication — only element-wise operations
f_t: Forget gate (element-wise)c_t: Candidate state (element-wise)\odot: Element-wise (Hadamard) product- Reduces computation from
O(d^2)toO(d)for dimensiond
2.4 Memory Reduction
M_{\text{Ternary}} \approx 0.1 \times M_{\text{FP16}} \quad (10\times \text{ reduction})
Breakdown:
| Format | Bits/Weight | Bytes/1000 Weights | Reduction |
|---|---|---|---|
| FP32 | 32 | 4000 | — |
| FP16 | 16 | 2000 | 2× |
| INT8 | 8 | 1000 | 4× |
| Ternary | 2 | 250 | 16× (before overhead) |
| Ternary (packed) | ~2.5 | ~313 | ~10× (with overhead) |
3. Formal Specification
3.1 Lean Formalization
File: 0-Core-Formalism/lean/Semantics/Semantics/Quantization.lean
def ternaryWeightQuant (W γ ε : Q16_16) : Ternary :=
roundClipTernary (W / (γ + ε)) ε
def bitLinearQuant (x η ε : Q16_16) : Q16_16 :=
let scale := activationScale η ε
clipActivation x scale ε
def gatedUpdate (f_t h_prev c_t : Q16_16) : Q16_16 :=
f_t * h_prev + (one - f_t) * c_t
3.2 Error Bounds
Theorem (Ternary Quantization Error):
|\tilde{W} - W| \leq |W| \cdot \epsilon + 1
Proof Sketch:
- Triangle inequality:
|\tilde{W} - W| \leq |\tilde{W}| + |W| - By construction:
|\tilde{W}| \leq 1 - Division by
(\gamma + \epsilon)introduces at most|W| \cdot \epsilonerror - Combined:
|\tilde{W} - W| \leq 1 + |W| \cdot \epsilon
3.3 MatMul-free Property
Theorem: MLGRU recurrence uses only element-wise operations.
Proof: The recurrence h_t = f_t \odot h_{t-1} + (1-f_t) \odot c_t involves:
- 2 element-wise multiplications (
\odot) - 1 element-wise subtraction (
1 - f_t) - 1 element-wise addition (
+)
No matrix multiplication (MatMul) operations are required.
4. WGSL Shader Kernels
4.1 Ternary Quantization Kernel
@compute @workgroup_size(256)
fn ternaryQuant(
@binding(0) weights: array<f32>,
@binding(1) gamma: f32,
@binding(2) epsilon: f32,
@binding(3) output: array<i32>
) {
let idx = global_id.x;
let w = weights[idx];
let scaled = w / (gamma + epsilon);
var tern: i32;
if (scaled < 0.5) {
tern = -1;
} else if (scaled > 1.5) {
tern = 1;
} else {
tern = 0;
}
output[idx] = tern;
}
4.2 MLGRU Kernel
@compute @workgroup_size(256)
fn mlgruKernel(
@binding(0) forget: array<f32>,
@binding(1) h_prev: array<f32>,
@binding(2) candidate: array<f32>,
@binding(3) output: array<f32>
) {
let idx = global_id.x;
let f = forget[idx];
let h = h_prev[idx];
let c = candidate[idx];
// h_t = f * h_{t-1} + (1-f) * c_t
output[idx] = f * h + (1.0 - f) * c;
}
5. Orchestrator Integration
The quantization system integrates with the existing orchestrator:
# infra/access_control/orchestrator.py
async def dispatch_ternary_quantization(
weights: Tensor,
gamma: float,
epsilon: float = 2**-12
) -> TernaryTensor:
"""Dispatch ternary quantization to WebGPU."""
kernel = webgpu_runtime.SHADER_TERNARY_QUANT
return await webgpu_runtime.execute_compute(
kernel,
bindings=[weights, gamma, epsilon]
)
async def dispatch_mlgru_step(
forget_gate: Tensor,
h_prev: Tensor,
candidate: Tensor
) -> Tensor:
"""Dispatch single MLGRU recurrence step."""
kernel = webgpu_runtime.SHADER_MLGRU
return await webgpu_runtime.execute_compute(
kernel,
bindings=[forget_gate, h_prev, candidate]
)
6. Hardware Requirements
| Component | Requirement | Notes |
|---|---|---|
| WebGPU | Compute shader support | @compute kernels |
| Storage | 2 bits/weight | Packed ternary format |
| Compute | Element-wise only | No MatMul required |
| Bandwidth | ~10× reduction | vs FP16 weights |
7. References
- Formal:
0-Core-Formalism/lean/Semantics/Semantics/Quantization.lean - Orchestrator:
infra/access_control/orchestrator.py - Runtime:
infra/access_control/webgpu_runtime.py - AGENTS.md: §1.4 (Q16_16 requirement), §6.2 (shim boundaries)
8. Verification Status
| Theorem | Status | Verification |
|---|---|---|
| Ternary quantization error bound | 🔄 Proven | ternaryQuantErrorBound |
| Activation range preservation | 🔄 Proven | activationQuantPreservesRange |
| MLGRU MatMul-free | ✅ Proven | mlgruIsMatMulFree |
| Memory reduction 10× | 🔄 Asymptotic | memoryReductionAsymptotic |
Legend: ✅ Complete | 🔄 Partial | ⏳ Pending
Next Steps:
- Implement WGSL kernels in
webgpu_runtime.py - Add
#evalwitnesses for quantization operations - Benchmark memory reduction on actual GPU
- Integrate with
finalScoreLawOptimalfor compressed inference