This is a dated research narrative. For the current installable package, supported capabilities, API and active measurements, see experts4bit-qlora (2026-09-05). Numbers on this page are quoted as they stood when it was written; the repository's docs/claims.json says which are still current.

Cerin Amroth Research · ML systems · experts-4bit upstream PR

experts-4bit

Large Mixture-of-Experts LLMs, fine-tuned and served on accessible NVIDIA GPUs.

MoE won the open-weights frontier and outgrew the GPUs. Qwen3-, Mixtral- and DeepSeek-class models activate few parameters per token but must hold every expert resident, so a 30B-class MoE wants 20+ GB for weights alone against the 8–16 GB on accessible cards — and fine-tuning stacks optimizer state on top. The losers are local and private deployments: teams whose data cannot leave the building are priced out of exactly the models built for them.

experts-4bit (e4b) quantizes the fused expert weights that stock bitsandbytes silently skips, composing with its 4-bit stack rather than forking it — so it inherits the ecosystem. Recompute-in-backward keeps training memory flat as expert count grows.

What it does

Measured

Everything below ran on a single RTX A2000 (12 GB) in a NAS's PCIe 3.0 ×8 slot — not a tuned bench rig — except where noted. Sources are public: the axolotl PR and the kit's METHODOLOGY.md.

Seed-matched A/B — the controlled experiment

OLMoE-1B-7B QLoRA, identical seed and data order in both arms.

ConfigLoaded GPUPeak GPUHeld-out eval loss
Experts resident4.70 GB6.00 GB1.6448 → 1.2213
Experts offloaded1.08 GB2.60 GB1.6448 → 1.2270

Peak VRAM −57%, load footprint −77%, and the loss curves overlay — convergence is preserved. The cost is the per-block H2D copy, ~+11% s/step uncontended. Per-step JSONL, charts and the A/B runner are published in ab-telemetry/, including an axolotl-native re-run with DDP arms.

Fitting and serving on one small card

Fused MoEQLoRA peak with e4bWithoutDecode (v0 path — superseded, see below)
OLMoE-1B-7B<8 GB (loads at 4.70)13.9 GB bf16 — OOM3.08 tok/s @ 4.86 GB
Gemma-4-26B-A4B8.47 GB (offload)OOM0.43 tok/s @ 6.2 GB
Qwen3-30B-A3B7.16 GB (offload)OOM0.22 tok/s @ 4.4 GB

The 26B/30B rows decode on a card where resident decode simply OOMs, and adapters serve over the exact NF4 base they trained against — no GGUF/AWQ re-quantization shifting the error surface. Quality holds: QLoRA on frozen NF4 experts improves OLMoE's held-out Alpaca eval loss 1.4813 → 1.0290, and the streaming loader never materializes the bf16 model in CPU or GPU RAM (verified under a 3 GB container cap).

The decode column is the v0 offload path and the engine has moved past it. It is the oldest data on this page, kept because it is the honest floor — what you get with no tuning at all on a 12 GB card in a NAS. The pipelined engine (enable_pipelined_residency) supersedes it, and picking hot experts from a routing histogram lifts it further: on the same A2000, informed hot sets take OLMoE from 3.448 tok/s naive to 4.099 tok/s at K=4 (+19%, coverage 7.3% → 29.1%). Bigger cards move it much further — Qwen3-30B-A3B reaches 1.65 tok/s in 4.41 GB with prefetched offload and 5.19 tok/s resident at 20.04 GB — but those are different hosts (A5000 / A100 80GB) and, because offload decode is transfer-bound, none of these rates transfers between boxes. That is why they are reported per host rather than as a headline number.

What these numbers do not say

In production, and next

e4b is not a lab demo. It serves scheduled Qwen3-30B-class jobs today from a single RTX A2000 (12 GB) on shared infrastructure that also carries unrelated production GPU workloads, and the current release is what is running — the live endpoint logged its most recent generations under 0.6.5 on the day it shipped. Three mechanics make that safe on one small card: every run appends tokens, peak VRAM and full version fingerprints to a ledger; each warm-up re-generates a golden canary and records its sha256, so a drifted endpoint is caught before it takes traffic; and a reaper returns the VRAM when idle, so a 30B model shares a GPU with unrelated jobs instead of holding it. Production decode currently runs 0.38 tok/s at ~4.46 GB — above the v0 table row above, which is the point of keeping that row labelled as a floor.

Next: land experts-4bit upstream, then the staged ExpertsNbit diff (the class ships in the package today; what is queued is the upstream-facing version). On the serving side the cold engine still wants its AVX2 host kernel — today it takes bnb's AVX-512 kernel where avx512f is present and otherwise a pure-torch decode, which is correct but slow — and the residency rail wants to go format-agnostic so the MXFP4 lane rides the same engines. On the training side, timing the expert GEMM directly: the one measurement that would settle the open decode question above. Upstream diffs and production serving telemetry available on request.

Contact

jordan@cerinamroth.com  ·  independent consulting: jordananderson.work

Current documentation: experts4bit-qlora · ML systems · this page was previously served at /ml/experts-4bit/.