Moe expert offloading on a 2-core Celeron with 2.7GB RAM A developer's on-hardware test shows that prefetching mixture-of-experts (MoE) expert weights from disk ahead of matmuls can improve token generation speed on a severely resource-constrained machine, with the Intel Celeron N4000 (2 cores, 2.7GB RAM) achieving a compute ceiling of ~2.0 tok/s and an I/O ceiling of ~150 MB/s. The test used the OLMoE-1B-7B-0924 model (64 experts/layer, top-8 routing, 16 layers) via a custom llama.cpp harness, and all measurements were logged in the project's results directory. Real, on-hardware measurements of MoE expert-weight offloading on a resource-constrained box: does prefetching mixture-of-experts weights off disk, ahead of the matmuls that need them, actually help — and if so, which mechanism does the work? Model: OLMoE-1B-7B-0924 https://huggingface.co/allenai/OLMoE-1B-7B-0924-GGUF GGUF, 64 experts/layer, top-8 routing, 16 layers , run through a custom llama.cpp https://github.com/ggml-org/llama.cpp example harness harness/expert-log.cpp that hooks ggml backend sched 's eval callback to see expert routing decisions in real time and prefetch the selected experts' weight slabs before the matmuls that consume them run. Everything here is a real process run on real hardware — no simulation, no synthetic timing model. All logs and CSVs backing every number below are committed under results/ . | Environment | ChromeOS Crostini Linux VM penguin | | CPU | Intel Celeron N4000 @ 1.10GHz, 2 cores no hyperthreading | | RAM | 2.7 GiB total, no swap | | Root disk | /dev/vdc , 34G, ~98% full during this project | | Kernel | Linux 6.6.135 x86 64 | This is not a datacenter box. It's the kind of machine MoE weight-offloading would need to target for it to matter: RAM well under the model size, a single-digit-core CPU, and a disk that is the actual bottleneck for most of this workload. Measured hardware ceilings both regenerated fresh for this write-up; see results/io ceiling/ and results/compute ceiling/ : - I/O ceiling: ~150 MB/s. O DIRECT sequential dd reads off the root disk, three 1024/512 MiB samples at different offsets: 145–157 MB/s. This bypasses the page cache entirely, so it's the raw disk's ceiling, not anything our harness does. - Compute ceiling: ~2.0 tok/s. A dense, fully-RAM-resident 630M-param model Qwen2.5-0.5B-Instruct, Q8 0, 638.74 MiB run twice back-to-back via llama-bench -p 0 -n 32 -r 1 --no-warmup , 2 threads : 2.10 tok/s cold, 2.03 tok/s warm. Cold and warm being nearly identical not a page-cache warm-up effect confirms this is a genuine compute measurement, not one still partly gated on disk.An earlier, unlogged estimate mid-project had put this figure closer to ~1.0 tok/s; that number was never saved to a committed log and could not be reproduced when re-measured for this write-up, most likely because this VM's actual CPU allocation varies with host load see Caveats . The ~2.0 tok/s figure is the one with a log backing it and is what the ratios below use. harness/expert-log.cpp is a llama.cpp example binary llama-expert-log built against upstream llama.cpp with a tiny patch harness/llama.cpp.patch , +9 lines: one exported llama model get tensor accessor . It does four things: - Reads GGUF tensor metadata directly , independent of loading the model, via the low-level gguf.h API — tensor name, ne shape, byte size, file offset. Expert tensors are stored as merged 3D tensors n embd, n ff, n expert for gate/up, n ff, n embd, n expert for down with expert as the outermost dimension, so each expert's slab is a contiguous byte range — base offset + expert id bytes per expert . This is what makes byte-accounting exact rather than estimated: bytes per token in every table below comes straight out of this metadata, and it matched the harness's own pread totals exactly in every run. - Hooks on tensors named ggml backend sched eval callback "ffn moe topk-