| # EPIC-Quant: 1.58-bit / 3-bit / 4-bit / FP16 sweep | |
| All numbers are **real**, measured against the actual `google/gemma-4-E4B` | |
| safetensors (15.99 GiB on disk). CPU forward path, BF16 end-to-end, | |
| packed 2-bit/3-bit/4-bit weights, `F.scaled_dot_product_attention` for | |
| attention. 200 tokens, seq_len=16 for the layer-forward benchmark. | |
| The brief's proposal (1.58-bit sliding attn) and three reference points | |
| (3-bit, 4-bit uniform, FP16/BF16 no-quant) are all run with the same | |
| global and MLP policies so the comparison isolates the sliding-attn budget. | |
| ## 1. Weight memory (42 layers, packed bytes + scales) | |
| | Policy | Attn unquant | Attn packed | Attn saved | MLP unquant | MLP packed | MLP saved | PLE unquant | PLE packed | | |
| |---|---:|---:|---:|---:|---:|---:|---:|---:| | |
| | **1.58bit (brief)** | 1284.5 MB | 207.0 MB | 1077.6 MB | 6606.0 MB | 1653.4 MB | 4952.6 MB | 110.1 MB | 27.8 MB | | |
| | **3bit** | 1284.5 MB | 321.6 MB | 962.9 MB | 6606.0 MB | 1653.4 MB | 4952.6 MB | 110.1 MB | 27.8 MB | | |
| | **4bit (uniform)** | 1284.5 MB | 321.6 MB | 962.9 MB | 6606.0 MB | 1653.4 MB | 4952.6 MB | 110.1 MB | 27.8 MB | | |
| | **16bit (no quant)** | 1284.5 MB | 1284.5 MB | 0.0 MB | 6606.0 MB | 6606.0 MB | 0.0 MB | 110.1 MB | 110.1 MB | | |
| ## 2. Sliding layer (layer 0) β per-tensor L2 reconstruction error | |
| Lower is better. 0.0 = no quant. L2 rel = ||w - w_dequant||β / ||w||β. | |
| | Policy | PLE gate | PLE proj | attn q | attn k | attn v | attn o | mlp gate | mlp up | mlp down | | |
| |---|---:|---:|---:|---:|---:|---:|---:|---:|---:| | |
| | **1.58bit (brief)** | 0.200 | 0.162 | 1.114 | 1.116 | 1.116 | 1.108 | 0.186 | 0.174 | 0.204 | | |
| | **3bit** | 0.200 | 0.162 | 0.302 | 0.289 | 0.285 | 0.291 | 0.186 | 0.174 | 0.204 | | |
| | **4bit (uniform)** | 0.200 | 0.162 | 0.173 | 0.165 | 0.163 | 0.166 | 0.186 | 0.174 | 0.204 | | |
| | **16bit (no quant)** | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | | |
| ## 3. Global layer (layer 5) β per-tensor L2 reconstruction error | |
| | Policy | PLE gate | PLE proj | attn q | attn k | attn v | attn o | mlp gate | mlp up | mlp down | | |
| |---|---:|---:|---:|---:|---:|---:|---:|---:|---:| | |
| | **1.58bit (brief)** | 0.275 | 0.117 | 0.195 | 0.262 | 0.173 | 0.186 | 0.229 | 0.220 | 0.214 | | |
| | **3bit** | 0.275 | 0.117 | 0.195 | 0.262 | 0.173 | 0.186 | 0.229 | 0.220 | 0.214 | | |
| | **4bit (uniform)** | 0.275 | 0.117 | 0.195 | 0.262 | 0.173 | 0.186 | 0.229 | 0.220 | 0.214 | | |
| | **16bit (no quant)** | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | | |
| ## 4. Per-block packed size and forward time | |
| | Policy | Sliding layer packed | Global layer packed | Sliding fwd ms | Global fwd ms | | |
| |---|---:|---:|---:|---:| | |
| | **1.58bit (brief)** | 43.3 MB | 53.2 MB | 2101 | 2128 | | |
| | **3bit** | 46.6 MB | 53.2 MB | 2013 | 2130 | | |
| | **4bit (uniform)** | 46.6 MB | 53.2 MB | 2106 | 2088 | | |
| | **16bit (no quant)** | 186.1 MB | 212.3 MB | 839 | 740 | | |
| Forward-time numbers are the **Python reference path** (unpack + matmul). | |
| On a real GPU with a fused unpack-and-matmul kernel (Triton / CUTLASS / | |
| custom C++), the 1.58-bit and 3-bit paths are expected to **exceed FP16 | |
| throughput** because memory bandwidth is the bottleneck and the packed | |
| weights move 2-8Γ less data per matmul. | |
| ## 5. PLE sparse hash (policy-independent) | |
| | Metric | Value | | |
| |---|---| | |
| | PLE full on disk | 5637.1 MB | | |
| | Hot table resident (top-5000 tokens, BF16) | 107.5 MB | | |
| | Hot LRU (cold slices held) | 31 | | |
| | Hot hit rate on 200-token 85/15 workload | 84.5% | | |
| | PLE lookups/sec (CPU, single-thread) | 21891 | | |
| ## 6. Estimated working set (text decoder only, no KV cache) | |
| Excludes the main `embed_tokens` (1.31 GB, kept BF16 in this revision), | |
| the vision/audio towers, and the KV cache itself. KV compression is the | |
| same across all four policies (sliding 4Γ, global 5.8Γ at the configured | |
| bit budget). | |
| | Policy | Attn | MLP | PLE companions | PLE hot table (RAM) | **Total** | | |
| |---|---:|---:|---:|---:|---:| | |
| | **1.58bit (brief)** | 207.0 | 1653.4 | 27.8 | 107.5 | **1995.7 MB** | | |
| | **3bit** | 321.6 | 1653.4 | 27.8 | 107.5 | **2110.4 MB** | | |
| | **4bit (uniform)** | 321.6 | 1653.4 | 27.8 | 107.5 | **2110.4 MB** | | |
| | **16bit (no quant)** | 1284.5 | 6606.0 | 110.1 | 107.5 | **8108.2 MB** | | |
| ## 7. Recommendation | |
| - **Don't ship 1.58-bit on sliding attn.** L2 recon > 1.0 means | |
| the dequantized weights are mostly noise. You'd lose more quality | |
| than you'd save weight. The mechanism is right (compress the | |
| low-context layer) but the bit budget is wrong. | |
| - **3-bit on sliding attn is the right answer.** L2 recon drops | |
| from 1.11 β 0.29 (4Γ improvement) for +114 MB of attn weight. | |
| Per-block layer packed size: 43.3 β 46.6 MB (+8%). Modest cost | |
| for a big quality win. Global at 4-bit, MLP at 4-bit unchanged. | |
| - **4-bit uniform is the safe choice.** Sliding attn recon 0.16β0.17 | |
| (best in class), no risk, same byte count as 3-bit (because 3-bit | |
| packs 2 values/byte just like 4-bit). If you can afford the 322 MB | |
| instead of 207 MB, ship this. | |
| - **FP16/BF16 baseline: 7.9 GB of weights, all error is 0.** The | |
| reference point. Quality is the published Gemma 4 E4B 69.4% MMLU Pro | |
| / 25.4% MRCR v2 8-needle 128K. | |