| # LFM2 / LFM2.5-MoE export defs for coreai-models (North Star, 2026-07-14) |
|
|
| The missing LiquidAI model definitions for Apple's CoreAI exporter, written by us and |
| **verified bit-exact vs the HF reference** (`verify_lfm2_def.py`: prefill Ξ=2.6e-5, |
| decode-with-state Ξ=1.0e-5 on logit scale ~30, fp32, 4-layer truncation covering conv + |
| attention + MLP + tied embeddings + state continuation). |
|
|
| ## What's in here |
| - `lfm2.py` β `python/src/coreai_models/models/macos/lfm2.py` (NEW) β dense LFM2/2.5 |
| hybrid: gated short-conv as L explicit taps (no aten.conv1d β converter-safe), conv |
| state as a mutable state tensor (`conv_state`, zeros = sequence start so one graph |
| serves prefill+decode), GQA attention with fused qkv + fused per-head qk RMSNorm, |
| KV cache sized to attention layers only (6 not 16). |
| - `lfm2_moe.py` β `python/src/coreai_models/models/macos/lfm2_moe.py` (NEW) β the 8B-A1B: |
| same hybrid + 32-expert top-4 SwiGLU via **SwitchGLU/GatherMM (the routed kernel β |
| only the 4 routed experts' slabs are read per token)**. Router matches the MLX-Swift |
| reference: softmax(fp32) β +expert_bias β top-4 β renorm. First `num_dense_layers` |
| are dense MLP. Expert stacking in `_mutate_state_dict` (experts.{e}.w1/w3/w2 β |
| switch_mlp.gate/up/down (1,E,out,in)). |
| - `registry.py` β `python/src/coreai_models/models/registry.py` β adds "lfm2" + "lfm2_moe". |
| - `macos.py` β `python/src/coreai_models/export/macos.py` β export hook: a model class may |
| provide `build_reference_inputs(...)` + `state_names()` to declare extra mutable state |
| (the conv state) beyond k_cache/v_cache. |
| - `verify_lfm2_def.py` β repo root β the numerical vet harness. Run it after ANY change. |
|
|
| ## Apply to a fresh clone of john-rocky/coreai-models |
| 1. `git clone --depth 1 https://github.com/john-rocky/coreai-models && cd coreai-models` |
| 2. Bump pins in `python/pyproject.toml`: `coreai-core==1.0.0b2`, `coreai-torch==0.4.1` |
| (b1 artifacts are rejected by the macOS 27 beta3+ strict loader β FB23666783), then |
| `uv lock --upgrade-package coreai-core --upgrade-package coreai-torch`. |
| 3. Copy the four .py files to the paths above (+ verify_lfm2_def.py to the root). |
| 4. Vet: `uv run python verify_lfm2_def.py` β must print MATCH / MATCH. |
| 5. Export 1.2B: `uv run coreai.llm.export LiquidAI/LFM2.5-1.2B-Instruct --experimental |
| --compute-precision float16 --max-context-length 8192 --output-dir ~/models/lfm25-1.2b-coreai-b2` |
| β οΈ `--max-context-length 8192` is MANDATORY on an 8GB box. Without it the export bakes in the |
| model's full 128000 context; the CoreAI engine's load/specialization then spikes RAM and CRASHED |
| the 8GB Mac (2026-07-14). Reference bundles all use 8192. (lesson #42) |
| 6. Bench: `Tools/CoreAIBench/.build/release/CoreAIBench <bundle-dir> 600` |
| (build CoreAIBench with `DEVELOPER_DIR=/Library/Developer/CommandLineTools swift build |
| -c release` + coreai-kit's Package.resolved copied in). |
| |
| ## 8B-A1B (lfm2_moe) status |
| Def is written and registered; NOT yet exported: (a) torch.export of 8.3B fp16 needs |
| ~17GB+ RAM β impossible on the 8GB box, run it on a β₯32GB machine or HF Jobs; |
| (b) `AutoConfig` for model_type=lfm2_moe needs transformers β₯5.x (venv has 4.57 β bump |
| only for the 8B export, or construct the config by hand from config.json). |
|
|