Speed research / Historical lab edition

M1 Pro engine microbenchmarks

Three Q4_K_M models. Two synthetic workloads. Three repetitions per test on one Apple M1 Pro with 32 GiB of unified memory.

Measured · one machine · 18 timing samples

Observed throughput · Q4_K_M

Two workloads, read separately.

Each result is the arithmetic mean ± sample standard deviation of three repetition rates. The range and standard deviation describe variation within this session, not a confidence interval or variation across machines.

Prompt processing · pp512

Processes 512 synthetic token IDs in batches, with no prior context. It measures the engine’s prompt-processing work; it does not include tokenization or a natural-language conversation.

ModelMean ± sample SD tokens/sObserved range tokens/sRepeats
MiniCPM5-2B796.31 ± 3.21792.61–798.273
Spark-X2.5-1.7B1,098.80 ± 6.051,091.82–1,102.433
Spark-X2.5-4B431.35 ± 0.35430.95–431.593

Single-token decoding · tg128

Performs 128 synthetic single-token decode steps from empty context, without a preceding prompt. It does not generate a sampled, natural-language answer.

ModelMean ± sample SD tokens/sObserved range tokens/sRepeats
MiniCPM5-2B75.84 ± 0.0675.78–75.903
Spark-X2.5-1.7B98.55 ± 0.1998.34–98.723
Spark-X2.5-4B44.79 ± 0.0444.76–44.833

How the numbers were measured

The method behind each repeat.

One recorded configuration

Apple M1 Pro, 10 CPU cores, 16 GPU cores and 32 GiB unified memory. All six tests ran in one session on 30 September 2026. The operating-system version and exact Mac product identifier were not retained.

Pinned engine and settings

llama.cpp with Metal and BLAS backends, six threads, batch size 512, micro-batch size 128, 99 requested GPU layers, flash attention, and F16 key/value caches. The exact runtime commit and model files are linked below.

Warmup and context

The default warmup runs one full prompt-processing pass before pp512 and one token step before tg128. Sequence memory is cleared before each timed repetition. Requested context is 512 tokens for pp512 and 128 for tg128; actual allocated context was not recorded.

Timing and calculation

Each original nanosecond timing covers synthetic decode work and backend synchronization. Model loading is outside the interval. For each repetition, tokens/s = token count × 1,000,000,000 ÷ elapsed nanoseconds. Summaries use all three repetition rates, with sample standard deviation using n − 1.

Conditions and limits

  • These are historical llama.cpp engine microbenchmarks on one recorded hardware configuration. They do not measure Loci app performance or customer usage.
  • The host was under substantial concurrent load: the recorded one-minute load averages before the three commands were approximately 31 to 33 on a 10-core CPU. Background work, thermal state and power mode were not controlled in the retained evidence.
  • Each test has three sequential repetitions from one session on 30 September 2026. Variation across those repetitions does not describe variation across machines, people or future runs.
  • The benchmark feeds synthetic token IDs. The generation test performs 128 single-token decode steps without a preceding prompt; it is not a 128-token natural-language answer or a quality test.
  • Requested context was 512 tokens for prompt processing and 128 tokens for generation. Actual allocated context, OS version, exact Mac product identifier and peak process memory were not retained.
  • The timings exclude model loading and include no app interface, time-to-first-token, tools, retrieval or conversation history. No phone or tablet was measured.
  • Original timing and checksum receipts are retained. The original executable and model cache are no longer available for a fresh local hash check. The runtime commit and immutable model artifact hashes and sizes were independently checked against the upstream sources on 30 October 2026.
  • No memory-fit threshold, Loci compatibility claim, device-wide speed estimate or cross-model quality conclusion follows from these measurements.
Before model command1-minute load5-minute load15-minute load
MiniCPM5-2B32.8725.0724.49
Spark-X2.5-1.7B31.7025.0824.51
Spark-X2.5-4B31.0825.0624.50

Load averages are recorded conditions, not CPU-utilization percentages. They do not identify the effect of competing work on any individual timing.

Exact artifacts and runtime

The model links identify the measured files at fixed upstream revisions. Their recorded checksums and sizes matched the upstream records on 30 October 2026.

MiniCPM5-2B Q4_K_M

MiniCPM5-2B-Q4_K_M.gguf

File size
1,561,318,368 bytes
Revision
2079a22f3beaa4e306449978533478fe0522f4b3
SHA-256
ec2d5801640099e97d8d7e8003ad4d81f336e757811f03a26173dddf386602fd

Spark-X2.5-1.7B Q4_K_M

Spark-X2.5-1.7B-Q4_K_M.gguf

File size
1,107,457,856 bytes
Revision
1f7fa33b1245c14730da39e125714ad3a327901b
SHA-256
902bde2522394954ac17821b3e5fd0df02defbc6944f122253f2580acf0503f4

Spark-X2.5-4B Q4_K_M

Spark-X2.5-4B-Q4_K_M.gguf

File size
2,600,224,352 bytes
Revision
9826e0be84e6e6e8b9668abc91421109a1df1e2d
SHA-256
adfcfa19a4ed6a5985da8bf565fe15f8e1a7e131d79bae2d19d48d1c40109428

llama.cpp · llama-bench

Runtime commit: 7fe450e19305b828c199d602c23a8337aaa1f03b

Read the benchmark implementation at this commit

Original timing and checksum receipts were retained. The original executable and model cache are no longer available for a fresh local hash check.

A fixed reference

Cite this edition

Loci AI, Inc. (2026). M1 Pro engine microbenchmarks, 30 September 2026. Three Q4_K_M models; synthetic pp512 and tg128 tests; three repetitions per test on one machine. https://askloci.ai/speed/lab/2026-09-30/

Include the exact model file, workload, hardware, three-repeat sample and host-load limitation with any quoted result.

No dataset reuse license is specified. Model licenses apply separately to the model artifacts.

Explore the measurement methods.

Read how Loci’s separate real-use observations are collected and what a fair comparison requires.

Speed research