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,166 @@
|
|
|
1
|
+
# Troubleshooting
|
|
2
|
+
|
|
3
|
+
Symptom → cause → fix, for the problems users actually hit. Every path and
|
|
4
|
+
flag below is taken from the code (`src/`) or the linked reference doc; when a
|
|
5
|
+
sentence here disagrees with the code, the code wins — fix the doc.
|
|
6
|
+
|
|
7
|
+
Related: [cli.md](./cli.md) (commands), [server-config.md](./server-config.md)
|
|
8
|
+
(serve flags, admission), [distribution.md](./distribution.md) (install paths,
|
|
9
|
+
signing), [docs/reference/distribution.md](./distribution.md) (sidecar layout, self-signing),
|
|
10
|
+
[environment.md](./environment.md) (contributor/agent platform facts).
|
|
11
|
+
|
|
12
|
+
## Runtime and install
|
|
13
|
+
|
|
14
|
+
### `dlopen` fails / `libmlxc.dylib` not found
|
|
15
|
+
|
|
16
|
+
**Cause.** The `mlx-bun` executable ships without the MLX native runtime
|
|
17
|
+
(`libmlxc.dylib`, `libmlx.dylib`, `libjaccl.dylib`, `mlx.metallib`, plus the
|
|
18
|
+
expert-IO dylib and frame-extract helper — the list is `NATIVE_PACK_FILES` in
|
|
19
|
+
`src/native-pack.ts`). The runtime is a versioned tarball downloaded on first
|
|
20
|
+
run into `~/Library/Caches/mlx-bun/native-v<ver>-<arch>/`. The download is
|
|
21
|
+
resumable and sha256-verified through the same machinery as model downloads
|
|
22
|
+
(`src/download.ts`), so an interrupted first run leaves a partial file, not a
|
|
23
|
+
broken install.
|
|
24
|
+
|
|
25
|
+
**Fix.** Rerun `mlx-bun serve` (or any command that loads the runtime); it
|
|
26
|
+
resumes and verifies. The library is resolved in this order
|
|
27
|
+
(`resolveLibmlxc()` in `src/mlx/ffi.ts`, mirrored by `nativeRuntimeDir()` in
|
|
28
|
+
`src/native-pack.ts`):
|
|
29
|
+
|
|
30
|
+
1. `MLX_BUN_LIBMLXC=/path/to/libmlxc.dylib` — explicit override; the other
|
|
31
|
+
libs are expected in the same directory.
|
|
32
|
+
2. Beside the executable (the sidecar layout from `docs/reference/distribution.md`).
|
|
33
|
+
3. The native-pack cache dir above.
|
|
34
|
+
4. Homebrew: `/opt/homebrew/lib`, then `/usr/local/lib`.
|
|
35
|
+
|
|
36
|
+
To use your own build, set `MLX_BUN_LIBMLXC`. If you see
|
|
37
|
+
`no native pack published for <arch> — set MLX_BUN_LIBMLXC or install mlx via
|
|
38
|
+
homebrew`, there is no published pack for that CPU architecture (only `arm64`
|
|
39
|
+
has a baked checksum in `src/native-pack.ts`); use one of the two escapes in
|
|
40
|
+
the message. `MLX_BUN_NATIVE_PACK_URL` overrides the download URL.
|
|
41
|
+
|
|
42
|
+
### Gatekeeper: "unidentified developer" / app can't be opened
|
|
43
|
+
|
|
44
|
+
**Cause.** Released binaries are Developer-ID signed and notarized. macOS only
|
|
45
|
+
checks the notarization ticket when a file carries the `com.apple.quarantine`
|
|
46
|
+
xattr, which browser downloads and `curl -O`-style saves get. Homebrew installs
|
|
47
|
+
and the documented `curl ... | tar -xz` one-liner never write a quarantined
|
|
48
|
+
file, so they never prompt (`distribution.md`, "Direct download").
|
|
49
|
+
|
|
50
|
+
**Fix.**
|
|
51
|
+
- Online: the notarization ticket resolves the check; allow it once.
|
|
52
|
+
- Offline: `xattr -d com.apple.quarantine mlx-bun` (the manual escape hatch
|
|
53
|
+
from `distribution.md`).
|
|
54
|
+
- Self-built binary: the bundle's dylibs must be (re)signed with the hardened
|
|
55
|
+
runtime and entitlements — see "Signing & notarization" in
|
|
56
|
+
[docs/reference/distribution.md](./distribution.md).
|
|
57
|
+
|
|
58
|
+
### Wrong Bun version / `Bun.Image` missing / FFI crashes in a source checkout
|
|
59
|
+
|
|
60
|
+
**Cause.** `package.json` pins `"bun": ">=1.4.0"`. Two things depend on it:
|
|
61
|
+
`Bun.Image` is the vision decode path (`src/vision/preprocess.ts`), and Bun
|
|
62
|
+
1.4 fixed a `bun:ffi` stack-argument ABI bug on macOS arm64 that made
|
|
63
|
+
multi-argument mlx-c bindings hand the callee shifted garbage
|
|
64
|
+
(`lab/repro/bun-ffi-stack-args/ISSUE.md`; the code now uses natural mlx-c
|
|
65
|
+
signatures with no workaround).
|
|
66
|
+
|
|
67
|
+
**Fix.** `bun upgrade`, then `bun --version` ≥ 1.4.0. The compiled release
|
|
68
|
+
binary embeds its own Bun, so this only affects running from source.
|
|
69
|
+
|
|
70
|
+
### `port 8080 is already serving …`
|
|
71
|
+
|
|
72
|
+
**Cause.** `serve` probes the port before loading weights and refuses to start
|
|
73
|
+
a second server on a port that already answers `/v1` (`src/cli.ts`, serve
|
|
74
|
+
branch; `--port` row in `server-config.md`).
|
|
75
|
+
|
|
76
|
+
**Fix.** Reuse the running server (`mlx-bun pi` attaches automatically), stop
|
|
77
|
+
it, or pass `--port <other>`. A second server is a second model in memory;
|
|
78
|
+
check `mlx-bun fit` first.
|
|
79
|
+
|
|
80
|
+
## Models and downloads
|
|
81
|
+
|
|
82
|
+
### `no models match (try \`mlx-bun scan\`)`
|
|
83
|
+
|
|
84
|
+
**Cause.** `ls`/`serve`/`fit` resolve models from a registry built by scanning
|
|
85
|
+
the Hugging Face hub cache. The registry is stale or empty, or the model is
|
|
86
|
+
not in the cache directory the registry reads.
|
|
87
|
+
|
|
88
|
+
**Fix.** Run `mlx-bun scan` after downloading. The cache path is resolved
|
|
89
|
+
exactly as `huggingface_hub` does (`DEFAULT_HUB` in `src/registry.ts`):
|
|
90
|
+
`HF_HUB_CACHE`, else `HF_HOME/hub`, else `~/.cache/huggingface/hub`. If you
|
|
91
|
+
downloaded to a custom location, set the same env var for `mlx-bun`. The
|
|
92
|
+
registry database lives at `~/.cache/mlx-bun/registry.sqlite`.
|
|
93
|
+
|
|
94
|
+
### Hugging Face download stalls at 0%
|
|
95
|
+
|
|
96
|
+
**Cause.** The Python `hf` downloader uses the Xet transfer path, which stalls
|
|
97
|
+
on some networks.
|
|
98
|
+
|
|
99
|
+
**Fix.** Use `mlx-bun get <org/repo>` — it speaks plain HTTPS resolve/CDN with
|
|
100
|
+
no Xet, Range-resumes partial blobs, and verifies every file (sha256 for LFS
|
|
101
|
+
blobs, git-blob sha1 for small files) into the standard hub cache layout
|
|
102
|
+
(`src/download.ts`). Rerunning the same command resumes verified
|
|
103
|
+
`.incomplete` prefixes. If you must use the Python CLI, set
|
|
104
|
+
`HF_HUB_DISABLE_XET=1` before the download command.
|
|
105
|
+
|
|
106
|
+
### `get` refuses for lack of disk space
|
|
107
|
+
|
|
108
|
+
**Cause.** Before transferring, `get` credits complete blobs and partial
|
|
109
|
+
prefixes, then requires free space for the exact remainder plus a fixed 1 GiB
|
|
110
|
+
reserve (`cli.md`, `get`).
|
|
111
|
+
|
|
112
|
+
**Fix.** Free space, or point `HF_HUB_CACHE` at a larger volume before
|
|
113
|
+
starting.
|
|
114
|
+
|
|
115
|
+
### Gated repo: 401/403 from Hugging Face
|
|
116
|
+
|
|
117
|
+
**Cause.** No token. `get` reads `HF_TOKEN`, else
|
|
118
|
+
`~/.cache/huggingface/token` (`hfToken()` in `src/download.ts`).
|
|
119
|
+
|
|
120
|
+
**Fix.** `hf auth login`, or export `HF_TOKEN`.
|
|
121
|
+
|
|
122
|
+
## Memory and performance
|
|
123
|
+
|
|
124
|
+
### Will it fit? / decode is very slow on a model near the RAM ceiling
|
|
125
|
+
|
|
126
|
+
**Cause.** A model whose weights plus KV cache exceed the wired-memory budget
|
|
127
|
+
pages weights every token. The default budget is machine RAM × 0.75
|
|
128
|
+
(`WIRED_FRACTION` in `src/fit.ts`; `--memory-budget` in `server-config.md`).
|
|
129
|
+
|
|
130
|
+
**Fix.** Check first:
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
mlx-bun fit <model> --ctx 8192 # this machine
|
|
134
|
+
mlx-bun fit <model> --ctx 8192 --skus # across the Apple Silicon lineup
|
|
135
|
+
mlx-bun fit <model> --kv-quant 4 # window with a 4-bit KV cache
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`fit` reports weights bytes (from safetensors headers), KV bytes/token, the
|
|
139
|
+
calibrated prefill transient, and the wired ceiling. Then close memory-heavy
|
|
140
|
+
apps, pick a smaller quantization, or serve with `--kv-quant 4|8` for a larger
|
|
141
|
+
context window in the same budget. GLM-5.2 uses its own streamed-runtime plan
|
|
142
|
+
(`fit GLM-5.2`; `--context-length`), not the resident-weights estimator.
|
|
143
|
+
|
|
144
|
+
### Completion stops before my `max_tokens` (no error)
|
|
145
|
+
|
|
146
|
+
**Cause.** This is memory admission clamping, not a bug. When the prompt fits
|
|
147
|
+
but the client's `max_tokens` would push the reservation past the safe
|
|
148
|
+
context, the server caps `max_tokens` to the remaining room and proceeds
|
|
149
|
+
(`admitRequestContext()` in `src/server.ts`: `max_tokens` is a ceiling, not a
|
|
150
|
+
promise). Earlier versions returned 400 for this case; the clamp shipped for
|
|
151
|
+
GLM-5.2 fixed-context serving in v0.0.13 and for all memory admission in
|
|
152
|
+
v0.2.0 (`docs/archive/planning/release-notes-v0.2.0.md`).
|
|
153
|
+
|
|
154
|
+
**Fix.** Nothing is required. To get more room: shorten the prompt, raise
|
|
155
|
+
`--memory-budget` if the machine allows, or serve with `--kv-quant 4|8`. The
|
|
156
|
+
current ceiling is visible at `/stats` (`context_tokens`).
|
|
157
|
+
|
|
158
|
+
### `400` with `"type": "memory_admission"`, `"code": "context_over_budget"`
|
|
159
|
+
|
|
160
|
+
**Cause.** The prompt alone leaves no generation slot inside the safe context.
|
|
161
|
+
Only this case is rejected; the alternative is an uncatchable GPU OOM
|
|
162
|
+
(`server-api.md`, error table; `--memory-budget` in `server-config.md`).
|
|
163
|
+
|
|
164
|
+
**Fix.** Same levers as above: shorter prompt, larger budget, quantized KV.
|
|
165
|
+
The server never refuses to *start* over budget — a budget too small for any
|
|
166
|
+
context logs a warning and serves, and requests then get this 400.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mlx-bun",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Native MLX inference for Bun on Apple Silicon — local LLM server (OpenAI/Anthropic-compatible) and TypeScript library. No Python.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -26,7 +26,9 @@
|
|
|
26
26
|
},
|
|
27
27
|
"exports": {
|
|
28
28
|
".": "./src/index.ts",
|
|
29
|
-
"./package.json": "./package.json"
|
|
29
|
+
"./package.json": "./package.json",
|
|
30
|
+
"./engine": "./src/library.ts",
|
|
31
|
+
"./client": "./src/client.ts"
|
|
30
32
|
},
|
|
31
33
|
"files": [
|
|
32
34
|
"bin",
|
|
@@ -47,16 +49,19 @@
|
|
|
47
49
|
],
|
|
48
50
|
"scripts": {
|
|
49
51
|
"test": "bash scripts/test.sh",
|
|
52
|
+
"typecheck": "tsc --noEmit && tsc -p tsconfig.web.json --noEmit && tsc -p src/contracts/tsconfig.json --noEmit",
|
|
50
53
|
"link-cli": "chmod +x src/cli.ts && ln -sf $PWD/src/cli.ts $HOME/.bun/bin/mlx-bun && mlx-bun --version",
|
|
51
54
|
"build:binary": "sh scripts/build-binary.sh",
|
|
52
55
|
"release": "PUBLISH=1 sh scripts/release-binary.sh",
|
|
53
|
-
"publish:npm": "bun publish"
|
|
56
|
+
"publish:npm": "bun publish",
|
|
57
|
+
"clean": "bun scripts/clean.ts"
|
|
54
58
|
},
|
|
55
59
|
"devDependencies": {
|
|
56
60
|
"@anthropic-ai/sdk": "^0.104.1",
|
|
57
61
|
"@types/bun": "^1.3.14",
|
|
58
62
|
"happy-dom": "^20.10.6",
|
|
59
|
-
"openai": "^6.42.0"
|
|
63
|
+
"openai": "^6.42.0",
|
|
64
|
+
"typescript": "6.0.3"
|
|
60
65
|
},
|
|
61
66
|
"dependencies": {
|
|
62
67
|
"@earendil-works/pi-ai": "0.80.3",
|
package/src/audio/decode.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// WAV decode for audio input (A1 of docs/design/
|
|
1
|
+
// WAV decode for audio input (A1 of docs/design/generic-model-support.md).
|
|
2
2
|
//
|
|
3
3
|
// Scope: RIFF/WAVE containers — PCM 16/24/32-bit and IEEE float32, any
|
|
4
4
|
// channel count (mean mixdown), any sample rate (linear resample to 16 kHz).
|
|
5
5
|
// PCM16 scales by 1/32768 to match the oracle golden generator
|
|
6
|
-
// (scripts/gen-e4b-audio-golden.py) exactly. Non-WAV containers (mp3/m4a/
|
|
6
|
+
// (scripts/oracle/gen-e4b-audio-golden.py) exactly. Non-WAV containers (mp3/m4a/
|
|
7
7
|
// flac/ogg) are transcoded to WAV by the serve layer via macOS `afconvert`
|
|
8
8
|
// before reaching this parser.
|
|
9
9
|
//
|
package/src/audio/features.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// USM log-mel feature extraction for gemma-4 audio — a verbatim-semantics
|
|
2
2
|
// port of the oracle's Gemma4AudioFeatureExtractor (optiq/vlm/_mlxvlm/
|
|
3
3
|
// models/gemma4/audio_feature_extractor.py, constructor DEFAULTS — §3.3 Q3
|
|
4
|
-
// of docs/design/
|
|
4
|
+
// of docs/design/generic-model-support.md: no per-bin normalization, params are
|
|
5
5
|
// fixed for all gemma-4 models). Gated bit-close against the T0 mel goldens
|
|
6
|
-
// (goldens/e4b-audio-*-mel.bin) in tests/audio-features.test.ts.
|
|
6
|
+
// (goldens/e4b-audio-*-mel.bin) in tests/parity/audio-features.test.ts.
|
|
7
7
|
//
|
|
8
8
|
// Pipeline (single waveform, 16 kHz mono float32):
|
|
9
9
|
// pad to a multiple of 128 samples (validity mask over the original part)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { AutoregressiveGraph } from "../../inference/graph";
|
|
2
|
+
import type { MlxArray } from "../../mlx/array";
|
|
3
|
+
import type { Cache, Gemma4Model } from "../../model/gemma4";
|
|
4
|
+
import type { RuntimeModel } from "../../model/factory";
|
|
5
|
+
import { CompiledDecode } from "../../model/compiled-decode";
|
|
6
|
+
import { runtimeConfig, type RuntimeConfig } from "../../runtime-config";
|
|
7
|
+
import { bindMlxGraph } from "./graph";
|
|
8
|
+
|
|
9
|
+
/** One declaration shared by planning and both native execution lanes. */
|
|
10
|
+
export function legacyCompiledDecodeAvailable(model: RuntimeModel): boolean {
|
|
11
|
+
return model.config?.modelType?.startsWith("gemma4") === true && !model.config.text.enableMoeBlock;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface MlxModelMemory {
|
|
15
|
+
readonly weightsBytes: number;
|
|
16
|
+
readonly expertRuntime?: {
|
|
17
|
+
readonly plan: { readonly plannedBytes: number };
|
|
18
|
+
flushUsage?: () => void;
|
|
19
|
+
finishUsage?: () => Promise<void>;
|
|
20
|
+
} | null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface MlxDecodeStep {
|
|
24
|
+
/** Consume one pending token and advance state once. Returned arrays belong
|
|
25
|
+
* to the caller. null permits ordinary graph execution and MUST leave state
|
|
26
|
+
* unchanged. Errors propagate unless this implementation can roll back. */
|
|
27
|
+
tryStep(token: MlxArray, state: Cache[]): { logits: MlxArray; evalWith: MlxArray[] } | null;
|
|
28
|
+
/** Release per-run workspaces after pending outputs are dropped and before
|
|
29
|
+
* cache disposal. Wait for native work if releasing requires completion. */
|
|
30
|
+
close(): void | Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Model-owned execution for committed tokens. Recheck the chunk limit after
|
|
34
|
+
* each forward: native arithmetic can change at a cache-length boundary. */
|
|
35
|
+
export interface MlxTokenAppend {
|
|
36
|
+
maxChunkSize(state: readonly Cache[]): number;
|
|
37
|
+
forwardHidden(ids: MlxArray, state: Cache[]): MlxArray | Promise<MlxArray>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** One replaceable binding owns all graph-specific operations used by the AR
|
|
41
|
+
* loop. The current method requires MLX tensors and the legacy Cache[] ABI.
|
|
42
|
+
* Weights are borrowed for the binding's lifetime; generated caches are owned
|
|
43
|
+
* by the run. Caller-provided caches and media remain borrowed. */
|
|
44
|
+
export interface MlxAutoregressiveBinding {
|
|
45
|
+
readonly runtime?: RuntimeConfig;
|
|
46
|
+
readonly graph: AutoregressiveGraph<MlxArray, Cache[], MlxArray>;
|
|
47
|
+
readonly eosTokenIds: readonly number[];
|
|
48
|
+
readonly memory: MlxModelMemory;
|
|
49
|
+
readonly adapters?: { active: string[] };
|
|
50
|
+
makeCache(): Cache[];
|
|
51
|
+
forwardEmbeddings?(
|
|
52
|
+
embeddings: MlxArray, state: Cache[], imageMask: MlxArray | null,
|
|
53
|
+
ids: MlxArray, multimodalMask: MlxArray | null,
|
|
54
|
+
): MlxArray;
|
|
55
|
+
/** Called once after prefill. A compiled/fused decoder belongs to THIS graph,
|
|
56
|
+
* never to a model inferred from a name or inherited by a replacement. */
|
|
57
|
+
createDecode?(policy: { hasAdapters: boolean; pagedKv: boolean }): MlxDecodeStep | null;
|
|
58
|
+
createAppend?(policy: { hasAdapters: boolean; pagedKv: boolean }): MlxTokenAppend | null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Keep concrete model and compiled-decode decisions at the legacy boundary. */
|
|
62
|
+
export function bindLegacyAutoregressiveModel(model: RuntimeModel): MlxAutoregressiveBinding {
|
|
63
|
+
const runtime = runtimeConfig();
|
|
64
|
+
return {
|
|
65
|
+
runtime,
|
|
66
|
+
graph: bindMlxGraph<Cache[]>(model, {
|
|
67
|
+
id: `legacy:${model.config.modelType}`, artifact: "legacy-resident-model",
|
|
68
|
+
stateAbi: "legacy-cache-array-v1", // not a persistence identity
|
|
69
|
+
}),
|
|
70
|
+
eosTokenIds: model.config.eosTokenIds,
|
|
71
|
+
memory: model,
|
|
72
|
+
adapters: model.loraState,
|
|
73
|
+
makeCache: model.makeCache.bind(model),
|
|
74
|
+
forwardEmbeddings: model.forwardEmbeddings?.bind(model),
|
|
75
|
+
createAppend: "createAppend" in model ? model.createAppend.bind(model) : undefined,
|
|
76
|
+
createDecode(policy) {
|
|
77
|
+
// Preserve the existing Gemma path and exclusions. MoE shapeless replay
|
|
78
|
+
// retraces growing windows; adapters would bake residuals into the tape.
|
|
79
|
+
if (!runtime.flag("MLX_BUN_COMPILED_DECODE", true) || policy.hasAdapters || policy.pagedKv ||
|
|
80
|
+
!legacyCompiledDecodeAvailable(model))
|
|
81
|
+
return null;
|
|
82
|
+
let compiled: CompiledDecode | null = CompiledDecode.for(model as Gemma4Model);
|
|
83
|
+
return {
|
|
84
|
+
tryStep(token, state) {
|
|
85
|
+
if (!compiled || !CompiledDecode.supports(state)) return null;
|
|
86
|
+
try { return compiled.step(token, state); }
|
|
87
|
+
catch (error) {
|
|
88
|
+
// CompiledDecode restores committed writes on failure, so retrying
|
|
89
|
+
// this token through the ordinary graph is safe. Other decoders
|
|
90
|
+
// must establish that guarantee themselves before returning null.
|
|
91
|
+
compiled = null;
|
|
92
|
+
console.warn(`compiled decode disabled for this generation: ${error}`);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
// Compiled closures belong to the model's existing unload lifecycle.
|
|
97
|
+
close() { compiled = null; },
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function assertMlxAutoregressiveBinding(binding: MlxAutoregressiveBinding): void {
|
|
104
|
+
const descriptor = binding.graph.descriptor;
|
|
105
|
+
if (descriptor.backend !== "mlx" || descriptor.graphAbi !== "mlx-hidden-bsh-v1" ||
|
|
106
|
+
descriptor.stateAbi !== "legacy-cache-array-v1")
|
|
107
|
+
throw new Error(`AR binding ${descriptor.id} has an incompatible backend, graph, or state ABI`);
|
|
108
|
+
}
|