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/array.ts
DELETED
|
@@ -1,425 +0,0 @@
|
|
|
1
|
-
// MlxArray: ownership wrapper around an mlx_array handle.
|
|
2
|
-
// Explicit .dispose() is the contract; a FinalizationRegistry backstop
|
|
3
|
-
// frees leaked handles on GC (verified in lab/spikes/phase0-memory.ts).
|
|
4
|
-
|
|
5
|
-
import { hostBufferDestructor, type HostBuffer } from "../storage/host-buffer";
|
|
6
|
-
import { dlopen, ptr, toArrayBuffer } from "bun:ffi";
|
|
7
|
-
import { C, Dtype, DTYPE_NAMES, type MlxHandle, optInt, outArray, takeMlxError } from "./ffi";
|
|
8
|
-
import type { SafetensorsDtype } from "../safetensors";
|
|
9
|
-
|
|
10
|
-
export const gpuStream: MlxHandle = C.mlx_default_gpu_stream_new();
|
|
11
|
-
export const cpuStream: MlxHandle = C.mlx_default_cpu_stream_new();
|
|
12
|
-
|
|
13
|
-
/** Shape buffer for FFI; ptr() rejects empty views, so 0-d arrays pass a
|
|
14
|
-
* dummy buffer with dim=0 (the pointee is never read). */
|
|
15
|
-
function shapeBuf(shape: number[]): Int32Array {
|
|
16
|
-
return shape.length === 0 ? new Int32Array(1) : new Int32Array(shape);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const SAFETENSORS_TO_MLX: Record<SafetensorsDtype, Dtype> = {
|
|
20
|
-
BOOL: Dtype.bool, U8: Dtype.uint8, I8: Dtype.int8,
|
|
21
|
-
U16: Dtype.uint16, I16: Dtype.int16, U32: Dtype.uint32, I32: Dtype.int32,
|
|
22
|
-
U64: Dtype.uint64, I64: Dtype.int64,
|
|
23
|
-
F16: Dtype.float16, BF16: Dtype.bfloat16, F32: Dtype.float32, F64: Dtype.float64,
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
// --- zero-copy pinning ---------------------------------------------------
|
|
27
|
-
// Buffers handed to mlx via new_data_managed_payload must outlive the mlx
|
|
28
|
-
// array. fromView pins the JS view in this map (a GC root, nothing more);
|
|
29
|
-
// release is EXPLICIT and JS-thread-only via unpinHostBuffer() — never an
|
|
30
|
-
// mlx dtor. See the hazard note below.
|
|
31
|
-
|
|
32
|
-
const pinned = new Map<number, Uint8Array>();
|
|
33
|
-
let nextPinId = 1;
|
|
34
|
-
|
|
35
|
-
// HAZARD (root cause of the 2026-07-06 restart-restore hang): mlx releases
|
|
36
|
-
// buffer Data wherever the LAST shared_ptr drops — often the Metal
|
|
37
|
-
// COMPLETION thread (gpu::eval retains buffers until the command buffer
|
|
38
|
-
// finishes, i.e. past dispose()). A bun:ffi JSCallback dtor invoked from
|
|
39
|
-
// that thread deadlocks when the JS thread is inside a blocking FFI eval
|
|
40
|
-
// (completion waits on JS, JS waits on completion) and SIGTRAPs mid-GC.
|
|
41
|
-
// So NO array here ever gets a JS dtor: fromPointer AND fromView both hand
|
|
42
|
-
// mlx the native no-op dtor below (payload 0), and host-buffer lifetime is
|
|
43
|
-
// the CALLER's contract, released only from the JS thread (unpinHostBuffer)
|
|
44
|
-
// or never (process-lifetime mmaps: expert-offload).
|
|
45
|
-
|
|
46
|
-
// Native no-op dtor: payload is always 0, and libc free(NULL) is defined to
|
|
47
|
-
// do nothing — a dtor mlx can safely call from ANY thread. The pointed-to
|
|
48
|
-
// memory's lifetime is the CALLER's contract (weight mmaps live for the
|
|
49
|
-
// process; restored KV is COPIED at load since 2026-07-07 — see kv-store.ts
|
|
50
|
-
// loadKvCache — so no restore mapping needs pinning anymore). Bun >= 1.4
|
|
51
|
-
// returns a numeric function address from .ptr; verified against dlsym on
|
|
52
|
-
// 1.4.0 and 1.4.2. Keep the library open for every native destructor's lifetime.
|
|
53
|
-
const libcFree = dlopen("/usr/lib/libSystem.B.dylib", {
|
|
54
|
-
free: { args: ["ptr"], returns: "void" },
|
|
55
|
-
});
|
|
56
|
-
// The pinned bun-types predates the runtime's numeric .ptr property.
|
|
57
|
-
const freeFnAddr = Number(Reflect.get(libcFree.symbols.free, "ptr"));
|
|
58
|
-
if (!Number.isSafeInteger(freeFnAddr) || freeFnAddr <= 0)
|
|
59
|
-
throw new Error("free.ptr is invalid — zero-copy arrays need a native no-op dtor");
|
|
60
|
-
|
|
61
|
-
export function pinnedBufferCount(): number {
|
|
62
|
-
return pinned.size;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// --- finalization backstop ----------------------------------------------
|
|
66
|
-
|
|
67
|
-
const registry = new FinalizationRegistry((handle: MlxHandle) => {
|
|
68
|
-
C.mlx_array_free(handle);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
export class MlxArray {
|
|
72
|
-
#handle: MlxHandle;
|
|
73
|
-
#disposed = false;
|
|
74
|
-
#token = {};
|
|
75
|
-
#pinId = 0; // fromView only: key into the pinned-view map (0 = no pin)
|
|
76
|
-
|
|
77
|
-
constructor(handle: MlxHandle) {
|
|
78
|
-
this.#handle = handle;
|
|
79
|
-
registry.register(this, handle, this.#token);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** Zero-copy: wrap an existing JS buffer. The view is pinned (GC-rooted)
|
|
83
|
-
* in a process-side map; mlx gets the NATIVE no-op dtor (free(NULL)) —
|
|
84
|
-
* never a JS callback, so the last release may happen on the Metal
|
|
85
|
-
* completion thread without deadlock (see hazard note above). Buffer
|
|
86
|
-
* lifetime is therefore the CALLER's contract:
|
|
87
|
-
* - mmap-backed views (toArrayBuffer aliases): the mapping owns the
|
|
88
|
-
* memory; prefer fromPointer, which skips the pin entirely.
|
|
89
|
-
* - JS-heap buffers: the pin keeps the buffer alive; call
|
|
90
|
-
* unpinHostBuffer() only after a JS-side sync point proves mlx is
|
|
91
|
-
* done with it (everything depending on the array evaluated AND the
|
|
92
|
-
* array disposed), or never (process-lifetime, e.g. short scripts). */
|
|
93
|
-
static fromView(view: Uint8Array, shape: number[], dtype: Dtype): MlxArray {
|
|
94
|
-
const sb = shapeBuf(shape);
|
|
95
|
-
const id = nextPinId++;
|
|
96
|
-
pinned.set(id, view);
|
|
97
|
-
const handle = C.mlx_array_new_data_managed_payload(
|
|
98
|
-
ptr(view), ptr(sb), shape.length, dtype, 0, freeFnAddr,
|
|
99
|
-
);
|
|
100
|
-
const arr = new MlxArray(handle);
|
|
101
|
-
arr.#pinId = id;
|
|
102
|
-
return arr;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** Release the GC root fromView placed on this array's host buffer.
|
|
106
|
-
* JS-thread-only by construction (it's a plain method) — this is the
|
|
107
|
-
* replacement for the deadlocking JSCallback unpin dtor. Idempotent;
|
|
108
|
-
* no-op for non-fromView arrays. Caller contract: only call once mlx can
|
|
109
|
-
* no longer touch the buffer (see fromView doc), or when the memory is
|
|
110
|
-
* owned elsewhere (an mmap kept mapped past every use). */
|
|
111
|
-
unpinHostBuffer(): void {
|
|
112
|
-
if (this.#pinId !== 0) {
|
|
113
|
-
pinned.delete(this.#pinId);
|
|
114
|
-
this.#pinId = 0;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/** Zero-copy: wrap a raw pointer (e.g. into an mmap'd weight shard).
|
|
119
|
-
* The caller guarantees the memory outlives EVERY mlx
|
|
120
|
-
* reference to the array — including GPU command buffers that retain the
|
|
121
|
-
* buffer past dispose() — i.e. mmaps backing these arrays stay mapped for
|
|
122
|
-
* the process. The dtor is free(NULL) (payload 0): native + no-op, so
|
|
123
|
-
* mlx may run it from the Metal completion thread without touching the
|
|
124
|
-
* JS runtime (the old JSCallback dtor deadlocked serving / SIGTRAPed
|
|
125
|
-
* under GC when that thread held the last reference — 2026-07-06). */
|
|
126
|
-
static fromPointer(dataPtr: number, shape: number[], dtype: Dtype): MlxArray {
|
|
127
|
-
const sb = shapeBuf(shape);
|
|
128
|
-
const handle = C.mlx_array_new_data_managed_payload(
|
|
129
|
-
dataPtr, ptr(sb), shape.length, dtype, 0, freeFnAddr,
|
|
130
|
-
);
|
|
131
|
-
return new MlxArray(handle);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** Adopt a page-aligned CPU restore allocation without a host copy.
|
|
135
|
-
* The native destructor owns it after this call, including GPU references. */
|
|
136
|
-
static adoptHostBuffer(buffer: HostBuffer, shape: number[], dtype: Dtype): MlxArray {
|
|
137
|
-
const sb = shapeBuf(shape);
|
|
138
|
-
const handle = C.mlx_array_new_data_managed_payload(
|
|
139
|
-
buffer.pointer, ptr(sb), shape.length, dtype, buffer.pointer, hostBufferDestructor,
|
|
140
|
-
);
|
|
141
|
-
const array = new MlxArray(handle);
|
|
142
|
-
buffer.transfer();
|
|
143
|
-
return array;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/** Copying constructor for small host data. */
|
|
147
|
-
static fromFloat32(data: Float32Array, shape: number[]): MlxArray {
|
|
148
|
-
const sb = shapeBuf(shape);
|
|
149
|
-
return new MlxArray(
|
|
150
|
-
C.mlx_array_new_data(ptr(data), ptr(sb), shape.length, Dtype.float32),
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/** Copy raw bytes into a fresh mlx-managed (page-aligned) LEAF array of the
|
|
155
|
-
* given dtype/shape. Unlike fromView (which no-copy-wraps the host buffer and
|
|
156
|
-
* is unsafe to feed to GPU ops when unaligned), mlx_array_new_data COPIES, so
|
|
157
|
-
* the source bytes need not outlive the array and GPU ops are safe. Used to
|
|
158
|
-
* detach a value from its computation graph: `MlxArray.fromBytesCopy(
|
|
159
|
-
* x.rawBytes(), x.shape, x.dtype)` yields a graph-free leaf with x's exact
|
|
160
|
-
* bytes (segmented-backward boundaries — src/train/segmented.ts). */
|
|
161
|
-
static fromBytesCopy(bytes: Uint8Array, shape: number[], dtype: Dtype): MlxArray {
|
|
162
|
-
const sb = shapeBuf(shape);
|
|
163
|
-
return new MlxArray(
|
|
164
|
-
C.mlx_array_new_data(ptr(bytes), ptr(sb), shape.length, dtype),
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
static fromInt32(data: Int32Array, shape: number[]): MlxArray {
|
|
169
|
-
const sb = shapeBuf(shape);
|
|
170
|
-
return new MlxArray(
|
|
171
|
-
C.mlx_array_new_data(ptr(data), ptr(sb), shape.length, Dtype.int32),
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/** Graph-free LEAF with this array's exact bytes — ONE copy, straight from
|
|
176
|
-
* the (evaluated) mlx buffer into a fresh mlx-owned array, no JS-heap
|
|
177
|
-
* intermediate (`fromBytesCopy(rawBytes())` is TWO copies: device→JS heap
|
|
178
|
-
* →new leaf). mlx_array_new_data copies synchronously, so the source only
|
|
179
|
-
* has to outlive this call. The buffer is read LINEARLY — the caller must
|
|
180
|
-
* pass a row-major contiguous array (ops.contiguous first for views), same
|
|
181
|
-
* contract as rawBytes. Segmented-backward boundary detach hot path. */
|
|
182
|
-
detachCopy(): MlxArray {
|
|
183
|
-
this.eval();
|
|
184
|
-
const dt = this.dtype;
|
|
185
|
-
const p =
|
|
186
|
-
dt === Dtype.float32 ? C.mlx_array_data_float32(this.handle)
|
|
187
|
-
: dt === Dtype.float16 ? C.mlx_array_data_float16(this.handle)
|
|
188
|
-
: dt === Dtype.bfloat16 ? C.mlx_array_data_bfloat16(this.handle)
|
|
189
|
-
: dt === Dtype.uint32 ? C.mlx_array_data_uint32(this.handle)
|
|
190
|
-
: null;
|
|
191
|
-
if (p === null) throw new Error(`detachCopy: unsupported dtype ${this.dtypeName}`);
|
|
192
|
-
const sb = shapeBuf(this.shape);
|
|
193
|
-
return new MlxArray(C.mlx_array_new_data(p as never, ptr(sb), this.ndim, dt));
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
get handle(): MlxHandle {
|
|
197
|
-
if (this.#disposed) throw new Error("MlxArray used after dispose");
|
|
198
|
-
return this.#handle;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
get ndim(): number {
|
|
202
|
-
return Number(C.mlx_array_ndim(this.handle));
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// NOTE on the DFG stale-read bug (lab/repro/bun-ffi-f64/ISSUE.md): the
|
|
206
|
-
// toArrayBuffer readbacks below (shape/rawBytes/toFloat32) are safe.
|
|
207
|
-
// The hazard is reading a *pre-existing* typed array after an FFI call
|
|
208
|
-
// wrote through its pointer — the JIT forwards a stale value from before
|
|
209
|
-
// the call. Here the view is constructed *after* the call, from the
|
|
210
|
-
// pointer the call returned: the loads are data-dependent on the call
|
|
211
|
-
// result and there is no prior JS load/store to forward from.
|
|
212
|
-
|
|
213
|
-
get shape(): number[] {
|
|
214
|
-
const n = this.ndim;
|
|
215
|
-
if (n === 0) return [];
|
|
216
|
-
const shapePtr = C.mlx_array_shape(this.handle);
|
|
217
|
-
return [...new Int32Array(toArrayBuffer(shapePtr!, 0, n * 4))];
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
get dtype(): Dtype {
|
|
221
|
-
return C.mlx_array_dtype(this.handle) as Dtype;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
get dtypeName(): string {
|
|
225
|
-
return DTYPE_NAMES[this.dtype] ?? `unknown(${this.dtype})`;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
get size(): number {
|
|
229
|
-
return Number(C.mlx_array_size(this.handle));
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
get nbytes(): number {
|
|
233
|
-
return Number(C.mlx_array_nbytes(this.handle));
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
eval(): this {
|
|
237
|
-
if (C.mlx_array_eval(this.handle) !== 0) throw new Error(`mlx_array_eval failed: ${takeMlxError() ?? ""}`);
|
|
238
|
-
return this;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/** Cast to another dtype (lazy). */
|
|
242
|
-
astype(dtype: Dtype, stream: MlxHandle = gpuStream): MlxArray {
|
|
243
|
-
return new MlxArray(
|
|
244
|
-
outArray("astype", (slot) => C.mlx_astype(slot, this.handle, dtype, stream)),
|
|
245
|
-
);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/** Raw bytes of a supported floating-point or integer array (copy). */
|
|
249
|
-
rawBytes(): Uint8Array {
|
|
250
|
-
return this.rawBytesView().slice();
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/** Publish an evaluated immutable buffer to a CPU reader. Strides are in
|
|
254
|
-
* elements, so padding, transposes and slices need no GPU packing copy.
|
|
255
|
-
* The caller retains this array until the reader reports completion. */
|
|
256
|
-
storageView(): import("../storage/kv-writer").StoredTensorView {
|
|
257
|
-
this.eval();
|
|
258
|
-
const shape = this.shape;
|
|
259
|
-
const stridePtr = C.mlx_array_strides(this.handle);
|
|
260
|
-
const strides = shape.length
|
|
261
|
-
? [...new BigInt64Array(toArrayBuffer(stridePtr!, 0, shape.length * 8))].map(Number)
|
|
262
|
-
: [];
|
|
263
|
-
const dt = this.dtype;
|
|
264
|
-
const pointer =
|
|
265
|
-
dt === Dtype.float32 ? C.mlx_array_data_float32(this.handle)
|
|
266
|
-
: dt === Dtype.float16 ? C.mlx_array_data_float16(this.handle)
|
|
267
|
-
: dt === Dtype.bfloat16 ? C.mlx_array_data_bfloat16(this.handle)
|
|
268
|
-
: dt === Dtype.uint32 ? C.mlx_array_data_uint32(this.handle)
|
|
269
|
-
: dt === Dtype.int32 ? C.mlx_array_data_int32(this.handle)
|
|
270
|
-
: dt === Dtype.uint8 ? C.mlx_array_data_uint8(this.handle)
|
|
271
|
-
: dt === Dtype.int8 ? C.mlx_array_data_int8(this.handle)
|
|
272
|
-
: null;
|
|
273
|
-
if (pointer === null && this.size) throw new Error(`storageView: unsupported or unavailable ${this.dtypeName}`);
|
|
274
|
-
return { pointer: Number(pointer), shape, strides, itemSize: Number(C.mlx_array_itemsize(this.handle)) };
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/** ZERO-COPY view of the evaluated array's bytes — aliases the mlx
|
|
278
|
-
* buffer directly, no JS-heap copy. Valid only while THIS array is
|
|
279
|
-
* alive and unmutated: do not retain past dispose(). Built for
|
|
280
|
-
* bulk-write paths (kv-store's streamed writer) where per-tensor
|
|
281
|
-
* rawBytes() copies pile up in the JS heap faster than GC collects
|
|
282
|
-
* them — the residual A7 whole-entry RSS spike (2026-07-07). The
|
|
283
|
-
* array must be contiguous (ops.contiguous first for views), same
|
|
284
|
-
* contract as rawBytes. */
|
|
285
|
-
rawBytesView(): Uint8Array {
|
|
286
|
-
this.eval();
|
|
287
|
-
const dt = this.dtype;
|
|
288
|
-
const p =
|
|
289
|
-
dt === Dtype.float32 ? C.mlx_array_data_float32(this.handle)
|
|
290
|
-
: dt === Dtype.float16 ? C.mlx_array_data_float16(this.handle)
|
|
291
|
-
: dt === Dtype.bfloat16 ? C.mlx_array_data_bfloat16(this.handle)
|
|
292
|
-
: dt === Dtype.uint32 ? C.mlx_array_data_uint32(this.handle)
|
|
293
|
-
: dt === Dtype.int32 ? C.mlx_array_data_int32(this.handle)
|
|
294
|
-
: dt === Dtype.uint8 ? C.mlx_array_data_uint8(this.handle)
|
|
295
|
-
: dt === Dtype.int8 ? C.mlx_array_data_int8(this.handle)
|
|
296
|
-
: null;
|
|
297
|
-
if (p === null) throw new Error(`rawBytesView: unsupported dtype ${this.dtypeName}`);
|
|
298
|
-
return new Uint8Array(toArrayBuffer(p!, 0, this.nbytes));
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/** Read back an INTEGER array without enqueueing a cast kernel: eval +
|
|
302
|
-
* direct buffer read for uint32/int32. A cast (`astype`) is a NEW op that
|
|
303
|
-
* queues BEHIND everything already dispatched on the GPU stream — on the
|
|
304
|
-
* batched decode hot path, reading the pipeline register via toFloat32
|
|
305
|
-
* stalled the "overlapped" token read for a FULL step of GPU work every
|
|
306
|
-
* token (the core of the Phase-0 B=1 gap; unified-engine plan Phase 2).
|
|
307
|
-
* Non-integer dtypes fall back to the rounded float readback. */
|
|
308
|
-
toIntTokens(): number[] {
|
|
309
|
-
if (this.dtype === Dtype.uint32) {
|
|
310
|
-
this.eval();
|
|
311
|
-
const p = C.mlx_array_data_uint32(this.handle);
|
|
312
|
-
return [...new Uint32Array(toArrayBuffer(p!, 0, this.size * 4))];
|
|
313
|
-
}
|
|
314
|
-
if (this.dtype === Dtype.int32) {
|
|
315
|
-
this.eval();
|
|
316
|
-
const p = C.mlx_array_data_int32(this.handle);
|
|
317
|
-
return [...new Int32Array(toArrayBuffer(p!, 0, this.size * 4))];
|
|
318
|
-
}
|
|
319
|
-
return [...this.toFloat32()].map((x) => Math.round(x));
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/** Read back as float32 (casts on GPU if needed, then copies out). */
|
|
323
|
-
toFloat32(): Float32Array {
|
|
324
|
-
const src = this.dtype === Dtype.float32 ? this : this.astype(Dtype.float32);
|
|
325
|
-
src.eval();
|
|
326
|
-
const dataPtr = C.mlx_array_data_float32(src.handle);
|
|
327
|
-
const out = new Float32Array(toArrayBuffer(dataPtr!, 0, src.size * 4)).slice();
|
|
328
|
-
if (src !== this) src.dispose();
|
|
329
|
-
return out;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/** Read an f32/f16/bf16 array numerically as float32 without enqueueing a
|
|
333
|
-
* GPU cast. This evaluates the ORIGINAL array, then expands 16-bit values
|
|
334
|
-
* on the host. Use this for small readbacks after later GPU work has
|
|
335
|
-
* already been dispatched: toFloat32() would append astype(float32) behind
|
|
336
|
-
* that work and turn the readback into an accidental full-step barrier. */
|
|
337
|
-
toFloat32Host(): Float32Array {
|
|
338
|
-
this.eval();
|
|
339
|
-
const dt = this.dtype;
|
|
340
|
-
if (dt === Dtype.float32) {
|
|
341
|
-
const p = C.mlx_array_data_float32(this.handle);
|
|
342
|
-
return new Float32Array(toArrayBuffer(p!, 0, this.size * 4)).slice();
|
|
343
|
-
}
|
|
344
|
-
if (dt === Dtype.bfloat16) {
|
|
345
|
-
const p = C.mlx_array_data_bfloat16(this.handle);
|
|
346
|
-
const src = new Uint16Array(toArrayBuffer(p!, 0, this.size * 2));
|
|
347
|
-
const words = new Uint32Array(src.length);
|
|
348
|
-
for (let i = 0; i < src.length; i++) words[i] = src[i]! << 16;
|
|
349
|
-
return new Float32Array(words.buffer);
|
|
350
|
-
}
|
|
351
|
-
if (dt === Dtype.float16) {
|
|
352
|
-
const p = C.mlx_array_data_float16(this.handle);
|
|
353
|
-
const src = new Uint16Array(toArrayBuffer(p!, 0, this.size * 2));
|
|
354
|
-
const out = new Float32Array(src.length);
|
|
355
|
-
for (let i = 0; i < src.length; i++) {
|
|
356
|
-
const bits = src[i]!;
|
|
357
|
-
const sign = bits & 0x8000;
|
|
358
|
-
const exponent = (bits >>> 10) & 0x1f;
|
|
359
|
-
const fraction = bits & 0x03ff;
|
|
360
|
-
let value: number;
|
|
361
|
-
if (exponent === 0) {
|
|
362
|
-
value = fraction === 0 ? 0 : fraction * 2 ** -24;
|
|
363
|
-
} else if (exponent === 0x1f) {
|
|
364
|
-
value = fraction === 0 ? Infinity : NaN;
|
|
365
|
-
} else {
|
|
366
|
-
value = (1 + fraction / 1024) * 2 ** (exponent - 15);
|
|
367
|
-
}
|
|
368
|
-
out[i] = sign ? -value : value;
|
|
369
|
-
}
|
|
370
|
-
return out;
|
|
371
|
-
}
|
|
372
|
-
throw new Error(`toFloat32Host: unsupported dtype ${this.dtypeName}`);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/** Basic slice: start/stop per dimension (stride 1). */
|
|
376
|
-
slice(start: number[], stop: number[], stream: MlxHandle = gpuStream): MlxArray {
|
|
377
|
-
const s = new Int32Array(start);
|
|
378
|
-
const e = new Int32Array(stop);
|
|
379
|
-
const strides = new Int32Array(start.map(() => 1));
|
|
380
|
-
return new MlxArray(
|
|
381
|
-
outArray("slice", (slot) =>
|
|
382
|
-
C.mlx_slice(
|
|
383
|
-
slot, this.handle,
|
|
384
|
-
ptr(s), BigInt(s.length), ptr(e), BigInt(e.length),
|
|
385
|
-
ptr(strides), BigInt(strides.length), stream,
|
|
386
|
-
),
|
|
387
|
-
),
|
|
388
|
-
);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
add(other: MlxArray, stream: MlxHandle = gpuStream): MlxArray {
|
|
392
|
-
return new MlxArray(
|
|
393
|
-
outArray("add", (slot) => C.mlx_add(slot, this.handle, other.handle, stream)),
|
|
394
|
-
);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/** Dequantize (w, scales, biases) → full precision. */
|
|
398
|
-
static dequantize(
|
|
399
|
-
w: MlxArray, scales: MlxArray, biases: MlxArray | null,
|
|
400
|
-
groupSize: number, bits: number, mode = "affine",
|
|
401
|
-
stream: MlxHandle = gpuStream,
|
|
402
|
-
): MlxArray {
|
|
403
|
-
const modeBuf = Buffer.from(mode + "\0", "utf8");
|
|
404
|
-
return new MlxArray(
|
|
405
|
-
outArray("dequantize", (slot) =>
|
|
406
|
-
C.mlx_dequantize(
|
|
407
|
-
slot, w.handle, scales.handle, biases?.handle ?? 0n,
|
|
408
|
-
optInt(groupSize), optInt(bits), ptr(modeBuf),
|
|
409
|
-
0n /* global_scale */, optInt(null) /* out dtype */, stream,
|
|
410
|
-
),
|
|
411
|
-
),
|
|
412
|
-
);
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
dispose(): void {
|
|
416
|
-
if (this.#disposed) return;
|
|
417
|
-
this.#disposed = true;
|
|
418
|
-
registry.unregister(this.#token);
|
|
419
|
-
C.mlx_array_free(this.#handle);
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
[Symbol.dispose](): void {
|
|
423
|
-
this.dispose();
|
|
424
|
-
}
|
|
425
|
-
}
|