File size: 7,854 Bytes
816f936 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | # LFM2.5 / Maple Preview β CPU-Efficient Quantized Variants and a Three-Engine Exploration
**Author**: Ljubomir Josifovski (ljupco) β Harpenden, UK, 2026.
**Hardware**: thinkpad2 (Lenovo, Intel i5-8350U, 4C/8T, AVX2, 64 GB DDR4-2400) and macbook2 (M2 Max, 96 GB).
**Scope**: quantized GGUF variants of the LiquidAI LFM2.5 family and the DeepGrove Maple Preview, plus a
three-engine porting/benchmarking exploration: stock llama.cpp (with the DeepGrove fork for Maple),
`ik-llama.cpp`, and `vllm.cpp`.
---
## 1. llama.cpp (stock + the DeepGrove fork) β the reference engines
### 1.1 Maple Preview on the DeepGrove fork (`deepgrove-main`)
The best CPU result of the whole project is the **Maple Preview** model (DeepGrove's ternary 2-bit MoE,
~1B active parameters of ~20B total, 256 experts with 8 routed) running on the **DeepGrove fork of llama.cpp**.
The fork adds the `maple` architecture (`src/models/maple.cpp`), the `TQ2_0` ternary quantization, and the
GGUF conversion support. On top of that upstream work we added:
- **TQ2_0 ternary Metal kernels** (`ggml/src/ggml-metal/ggml-metal.metal`) for the M2 Max, and
- per-machine server wrapper scripts (`llama_server_maple-preview_macbook2.sh`,
`llama_server_maple-preview_thinkpad2.sh`).
The Maple Preview GGUFs referenced here are the DeepGrove team's own releases; the engine is the DeepGrove
fork. We made no code changes that need publishing for this model β the fork is upstream; we only reference it.
Measured decode (benchy tg64, 4 threads, thinkpad2): **~28.2 t/s** β the fastest model of the four.
### 1.2 The LFM2.5 quantized variants (this repository's contribution)
For the LiquidAI **LFM2.5** family (2.6B dense, 1.2B-Thinking, 8B-A1B MoE) we produced **mixed-quant GGUF
variants** that keep the most sensitive tensors (attention / router / output heads) at a higher precision
while the bulk of the weights are 4-bit (Q4_K / Q4_0). The variants we distribute on HuggingFace
(`ljupco/*`) are:
| Model | Variant | Body | Heads |
|---|---|---|---|
| LFM2.5-2.6B | `-Q4_K_M` | Q4_K | Q4_K |
| LFM2.5-1.2B-Thinking | `-Q4_0h` | Q4_0 | higher-precision heads |
| LFM2.5-8B-A1B | `-Q4_0h` | Q4_0 | higher-precision heads |
These are the files benchmarked in the engine sections below. Full credit and thanks to the original model
creators β see the Credits section.
---
## 2. `ik-llama.cpp` β the LFM2 port (`lfm2-port` branch)
`~/ik-llama.cpp` carries a from-scratch **LFM2 architecture port** into a llama.cpp fork:
the LFM2 2.6B dense and 1.2B-Thinking and 8B-A1B MoE, including the shortconv layers, the gated-delta
attention, and the NEOX RoPE handling that the LFM2 family requires.
Status: **correct and complete** β all three LFM2 models run and produce valid output. Benchmarks vs the
upstream llama.cpp reference (benchy tg64, 4 threads, thinkpad2):
| Model | ik-llama.cpp | upstream llama.cpp | delta |
|---|---|---|---|
| LFM2.5-2.6B-Q4_K_M | 13.08 t/s | 12.40 t/s | **+5 %** |
| LFM2.5-1.2B-Thinking-Q4_0h | 25.30 t/s | 30.40 t/s | β17 % |
| LFM2.5-8B-A1B-Q4_0h | 13.81 t/s | 20.99 t/s | β34 % |
The 2.6B dense shows a small win; the 1.2B and 8B trails. The port is the *reference* used for the
vllm.cpp section. No separate code release is planned for this fork beyond the branch itself; it is a
research port.
---
## 3. `vllm.cpp` β the LFM2/Maple port (`lfm2-maple-port` branch)
`~/vllm.cpp/worktrees/lfm2-maple-port` (fork: `ljubomirj/vllm.cpp`, branch `lfm2-maple-port`) is a port of
**all four models** into the vllm.cpp engine (GGUF-first, C++20, single binary), with a large speed
campaign. This work **did not beat the llama.cpp references** β it is published for reference and as a
record of the optimisation arc.
### 3.1 The port
All four models run and produce correct output: LFM2.5 2.6B / 1.2B-Thinking / 8B-A1B and Maple Preview
(`general.architecture` dispatch in `src/vllm/entrypoints/model_loader.cpp`).
### 3.2 The speed campaign β what was done
1. **The iqk tier** β vendored the llama.cpp CPU K-quant integer-dot kernels into `src/vt/cpu/iqk/`
(Q4_K / Q6_K decode dots at ~72 GFLOP/s, DDR4-bandwidth-bound).
2. **Op fusion** β the LFM2 layers run at ~4 ops vs ~9 originally:
- the `gate/up` row-concat merge (per-row block quants make the concat a pure byte copy);
- the `silu+down` fused kernel (`kMatmulBf16DSilu`);
- the `post-norm+gate_up` fusion (`kMatmulBf16DPostNorm`);
- the `in-norm+in_proj` and `in-norm+first-qkv` fusions (the input-layernorm with its residual-add
folded into the act quantization);
- the attention bf16-alignment fix (the fused q_proj's act row must match the bf16-rounded normed
activation the sibling k/v projections consume).
3. **The R8 gemv arc** β vendored the DeepGrove 8x8 LUT gemv (`src/vt/cpu/gemv_q4k/`). **Conclusive
negative result**: the DeepGrove gemv is structurally tied to the DeepGrove Q4_K sub-block-pair packing
(`qs[j] = {value (j%32)+64*(j/32), value +32}`) and its (2s, 2s+1) scale/min/bsum grouping, which is
**incompatible** with the standard ggml Q4_K packing (sub-blocks (s, s+4)) used by all standard-quantized
models. The gemv is correct only for DeepGrove-quantized weights. This is recorded here so the next
engineer does not repeat the arc.
4. **Threadpool** β the ggml-faithful barrier+steal pool is the local optimum; the `poll=0` cond-wait
experiment is slower than the spin for the fast decode ops.
### 3.3 Results (benchy tg64, 4 threads, thinkpad2)
| Model | vllm.cpp (best) | llama.cpp reference | delta |
|---|---|---|---|
| LFM2.5-2.6B-Q4_K_M | 9.0 t/s | 13.08 (ik) | β31 % |
| LFM2.5-1.2B-Thinking-Q4_0h | ~14 t/s | 25.30 (ik) | β45 % |
| LFM2.5-8B-A1B-Q4_0h | 9.3 t/s | 13.81 (ik) | β33 % |
| Maple Preview | 13.9 t/s | 28.2 (DeepGrove) | β51 % |
The residual gap is the DDR4-bandwidth-bound dot compute itself (the dots are at the same speed as the
reference; the overhead is at the floor after the fusions).
---
## 4. Publishing
### 4.1 HuggingFace β the quantized GGUFs
The mixed-quant LFM2.5 GGUFs are published under **`ljupco`** on HuggingFace. Each repository's model card
declares the `base_model` metadata pointing at the original LiquidAI model, so HuggingFace lists our
variants on the originals' Quantizations pages.
### 4.2 Code
- **Maple Preview**: the engine is the DeepGrove fork (upstream); our additions are the **TQ2_0 ternary Metal
kernels** (a non-trivial, reusable contribution β ~400+ lines of `ggml-metal` support for the ternary
quantization that could be upstreamed to llama.cpp) and the per-machine wrapper scripts, which remain in
the `deepgrove-main` worktree.
- **ik-llama.cpp**: the `lfm2-port` branch remains the reference.
- **vllm.cpp**: the `lfm2-maple-port` branch is pushed to the `ljubomirj/vllm.cpp` fork for reference.
---
## 5. Credits and Acknowledgements
We are deeply grateful to the teams whose work this project builds on:
- **Liquid AI** β for the LFM2.5 family (2.6B, 1.2B-Thinking, 8B-A1B), the gated-delta / shortconv
architecture, and their open weights. We thank them for making these models available.
- **DeepGrove AI** β for the Maple Preview model, the TQ2_0 ternary quantization, and their llama.cpp fork
with the Maple architecture support. Their 8x8 gemv design and the fork itself made the Maple results
possible.
- **llama.cpp / ggml** β the core inference engine and its maintainers and contributors.
- **vllm.cpp (mudler)** β the engine we ported into.
- **The HuggingFace / GGUF ecosystem** β the format, the tooling, and the platform.
Without their work, none of this project would exist. Any remaining errors are ours.
---
*Report written 2026-08-08. Benchmarks are indicative single-machine measurements; expect day-to-day noise of
Β±10β20 % on the thinkpad2.*
|