Skip to content

Bonsai 2 Small native checkpoint qualification ​

These results cover the pinned 2B, 4B, and 9B MLX checkpoints through the native Swift/MLX release runtime. Python orchestrates requests and scores saved outputs; it does not execute model inference.

The later upstream parity investigation found native vision discrepancies and changed the runtime. The measurements below belong to the original executable identified here; they do not qualify the corrected implementation. Fresh measurements of the corrected executable are in the fixed-runtime rerun.

The machine-readable summary contains redacted copies of the cases and selected outputs, fixture hashes, and timing samples. Original prompts and outputs remain unchanged on T7; response hashes refer to those originals.

Scope and provenance ​

  • Host: Apple M3 Max (14 CPU cores, 30 GPU cores), 36 GiB unified memory, macOS 26.6.2.
  • Model runtime implementation: 1f1b1b852d618a7420661ea4658903ffb9e91092 on codex/native-bonsai2-small.
  • Tested release executable SHA-256: 60de2728001459877ff32fe20ce26630b178e871aa06068a85a7f3dd8110b9cd.
  • Model payloads, metadata, prompts, images, requests, outputs, and timing receipts are retained under /Volumes/T7/mere-run-qualification/bonsai2-small-2026-10-15.
  • All source files were checked against pinned upstream LFS SHA-256 or Git blob identities. The initial API cache copy was moved to T7 with a verified compatibility link.
  • No conversion, extra quantization, MTP, admission override, or parallel inference was used.
ModelPinned revisionModel snapshot bytes
2B1c6cbae21f8c38830ce337972b46fdae7b18eaaa1,213,249,532
4Bdff2caaa23fa8706164c44c10f1b58feb405f76a1,884,415,990
9Bf4e28a59531731c41b6dfac88cf271bd58f0a2873,475,204,252

Quality ​

One sampled trial per case uses the generation sidecar sampler: temperature 1.0, top-p 0.95, top-k 20, and min-p 0. No presence or frequency penalty is applied in this primary condition. The API uses the catalog thinking default and an 8,192-token context, with up to 4,096 generated tokens per quality case. Its profile rejects deterministic-seed and provider-thinking controls.

The frozen suite contains eight grounded cases, two generated Python functions with five tests each, four images, one arithmetic case, and one reasoning case. Image cases cover OCR/counting, a receipt, a bar chart, and a public-domain NASA photograph. Requests use no output grammar or response-format enforcement. Strict JSON scoring rejects fences, repeated objects, and unfinished reasoning.

ModelPassed casesGroundedCode testsVision strictArithmeticReasoning strict
2B9/166/87/101/4PassFail
4B12/167/810/102/4PassFail
9B12/167/810/101/4PassPass
ModelMedian quality request (s)Slowest request (s)Requests reaching 4,096 tokens
2B5.5932.992
4B9.00219.782
9B35.38259.772

Fence-only recovery is a separate diagnostic. It removes one complete outer Markdown fence without changing values or calling the model again. It does not change strict scores.

ModelVision after fence-only recoveryCorrect vision fields after recovery
2B2/412/18
4B2/412/18
9B3/413/18

Separate sampler and budget probe ​

A secondary run used the same four selected cases for every model: grounded JSON extraction, interval merging, shape OCR/counting, and the chart. It used presence penalty 1.0, repetition penalty 1.0, an 8,192-token output allowance, and a new resident session with a 16,384-token context. Temperature, top-p, top-k, and min-p stayed the same. The native presence penalty covers the full generated history; the model card prefers a 64-token window where supported. Multiple conditions changed, so this does not isolate the effect of the penalty. Primary scores above are unchanged.

ModelSecondary passed cases8,192-token capsSlowest request (s)Failed case IDs
2B0/4171.982b-grounded-3, 2b-code-merge_intervals, 2b-vision-shapes, 2b-vision-chart
4B1/41545.284b-grounded-3, 4b-vision-shapes, 4b-vision-chart
9B3/41188.079b-vision-chart

The code evaluator runs generated functions with closed builtins, no imports or introspection, a CPU limit, and a short wall timeout. Ordinary list/string methods are allowed. An initial evaluator restriction on list.sort() was corrected by rescoring the same saved outputs against the same five tests; no model answer was regenerated.

Throughput ​

Each model and modality has one discarded 128-token warm-up followed by three serial resident requests. Text requests have a 512-token budget; image requests have a 256-token budget. Native /runtime/status snapshots supply per-request generation, prefill, and decode timings. Timing requests are deliberately capped and are not scored for answer completion. Decode TPS includes reasoning tokens and excludes model loading and prefill. Prefix reuse follows the server default; internal first-token timing can precede the visible final answer.

ModelText median decode tok/sText rangeVision median decode tok/sVision range
2B22.5220.25–131.61112.5523.72–125.76
4B15.4715.10–15.6115.4115.30–15.57
9B16.5213.82–17.6518.5218.42–18.61
ModelModalityMedian prefill (s)Median internal first token (s)Median request (s)
2Btext0.0010.03722.74
2Bvision0.5990.6162.88
4Btext0.0010.06433.11
4Bvision1.0731.12417.65
9Btext0.0010.06431.01
9Bvision1.8271.88415.65

Measurements were collected on an interactive desktop, with process, memory-pressure, and thermal snapshots retained for every request. The collector lists other native inference and compiler processes; it does not prove that every desktop GPU workload was absent.

The primary quality run included substantial latency variation: one 4B grounded answer took about 220 seconds. A process sample and GPU telemetry were retained for that quality request; profiling was separate from throughput runs. Short warmed decode observations do not establish sustained long-context speed.

Reproduction and remaining gates ​

The T7 evidence root includes download.py, metadata/, download-receipt.json, fixtures/make-fixtures.py, fixtures/manifest.json, quality-cases.json, plan.json, and every request and response receipt. Native model repair-manifests completed managed discovery for all three snapshots.

Use a fresh prepared evidence root for a new trial. Reusing the frozen root resumes saved quality results. Start the normally admitted loopback server before invoking the collector.

bash
swift build -c release --product mere.run
python3 scripts/validation/qualify-bonsai2-small-api.py \
  --binary .build/release/mere.run \
  --evidence-root /Volumes/T7/mere-run-qualification/bonsai2-small-2026-10-15 \
  --phase quality

Start the loopback server with the explicit T7 model path, --context-size 8192, and MERERUN_HUB_CACHE pointing into the evidence root. Keep normal machine and request admission enabled. The shared benchmark command requires 32 GiB of admission headroom; the resident API acquired its normal 16 GiB class once and retained request admission throughout.

This is a bounded native smoke qualification. These failures do not distinguish checkpoint behavior from native-runtime discrepancies without an upstream parity comparison. Broad benchmarks, additional sampling trials, released-checkpoint parity against another runtime, the declared 262,144-token context, and smaller-memory hardware remain unqualified.

The natural-image fixture comes from the versioned scikit-image astronaut asset. Its source documentation records NASA public-domain provenance. The generated fixture source and all image hashes are retained on T7.

Released under the MIT License.