mlx-bun 0.5.0 → 1.0.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 +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
package/src/mlx/ffi.ts
DELETED
|
@@ -1,531 +0,0 @@
|
|
|
1
|
-
// Raw bun:ffi bindings to libmlxc.
|
|
2
|
-
//
|
|
3
|
-
// Calling convention (verified in Phase 0, see PLAN.md):
|
|
4
|
-
// - Every mlx-c handle is a one-pointer struct `{ void* ctx }` — passed and
|
|
5
|
-
// returned by value in a single register on arm64, so FFIType.u64 works.
|
|
6
|
-
// - Out-params (`mlx_array* res`) are a pointer to that slot: allocate a
|
|
7
|
-
// BigUint64Array(1), pass ptr(), reread after the call via read.u64 —
|
|
8
|
-
// NOT slot[0] (DFG stale-read bug, see rule above outArray).
|
|
9
|
-
// - Ops return int status; 0 = success.
|
|
10
|
-
// - mlx_optional_int is `{ int32 value; bool has_value }` = 8 bytes, by
|
|
11
|
-
// value in one register: value in bits 0..31, has_value at bit 32.
|
|
12
|
-
|
|
13
|
-
import { dlopen, FFIType, ptr, read, type Pointer } from "bun:ffi";
|
|
14
|
-
import { existsSync } from "node:fs";
|
|
15
|
-
import { dirname, join } from "node:path";
|
|
16
|
-
import { MLX_CORE_VERSION, nativePackDir } from "../native-pack";
|
|
17
|
-
import { runtimeValue } from "../runtime-config";
|
|
18
|
-
|
|
19
|
-
const { ptr: P, i32, u64, f32, f64, cstring } = FFIType;
|
|
20
|
-
|
|
21
|
-
/** libmlxc resolution, in order: explicit env override → next to the
|
|
22
|
-
* executable (the `bun build --compile` sidecar layout, where
|
|
23
|
-
* libmlxc.dylib + libmlx.dylib + mlx.metallib ship beside the binary —
|
|
24
|
-
* see docs/reference/distribution.md) → the downloaded native-pack cache
|
|
25
|
-
* (src/native-pack.ts; populated on first run by the CLI) → homebrew
|
|
26
|
-
* (arm64, then Intel prefix). Keep in sync with nativeRuntimeDir(). */
|
|
27
|
-
function resolveLibmlxc(): string {
|
|
28
|
-
const env = runtimeValue("MLX_BUN_LIBMLXC");
|
|
29
|
-
if (env) return env;
|
|
30
|
-
const beside = join(dirname(process.execPath), "libmlxc.dylib");
|
|
31
|
-
if (existsSync(beside)) return beside;
|
|
32
|
-
const cached = join(nativePackDir(), "libmlxc.dylib");
|
|
33
|
-
if (existsSync(cached)) return cached;
|
|
34
|
-
for (const p of ["/opt/homebrew/lib/libmlxc.dylib", "/usr/local/lib/libmlxc.dylib"])
|
|
35
|
-
if (existsSync(p)) return p;
|
|
36
|
-
// let dlopen produce the canonical error message for the default path
|
|
37
|
-
return "/opt/homebrew/lib/libmlxc.dylib";
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export const LIBMLXC_PATH = resolveLibmlxc();
|
|
41
|
-
export const C = dlopen(LIBMLXC_PATH, {
|
|
42
|
-
// linked MLX core version, independent of the C API family
|
|
43
|
-
mlx_version: { args: [P], returns: i32 },
|
|
44
|
-
mlx_string_new: { args: [], returns: u64 },
|
|
45
|
-
mlx_string_data: { args: [u64], returns: cstring },
|
|
46
|
-
mlx_string_free: { args: [u64], returns: i32 },
|
|
47
|
-
// array lifecycle
|
|
48
|
-
mlx_array_new: { args: [], returns: u64 },
|
|
49
|
-
mlx_array_new_data: { args: [P, P, i32, i32], returns: u64 },
|
|
50
|
-
mlx_array_new_data_managed_payload: { args: [P, P, i32, i32, P, P], returns: u64 },
|
|
51
|
-
mlx_array_free: { args: [u64], returns: i32 },
|
|
52
|
-
mlx_array_eval: { args: [u64], returns: i32 },
|
|
53
|
-
// array metadata
|
|
54
|
-
mlx_array_ndim: { args: [u64], returns: u64 },
|
|
55
|
-
mlx_array_shape: { args: [u64], returns: P },
|
|
56
|
-
mlx_array_strides: { args: [u64], returns: P },
|
|
57
|
-
mlx_array_itemsize: { args: [u64], returns: u64 },
|
|
58
|
-
mlx_array_dim: { args: [u64, i32], returns: i32 },
|
|
59
|
-
mlx_array_dtype: { args: [u64], returns: i32 },
|
|
60
|
-
mlx_array_size: { args: [u64], returns: u64 },
|
|
61
|
-
mlx_array_nbytes: { args: [u64], returns: u64 },
|
|
62
|
-
// data access (forces eval/copy to host-visible memory)
|
|
63
|
-
mlx_array_data_float32: { args: [u64], returns: P },
|
|
64
|
-
mlx_array_data_float16: { args: [u64], returns: P },
|
|
65
|
-
mlx_array_data_bfloat16: { args: [u64], returns: P },
|
|
66
|
-
mlx_array_data_uint32: { args: [u64], returns: P },
|
|
67
|
-
mlx_array_data_int32: { args: [u64], returns: P },
|
|
68
|
-
mlx_array_data_uint8: { args: [u64], returns: P },
|
|
69
|
-
mlx_array_data_int8: { args: [u64], returns: P },
|
|
70
|
-
mlx_array_item_float32: { args: [P, u64], returns: i32 },
|
|
71
|
-
// streams
|
|
72
|
-
mlx_default_gpu_stream_new: { args: [], returns: u64 },
|
|
73
|
-
mlx_default_cpu_stream_new: { args: [], returns: u64 },
|
|
74
|
-
mlx_stream_free: { args: [u64], returns: i32 },
|
|
75
|
-
// eval control (both take mlx_vector_array)
|
|
76
|
-
mlx_eval: { args: [u64], returns: i32 },
|
|
77
|
-
mlx_async_eval: { args: [u64], returns: i32 },
|
|
78
|
-
// memory introspection / limits
|
|
79
|
-
mlx_get_active_memory: { args: [P], returns: i32 },
|
|
80
|
-
mlx_get_peak_memory: { args: [P], returns: i32 },
|
|
81
|
-
mlx_reset_peak_memory: { args: [], returns: i32 },
|
|
82
|
-
// mlx_device_info is a one-pointer struct like every other handle
|
|
83
|
-
mlx_device_info_new: { args: [], returns: u64 },
|
|
84
|
-
mlx_device_info_get: { args: [P, u64], returns: i32 },
|
|
85
|
-
mlx_device_info_free: { args: [u64], returns: i32 },
|
|
86
|
-
mlx_device_info_get_size: { args: [P, u64, cstring], returns: i32 },
|
|
87
|
-
mlx_device_info_get_string: { args: [P, u64, cstring], returns: i32 },
|
|
88
|
-
mlx_get_default_device: { args: [P], returns: i32 },
|
|
89
|
-
mlx_device_free: { args: [u64], returns: i32 },
|
|
90
|
-
mlx_synchronize: { args: [u64], returns: i32 },
|
|
91
|
-
mlx_get_cache_memory: { args: [P], returns: i32 },
|
|
92
|
-
mlx_clear_cache: { args: [], returns: i32 },
|
|
93
|
-
mlx_set_memory_limit: { args: [P, u64], returns: i32 },
|
|
94
|
-
mlx_set_wired_limit: { args: [P, u64], returns: i32 },
|
|
95
|
-
// io: native lazy safetensors loader (Load primitive is CPU-only —
|
|
96
|
-
// always pass the CPU stream; GPU ops consume the unified buffers)
|
|
97
|
-
mlx_load_safetensors: { args: [P, P, cstring, u64], returns: i32 },
|
|
98
|
-
mlx_map_string_to_array_new: { args: [], returns: u64 },
|
|
99
|
-
mlx_map_string_to_array_free: { args: [u64], returns: i32 },
|
|
100
|
-
mlx_map_string_to_array_get: { args: [P, u64, cstring], returns: i32 },
|
|
101
|
-
mlx_map_string_to_string_new: { args: [], returns: u64 },
|
|
102
|
-
mlx_map_string_to_string_free: { args: [u64], returns: i32 },
|
|
103
|
-
// fast fused ops
|
|
104
|
-
// (res, x, weight may-be-null, eps, stream)
|
|
105
|
-
mlx_fast_rms_norm: { args: [P, u64, u64, f32, u64], returns: i32 },
|
|
106
|
-
// (res, x, weight may-be-null, bias may-be-null, eps, stream)
|
|
107
|
-
mlx_fast_layer_norm: { args: [P, u64, u64, u64, f32, u64], returns: i32 },
|
|
108
|
-
// MLX 0.32.2: mask, sinks, force_fused, stream.
|
|
109
|
-
mlx_fast_scaled_dot_product_attention: {
|
|
110
|
-
args: [P, u64, u64, u64, f32, cstring, u64, u64, FFIType.bool, u64], returns: i32,
|
|
111
|
-
},
|
|
112
|
-
mlx_matmul: { args: [P, u64, u64, u64], returns: i32 },
|
|
113
|
-
mlx_contiguous: { args: [P, u64, FFIType.bool, u64], returns: i32 },
|
|
114
|
-
mlx_copy: { args: [P, u64, u64], returns: i32 },
|
|
115
|
-
// (res: mlx_vector_array*, w, opt group_size, opt bits, mode, global_scale, stream)
|
|
116
|
-
mlx_quantize: { args: [P, u64, u64, u64, cstring, u64, u64], returns: i32 },
|
|
117
|
-
mlx_vector_array_get: { args: [P, u64, u64], returns: i32 },
|
|
118
|
-
mlx_vector_array_new: { args: [], returns: u64 },
|
|
119
|
-
mlx_softmax_axis: { args: [P, u64, i32, FFIType.bool, u64], returns: i32 },
|
|
120
|
-
mlx_max_axis: { args: [P, u64, i32, FFIType.bool, u64], returns: i32 },
|
|
121
|
-
mlx_sum_axis: { args: [P, u64, i32, FFIType.bool, u64], returns: i32 },
|
|
122
|
-
// Optional dtype uses the eight-byte value/has_value layout of optional int.
|
|
123
|
-
mlx_cumsum_axis: { args: [P, u64, i32, FFIType.bool, FFIType.bool, u64, u64], returns: i32 },
|
|
124
|
-
mlx_cummax_axis: { args: [P, u64, i32, FFIType.bool, FFIType.bool, u64], returns: i32 },
|
|
125
|
-
mlx_maximum: { args: [P, u64, u64, u64], returns: i32 },
|
|
126
|
-
mlx_expand_dims: { args: [P, u64, i32, u64], returns: i32 },
|
|
127
|
-
mlx_logical_or: { args: [P, u64, u64, u64], returns: i32 },
|
|
128
|
-
// (res, x, dims, traditional, opt base, scale, offset, freqs may-be-null, stream)
|
|
129
|
-
mlx_fast_rope: { args: [P, u64, i32, FFIType.bool, u64, f32, i32, u64, u64], returns: i32 },
|
|
130
|
-
// ops (grown as phases need them)
|
|
131
|
-
mlx_add: { args: [P, u64, u64, u64], returns: i32 },
|
|
132
|
-
mlx_subtract: { args: [P, u64, u64, u64], returns: i32 },
|
|
133
|
-
mlx_multiply: { args: [P, u64, u64, u64], returns: i32 },
|
|
134
|
-
mlx_divide: { args: [P, u64, u64, u64], returns: i32 },
|
|
135
|
-
mlx_tanh: { args: [P, u64, u64], returns: i32 },
|
|
136
|
-
mlx_sigmoid: { args: [P, u64, u64], returns: i32 },
|
|
137
|
-
mlx_erf: { args: [P, u64, u64], returns: i32 },
|
|
138
|
-
// (res, c, a, b, alpha, beta, stream) — alpha·(a@b) + beta·c (nn.Linear bias path)
|
|
139
|
-
mlx_addmm: { args: [P, u64, u64, u64, f32, f32, u64], returns: i32 },
|
|
140
|
-
mlx_power: { args: [P, u64, u64, u64], returns: i32 },
|
|
141
|
-
mlx_take_axis: { args: [P, u64, u64, i32, u64], returns: i32 },
|
|
142
|
-
mlx_reshape: { args: [P, u64, P, u64, u64], returns: i32 },
|
|
143
|
-
mlx_transpose_axes: { args: [P, u64, P, u64, u64], returns: i32 },
|
|
144
|
-
mlx_argmax_axis: { args: [P, u64, i32, FFIType.bool, u64], returns: i32 },
|
|
145
|
-
mlx_concatenate_axis: { args: [P, u64, i32, u64], returns: i32 },
|
|
146
|
-
mlx_vector_array_new_data: { args: [P, u64], returns: u64 },
|
|
147
|
-
mlx_vector_array_free: { args: [u64], returns: i32 },
|
|
148
|
-
mlx_array_item_uint32: { args: [P, u64], returns: i32 },
|
|
149
|
-
mlx_array_item_int32: { args: [P, u64], returns: i32 },
|
|
150
|
-
mlx_slice: { args: [P, u64, P, u64, P, u64, P, u64, u64], returns: i32 },
|
|
151
|
-
// (res, src, update, start*, n, stop*, n, strides*, n, stream)
|
|
152
|
-
mlx_slice_update: { args: [P, u64, u64, P, u64, P, u64, P, u64, u64], returns: i32 },
|
|
153
|
-
mlx_zeros: { args: [P, P, u64, i32, u64], returns: i32 },
|
|
154
|
-
mlx_exp: { args: [P, u64, u64], returns: i32 },
|
|
155
|
-
mlx_cos: { args: [P, u64, u64], returns: i32 },
|
|
156
|
-
mlx_sin: { args: [P, u64, u64], returns: i32 },
|
|
157
|
-
mlx_negative: { args: [P, u64, u64], returns: i32 },
|
|
158
|
-
mlx_argsort_axis: { args: [P, u64, i32, u64], returns: i32 },
|
|
159
|
-
mlx_argpartition_axis: { args: [P, u64, i32, i32, u64], returns: i32 },
|
|
160
|
-
mlx_arange: { args: [P, f64, f64, f64, i32, u64], returns: i32 },
|
|
161
|
-
mlx_take_along_axis: { args: [P, u64, u64, i32, u64], returns: i32 },
|
|
162
|
-
mlx_put_along_axis: { args: [P, u64, u64, u64, i32, u64], returns: i32 },
|
|
163
|
-
mlx_where: { args: [P, u64, u64, u64, u64], returns: i32 },
|
|
164
|
-
mlx_logsumexp_axis: { args: [P, u64, i32, FFIType.bool, u64], returns: i32 },
|
|
165
|
-
mlx_greater_equal: { args: [P, u64, u64, u64], returns: i32 },
|
|
166
|
-
mlx_less: { args: [P, u64, u64, u64], returns: i32 },
|
|
167
|
-
mlx_less_equal: { args: [P, u64, u64, u64], returns: i32 },
|
|
168
|
-
mlx_logical_and: { args: [P, u64, u64, u64], returns: i32 },
|
|
169
|
-
mlx_logical_not: { args: [P, u64, u64], returns: i32 },
|
|
170
|
-
mlx_equal: { args: [P, u64, u64, u64], returns: i32 },
|
|
171
|
-
mlx_all: { args: [P, u64, FFIType.bool, u64], returns: i32 },
|
|
172
|
-
mlx_any_axis: { args: [P, u64, i32, FFIType.bool, u64], returns: i32 },
|
|
173
|
-
mlx_random_key: { args: [P, u64], returns: i32 },
|
|
174
|
-
mlx_random_categorical: { args: [P, u64, i32, u64, u64], returns: i32 },
|
|
175
|
-
mlx_astype: { args: [P, u64, i32, u64], returns: i32 },
|
|
176
|
-
// (res, w, scales, biases, opt group_size, opt bits, mode, global_scale, opt dtype, stream)
|
|
177
|
-
mlx_dequantize: { args: [P, u64, u64, u64, u64, u64, cstring, u64, u64, u64], returns: i32 },
|
|
178
|
-
mlx_quantized_matmul: { args: [P, u64, u64, u64, u64, FFIType.bool, u64, u64, cstring, u64], returns: i32 },
|
|
179
|
-
// (res, x, w, scales, biases?, lhs_indices?, rhs_indices?, transpose,
|
|
180
|
-
// opt group_size, opt bits, mode, sorted_indices, stream)
|
|
181
|
-
mlx_gather_qmm: { args: [P, u64, u64, u64, u64, u64, u64, FFIType.bool, u64, u64, cstring, FFIType.bool, u64], returns: i32 },
|
|
182
|
-
mlx_floor_divide: { args: [P, u64, u64, u64], returns: i32 },
|
|
183
|
-
// (res, input, weight, stride, padding, dilation, groups, stream) — depthwise
|
|
184
|
-
// causal conv1d for Qwen3.5 gated-DeltaNet (groups == channels, padding 0).
|
|
185
|
-
mlx_conv1d: { args: [P, u64, u64, i32, i32, i32, i32, u64], returns: i32 },
|
|
186
|
-
// --- Whisper (src/model/whisper.ts, src/audio/whisper-mel.ts) -----------
|
|
187
|
-
// (res, a, n, axis, norm, stream) — mlx_fft_norm enum: 0 backward (numpy default).
|
|
188
|
-
mlx_fft_rfft: { args: [P, u64, i32, i32, i32, u64], returns: i32 },
|
|
189
|
-
// (res, a, shape*, shape_num, strides*(int64), strides_num, offset, stream)
|
|
190
|
-
mlx_as_strided: { args: [P, u64, P, u64, P, u64, u64, u64], returns: i32 },
|
|
191
|
-
// (res, a, axes*, n, low*, n, high*, n, pad_value, mode, stream)
|
|
192
|
-
mlx_pad: { args: [P, u64, P, u64, P, u64, P, u64, u64, cstring, u64], returns: i32 },
|
|
193
|
-
mlx_log10: { args: [P, u64, u64], returns: i32 },
|
|
194
|
-
// full reduce: (res, a, keepdims, stream)
|
|
195
|
-
mlx_max: { args: [P, u64, FFIType.bool, u64], returns: i32 },
|
|
196
|
-
mlx_broadcast_to: { args: [P, u64, P, u64, u64], returns: i32 },
|
|
197
|
-
mlx_topk_axis: { args: [P, u64, i32, i32, u64], returns: i32 },
|
|
198
|
-
mlx_var_axis: { args: [P, u64, i32, FFIType.bool, i32, u64], returns: i32 },
|
|
199
|
-
mlx_stack_axis: { args: [P, u64, i32, u64], returns: i32 },
|
|
200
|
-
mlx_minimum: { args: [P, u64, u64, u64], returns: i32 },
|
|
201
|
-
// flat take: (res, a, indices, stream)
|
|
202
|
-
mlx_take: { args: [P, u64, u64, u64], returns: i32 },
|
|
203
|
-
// Natural mlx-c signatures. Bun 1.4 fixed the macOS arm64 stack packing
|
|
204
|
-
// bug recorded in lab/repro/bun-ffi-stack-args, so these must match the
|
|
205
|
-
// header exactly. mlx-bun now requires Bun 1.4 or newer.
|
|
206
|
-
mlx_conv2d: { args: [P, u64, u64, i32, i32, i32, i32, i32, i32, i32, u64], returns: i32 },
|
|
207
|
-
mlx_conv3d: { args: [P, u64, u64, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, u64], returns: i32 },
|
|
208
|
-
// --- training: autograd (value_and_grad) — proven in lab/spikes/phase-train-vag.ts.
|
|
209
|
-
// mlx_value_and_grad(res: mlx_closure_value_and_grad*, fun: mlx_closure,
|
|
210
|
-
// argnums: int*, n) → builds a value+grad closure differentiating the
|
|
211
|
-
// selected inputs of `fun` (a mlx_closure_new_func_payload over a JS loss).
|
|
212
|
-
mlx_value_and_grad: { args: [P, u64, P, u64], returns: i32 },
|
|
213
|
-
mlx_closure_value_and_grad_new: { args: [], returns: u64 },
|
|
214
|
-
// (value: vector_array*, grads: vector_array*, cls, input: vector_array)
|
|
215
|
-
mlx_closure_value_and_grad_apply: { args: [P, P, u64, u64], returns: i32 },
|
|
216
|
-
mlx_closure_value_and_grad_free: { args: [u64], returns: i32 },
|
|
217
|
-
// mlx_vjp(outputs: vector_array*, vjps: vector_array*, fun: mlx_closure,
|
|
218
|
-
// primals: vector_array, cotangents: vector_array) — reverse-mode AD given an
|
|
219
|
-
// explicit cotangent per output. The natural segmented-backward primitive:
|
|
220
|
-
// fun = segment forward, cotangent = dh, vjps = [dh_in, ...dLoRA]. No
|
|
221
|
-
// surrogate scalar, no value_and_grad closure (see src/train/segmented.ts).
|
|
222
|
-
mlx_vjp: { args: [P, P, u64, u64, u64], returns: i32 },
|
|
223
|
-
// --- training: random init (LoRA A ~ normal; B stays zeros)
|
|
224
|
-
// (res, shape*, n, dtype, loc, scale, key may-be-null, stream)
|
|
225
|
-
mlx_random_normal: { args: [P, P, u64, i32, f32, f32, u64, u64], returns: i32 },
|
|
226
|
-
// (res, low, high, shape*, n, dtype, key may-be-null, stream) — low/high are
|
|
227
|
-
// scalar mlx_arrays. Used for mlx-lm-faithful LoRA A init (uniform).
|
|
228
|
-
mlx_random_uniform: { args: [P, u64, u64, P, u64, i32, u64, u64], returns: i32 },
|
|
229
|
-
mlx_random_randint: { args: [P, u64, u64, P, u64, i32, u64, u64], returns: i32 },
|
|
230
|
-
mlx_random_seed: { args: [u64], returns: i32 },
|
|
231
|
-
mlx_random_split_num: { args: [P, u64, i32, u64], returns: i32 },
|
|
232
|
-
// --- training: loss/optimizer elementwise + reductions
|
|
233
|
-
mlx_stop_gradient: { args: [P, u64, u64], returns: i32 },
|
|
234
|
-
mlx_log: { args: [P, u64, u64], returns: i32 },
|
|
235
|
-
mlx_logaddexp: { args: [P, u64, u64, u64], returns: i32 },
|
|
236
|
-
mlx_mean: { args: [P, u64, FFIType.bool, u64], returns: i32 },
|
|
237
|
-
mlx_mean_axis: { args: [P, u64, i32, FFIType.bool, u64], returns: i32 },
|
|
238
|
-
mlx_sqrt: { args: [P, u64, u64], returns: i32 },
|
|
239
|
-
mlx_rsqrt: { args: [P, u64, u64], returns: i32 },
|
|
240
|
-
mlx_square: { args: [P, u64, u64], returns: i32 },
|
|
241
|
-
mlx_abs: { args: [P, u64, u64], returns: i32 },
|
|
242
|
-
// (res, a, a_min may-be-null, a_max may-be-null, stream)
|
|
243
|
-
mlx_clip: { args: [P, u64, u64, u64, u64], returns: i32 },
|
|
244
|
-
// --- quantization: native safetensors writer (io.h) + map inserts (map.h)
|
|
245
|
-
mlx_save_safetensors: { args: [cstring, u64, u64], returns: i32 },
|
|
246
|
-
mlx_map_string_to_array_insert: { args: [u64, cstring, u64], returns: i32 },
|
|
247
|
-
mlx_map_string_to_string_insert: { args: [u64, cstring, cstring], returns: i32 },
|
|
248
|
-
// compile via closures (Phase A compiled decode — docs/archive/investigations/optimization_plan.md).
|
|
249
|
-
// mlx_closure is the usual one-pointer struct; the func-payload variant
|
|
250
|
-
// carries an id we use to route the trace callback back to JS.
|
|
251
|
-
mlx_closure_new: { args: [], returns: u64 },
|
|
252
|
-
mlx_closure_new_func_payload: { args: [P, P, P], returns: u64 },
|
|
253
|
-
mlx_closure_free: { args: [u64], returns: i32 },
|
|
254
|
-
mlx_closure_apply: { args: [P, u64, u64], returns: i32 },
|
|
255
|
-
// gradient checkpointing (transforms.h): wrap a closure so its forward
|
|
256
|
-
// activations are dropped and recomputed during the enclosing backward.
|
|
257
|
-
// mlx_checkpoint(res: mlx_closure*, fun: mlx_closure) → checkpointed closure.
|
|
258
|
-
mlx_checkpoint: { args: [P, u64], returns: i32 },
|
|
259
|
-
// custom_vjp (transforms.h): attach a hand-written backward to a forward whose
|
|
260
|
-
// primitives have no usable vjp (e.g. a fused metal_kernel). Needed for the L2
|
|
261
|
-
// flash-attention training op. mlx_custom_vjp(res: mlx_closure*, fun: mlx_closure,
|
|
262
|
-
// fun_vjp: mlx_closure_custom). The custom-vjp closure's callback is
|
|
263
|
-
// (res*, primals, cotangents, outputs, payload) → status.
|
|
264
|
-
mlx_custom_vjp: { args: [P, u64, u64], returns: i32 },
|
|
265
|
-
mlx_closure_custom_new_func_payload: { args: [P, P, P], returns: u64 },
|
|
266
|
-
mlx_closure_custom_free: { args: [u64], returns: i32 },
|
|
267
|
-
mlx_compile: { args: [P, u64, FFIType.bool], returns: i32 },
|
|
268
|
-
mlx_set_compile_mode: { args: [i32], returns: i32 },
|
|
269
|
-
mlx_vector_array_size: { args: [u64], returns: u64 },
|
|
270
|
-
mlx_vector_array_set_data: { args: [P, P, u64], returns: i32 },
|
|
271
|
-
// dynamic-start variants: per-decode-step offsets enter the graph as
|
|
272
|
-
// array VALUES instead of baked ints, so one compiled graph serves
|
|
273
|
-
// every step (no per-step retrace).
|
|
274
|
-
// (res, x, dims, traditional, opt base, scale, offset ARRAY, freqs may-be-null, stream)
|
|
275
|
-
mlx_fast_rope_dynamic: { args: [P, u64, i32, FFIType.bool, u64, f32, u64, u64, u64], returns: i32 },
|
|
276
|
-
// (res, src, update, start ARRAY, axes*, axes_num, stream)
|
|
277
|
-
mlx_slice_update_dynamic: { args: [P, u64, u64, u64, P, u64, u64], returns: i32 },
|
|
278
|
-
// (res, a, start ARRAY, axes*, axes_num, slice_size*, n, stream)
|
|
279
|
-
mlx_slice_dynamic: { args: [P, u64, u64, P, u64, P, u64, u64], returns: i32 },
|
|
280
|
-
// custom Metal kernels (Phase E — mx.fast.metal_kernel from Bun)
|
|
281
|
-
mlx_vector_string_new_data: { args: [P, u64], returns: u64 },
|
|
282
|
-
mlx_vector_string_free: { args: [u64], returns: i32 },
|
|
283
|
-
// (name, input_names, output_names, source, header, ensure_row_contiguous, atomic_outputs)
|
|
284
|
-
mlx_fast_metal_kernel_new: { args: [cstring, u64, u64, cstring, cstring, FFIType.bool, FFIType.bool], returns: u64 },
|
|
285
|
-
mlx_fast_metal_kernel_free: { args: [u64], returns: FFIType.void },
|
|
286
|
-
// (outputs: mlx_vector_array*, kernel, inputs, config, stream)
|
|
287
|
-
mlx_fast_metal_kernel_apply: { args: [P, u64, u64, u64, u64], returns: i32 },
|
|
288
|
-
mlx_fast_metal_kernel_config_new: { args: [], returns: u64 },
|
|
289
|
-
mlx_fast_metal_kernel_config_free: { args: [u64], returns: FFIType.void },
|
|
290
|
-
mlx_fast_metal_kernel_config_add_output_arg: { args: [u64, P, u64, i32], returns: i32 },
|
|
291
|
-
mlx_fast_metal_kernel_config_set_grid: { args: [u64, i32, i32, i32], returns: i32 },
|
|
292
|
-
mlx_fast_metal_kernel_config_set_thread_group: { args: [u64, i32, i32, i32], returns: i32 },
|
|
293
|
-
mlx_fast_metal_kernel_config_set_init_value: { args: [u64, f32], returns: i32 },
|
|
294
|
-
mlx_fast_metal_kernel_config_add_template_arg_int: { args: [u64, cstring, i32], returns: i32 },
|
|
295
|
-
mlx_fast_metal_kernel_config_add_template_arg_dtype: { args: [u64, cstring, i32], returns: i32 },
|
|
296
|
-
// GPU trace capture (Phase E step 2: size the prize before the kernel)
|
|
297
|
-
mlx_metal_start_capture: { args: [cstring], returns: i32 },
|
|
298
|
-
mlx_metal_stop_capture: { args: [], returns: i32 },
|
|
299
|
-
// TurboQuant KV codec (Phase 13): FWHT rotation + per-group affine/Lloyd-Max
|
|
300
|
-
// (res, a, opt scale, stream) — 1/sqrt(dim) normalization when scale is null.
|
|
301
|
-
mlx_hadamard_transform: { args: [P, u64, u64, u64], returns: i32 },
|
|
302
|
-
mlx_min_axis: { args: [P, u64, i32, FFIType.bool, u64], returns: i32 },
|
|
303
|
-
mlx_round: { args: [P, u64, i32, u64], returns: i32 },
|
|
304
|
-
mlx_greater: { args: [P, u64, u64, u64], returns: i32 },
|
|
305
|
-
mlx_bitwise_and: { args: [P, u64, u64, u64], returns: i32 },
|
|
306
|
-
mlx_bitwise_or: { args: [P, u64, u64, u64], returns: i32 },
|
|
307
|
-
mlx_left_shift: { args: [P, u64, u64, u64], returns: i32 },
|
|
308
|
-
mlx_right_shift: { args: [P, u64, u64, u64], returns: i32 },
|
|
309
|
-
}).symbols;
|
|
310
|
-
|
|
311
|
-
export type MlxHandle = bigint;
|
|
312
|
-
|
|
313
|
-
// --- error handling -------------------------------------------------------
|
|
314
|
-
// mlx-c's default error handler prints and aborts the process. Install a
|
|
315
|
-
// recording handler instead: ops then return non-zero status and outArray
|
|
316
|
-
// throws a JS Error carrying the mlx message + JS stack. mlx-c invokes the
|
|
317
|
-
// handler on the calling thread (exceptions are caught in the C wrappers),
|
|
318
|
-
// so a non-threadsafe JSCallback is safe here.
|
|
319
|
-
import { CString, JSCallback } from "bun:ffi";
|
|
320
|
-
|
|
321
|
-
let lastMlxError: string | null = null;
|
|
322
|
-
|
|
323
|
-
const errorHandler = new JSCallback(
|
|
324
|
-
(msgPtr: number) => {
|
|
325
|
-
lastMlxError = msgPtr ? new CString(msgPtr as never).toString() : "unknown mlx error";
|
|
326
|
-
},
|
|
327
|
-
{ args: ["ptr", "ptr"], returns: "void" },
|
|
328
|
-
);
|
|
329
|
-
|
|
330
|
-
const errLib = dlopen(LIBMLXC_PATH, {
|
|
331
|
-
mlx_set_error_handler: { args: [P, P, P], returns: FFIType.void },
|
|
332
|
-
}).symbols;
|
|
333
|
-
errLib.mlx_set_error_handler(errorHandler.ptr, null, null);
|
|
334
|
-
|
|
335
|
-
/** Consume the last recorded mlx error message (if any). */
|
|
336
|
-
export function takeMlxError(): string | null {
|
|
337
|
-
const e = lastMlxError;
|
|
338
|
-
lastMlxError = null;
|
|
339
|
-
return e;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
function readRuntimeVersion(): string {
|
|
343
|
-
const slot = new BigUint64Array([C.mlx_string_new()]);
|
|
344
|
-
const p = ptr(slot);
|
|
345
|
-
try {
|
|
346
|
-
if (C.mlx_version(p) !== 0)
|
|
347
|
-
throw new Error(`mlx_version failed: ${takeMlxError() ?? "(no mlx message)"}`);
|
|
348
|
-
return C.mlx_string_data(read.u64(p, 0)).toString();
|
|
349
|
-
} finally { C.mlx_string_free(read.u64(p, 0)); }
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/** Read once at startup; kernel eligibility must follow the linked core. */
|
|
353
|
-
export const MLX_VERSION = readRuntimeVersion();
|
|
354
|
-
if (MLX_VERSION !== MLX_CORE_VERSION) {
|
|
355
|
-
throw new Error(`mlx-bun requires its bundled MLX ${MLX_CORE_VERSION}; ${LIBMLXC_PATH} loaded MLX ${MLX_VERSION}`);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
/** mlx_dtype enum values (array.h). */
|
|
359
|
-
export const enum Dtype {
|
|
360
|
-
bool = 0, uint8 = 1, uint16 = 2, uint32 = 3, uint64 = 4,
|
|
361
|
-
int8 = 5, int16 = 6, int32 = 7, int64 = 8,
|
|
362
|
-
float16 = 9, float32 = 10, float64 = 11, bfloat16 = 12, complex64 = 13,
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
export const DTYPE_NAMES: Record<number, string> = {
|
|
366
|
-
0: "bool", 1: "uint8", 2: "uint16", 3: "uint32", 4: "uint64",
|
|
367
|
-
5: "int8", 6: "int16", 7: "int32", 8: "int64",
|
|
368
|
-
9: "float16", 10: "float32", 11: "float64", 12: "bfloat16", 13: "complex64",
|
|
369
|
-
};
|
|
370
|
-
|
|
371
|
-
/** Pack mlx_optional_int for by-value passing. */
|
|
372
|
-
export function optInt(value: number | null): bigint {
|
|
373
|
-
if (value === null) return 0n;
|
|
374
|
-
return (BigInt(value >>> 0) & 0xffffffffn) | (1n << 32n);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/** Pack mlx_optional_dtype (same layout: enum + has_value flag). */
|
|
378
|
-
export const optDtype = optInt;
|
|
379
|
-
|
|
380
|
-
/** Pack mlx_optional_float `{float value; bool has_value}` for by-value passing. */
|
|
381
|
-
const f32Bits = new DataView(new ArrayBuffer(4));
|
|
382
|
-
export function optFloat(value: number | null): bigint {
|
|
383
|
-
if (value === null) return 0n;
|
|
384
|
-
f32Bits.setFloat32(0, value, true);
|
|
385
|
-
return BigInt(f32Bits.getUint32(0, true)) | (1n << 32n);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
/** Null handle for optional mlx_array parameters. */
|
|
389
|
-
export const NULL_HANDLE = 0n;
|
|
390
|
-
|
|
391
|
-
// RULE: never read a typed array that a bun:ffi call wrote through a
|
|
392
|
-
// pointer — once the calling function is DFG-compiled, the JIT eliminates
|
|
393
|
-
// the load across the native call and `buf[i]` returns stale values
|
|
394
|
-
// (lab/repro/bun-ffi-f64/ISSUE.md; PLAN.md Phase 4 findings). Out-param slots
|
|
395
|
-
// must be read back with bun:ffi `read.*` (verified safe). Initializing the
|
|
396
|
-
// slot via the typed-array *constructor* is fine: that store happens in
|
|
397
|
-
// host code the JIT can't elide.
|
|
398
|
-
|
|
399
|
-
/** Run an op that writes its result through an mlx_array* out-param. */
|
|
400
|
-
export function outArray(op: string, call: (slotPtr: number) => number): MlxHandle {
|
|
401
|
-
const slot = new BigUint64Array([C.mlx_array_new()]);
|
|
402
|
-
const slotPtr = ptr(slot);
|
|
403
|
-
const status = call(slotPtr);
|
|
404
|
-
const handle = read.u64(slotPtr, 0);
|
|
405
|
-
if (status !== 0) {
|
|
406
|
-
C.mlx_array_free(handle);
|
|
407
|
-
throw new Error(`${op} failed: ${takeMlxError() ?? "(no mlx message)"}`);
|
|
408
|
-
}
|
|
409
|
-
return handle;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
export function activeMemory(): number {
|
|
413
|
-
const out = new BigUint64Array(1);
|
|
414
|
-
const p = ptr(out);
|
|
415
|
-
C.mlx_get_active_memory(p);
|
|
416
|
-
return Number(read.u64(p, 0));
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
export function cacheMemory(): number {
|
|
420
|
-
const out = new BigUint64Array(1);
|
|
421
|
-
const p = ptr(out);
|
|
422
|
-
C.mlx_get_cache_memory(p);
|
|
423
|
-
return Number(read.u64(p, 0));
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
export function peakMemory(): number {
|
|
427
|
-
const out = new BigUint64Array(1);
|
|
428
|
-
const p = ptr(out);
|
|
429
|
-
C.mlx_get_peak_memory(p);
|
|
430
|
-
return Number(read.u64(p, 0));
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
/** mx.reset_peak_memory — zero the peak counter (e.g. after model load,
|
|
434
|
-
* so a subsequent peakMemory() reads generation-only peak). */
|
|
435
|
-
export function resetPeakMemory(): void {
|
|
436
|
-
C.mlx_reset_peak_memory();
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
/** mx.clear_cache — release the allocator's cached buffers back to the
|
|
440
|
-
* OS. mlx-lm calls this after every prefill chunk (and every 256 decode
|
|
441
|
-
* steps); without it the first decode step after a long prefill pays a
|
|
442
|
-
* one-shot allocator-reclaim stall (~800 ms after an 8k prefill —
|
|
443
|
-
* measured, scripts/decode-split.ts; the root cause of the
|
|
444
|
-
* context-scaling decode gap). */
|
|
445
|
-
export function clearCache(): void {
|
|
446
|
-
C.mlx_clear_cache();
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
let cachedDeviceArchitecture: string | undefined;
|
|
450
|
-
|
|
451
|
-
/** Native architecture identifier, used to match MLX's hardware dispatch. */
|
|
452
|
-
export function deviceArchitecture(): string {
|
|
453
|
-
if (cachedDeviceArchitecture !== undefined) return cachedDeviceArchitecture;
|
|
454
|
-
const devSlot = new BigUint64Array(1), devPtr = ptr(devSlot);
|
|
455
|
-
if (C.mlx_get_default_device(devPtr) !== 0)
|
|
456
|
-
throw new Error(`mlx_get_default_device failed: ${takeMlxError() ?? ""}`);
|
|
457
|
-
const dev = read.u64(devPtr, 0);
|
|
458
|
-
const infoSlot = new BigUint64Array([C.mlx_device_info_new()]), infoPtr = ptr(infoSlot);
|
|
459
|
-
try {
|
|
460
|
-
if (C.mlx_device_info_get(infoPtr, dev) !== 0)
|
|
461
|
-
throw new Error(`mlx_device_info_get failed: ${takeMlxError() ?? ""}`);
|
|
462
|
-
const out = new BigUint64Array(1), outPtr = ptr(out);
|
|
463
|
-
const key = Buffer.from("architecture\0", "utf8");
|
|
464
|
-
if (C.mlx_device_info_get_string(outPtr, read.u64(infoPtr, 0), ptr(key)) !== 0)
|
|
465
|
-
throw new Error("architecture not in device info");
|
|
466
|
-
// Copy before the device-info object releases the native string.
|
|
467
|
-
return cachedDeviceArchitecture = new CString(Number(read.u64(outPtr, 0)) as Pointer).toString();
|
|
468
|
-
} finally {
|
|
469
|
-
C.mlx_device_info_free(read.u64(infoPtr, 0));
|
|
470
|
-
C.mlx_device_free(dev);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
/** Metal's recommended max working-set size for the default device. */
|
|
475
|
-
export function maxRecommendedWorkingSetSize(): number {
|
|
476
|
-
const devSlot = new BigUint64Array(1);
|
|
477
|
-
const devPtr = ptr(devSlot);
|
|
478
|
-
if (C.mlx_get_default_device(devPtr) !== 0)
|
|
479
|
-
throw new Error(`mlx_get_default_device failed: ${takeMlxError() ?? ""}`);
|
|
480
|
-
const dev = read.u64(devPtr, 0);
|
|
481
|
-
const infoSlot = new BigUint64Array([C.mlx_device_info_new()]);
|
|
482
|
-
const infoPtr = ptr(infoSlot);
|
|
483
|
-
try {
|
|
484
|
-
if (C.mlx_device_info_get(infoPtr, dev) !== 0)
|
|
485
|
-
throw new Error(`mlx_device_info_get failed: ${takeMlxError() ?? ""}`);
|
|
486
|
-
const info = read.u64(infoPtr, 0);
|
|
487
|
-
const out = new BigUint64Array(1);
|
|
488
|
-
const outPtr = ptr(out);
|
|
489
|
-
const key = Buffer.from("max_recommended_working_set_size\0", "utf8");
|
|
490
|
-
if (C.mlx_device_info_get_size(outPtr, info, ptr(key)) !== 0)
|
|
491
|
-
throw new Error("max_recommended_working_set_size not in device info");
|
|
492
|
-
return Number(read.u64(outPtr, 0));
|
|
493
|
-
} finally {
|
|
494
|
-
C.mlx_device_info_free(read.u64(infoPtr, 0));
|
|
495
|
-
C.mlx_device_free(dev);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
/** mx.set_wired_limit — returns the previous limit. Models close to the
|
|
500
|
-
* working-set ceiling decode ~4x slower without this (Metal evicts and
|
|
501
|
-
* re-faults weight buffers every token; mlx-lm's wired_limit context
|
|
502
|
-
* is the reference behavior). MUST be scoped (set → generate →
|
|
503
|
-
* synchronize → restore), never process-permanent: a permanent limit
|
|
504
|
-
* pins buffers across idle periods and OOM-kills multi-model processes
|
|
505
|
-
* (the test suite) via uncatchable async GPU errors. */
|
|
506
|
-
export function setWiredLimit(bytes: number): number {
|
|
507
|
-
const out = new BigUint64Array(1);
|
|
508
|
-
const p = ptr(out);
|
|
509
|
-
if (C.mlx_set_wired_limit(p, BigInt(Math.floor(bytes))) !== 0)
|
|
510
|
-
throw new Error(`mlx_set_wired_limit failed: ${takeMlxError() ?? ""}`);
|
|
511
|
-
return Number(read.u64(p, 0));
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
/** mx.set_memory_limit — returns the previous limit. At the limit the
|
|
515
|
-
* allocator reclaims/waits instead of ballooning past it. Defense in
|
|
516
|
-
* depth under admission control ONLY: it does NOT make Metal
|
|
517
|
-
* command-buffer OOM catchable (Phase 6 finding — that throw comes
|
|
518
|
-
* from a completion handler and is std::terminate). */
|
|
519
|
-
export function setMemoryLimit(bytes: number): number {
|
|
520
|
-
const out = new BigUint64Array(1);
|
|
521
|
-
const p = ptr(out);
|
|
522
|
-
if (C.mlx_set_memory_limit(p, BigInt(Math.floor(bytes))) !== 0)
|
|
523
|
-
throw new Error(`mlx_set_memory_limit failed: ${takeMlxError() ?? ""}`);
|
|
524
|
-
return Number(read.u64(p, 0));
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
/** mx.synchronize(stream) — wired limit must not change mid-async-eval. */
|
|
528
|
-
export function synchronize(stream: MlxHandle): void {
|
|
529
|
-
if (C.mlx_synchronize(stream) !== 0)
|
|
530
|
-
throw new Error(`mlx_synchronize failed: ${takeMlxError() ?? ""}`);
|
|
531
|
-
}
|
package/src/mlx/materialize.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// Explicit compact storage for a value that must release a larger backing
|
|
2
|
-
// buffer. MLX 0.31.2 Copy::eval shares storage; contiguous() may also alias.
|
|
3
|
-
// MLX's dynamic slice allocates the logical output size and has a native VJP.
|
|
4
|
-
import { MlxArray } from "./array";
|
|
5
|
-
import * as ops from "./ops";
|
|
6
|
-
|
|
7
|
-
let zero: MlxArray | undefined;
|
|
8
|
-
|
|
9
|
-
/** Borrow an array; return an owned, row-contiguous copy on the GPU.
|
|
10
|
-
* Values and dtype are unchanged. Evaluation stays lazy and never reads data
|
|
11
|
-
* back to the host. Use only when independent compact storage is required;
|
|
12
|
-
* immutable array aliases normally avoid this allocation and dispatch.
|
|
13
|
-
* Slice sizes are concrete, so use shape-specialized compiled graphs. */
|
|
14
|
-
export function materializeCopy(input: MlxArray): MlxArray {
|
|
15
|
-
zero ??= MlxArray.fromInt32(new Int32Array([0]), []);
|
|
16
|
-
if (input.ndim > 0) return ops.sliceDynamic(input, zero, [0], input.shape);
|
|
17
|
-
const vector = ops.reshape(input, [1]);
|
|
18
|
-
try {
|
|
19
|
-
const copy = ops.sliceDynamic(vector, zero, [0], [1]);
|
|
20
|
-
try { return ops.reshape(copy, []); }
|
|
21
|
-
finally { copy.dispose(); }
|
|
22
|
-
} finally { vector.dispose(); }
|
|
23
|
-
}
|