mlx-bun 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -588
- package/docs/README.md +91 -0
- package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
- package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
- package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
- package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
- package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
- package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
- package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
- package/docs/design/batching.md +569 -0
- package/docs/design/decode-speed-program.md +3178 -169
- package/docs/design/dreaming-nightly-pipeline.md +675 -282
- package/docs/design/generic-model-support.md +579 -334
- package/docs/design/kv-cache.md +680 -0
- package/docs/design/orpo-training.md +673 -1239
- package/docs/design/speculative-decoding.md +1627 -0
- package/docs/design/turboquant.md +2102 -0
- package/docs/design/unified-engine-frontier-plan.md +1831 -727
- package/docs/design/web-chat-redesign.md +666 -1083
- package/docs/planning/PRODUCT_ROADMAP.md +34 -1
- package/docs/planning/release-notes-v0.3.0.md +35 -0
- package/docs/planning/video-series.md +2 -2
- package/docs/reference/benchmarks.md +1162 -0
- package/docs/reference/cli.md +394 -159
- package/docs/reference/distribution.md +321 -182
- package/docs/reference/environment.md +348 -0
- package/docs/reference/glossary.md +39 -0
- package/docs/reference/library-api.md +566 -168
- package/docs/reference/memory.md +227 -64
- package/docs/reference/models.md +104 -6
- package/docs/reference/server-api.md +886 -425
- package/docs/reference/server-config.md +638 -330
- package/docs/reference/training.md +393 -254
- package/docs/reference/troubleshooting.md +166 -0
- package/package.json +9 -4
- package/src/audio/decode.ts +2 -2
- package/src/audio/features.ts +2 -2
- package/src/backends/mlx/autoregressive.ts +108 -0
- package/src/backends/mlx/batch-group.ts +1646 -0
- package/src/backends/mlx/diffusion.ts +39 -0
- package/src/backends/mlx/draft-target.ts +47 -0
- package/src/backends/mlx/evaluation.ts +105 -0
- package/src/backends/mlx/fill-append.ts +45 -0
- package/src/backends/mlx/gateway-binding.ts +71 -0
- package/src/backends/mlx/graph.ts +38 -0
- package/src/backends/mlx/memory-client.ts +189 -0
- package/src/backends/mlx/memory-guard.ts +40 -0
- package/src/backends/mlx/methods.ts +90 -0
- package/src/backends/mlx/model-prompt.ts +164 -0
- package/src/backends/mlx/model-serving.ts +79 -0
- package/src/backends/mlx/prefill.ts +33 -0
- package/src/backends/mlx/request-policy.ts +20 -0
- package/src/backends/mlx/rollback.ts +51 -0
- package/src/backends/mlx/serial-executor.ts +273 -0
- package/src/backends/mlx/speculative.ts +114 -0
- package/src/backends/mlx/state-views.ts +26 -0
- package/src/backends/mlx/text-engine.ts +73 -0
- package/src/cli.ts +58 -25
- package/src/client.ts +66 -0
- package/src/config.ts +21 -4
- package/src/contracts/completion.ts +16 -0
- package/src/contracts/execution.ts +49 -0
- package/src/contracts/generation.ts +103 -0
- package/src/contracts/host.ts +7 -0
- package/src/contracts/jobs.ts +66 -0
- package/src/contracts/pi-provider.ts +30 -0
- package/src/contracts/pi.ts +259 -0
- package/src/contracts/resources.ts +18 -0
- package/src/contracts/scheduling.ts +27 -0
- package/src/contracts/tsconfig.json +14 -0
- package/src/diffusion/diffusion-generate.ts +218 -153
- package/src/embed.ts +1 -1
- package/src/engine/admission.ts +59 -0
- package/src/engine/cancellation.ts +38 -0
- package/src/engine/engine.ts +56 -0
- package/src/engine/execution-coordinator.ts +70 -0
- package/src/engine/execution-plan.ts +51 -0
- package/src/engine/resources.ts +42 -0
- package/src/engine/scheduler.ts +67 -0
- package/src/engine/session.ts +247 -0
- package/src/eval/README.md +44 -1
- package/src/eval/kl.ts +236 -3
- package/src/eval/reference-logits.ts +207 -0
- package/src/eval/runner.ts +8 -96
- package/src/fill/echo-index.ts +188 -0
- package/src/fill/fill-session.ts +452 -0
- package/src/fill/proposal.ts +68 -0
- package/src/fill/schema-rows.ts +506 -0
- package/src/fill/tool-boundary.ts +103 -0
- package/src/fit.ts +1 -1
- package/src/generate.ts +656 -268
- package/src/grammar.ts +12 -7
- package/src/harness-pi.ts +14 -33
- package/src/hub-rest.ts +4 -4
- package/src/index.ts +7 -0
- package/src/inference/denoising.ts +17 -0
- package/src/inference/graph.ts +33 -0
- package/src/inference/prefill.ts +39 -0
- package/src/inference/rollback.ts +7 -0
- package/src/jobs/db.ts +4 -0
- package/src/jobs/index.ts +2 -0
- package/src/jobs/job-entry.ts +12 -12
- package/src/jobs/runner.ts +98 -13
- package/src/jobs/task-client.ts +19 -0
- package/src/jobs/types.ts +2 -58
- package/src/kv-store.ts +109 -49
- package/src/lab/README.md +18 -0
- package/src/{assets → lab/curve}/curve-designer.html +2 -2
- package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
- package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +5 -5
- package/src/{model → lab/paged-kv}/paged-kv.ts +9 -6
- package/src/library.ts +40 -0
- package/src/lora.ts +18 -0
- package/src/media-fetch.ts +1 -1
- package/src/memory/article.ts +1 -1
- package/src/memory/chunk.ts +1 -1
- package/src/memory/model.ts +30 -169
- package/src/memory/prompts.ts +1 -1
- package/src/memory/rest.ts +1 -1
- package/src/memory/schedule.ts +1 -1
- package/src/memory/stages.ts +4 -1
- package/src/memory/vault.ts +1 -3
- package/src/mlx/array.ts +9 -10
- package/src/mlx/compile.ts +12 -2
- package/src/mlx/ffi.ts +58 -11
- package/src/mlx/materialize.ts +23 -0
- package/src/mlx/metal-kernel.ts +10 -11
- package/src/mlx/ops.ts +33 -13
- package/src/mlx/quantized-rows.ts +36 -0
- package/src/mlx/token-bitmask.ts +52 -0
- package/src/mlx/turboquant-kv-decode.ts +82 -0
- package/src/mlx/turboquant-kv-inverse.ts +122 -0
- package/src/mlx/turboquant-ops.ts +33 -3
- package/src/mlx/turboquant-tables.ts +2 -2
- package/src/model/batched-mask.ts +8 -2
- package/src/model/batched-quant.ts +1 -1
- package/src/model/batched-rotating-quant.ts +2 -2
- package/src/model/batched-rotating.ts +1 -1
- package/src/model/compiled-decode.ts +1 -1
- package/src/model/diffusion-gemma.ts +8 -8
- package/src/model/factory.ts +76 -33
- package/src/model/fingerprint.ts +1 -1
- package/src/model/flash-attention.ts +3 -3
- package/src/model/gemma4-base.ts +26 -9
- package/src/model/gemma4.ts +6 -6
- package/src/model/generated/gemma4-12b.ts +2 -2
- package/src/model/generated/gemma4-26b.ts +2 -2
- package/src/model/generated/gemma4-e4b.ts +2 -2
- package/src/model/glm52-dsa.ts +13 -9
- package/src/model/glm52-memory.ts +1 -1
- package/src/model/implementation.ts +69 -0
- package/src/model/minicpm5.ts +6 -8
- package/src/model/profile.ts +12 -2
- package/src/model/qwen-append.ts +12 -0
- package/src/model/qwen-conv.ts +52 -0
- package/src/model/qwen3_5-checkpoint.ts +164 -0
- package/src/model/qwen3_5.ts +140 -56
- package/src/model/support.ts +1 -1
- package/src/model/trellis-balanced-scatter.ts +51 -0
- package/src/model/trellis-linear.ts +672 -0
- package/src/model/trellis-shared-m.ts +151 -0
- package/src/model/trellis-shared-scatter.ts +144 -0
- package/src/model/trellis-splitk-prefill.ts +158 -0
- package/src/model/trellis-tiled-prefill.ts +136 -0
- package/src/model/trellis-vector-expand.ts +62 -0
- package/src/model/trellis-wide-prefill.ts +94 -0
- package/src/model/universal/dense.ts +1 -1
- package/src/model/universal/modules.ts +8 -1
- package/src/native-pack.ts +6 -5
- package/src/pi-provider.ts +6 -64
- package/src/pi-web.ts +8 -315
- package/src/prompt-cache.ts +96 -53
- package/src/quantize/allocator.ts +1 -1
- package/src/quantize/config-writer.ts +10 -3
- package/src/quantize/rotate.ts +4 -4
- package/src/quantize/trellis.ts +586 -0
- package/src/responses.ts +28 -1
- package/src/runtime-config.ts +18 -4
- package/src/sampler.ts +4 -4
- package/src/serve/batch-scheduler.ts +8 -1671
- package/src/serve/chat-request.ts +391 -0
- package/src/serve/chat-stage.ts +195 -0
- package/src/serve/checkpoint-identity.ts +64 -0
- package/src/serve/completion-executor.ts +15 -7
- package/src/serve/discovery-routes.ts +12 -13
- package/src/serve/generation-gateway.ts +154 -193
- package/src/serve/http.ts +159 -0
- package/src/serve/inference-request.ts +79 -0
- package/src/serve/isolate.ts +297 -105
- package/src/serve/lab-routes.ts +3 -0
- package/src/serve/lane-registry.ts +2 -1
- package/src/serve/model-admin-routes.ts +7 -5
- package/src/serve/model-binding.ts +43 -0
- package/src/serve/model-host.ts +512 -0
- package/src/serve/openai-wire.ts +103 -0
- package/src/serve/parent-application.ts +56 -0
- package/src/serve/pipeline.ts +33 -0
- package/src/serve/preparation.ts +33 -0
- package/src/serve/request-plan.ts +19 -15
- package/src/serve/request-prep.ts +346 -0
- package/src/serve/response-lease.ts +24 -0
- package/src/serve/responses-client.ts +69 -0
- package/src/serve/session-completion-engine.ts +110 -0
- package/src/serve/session-search.ts +1 -1
- package/src/serve/static-routes.ts +5 -5
- package/src/serve/text-completion-stage.ts +104 -0
- package/src/serve/token-streams.ts +519 -0
- package/src/server.ts +317 -2649
- package/src/spec/assistant-source.ts +10 -44
- package/src/spec/deepspec-source.ts +6 -6
- package/src/spec/dflash-source.ts +8 -8
- package/src/spec/dspark/ab-stats.ts +3 -3
- package/src/spec/dspark/calibration.ts +2 -2
- package/src/spec/dspark/deepspec-module.ts +2 -2
- package/src/spec/dspark/generate-dflash.ts +2 -2
- package/src/spec/dspark/generate.ts +2 -2
- package/src/spec/dspark/loader.ts +1 -1
- package/src/spec/dspark/module-dflash.ts +4 -3
- package/src/spec/dspark/module.ts +3 -3
- package/src/spec/dspark/quantize-drafter.ts +1 -1
- package/src/spec/generate.ts +1 -1
- package/src/spec/glm52-mtp-source.ts +1 -1
- package/src/spec/ngram-source.ts +1 -1
- package/src/spec/prefix-state.ts +45 -0
- package/src/spec/qwen-mtp-source.ts +166 -69
- package/src/spec/serve-loop.ts +154 -156
- package/src/spec/source.ts +42 -10
- package/src/spec/two-model.ts +1 -1
- package/src/ssd-cache.ts +80 -12
- package/src/ssd-durability.ts +25 -13
- package/src/tool-call.ts +51 -14
- package/src/train/flash-cce.ts +2 -2
- package/src/train/forward.ts +6 -0
- package/src/train/loss.ts +1 -1
- package/src/train/prefix-shared.ts +5 -1
- package/src/train/segmented.ts +5 -3
- package/src/train/trainer.ts +6 -6
- package/src/vision/prompt.ts +1 -1
- package/src/vision/qwen3vl-tower.ts +52 -10
- package/src/web/app.html +1 -1
- package/src/web/app.js +5 -3
- package/src/web/src/adapters-panel.ts +3 -3
- package/src/web/src/assistant.ts +2 -36
- package/src/web/src/chat.ts +4 -4
- package/src/web/src/composer.ts +4 -4
- package/src/web/src/hub.ts +1 -1
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +1 -1
- package/src/web/src/model-picker.ts +1 -1
- package/src/web/src/palette.ts +1 -1
- package/src/web/src/protocol.ts +3 -39
- package/src/web/src/sessions.ts +1 -1
- package/src/web/src/ui-catalog.ts +4 -18
- package/src/web-assets.ts +47 -0
- package/src/weights.ts +55 -9
- package/docs/archive/investigations/curve-runs/bisector-route.json +0 -98
- package/docs/archive/investigations/curve-runs/bisector-trace.json +0 -1393
- package/docs/archive/investigations/curve-runs/curve-terrain.json +0 -1179
- package/docs/archive/investigations/curve-runs/curve-terrain.svg +0 -42
- package/docs/archive/investigations/hlg-ab.html +0 -34
- package/docs/archive/investigations/hlg-explorer.html +0 -238
- package/docs/archive/investigations/hlg-figs/cliff.svg +0 -1
- package/docs/archive/investigations/hlg-figs/cross.svg +0 -1
- package/docs/archive/investigations/hlg-figs/edges.svg +0 -1
- package/docs/archive/investigations/hlg-figs/k20-grids.svg +0 -1
- package/docs/archive/investigations/hlg-figs/k20-peaks.svg +0 -1
- package/docs/archive/investigations/hlg-figs/lw-curve.svg +0 -1
- package/docs/archive/investigations/hlg-figs/terrain.svg +0 -1
- package/docs/archive/investigations/hlg-report.html +0 -262
- package/docs/archive/investigations/hlg-runs/hlg-ab.json +0 -149
- package/docs/archive/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
- package/docs/archive/investigations/hlg-runs/hlg-blind.json +0 -107
- package/docs/archive/investigations/hlg-runs/hlg-cliff.json +0 -197
- package/docs/archive/investigations/hlg-runs/hlg-cross.json +0 -505
- package/docs/archive/investigations/hlg-runs/hlg-edge.json +0 -388
- package/docs/archive/investigations/hlg-runs/hlg-eval1.json +0 -25
- package/docs/archive/investigations/hlg-runs/hlg-frontier.json +0 -86
- package/docs/archive/investigations/hlg-runs/hlg-grid.json +0 -242
- package/docs/archive/investigations/hlg-runs/hlg-grid2.json +0 -343
- package/docs/archive/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
- package/docs/archive/investigations/hlg-runs/hlg-map.json +0 -383
- package/docs/archive/investigations/hlg-runs/run0-original.log +0 -159
- package/docs/archive/investigations/hlg-runs/runA-recommended.log +0 -131
- package/docs/archive/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
- package/docs/archive/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
- package/docs/archive/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
- package/docs/archive/investigations/hlg-runs/runAD-ab-samples.log +0 -8
- package/docs/archive/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
- package/docs/archive/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
- package/docs/archive/investigations/hlg-runs/runAG-eval-config2.log +0 -16
- package/docs/archive/investigations/hlg-runs/runB-gain-variants.log +0 -192
- package/docs/archive/investigations/hlg-runs/runC-pivots.log +0 -162
- package/docs/archive/investigations/hlg-runs/runD-oetf.log +0 -132
- package/docs/archive/investigations/hlg-runs/runE-eotf.log +0 -162
- package/docs/archive/investigations/hlg-runs/runF-shaper-working.log +0 -86
- package/docs/archive/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
- package/docs/archive/investigations/hlg-runs/runH-wsweep.log +0 -176
- package/docs/archive/investigations/hlg-runs/runI-asweep.log +0 -176
- package/docs/archive/investigations/hlg-runs/runJ-knobmap.log +0 -49
- package/docs/archive/investigations/hlg-runs/runK-frontier.log +0 -19
- package/docs/archive/investigations/hlg-runs/runL-widemap.log +0 -65
- package/docs/archive/investigations/hlg-runs/runM-frontier-emb.log +0 -15
- package/docs/archive/investigations/hlg-runs/runN-verify.log +0 -116
- package/docs/archive/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
- package/docs/archive/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
- package/docs/archive/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
- package/docs/archive/investigations/hlg-runs/runR-blind-transcript.log +0 -79
- package/docs/archive/investigations/hlg-runs/runS-cross-coherence.log +0 -33
- package/docs/archive/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
- package/docs/archive/investigations/hlg-runs/runU-cross-12b.log +0 -33
- package/docs/archive/investigations/hlg-runs/runV-lw-e4b.log +0 -22
- package/docs/archive/investigations/hlg-runs/runW-lw-12b.log +0 -22
- package/docs/archive/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
- package/docs/archive/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
- package/docs/archive/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
- package/docs/archive/mlx-bun-lab-report.html +0 -275
- package/docs/archive/wwdc-mlx-bun.html +0 -848
- package/docs/design/adapters-end-to-end.md +0 -205
- package/docs/design/batching-perf-path.md +0 -255
- package/docs/design/batching-v2-plan.md +0 -529
- package/docs/design/bucketing-stage.md +0 -197
- package/docs/design/compat-cli-surface-design.md +0 -230
- package/docs/design/docs-reorg-plan.md +0 -165
- package/docs/design/dspark-serving-program.md +0 -371
- package/docs/design/dspark-speculative-decoding.md +0 -318
- package/docs/design/grammar-spec-batching-integration.md +0 -301
- package/docs/design/memory-inference-path.md +0 -422
- package/docs/design/memory-synthesis.md +0 -287
- package/docs/design/memory-system.md +0 -237
- package/docs/design/mlx-lm-serving-execution-seam.md +0 -81
- package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
- package/docs/design/omlx-adoption-map.md +0 -98
- package/docs/design/orpo-dynamic-lambda.md +0 -220
- package/docs/design/orpo-future-enhancements.md +0 -340
- package/docs/design/paged-kv-cache.md +0 -214
- package/docs/design/parallel-slots.md +0 -567
- package/docs/design/parity-tier-dag.md +0 -161
- package/docs/design/repo-cleanup-plan.md +0 -231
- package/docs/design/runtime-isolation.md +0 -263
- package/docs/design/segmented-backward-training.md +0 -543
- package/docs/design/spec-decode-larger-targets.md +0 -229
- package/docs/design/ssd-kv-cold-tier.md +0 -415
- package/docs/design/structured-output.md +0 -484
- package/docs/design/tauri-desktop-app.md +0 -127
- package/docs/design/the-dreaming-master-plan.md +0 -445
- package/docs/design/turboquant-kv.md +0 -235
- package/docs/design/turboquant-weights.md +0 -467
- package/docs/design/w4a16-compute-precision-spike.md +0 -232
- package/docs/design/web-chat-beat-matrix.md +0 -315
- package/docs/design/write-pipeline-entity.md +0 -468
- package/docs/planning/IDEAS.md +0 -69
- package/docs/reference/embedding.md +0 -197
- package/docs/reference/features-matrix.md +0 -101
- package/docs/reference/orpo-quickstart.md +0 -135
- package/src/flags.ts +0 -11
- /package/docs/{design → archive/investigations}/colibri-glm52-port.md +0 -0
- /package/docs/{planning → archive/planning}/chunk-task-roadmap.md +0 -0
- /package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +0 -0
- /package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +0 -0
- /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.2.0.md +0 -0
- /package/src/{memory-plan.ts → admission-plan.ts} +0 -0
- /package/{docs/archive/investigations → src/serve/assets}/curve-terrain.html +0 -0
- /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
# Reference environment and platform facts
|
|
2
|
+
|
|
3
|
+
The canonical home for the oracle setup and the hard-won platform facts that
|
|
4
|
+
agents and contributors need. CLAUDE.md points here; do not duplicate these
|
|
5
|
+
facts elsewhere. Each fact is one paragraph with the evidence path that proves
|
|
6
|
+
it — when you change the code, update the paragraph.
|
|
7
|
+
|
|
8
|
+
User-facing symptoms live in [troubleshooting.md](./troubleshooting.md).
|
|
9
|
+
|
|
10
|
+
## Machines
|
|
11
|
+
|
|
12
|
+
There are TWO development machines and neither is canonical. One is a MacBook
|
|
13
|
+
Pro M1 Max with 32 GB (`hw.model MacBookPro18,2`); the other is a MacBook Pro
|
|
14
|
+
M4 Pro with 24 GB, the machine PLAN.md's "Reference environment" section
|
|
15
|
+
describes (unified memory, ~273 GB/s). Every measured number is labeled with
|
|
16
|
+
host / chip / RAM — `docs/reference/benchmarks.md` carries "M1 Max 32 GB"
|
|
17
|
+
section headings for exactly this reason, and its TurboQuant section carries an
|
|
18
|
+
explicit "measured on an M1 Max 32 GB, not this file's M4 Pro reference" note.
|
|
19
|
+
Before asserting anything about RAM, OOM, or bandwidth, run
|
|
20
|
+
`sysctl hw.memsize hw.model` — never assume which laptop you are on. The
|
|
21
|
+
reference `serve.sh` (below) hard-codes a 28 GB wired limit "of 32 GB", so it
|
|
22
|
+
is written for the M1 Max.
|
|
23
|
+
|
|
24
|
+
For the current M4 Pro optimization campaign, Josh specifies internal SSD
|
|
25
|
+
storage for active models. The external SSD stores artifacts to copy when
|
|
26
|
+
needed; external-drive loading performance is outside normal acceptance for
|
|
27
|
+
the 12–17 GB models. Stage each needed artifact under `~/models/`, verify
|
|
28
|
+
every file against its archive, and record that path in both benchmark arms.
|
|
29
|
+
Preserve earlier external-drive measurements as a separate cohort. The local
|
|
30
|
+
active-model manifests live under `reports/qwen38-rd/`.
|
|
31
|
+
|
|
32
|
+
Perf claims get a number on the machine they were measured on, recorded in the
|
|
33
|
+
user-local eval DB (`~/.cache/mlx-bun/evals.sqlite`) and promoted to
|
|
34
|
+
`docs/reference/benchmarks.md` deliberately. `bun scripts/bench-serve.ts all`
|
|
35
|
+
is the benchmark harness; it writes Markdown and raw JSON under `reports/`
|
|
36
|
+
as gitignored outputs. Numbers on a loaded machine are
|
|
37
|
+
garbage — run-to-run spread is the stability signal, and the harness retries
|
|
38
|
+
unstable cells (`scripts/bench-serve.ts`; `benchmarks.md`, "Running the
|
|
39
|
+
benchmark").
|
|
40
|
+
|
|
41
|
+
## External storage loading
|
|
42
|
+
|
|
43
|
+
On the M4 Pro with MLX 0.32.2, two RTN4 first-request warmups from
|
|
44
|
+
`/Volumes/MLX-Models`, an external USB SSD using APFS, hit Metal GPU timeouts
|
|
45
|
+
before any committed-token append. One occurred with fill disabled. The
|
|
46
|
+
system log confirms the first timeout; neither establishes an allocation
|
|
47
|
+
leak or an append-kernel failure. Three attention tests, a fresh four-response
|
|
48
|
+
external HTTP control, and a separate four-response internal-SSD control pass.
|
|
49
|
+
The internal copy contains the same 25 files and 15,849,971,577 bytes, each
|
|
50
|
+
SHA-256 verified. Its responses and final active allocation match the external
|
|
51
|
+
control. Copying and hashing may warm the OS file cache, so this comparison
|
|
52
|
+
alone does not prove that the drive caused the failures.
|
|
53
|
+
|
|
54
|
+
[MLX issue #3803](https://github.com/ml-explore/mlx/issues/3803) reports the
|
|
55
|
+
same failure with external storage on a different machine and much larger
|
|
56
|
+
models. A [maintainer recommends evaluating weights before GPU inference](https://github.com/ml-explore/mlx/issues/3803#issuecomment-4898914127)
|
|
57
|
+
so disk-loading tasks finish first. Our loader already assigns safetensors
|
|
58
|
+
loads to the CPU stream, but leaves them lazy. A research preload evaluates
|
|
59
|
+
each requested canonical weight once during construction. Two balanced
|
|
60
|
+
external-drive pairs complete all sixteen responses exactly, with identical
|
|
61
|
+
final active allocation. Both eager arms take longer from process start to
|
|
62
|
+
first complete response; moving work before readiness is not a startup-speed
|
|
63
|
+
win. Both ordinary arms also pass, so reliability remains unproven. This
|
|
64
|
+
loading change is not integrated, and further external-drive tuning is
|
|
65
|
+
deferred under the active-storage policy above. Evidence under `reports/qwen38-rd/`:
|
|
66
|
+
`fill-append-http-final-partial-review.json`, `rtn4-storage-control-manifest.json`,
|
|
67
|
+
`fill-append-storage-control-review.json` and `weights-loading-http.json`.
|
|
68
|
+
|
|
69
|
+
## The Python oracle
|
|
70
|
+
|
|
71
|
+
Logit parity with mlx-lm is the correctness oracle; mixed-precision KV and the
|
|
72
|
+
vision sidecar verify against mlx-optiq. The current working tree requires
|
|
73
|
+
MLX and MLX-Metal 0.32.2. On the M4 Pro, the default reference is
|
|
74
|
+
`/Users/joshrossi/Code/mlx-lm/.venv-mlx-0.32.2-macos14`; invoke its
|
|
75
|
+
`bin/python` for reference scripts. MLX-LM remains 0.31.3. The shared resolver
|
|
76
|
+
checks installed MLX/Metal versions and rejects an incompatible explicit
|
|
77
|
+
`MLX_BUN_ORACLE_VENV` instead of silently selecting another environment.
|
|
78
|
+
|
|
79
|
+
The earlier reference at `/Users/joshrossi/Code/mlx-lm/.venv` remains an
|
|
80
|
+
old-runtime control. Its historical pins were verified
|
|
81
|
+
from the installed `dist-info` directories in
|
|
82
|
+
`.venv/lib/python3.14/site-packages/`: mlx 0.31.2 (with mlx-metal 0.31.2),
|
|
83
|
+
mlx-lm 0.31.3, mlx-optiq 0.2.15, pillow 12.2.0. PLAN.md records that optiq was
|
|
84
|
+
bumped from 0.2.4 to 0.2.15 on 2026-07-06 and the mixed-KV goldens stayed
|
|
85
|
+
byte-identical across the bump. The venv directory holds no project source —
|
|
86
|
+
just the venv and `serve.sh`.
|
|
87
|
+
|
|
88
|
+
The Qwen MTP compatibility test accepts explicit local artifact paths through
|
|
89
|
+
`MLX_BUN_TEST_MTP_TARGET` and `MLX_BUN_TEST_MTP_DRAFT`, alongside
|
|
90
|
+
`MLX_BUN_TEST_QWEN38_MTP=1`. It compares speculative and ordinary greedy
|
|
91
|
+
generation on that same target and prints both paths. This does not substitute
|
|
92
|
+
one quant for another in the pinned logit-oracle tests.
|
|
93
|
+
|
|
94
|
+
**M4 Pro installation checked 2026-09-04:** the same venv path on
|
|
95
|
+
`Joshs-MBP-2025.local` currently uses `lib/python3.13/site-packages`, with
|
|
96
|
+
mlx/metal 0.31.2, mlx-lm 0.31.3 and mlx-optiq **0.2.7** from installed
|
|
97
|
+
dist-info metadata. The older python3.14/OptiQ 0.2.15 record above is not the
|
|
98
|
+
installed stack on this Mac. Record actual interpreter/package/native-library
|
|
99
|
+
versions for every comparison; preserve this oracle as the 0.31.2 control.
|
|
100
|
+
Qwen artifacts are also present under
|
|
101
|
+
`/Volumes/MLX-Models/models/{Qwen,mjriii}/`; header-only inventories under
|
|
102
|
+
`reports/qwen38-rd/` are machine-local and do not load the GPU.
|
|
103
|
+
|
|
104
|
+
**Authorized M4 Pro runtime update, staged 2026-09-07:** MLX 0.32.2 with
|
|
105
|
+
MLX-C `c74db5307cc8ce122f48d97ef951b30578674e7f` is built under
|
|
106
|
+
`reports/qwen38-rd/mlx-upgrade-0.32.2/install/lib/`. Explicit
|
|
107
|
+
`MLX_BUN_LIBMLXC=<that-directory>/libmlxc.dylib` selects it per process.
|
|
108
|
+
The original Homebrew MLX 0.31.2 and MLX-C 0.6.0 revision 2 remain installed.
|
|
109
|
+
The staged core uses the official macOS 26 arm64 MLX-Metal wheel, with verified
|
|
110
|
+
archive hashes and relocatable library dependencies. This local artifact does
|
|
111
|
+
not change the published native pack or its minimum supported macOS version.
|
|
112
|
+
The source-build attempt failed because the offline Metal toolchain is absent;
|
|
113
|
+
building the C wrapper against the official native libraries succeeded.
|
|
114
|
+
|
|
115
|
+
The matching reference is `/Users/joshrossi/Code/mlx-lm/.venv-mlx-0.32.2`,
|
|
116
|
+
selected through `MLX_BUN_ORACLE_VENV`. Its Python remains 3.13.5; MLX and
|
|
117
|
+
MLX-Metal change to 0.32.2 while all other 62 package pins match the old venv,
|
|
118
|
+
including MLX-LM 0.31.3 and OptiQ 0.2.7. Installation and dependency checks pass.
|
|
119
|
+
Keep runtime and reference overrides paired. The macOS 26 build remains an
|
|
120
|
+
explicit comparison build. The working tree now selects the macOS 14 package
|
|
121
|
+
candidate described below. Build manifests, package freezes and gate results
|
|
122
|
+
live under the upgrade report directory.
|
|
123
|
+
|
|
124
|
+
The package candidate also has an official macOS 14 build of MLX-Metal 0.32.2,
|
|
125
|
+
with MLX-C compiled for 14.0 under `install-macos14/lib/`. Its matching Python
|
|
126
|
+
reference is `/Users/joshrossi/Code/mlx-lm/.venv-mlx-0.32.2-macos14`, with the
|
|
127
|
+
same 64 package versions as the macOS 26 reference and a passing dependency
|
|
128
|
+
check. Both builds pass the twelve-cell RTN4 same-version logit/state oracle
|
|
129
|
+
comparison. The macOS 14 candidate additionally passes the actual 4K prompt
|
|
130
|
+
and 8K extension, with complete logits and live cache state checked against
|
|
131
|
+
its matching reference. After the Trellis arithmetic port, the model-free
|
|
132
|
+
suite passes 1,882 tests with ten skips on the new core and 1,881 tests with
|
|
133
|
+
eleven skips on the old core. The local native-pack
|
|
134
|
+
candidate under `native-pack-candidate/` extracts into `native-pack-extracted/`;
|
|
135
|
+
all five Mach-O files target 14.0, have valid ad-hoc signatures and load their
|
|
136
|
+
non-system dependencies from siblings. These checks ran on macOS 27, not an
|
|
137
|
+
actual macOS 14 host. The production native-pack manifest now targets this
|
|
138
|
+
0.4.0 candidate and the verified local cache is
|
|
139
|
+
`/Users/joshrossi/Library/Caches/mlx-bun/native-v0.4.0-arm64`. The candidate
|
|
140
|
+
has not been published. The consolidated source passes 52 complete Qwen
|
|
141
|
+
forward/state/continuation cases and six Trellis generations, with fixed
|
|
142
|
+
source/runtime/reference hashes and clean worker exits. The consolidated
|
|
143
|
+
model-free suite passes 1,875 tests with ten skips; all typechecks pass.
|
|
144
|
+
Integrated inverse-KV serving response gates also pass. The broader
|
|
145
|
+
same-version reference gate passes all eighteen MiniCPM5, Llama 1B and Gemma
|
|
146
|
+
e4b cases after matching MLX-LM's compiled MiniCPM5 prefill activation.
|
|
147
|
+
Run `MLX_BUN_TEST_RUNTIME_ORACLE=1 bun test tests/parity/runtime-oracle.test.ts`
|
|
148
|
+
to repeat these logit, live-cache and continuation comparisons against the
|
|
149
|
+
matching reference. It skips unavailable artifacts, runs the Bun and Python
|
|
150
|
+
children sequentially and does not rewrite goldens. Combined/pressure
|
|
151
|
+
acceptance remains.
|
|
152
|
+
The frozen old source lives outside Bun's
|
|
153
|
+
test discovery at
|
|
154
|
+
`/Users/joshrossi/.cache/mlx-bun/runtime-controls/mlx-0.31.2-before-0.32.2/`.
|
|
155
|
+
Preserve its `snapshot.json` and source for old-runtime comparisons when
|
|
156
|
+
simplifying production bindings. The build directories are under the upgrade
|
|
157
|
+
report directory, whose `control-location.json` records the verified move.
|
|
158
|
+
The accepted new-core source before binding consolidation is also frozen at
|
|
159
|
+
`/Users/joshrossi/.cache/mlx-bun/runtime-controls/mlx-0.32.2-before-consolidation/`.
|
|
160
|
+
Its 932 files and the six locally installed native files were hash-verified;
|
|
161
|
+
`consolidation-preparation.json` records the copy and local installation.
|
|
162
|
+
|
|
163
|
+
The small DeltaNet fixture also depends on the oracle/runtime. On the M4 Pro
|
|
164
|
+
with the pins above, both Bun and Python differ from the June fixture at one
|
|
165
|
+
prefill output; their gate values, outputs and complete recurrent states agree
|
|
166
|
+
exactly. The fixture was explicitly replayed on 2026-09-05 with unchanged
|
|
167
|
+
inputs. It now records package/device/source provenance and exact state hashes.
|
|
168
|
+
No numerical tolerance changed. `scripts/oracle/gen-qwen-delta-golden.py
|
|
169
|
+
--replay tests/fixtures/qwen-delta-golden.json --output <review-file>` reproduces
|
|
170
|
+
the comparison under the pinned Python. Without `--output`, the M4 Pro writes
|
|
171
|
+
the reference fixture; other chips write a `goldens/<chip>/` override, which
|
|
172
|
+
the test resolves before the reference. Earlier oracle comparisons and the
|
|
173
|
+
single-value diff are in `reports/qwen38-rd/delta-*.json`.
|
|
174
|
+
|
|
175
|
+
CI explicitly replays those unchanged inputs through MLX-LM 0.31.3 on
|
|
176
|
+
MLX/MLX-Metal 0.32.2 before testing, saving a runner-chip override and its
|
|
177
|
+
provenance as a workflow artifact. This avoids comparing the macOS 14 runner
|
|
178
|
+
against an M4 Pro output fixture. The test still requires exact output and
|
|
179
|
+
state hashes; Python runs only the external reference. Trellis variant
|
|
180
|
+
matrix tests allow 30 seconds for first-use kernel compilation on CI.
|
|
181
|
+
|
|
182
|
+
Readable oracle source, in that `site-packages/`: `mlx_lm/models/gemma3.py`
|
|
183
|
+
and `mlx_lm/server.py` for the port targets; `mlx_lm/models/cache.py` for the
|
|
184
|
+
cache classes; `mlx_lm/tokenizer_utils.py` for prompt rendering;
|
|
185
|
+
`optiq/runtime/fused_quant_sdpa.py` and `optiq/runtime/streaming_kv_quant.py`
|
|
186
|
+
for quantized-KV attention; `optiq/vlm/` for the vision sidecar wiring;
|
|
187
|
+
`optiq/auth.py` for the server's API-key rule.
|
|
188
|
+
|
|
189
|
+
The reference server is `/Users/joshrossi/Code/mlx-lm/serve.sh`. It runs
|
|
190
|
+
`optiq serve` on `mlx-community/Qwen3.6-27B-OptiQ-4bit` with `--mtp`, the
|
|
191
|
+
snapshot's `kv_config.json`, `--max-tokens 32768`, and
|
|
192
|
+
`--prompt-cache-bytes` = 5 GiB, inside a restart loop (mlx-lm still aborts the
|
|
193
|
+
process on an uncatchable Metal OOM, ml-explore/mlx-lm#854). It first raises
|
|
194
|
+
`iogpu.wired_limit_mb` to 28672 via `sudo sysctl` (resets on reboot). optiq's
|
|
195
|
+
default port is 8080 (`optiq/cli.py`). Never start it, or any long-running
|
|
196
|
+
server or multi-GB download, from an agent session — Josh runs servers
|
|
197
|
+
himself; testing against an already-running server with curl is fine.
|
|
198
|
+
|
|
199
|
+
Oracle weights for the Gemma parity work: `gemma-4-12B-it-OptiQ-4bit` at
|
|
200
|
+
`~/.cache/huggingface/hub/models--mlx-community--gemma-4-12B-it-OptiQ-4bit/snapshots/5b1101065d2094c8f12aa87fee80e0afa5b292b7/`
|
|
201
|
+
— two safetensors shards, `model.safetensors.index.json`, `kv_config.json`,
|
|
202
|
+
`optiq_metadata.json`, `optiq_vision.safetensors`, `chat_template.jinja`,
|
|
203
|
+
`config.json`, `generation_config.json` (listing verified on disk; PLAN.md
|
|
204
|
+
records 8.3 GB). Measured baselines for it are in PLAN.md's "Reference
|
|
205
|
+
environment" section and `benchmarks.md`; compare direct-vs-direct only — the
|
|
206
|
+
early 14.1 tok/s figure was server-inflated (PLAN.md, Phase 3 finding).
|
|
207
|
+
|
|
208
|
+
## Oracle-side hazards
|
|
209
|
+
|
|
210
|
+
**Xet stalls.** Hugging Face's Xet transfer path stalls on this network. Set
|
|
211
|
+
`HF_HUB_DISABLE_XET=1` before any Python-side `hf download`; our own
|
|
212
|
+
downloader speaks plain HTTPS and never touches Xet (`src/download.ts`
|
|
213
|
+
header comment; `src/memory/model.ts` prints the `HF_HUB_DISABLE_XET=1` form
|
|
214
|
+
in its fetch hint; `scripts/oracle/export-datasets.py`,
|
|
215
|
+
`scripts/turboquant/farm-setup.sh`, and `scripts/memory/eval-northstar.ts`
|
|
216
|
+
all set it). HF auth is configured (`hf auth login`); `src/download.ts`
|
|
217
|
+
`hfToken()` reads `HF_TOKEN`, else `~/.cache/huggingface/token`.
|
|
218
|
+
|
|
219
|
+
**optiq wants paths, not repo ids.** optiq tooling treats `--model` as a
|
|
220
|
+
filesystem path in places, so pass the local snapshot directory (the path
|
|
221
|
+
above), not `mlx-community/...` (PLAN.md "Reference environment"; serve.sh
|
|
222
|
+
passes the snapshot path for `--kv-config`).
|
|
223
|
+
|
|
224
|
+
**The vision sidecar.** `optiq_vision.safetensors` (bf16, ~105 MB per PLAN
|
|
225
|
+
and CLAUDE history) auto-enables in `optiq serve` when present beside the
|
|
226
|
+
weights and needs pillow in Python land (installed in the venv). Our registry
|
|
227
|
+
records the sidecar's size and notes that the shipped file actually carries
|
|
228
|
+
`audio_tower.*` tensors too (`src/registry.ts`, `optiq_vision` comments).
|
|
229
|
+
|
|
230
|
+
**mlx-lm's prompt cache is byte-capped.** In the pinned mlx-lm 0.31.3,
|
|
231
|
+
`LRUPromptCache` (`mlx_lm/models/cache.py`) takes `max_size` (default 10) AND
|
|
232
|
+
`max_bytes`, evicting through a typed `CacheOrder` LRU; `server.py` exposes
|
|
233
|
+
`--prompt-cache-bytes`. The older count-capped cache was the OOM footgun that
|
|
234
|
+
`serve.sh`'s 5 GiB cap works around. Ours is byte-capped too: `--prompt-cache`
|
|
235
|
+
(GB, default 8) is a byte-capped LRU (`server-config.md`).
|
|
236
|
+
|
|
237
|
+
**TokenizerWrapper injects `enable_thinking=True`.** mlx-lm's
|
|
238
|
+
`apply_chat_template` sets `kwargs["enable_thinking"] = self.has_thinking`
|
|
239
|
+
whenever the caller did not pass it (`mlx_lm/tokenizer_utils.py`, around
|
|
240
|
+
line 336). Any cross-stack parity or bench prompt must pin `enable_thinking`
|
|
241
|
+
explicitly or the rendered prompts drift — `scripts/bench-serve.ts` pins it
|
|
242
|
+
on every arm via `chat_template_kwargs`.
|
|
243
|
+
|
|
244
|
+
**pi client config.** `~/.pi/agent/models.json` currently defines an
|
|
245
|
+
`mlx-bun` provider at `http://localhost:8080/v1` with
|
|
246
|
+
`apiKey: "sk-mlx-bun-local"` (mlx-bun does not validate the key). optiq
|
|
247
|
+
servers DO validate: the Bearer token must start with `sk-optiq-`
|
|
248
|
+
(`optiq/auth.py`, `_REQUIRED_PREFIX`), so a pi provider pointed at
|
|
249
|
+
`serve.sh` needs such a key.
|
|
250
|
+
|
|
251
|
+
## Bun and FFI facts
|
|
252
|
+
|
|
253
|
+
**Bun ≥ 1.4.0.** `package.json` `engines.bun` is `>=1.4.0`. `Bun.Image`
|
|
254
|
+
(native OS codecs via ImageIO, EXIF auto-orient, off-thread) is the vision
|
|
255
|
+
decode path (`src/vision/preprocess.ts`); `Bun.Image.resize` is deliberately
|
|
256
|
+
not used. The FFI ABI fix below is the other reason for the pin.
|
|
257
|
+
|
|
258
|
+
**bun:ffi stack-argument ABI (fixed in 1.4).** Through Bun 1.3.14, `bun:ffi`
|
|
259
|
+
wrote one 8-byte stack slot per argument, but Apple's arm64 ABI packs stack
|
|
260
|
+
args at natural size, so a binding whose 9th+ int-class args put an `i32`
|
|
261
|
+
before more args handed the callee shifted garbage (mlx_conv2d's segfault at
|
|
262
|
+
0x1: the bogus value landed in the stream arg). Filed as oven-sh/bun#33672;
|
|
263
|
+
repro in `lab/repro/bun-ffi-stack-args/` (`repro.c` + `repro.ts`,
|
|
264
|
+
`ISSUE.md`). Bun 1.4.0 returns the expected values, so bindings now use
|
|
265
|
+
their natural mlx-c signatures — `ops.conv2d` in `src/mlx/ops.ts` passes all
|
|
266
|
+
eleven args plainly and the packed-u64 workaround is gone. `ISSUE.md` keeps
|
|
267
|
+
the original report as the regression record.
|
|
268
|
+
|
|
269
|
+
**bun:ffi symbol `.ptr` is fixed in 1.4.** Direct function addresses match
|
|
270
|
+
`dlsym` on both 1.4.0 and the isolated 1.4.2 runtime. `src/mlx/array.ts` now
|
|
271
|
+
uses the numeric `free.ptr`, with a validity guard and a process-lifetime
|
|
272
|
+
library handle. Native destructor ownership remains unchanged.
|
|
273
|
+
|
|
274
|
+
**FFI typed-array readback still needs `read.*`.** The standalone
|
|
275
|
+
`lab/repro/bun-ffi-f64/` hot-loop repro still produces stale indexed reads on
|
|
276
|
+
1.4.0 and 1.4.2, despite the upstream issue being closed. Keep the native
|
|
277
|
+
out-param read helpers. The stack-argument repro passes on both versions.
|
|
278
|
+
Raw runtime binaries, hashes and outcomes are recorded in
|
|
279
|
+
`reports/qwen38-rd/bun-runtime-audit/`; the installed runtime and pinned Python
|
|
280
|
+
oracle were not upgraded. Bun's [1.4 release notes](https://bun.com/blog/bun-v1.4)
|
|
281
|
+
describe its new FFI implementation, while [1.4.2](https://bun.com/blog/bun-v1.4.2)
|
|
282
|
+
fixes the intervening AsyncLocalStorage regression. Release claims do not
|
|
283
|
+
replace these local regression checks.
|
|
284
|
+
|
|
285
|
+
**`Bun.mmap` SIGTRAPs above 4 GB.** JSC ArrayBuffers cap at 2^32 bytes, so
|
|
286
|
+
`Bun.mmap` panics on weight shards larger than that (observed on Bun 1.3.3,
|
|
287
|
+
still true at 1.3.14). `src/mmap.ts` binds libc `mmap`/`munmap`/`madvise`
|
|
288
|
+
from `/usr/lib/libSystem.B.dylib` and hands mlx raw base+offset pointers;
|
|
289
|
+
only small ranges (headers) are ever viewed from JS.
|
|
290
|
+
|
|
291
|
+
**Never give mlx a JS-callback destructor.** mlx releases the last
|
|
292
|
+
`array::Data` reference from the Metal completion thread (`gpu::eval`
|
|
293
|
+
retains buffers until the command buffer completes, past `dispose()`). A
|
|
294
|
+
`JSCallback` dtor on that thread deadlocks when the JS thread is inside a
|
|
295
|
+
blocking FFI eval and SIGTRAPs mid-GC (the 2026-07-06 restart-restore hang).
|
|
296
|
+
`src/mlx/array.ts` therefore gives every zero-copy array (`fromPointer` and
|
|
297
|
+
`fromView`) the native no-op dtor — libc `free` with payload 0 — and makes
|
|
298
|
+
host-buffer lifetime the caller's contract: weight mmaps live for the
|
|
299
|
+
process, restored KV is copied at load (`src/kv-store.ts` `loadKvCache`,
|
|
300
|
+
since 2026-07-07), and `unpinHostBuffer` runs only on the JS thread.
|
|
301
|
+
|
|
302
|
+
## Metal and mlx-c facts
|
|
303
|
+
|
|
304
|
+
**`mlx_copy` shares storage.** In pinned MLX 0.31.2, `Copy::eval` calls
|
|
305
|
+
`copy_shared_buffer`. Neither `ops.copyOf` nor `contiguous` guarantees a
|
|
306
|
+
small independent allocation for a contiguous view. Explicit disposal drops
|
|
307
|
+
handles but a surviving view can retain its entire source allocation.
|
|
308
|
+
`src/mlx/materialize.ts` uses the stock dynamic-slice kernel, which allocates
|
|
309
|
+
the output's logical size and supports gradients. The Qwen convolution state
|
|
310
|
+
uses it to release large prefill buffers. Byte, pointer, retained-memory,
|
|
311
|
+
compiled execution and gradient gates live in `tests/unit/materialize.test.ts`;
|
|
312
|
+
the direct storage probe is `reports/qwen38-rd/copy-alias-probe.json`.
|
|
313
|
+
|
|
314
|
+
**Non-page-aligned host pointers read garbage on the GPU.** Metal cannot
|
|
315
|
+
no-copy-wrap a host pointer that is not page-aligned: GPU ops silently read
|
|
316
|
+
garbage while CPU-stream ops are fine (PLAN.md Phase 1 finding, restated in
|
|
317
|
+
the `src/weights.ts` header). Safetensors tensor offsets are arbitrary, so
|
|
318
|
+
weights load through mlx's own `mlx_load_safetensors` on the CPU stream
|
|
319
|
+
(`src/weights.ts`, `src/lora.ts`; Load has no GPU kernel) into mlx-owned,
|
|
320
|
+
page-aligned buffers. Everything we DO wrap ourselves is page-aligned by
|
|
321
|
+
construction: the KV store file layout (`src/kv-store.ts`) and the
|
|
322
|
+
expert-offload file (`src/expert-offload.ts`, `src/expert-offload-build.ts`).
|
|
323
|
+
|
|
324
|
+
**Read the full mlx-c signature before binding.** A missed trailing optional
|
|
325
|
+
parameter shifts the stream argument and produces "There is no Stream(...)"
|
|
326
|
+
errors at eval time. `src/mlx/ffi.ts` is the single binding table and cites
|
|
327
|
+
the header each group comes from (`io.h`, `map.h`, `transforms.h`); the
|
|
328
|
+
`mlx_load_safetensors` row shows the shape — `(out, meta_out, path, stream)`.
|
|
329
|
+
|
|
330
|
+
**libmlxc resolution order.** `MLX_BUN_LIBMLXC` env → beside the executable
|
|
331
|
+
(sidecar layout, `docs/reference/distribution.md`) → `~/Library/Caches/mlx-bun/native-v<ver>-<arch>/`
|
|
332
|
+
(downloaded on first run, sha256-verified) → `/opt/homebrew/lib` →
|
|
333
|
+
`/usr/local/lib`. Dev trees and embedders never download anything. The order
|
|
334
|
+
is defined twice and must stay in sync: `resolveLibmlxc()` in
|
|
335
|
+
`src/mlx/ffi.ts` and `nativeRuntimeDir()` in `src/native-pack.ts`. Publishing
|
|
336
|
+
a new native pack means pasting the tarball's sha256/size into
|
|
337
|
+
`src/native-pack.ts` before tagging (comment block "RELEASE-TIME BAKE").
|
|
338
|
+
|
|
339
|
+
## Repo hygiene that follows from the above
|
|
340
|
+
|
|
341
|
+
`scripts/` holds production tooling only (bench-*, regen-*, parity-*, gen-*,
|
|
342
|
+
build/release, eval/serve) plus `scripts/{oracle,memory,turboquant}/` for
|
|
343
|
+
venv-side oracles, the Dreaming suite, and live TurboQuant research; research
|
|
344
|
+
one-offs are deleted once their finding is written into a doc. `lab/repro/`
|
|
345
|
+
holds self-contained reproductions for upstream bug reports (the two Bun
|
|
346
|
+
issues above, plus `optiq-mixed-kv-inert` and `vllm-metal-turboquant`); they
|
|
347
|
+
are not part of the build. Committed absolute paths (the venv, the weights
|
|
348
|
+
snapshot, `serve.sh`) are machine-specific on purpose — do not "correct" them.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# mlx-bun serving
|
|
2
|
+
|
|
3
|
+
mlx-bun serving runs local model completions and reports how each request uses the inference runtime.
|
|
4
|
+
|
|
5
|
+
## Language
|
|
6
|
+
|
|
7
|
+
**Completion execution**:
|
|
8
|
+
A single model completion attempt, including its generated output, resource lifetime, usage accounting, and observed scheduling placement.
|
|
9
|
+
_Avoid_: Generation request, serve transaction
|
|
10
|
+
|
|
11
|
+
**Execution composition**:
|
|
12
|
+
The exact combination of model runtime, numeric scheme, acceleration methods, and request features used for a workload. Explicit choices and resolved defaults are authoritative.
|
|
13
|
+
_Avoid_: Configuration bundle, inferred mode
|
|
14
|
+
|
|
15
|
+
**Model profile**:
|
|
16
|
+
A declaration that identifies an external model artifact, the engine capabilities required to run it, and the measured execution composition recommended for a device or workload. The profile does not bundle or own the model weights.
|
|
17
|
+
It selects model construction; request methods such as MTP, KV schemes, adapters, grammar, and sampling remain independent explicit or default-resolved choices.
|
|
18
|
+
_Avoid_: Generic model preset
|
|
19
|
+
|
|
20
|
+
**Fidelity contract**:
|
|
21
|
+
The oracle and verification claim attached to an execution composition, such as bit-exact parity with an external implementation or measured evidence when no matching oracle exists.
|
|
22
|
+
L1 means bit-exact mlx-lm parity, L2 means bit-exact mlx-optiq parity, and L3 means measured evidence without a matching oracle.
|
|
23
|
+
_Avoid_: Execution mode, optimization tier
|
|
24
|
+
|
|
25
|
+
**Artifact fingerprint**:
|
|
26
|
+
An immutable external revision identity used to bind evidence and a model profile to exact weights and metadata. A mutable alias or local directory name is not an artifact fingerprint.
|
|
27
|
+
_Avoid_: Model path, model family
|
|
28
|
+
|
|
29
|
+
**Scheduling mechanism**:
|
|
30
|
+
The executor that receives an already-resolved execution composition. `serial` is the preserved strict or dedicated executor. `continuous` admits the request to the scheduler, which chooses a B=1 fast path or B=N step from its active row count. Placement never changes the composition.
|
|
31
|
+
_Avoid_: Inferred lane, inferred mode
|
|
32
|
+
|
|
33
|
+
**Concurrency cap**:
|
|
34
|
+
The maximum rows admitted to the continuous scheduler. `--batch` declares this cap; `1` pins the serial mechanism. It does not select MTP, a KV scheme, TurboQuant, grammar, adapters, or sampling.
|
|
35
|
+
_Avoid_: Batch method, quality mode
|
|
36
|
+
|
|
37
|
+
**B=1 fast path**:
|
|
38
|
+
The continuous scheduler's one-active-row specialization. It adopts serial-class caches and uses the parity- and latency-gated single-row graph. It is not the strict serial mechanism selected by `--batch 1` or required by a dedicated composition.
|
|
39
|
+
_Avoid_: Serial fallback, batch prediction
|