On-Device LLM Leaderboard · v0, iPhone tier
Proof strength is disclosed honestly: where a column rests on a proxy, it says so.
"Of the models that actually run on this phone, which is the smartest that stays usable?" — the intelligence × decode-speed Pareto front under real device limits. Intelligence is measured on Mac (fast) and transferred to the device by the zoo parity gate (device ≡ Mac ≡ HF greedy token-exact); only tok/s, memory, and power are measured on the device itself. Measuring smarts at ~200 tok/s on a Mac instead of dying at ~20 tok/s on the phone is only honest because the parity gate proves the phone emits the same tokens.
| # | column | what it is | how measured |
|---|---|---|---|
| ① | shipped int8 | the on-device quantized bundle | Core AI engine, Mac GPU, S=1 pipelined |
| ② | baseline | the same model before quantization | eager PyTorch reference, float |
| ③ | retention | ② → ① | accuracy(①) / accuracy(②) on identical items |
Quantization variants (int8 vs int4) are separate entries, never mixed. ① is always measured with each model's shipped recipe default (the quant actually in the ModelStore bundle), not a softer fallback.
The v0 family is Qwen3.5 (0.8B / 2B). Its checkpoint is a
vision-language model with a hybrid linear-attention (gated-delta / SSM) + sparse
full-attention text backbone (model_type: qwen3_5, mostly
linear_attention with full_attention every 4th layer, MTP head, mrope).
Three baselines were considered:
transformers 4.57.6 has no
qwen3_5 model_type (only qwen3, qwen3_moe,
qwen3_next, qwen3_vl*). It existed only in the unreleased
4.57.0.dev0 the checkpoint was saved with, and the repo ships no custom
modeling code. Chasing a fork for a VL+SSM hybrid is out of scope for v0.Qwen3_5StatefulForCausalLM is coreai_models' own PyTorch implementation of
this exact architecture — the same definition that is quantized+exported for ①.
Run unquantized (fp16), greedy, it is a genuine pre-quantization reference. Harness =
ref_eval.py.Column ② is the coreai_models eager PyTorch
reference, not an independent third-party transformers run. So retention
③ captures (int8 weight quantization) + (eager→Core AI engine numerics)
together. This is arguably the more product-relevant number ("what the shipped on-device
model loses vs the float model"), but it is not an independent re-implementation, and this
page says so. When a qwen3_5-capable transformers appears, (a) can be added as a
stronger anchor.
Two-tier cost design. The eager reference decodes at ~11 tok/s on the Mac GPU — ~18× slower than the engine — so it is not run on the full battery. Column ① runs the full battery; column ② runs a stratified subset, and retention ③ is computed on those shared keys. Subset size is disclosed per entry.
Greedy (deterministic), cap = 1024 tokens (4096 for reasoning-heavy
models), 0-shot, chat template with thinking OFF (verified:
on-device ChatSession runs thinking-off). Prompts instruct step-by-step reasoning
in the visible answer.
| bench | source | metric | scorer |
|---|---|---|---|
| IFEval | google/IFEval (541) | prompt/inst strict+loose, mean-of-4 | official google-research checkers (vendored) |
| MMLU-Pro | TIGER-Lab/MMLU-Pro | accuracy, stratified over 14 categories | \boxed{letter} extraction |
| MATH-500 | HuggingFaceH4/MATH-500 | accuracy, stratified over 7 subjects | \boxed{} + sympy symbolic equality |
GPQA-Diamond is excluded from the iPhone tier: at ≤1B it sits at/below
chance (13.3% vs 25% chance, 60% never converge within cap) = floor effect, and it is gated
(ToS). It moves to the Mac / v1 tier. Benchmark contamination is a real risk;
the battery is versioned (battery_version) and rotated.
max-tokens is an explicit design lever. Verbose small models spend the whole
budget reasoning: qwen3.5-0.8B int8 at cap-1024 on MMLU-Pro caps 69/196 and
produces no boxed answer in 65/196 — those score as wrong (a fair "couldn't
deliver a usable answer on-device in-budget" signal). Larger / less-verbose models cap far less.
Finding: ① and ② cap at different points (greedy paths diverge — int8 vs float weights, engine vs eager), so their no-answer rates differ and the retention ratio ③ can be dominated by cap-timing, not quantization quality — it can even exceed 100% at small n. On shared answered problems the two emit identical boxed answers. Two mitigations, both reported:
acc (no-answer =
wrong; the on-device "usable" number) and acc_completed (only problems that
produced an answer; cap-independent quality). Retention ③ is reported on
acc_completed so it reflects quantization damage, not verbosity;
acc + no-answer rate carry the usability story. When retention is within noise
(≥0.97 or CI-consistent) the board shows "≈100% ▵" and keeps the raw value in
the data.Reproducibility. Every number regenerates bit-identically from the raw
per-item outputs: the scorer pins PYTHONHASHSEED, seeds langdetect, and
seeds Python's random. The last one matters because the official IFEval
checkers are not reproducible out of the box: upstream google/IFEval items 1122 and
1129 carry non-alphabet "letters" ('#', '!') in
keywords:letter_frequency kwargs, and the official checker replaces those with an
unseeded random letter on every run — a ~±0.2pp jitter that affects anyone using the
official scorer unseeded. We keep the official semantics (seeded) and disclose the two items.
Every accuracy carries a 95% interval, so ranks are not read off noise:
=). Subset runs
leave the top group tied; the full 596-item battery separates them.PipelinedBench (STATS prefill/decode) on iPhone 17 Pro / M4 Max. tok/s + peak
footprint for v0; power (tokens/joule) is a v0.5 axis. This box ≈ M4 Max: 0.8B int8 =
207 tok/s decode, matching the published 204. A row's memory is marked est until
device-measured, and decode is shown as Mac (○) until an iPhone number exists. Reported tok/s are warm-state: engine loaded and warmed, cold load and first-run specialization excluded; 128-token prompt / 256-token decode, two trials on a settled device. The built-in Foundation Model publishes no tok/s — its public API returns no token counts or streaming stats, so only wall-clock per answer exists (kept in the raw logs).
Quality is an attribute of the artifact (model × quant ×
format), measured on its native runtime + float retention.
Speed/memory/power are attributes of runtime × device. Two normalized,
HF-dataset-ready tables: artifacts.jsonl and measurements.jsonl. v0
data is Core AI only (format=aimodel, runtime=coreai), but
GGUF/llama.cpp and MLX/mlx-lm rows drop in as pure data additions.
Apple's on-device system model (SystemLanguageModel via
LanguageModelSession()) runs the same battery through its
public API — no weight extraction
(runtime=foundation-models, format=system, DL size 0, OS-resident,
retention=null). On the full 596-item battery it tops the composite point estimate
(76.1%) with no weak bench (IFEval 82.1 / MMLU-Pro 64.8 / MATH 81.5 completed; refusals 0) —
but it is a statistical tie with the best open 1–2B ports, and LFM2.5-1.2B beats it on
IFEval (87.7). Correction note: an earlier subset run (n=40) showed FM "weak on IFEval" (67%);
the full battery corrected that to 82.1% — small-n noise, kept here as a worked example of why
the board reports CIs and refuses to rank inside them.
guardrailViolation and explicit textual refusals are separated from
wrong answers (refusal_rate; accuracy is computed over non-refused items).
Near-zero on the general battery for every model, but the column matters the moment a bench
probes guarded topics.
Reasoning-heavy models (Qwen3.5-4B, the built-in FM) top MMLU-Pro but crater IFEval: Qwen3.5-4B is the smartest port on MMLU-Pro (68.9% completed) yet scores 31.5% on IFEval because it prepends a "Thinking Process:" meta-analysis that isn't the requested output — violating format constraints outright — and generates ~4000 tokens even at cap-4096. The composite includes IFEval deliberately: raw knowledge is not the same as being useful in your pocket.
Publishing another model's score carries a duty of fairness. Every entry links its parity proof; if we measured the wrong quant, or a port lost parity and the number reflects a broken export rather than the model, model owners can contest it via the objection issue template. Only open-weight models are ported; the only closed system on the board is Apple's built-in FM, via its public API.
Public benchmarks may appear in any model's training data, and this is not verifiable from outside. The board's columns differ sharply in how much that matters:
Mitigations, in order of deployment: the battery is versioned and rotated
(each rotation bumps battery_version); a paraphrase probe is
planned — the same items rewritten with different wording/numbers, scored pairwise, so a
memorizer shows a public>paraphrase gap that genuine capability does not; and the roadmap's
endpoint is self-authored, freshly-captured test sets that are contamination-free by
construction. Submissions suspected of benchmark tuning are checked with the probe before
listing.
Where DeviceMark sits among the tools that measure local/on-device AI. The matrix uses each project's own published scope (links below); "intelligence axis" means output quality is a reported, per-model comparison column, not merely an internal pass/fail check.
| intelligence axis | measured on phones | speed / memory | quant retention | shipped-artifact parity proof | live board | |
|---|---|---|---|---|---|---|
| DeviceMark (this) | ✅ 3 benches + CIs | ✅ iPhone 17 Pro | ✅ / ✅ | ✅ vs same-weights float | ✅ token-parity gate per entry | ✅ |
| MobileAIBench | ✅ (desktop harness) | latency only (iOS app) | ✅ / ✅ | ✅ (re-quantized by the harness) | — | — (paper) |
| MLPerf Client v1.6 | pass/fail MMLU gate only | — (PC, Mac, iPad) | ✅ / — | — | vendor-governed harness | results tables |
| LocalScore | — | — (desktop) | ✅ / — | — | — | ✅ crowd DB |
| PocketPal leaderboard | — | ✅ (crowd phones) | ✅ / — | — | — | ✅ (ranks devices) |
| Geekbench AI | accuracy alongside speed (CV/NLP-cls, no LLM generation) | ✅ | ✅ / — | precision variants scored | — | ✅ |
Lineage on the quality side. The Open LLM Leaderboard (2M+ unique visitors before HF archived it) established the "same harness, many models" quality board — on server GPUs, fp16/bf16, with no device axis; its retirement note cites benchmark saturation and the risk of "optimizing in irrelevant directions", which is exactly the contamination/goodharting problem the contamination section addresses. Chatbot Arena ranks by human votes — measurement here is deliberately not voting, which is why this project avoids the word "arena". LiveBench demonstrates the rotation defense this board's battery versioning follows: ~1/6 of questions replaced monthly, fully refreshed in ~6 months, with verifiable ground truth. DeviceMark applies that lineage to the on-device setting, where the artifact (quantized bundle), the runtime, and the physical device are part of what is being measured.
The parity claim is per-entry, not global. Speed gates below are PipelinedBench greedy token-match runs on the same iPhone 17 Pro (iOS 27.0 24A5355q); quality runs are the full 596-item battery on the Mac engine (macOS 27 beta3 26A5378j, b2 toolchain, 2026-07-12/13).
| entry | device speed gate | note |
|---|---|---|
| LFM2.5-1.2B | nat 24/24 · oracle 24/24 | ship int8hu bundle |
| Granite-4.0-H-1B | nat 24/24 · oracle 24/24 | ship int8hu bundle |
| Youtu-LLM-2B | nat 16/16 · oracle 16/16 | fp32-HF-anchored expected tokens |
| Qwen3.5-4B | 24/24 | Mac-engine-anchored expected tokens |
| Gemma 4 E2B (QAT int4) | 8/8 | chat-format greedy, PLE tables bound on-device |
| Qwen3.5-0.8B / 2B | port-time token-exact gate | tok/s from earlier verified device runs (zoo recipe notes), not re-run on 24A5355q |
| Apple FM | n/a | system model via public API; no artifact to gate |
Raw per-item outputs (model answers + our scores, no benchmark questions redistributed) are
published in the results dataset
under raw/, so every number on this page can be re-scored independently.
The published dataset ships results only — scores, counts, and confidence intervals. Benchmark questions and gold answers are not redistributed; each benchmark keeps its own license: IFEval (Apache-2.0), MMLU-Pro (MIT), MATH-500 (MIT, from the Hendrycks MATH set). GPQA-Diamond is excluded from this tier entirely (floor effect at ≤1B, and its gated terms of use). The results tables are published under CC-BY-4.0 as a Hugging Face dataset.
The measuring box is on macOS 27 beta3, which requires b2-versioned IR; pre-2026-07-09
bundles are un-loadable. Every entry's ① bundle is re-exported locally with the b2
toolchain via the zoo's own recipe (zoo_convert.py) — bit-identical weights, just
re-emitted IR.
Draft, v0. This page is the authoritative statement of method; the board links here from its footnotes.