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/autograd.ts
DELETED
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
// Native autograd via mlx-c value_and_grad over a JS loss closure.
|
|
2
|
-
//
|
|
3
|
-
// Encapsulates the exact FFI lifecycle proven in lab/spikes/phase-train-vag.ts:
|
|
4
|
-
// JS loss closure (JSCallback) → mlx_closure_new_func_payload →
|
|
5
|
-
// mlx_value_and_grad → mlx_closure_value_and_grad_apply → read grads.
|
|
6
|
-
//
|
|
7
|
-
// House rules honored:
|
|
8
|
-
// - Out-params read via bun:ffi `read.u64` (never slot[0] — DFG stale-read).
|
|
9
|
-
// - The JS closure NEVER throws across the FFI boundary (try/catch → return 1);
|
|
10
|
-
// the captured error is re-thrown on the JS side after apply() fails.
|
|
11
|
-
// - All native handles (closure, value_and_grad closure, JSCallback) are held
|
|
12
|
-
// alive on the instance and freed in dispose().
|
|
13
|
-
|
|
14
|
-
import { JSCallback, ptr, read } from "bun:ffi";
|
|
15
|
-
import { C, takeMlxError } from "./ffi";
|
|
16
|
-
import { MlxArray } from "./array";
|
|
17
|
-
|
|
18
|
-
type CallbackHandle = Pick<JSCallback, "ptr" | "close">;
|
|
19
|
-
type NativeCall<F extends (...args: any[]) => any> =
|
|
20
|
-
(...args: Parameters<F>) => ReturnType<F>;
|
|
21
|
-
|
|
22
|
-
/** Constructor-only dependency seam for deterministic native failure tests. */
|
|
23
|
-
export interface ValueAndGradConstructorHooks {
|
|
24
|
-
callback?: (
|
|
25
|
-
callback: ConstructorParameters<typeof JSCallback>[0],
|
|
26
|
-
definition: ConstructorParameters<typeof JSCallback>[1],
|
|
27
|
-
) => CallbackHandle;
|
|
28
|
-
closureNew?: NativeCall<typeof C.mlx_closure_new_func_payload>;
|
|
29
|
-
transformedNew?: NativeCall<typeof C.mlx_closure_value_and_grad_new>;
|
|
30
|
-
transform?: NativeCall<typeof C.mlx_value_and_grad>;
|
|
31
|
-
transformedFree?: NativeCall<typeof C.mlx_closure_value_and_grad_free>;
|
|
32
|
-
closureFree?: NativeCall<typeof C.mlx_closure_free>;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** A reusable value-and-grad over a JS-built loss graph.
|
|
36
|
-
*
|
|
37
|
-
* `loss(primals)` receives the input arrays in argument order and must
|
|
38
|
-
* return a single SCALAR MlxArray (the loss). The graph it builds is
|
|
39
|
-
* differentiated w.r.t. the inputs named in `argIdx`. `apply(primals)`
|
|
40
|
-
* returns the loss value and exactly `argIdx.length` gradients (one per
|
|
41
|
-
* differentiated input, in `argIdx` order).
|
|
42
|
-
*
|
|
43
|
-
* The closure must not throw; if the user `loss` throws, the error is
|
|
44
|
-
* captured and surfaced from `apply()`. The MlxArrays handed to `loss`
|
|
45
|
-
* are owned by mlx — do NOT dispose them; the returned loss IS disposed
|
|
46
|
-
* of by mlx's graph. */
|
|
47
|
-
export class ValueAndGrad {
|
|
48
|
-
readonly #cb: CallbackHandle;
|
|
49
|
-
readonly #closure: bigint;
|
|
50
|
-
readonly #vag: bigint;
|
|
51
|
-
readonly #argIdx: Int32Array;
|
|
52
|
-
readonly #freeClosure: NativeCall<typeof C.mlx_closure_free>;
|
|
53
|
-
readonly #freeVag: NativeCall<typeof C.mlx_closure_value_and_grad_free>;
|
|
54
|
-
#closureError: string | null = null;
|
|
55
|
-
#disposed = false;
|
|
56
|
-
|
|
57
|
-
constructor(
|
|
58
|
-
loss: (primals: MlxArray[]) => MlxArray,
|
|
59
|
-
argIdx: number[],
|
|
60
|
-
hooks: ValueAndGradConstructorHooks = {},
|
|
61
|
-
) {
|
|
62
|
-
if (argIdx.length === 0) throw new Error("ValueAndGrad: argIdx must be non-empty");
|
|
63
|
-
this.#argIdx = new Int32Array(argIdx);
|
|
64
|
-
const makeCallback = hooks.callback ?? ((callback, definition) => new JSCallback(callback, definition));
|
|
65
|
-
const closureNew = hooks.closureNew ?? C.mlx_closure_new_func_payload;
|
|
66
|
-
const transformedNew = hooks.transformedNew ?? C.mlx_closure_value_and_grad_new;
|
|
67
|
-
const transform = hooks.transform ?? C.mlx_value_and_grad;
|
|
68
|
-
this.#freeClosure = hooks.closureFree ?? C.mlx_closure_free;
|
|
69
|
-
this.#freeVag = hooks.transformedFree ?? C.mlx_closure_value_and_grad_free;
|
|
70
|
-
|
|
71
|
-
const cb = makeCallback(
|
|
72
|
-
(outPtr: number, inVec: bigint, _payload: number): number => {
|
|
73
|
-
try {
|
|
74
|
-
// Read the primals out of the input vector_array. mlx_vector_array_get
|
|
75
|
-
// returns a fresh (ref-counted) handle, so disposing the wrapper
|
|
76
|
-
// afterward is correct — it drops our reference, not mlx's graph
|
|
77
|
-
// reference (proven in lab/spikes/phase-train-vag.ts).
|
|
78
|
-
const n = Number(C.mlx_vector_array_size(inVec));
|
|
79
|
-
const primals: MlxArray[] = [];
|
|
80
|
-
for (let i = 0; i < n; i++) {
|
|
81
|
-
const slot = new BigUint64Array([C.mlx_array_new()]);
|
|
82
|
-
const sp = ptr(slot);
|
|
83
|
-
if (C.mlx_vector_array_get(sp, inVec, BigInt(i)) !== 0)
|
|
84
|
-
throw new Error(`vector_array_get(${i}) failed`);
|
|
85
|
-
primals.push(new MlxArray(read.u64(sp, 0)));
|
|
86
|
-
}
|
|
87
|
-
const out = loss(primals);
|
|
88
|
-
// Populate *out with the single scalar loss. set_data copies the
|
|
89
|
-
// handle into the output vector (mlx retains its own reference), so
|
|
90
|
-
// disposing the loss wrapper afterward drops only our reference.
|
|
91
|
-
const handles = new BigUint64Array([out.handle]);
|
|
92
|
-
if (C.mlx_vector_array_set_data(outPtr as never, ptr(handles), 1n) !== 0)
|
|
93
|
-
throw new Error("vector_array_set_data failed");
|
|
94
|
-
for (const p of primals) p.dispose();
|
|
95
|
-
out.dispose();
|
|
96
|
-
return 0;
|
|
97
|
-
} catch (e) {
|
|
98
|
-
this.#closureError = e instanceof Error ? e.message : String(e);
|
|
99
|
-
return 1;
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
{ args: ["ptr", "u64", "ptr"], returns: "i32" },
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
let closure: bigint | null = null;
|
|
106
|
-
let vagSlot: BigUint64Array | null = null;
|
|
107
|
-
try {
|
|
108
|
-
closure = closureNew(cb.ptr as never, null, null);
|
|
109
|
-
vagSlot = new BigUint64Array([transformedNew()]);
|
|
110
|
-
if (transform(ptr(vagSlot), closure, ptr(this.#argIdx), BigInt(this.#argIdx.length)) !== 0)
|
|
111
|
-
throw new Error("mlx_value_and_grad failed");
|
|
112
|
-
this.#cb = cb;
|
|
113
|
-
this.#closure = closure;
|
|
114
|
-
this.#vag = read.u64(ptr(vagSlot), 0);
|
|
115
|
-
} catch (e) {
|
|
116
|
-
// mlx-c out-params are initialized live handles. On failure the slot
|
|
117
|
-
// still owns whichever handle it contains and must be freed explicitly.
|
|
118
|
-
if (vagSlot) this.#freeVag(read.u64(ptr(vagSlot), 0));
|
|
119
|
-
if (closure !== null) this.#freeClosure(closure);
|
|
120
|
-
cb.close();
|
|
121
|
-
throw e;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/** Run the loss + backward on `primals` (in argument order). Returns the
|
|
126
|
-
* scalar loss and one gradient per differentiated input. Caller owns all
|
|
127
|
-
* returned arrays (dispose them). */
|
|
128
|
-
apply(primals: MlxArray[]): { value: MlxArray; grads: MlxArray[] } {
|
|
129
|
-
if (this.#disposed) throw new Error("ValueAndGrad used after dispose");
|
|
130
|
-
this.#closureError = null;
|
|
131
|
-
|
|
132
|
-
const handles = new BigUint64Array(primals.map((p) => p.handle));
|
|
133
|
-
const inVec = C.mlx_vector_array_new_data(ptr(handles), BigInt(primals.length));
|
|
134
|
-
|
|
135
|
-
const valueSlot = new BigUint64Array([C.mlx_vector_array_new()]);
|
|
136
|
-
const gradsSlot = new BigUint64Array([C.mlx_vector_array_new()]);
|
|
137
|
-
const st = C.mlx_closure_value_and_grad_apply(ptr(valueSlot), ptr(gradsSlot), this.#vag, inVec);
|
|
138
|
-
const valueVec = read.u64(ptr(valueSlot), 0);
|
|
139
|
-
const gradsVec = read.u64(ptr(gradsSlot), 0);
|
|
140
|
-
if (st !== 0) {
|
|
141
|
-
C.mlx_vector_array_free(valueVec);
|
|
142
|
-
C.mlx_vector_array_free(gradsVec);
|
|
143
|
-
C.mlx_vector_array_free(inVec);
|
|
144
|
-
// Surface whichever error fired: a JS throw inside the loss closure
|
|
145
|
-
// (#closureError) or MLX's own C-level error (takeMlxError) — e.g. a
|
|
146
|
-
// missing vjp for an op in the forward graph. Discarding the latter
|
|
147
|
-
// turned an "unsupported gradient" into an opaque failure.
|
|
148
|
-
const mlxErr = takeMlxError();
|
|
149
|
-
const detail = this.#closureError ?? mlxErr ?? "";
|
|
150
|
-
throw new Error(`value_and_grad_apply failed${detail ? `: ${detail}` : ""}`);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// value vector has exactly one entry (the scalar loss).
|
|
154
|
-
const value = vecGet(valueVec, 0);
|
|
155
|
-
|
|
156
|
-
const nGrads = Number(C.mlx_vector_array_size(gradsVec));
|
|
157
|
-
if (nGrads !== this.#argIdx.length) {
|
|
158
|
-
value.dispose();
|
|
159
|
-
C.mlx_vector_array_free(valueVec);
|
|
160
|
-
C.mlx_vector_array_free(gradsVec);
|
|
161
|
-
C.mlx_vector_array_free(inVec);
|
|
162
|
-
throw new Error(`expected ${this.#argIdx.length} grads, got ${nGrads}`);
|
|
163
|
-
}
|
|
164
|
-
const grads: MlxArray[] = [];
|
|
165
|
-
for (let i = 0; i < nGrads; i++) grads.push(vecGet(gradsVec, i));
|
|
166
|
-
|
|
167
|
-
C.mlx_vector_array_free(valueVec);
|
|
168
|
-
C.mlx_vector_array_free(gradsVec);
|
|
169
|
-
C.mlx_vector_array_free(inVec);
|
|
170
|
-
return { value, grads };
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
dispose(): void {
|
|
174
|
-
if (this.#disposed) return;
|
|
175
|
-
this.#disposed = true;
|
|
176
|
-
this.#freeVag(this.#vag);
|
|
177
|
-
this.#freeClosure(this.#closure);
|
|
178
|
-
this.#cb.close();
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
[Symbol.dispose](): void {
|
|
182
|
-
this.dispose();
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/** Pull array `i` out of a vector_array into an owned MlxArray wrapper. */
|
|
187
|
-
function vecGet(vec: bigint, i: number): MlxArray {
|
|
188
|
-
const slot = new BigUint64Array([C.mlx_array_new()]);
|
|
189
|
-
const sp = ptr(slot);
|
|
190
|
-
if (C.mlx_vector_array_get(sp, vec, BigInt(i)) !== 0)
|
|
191
|
-
throw new Error(`vector_array_get(${i}) failed`);
|
|
192
|
-
return new MlxArray(read.u64(sp, 0));
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/** Reverse-mode AD via mlx_vjp: given a function `fn(primals) -> outputs` and a
|
|
196
|
-
* cotangent per output, returns the cotangent w.r.t. EVERY primal. This is the
|
|
197
|
-
* natural primitive for segmented backward (segment forward + dh -> [dh_in,
|
|
198
|
-
* ...dLoRA]) — no surrogate scalar and no value_and_grad closure. Unlike
|
|
199
|
-
* ValueAndGrad it returns a vjp for ALL primals (not a selected argnum subset).
|
|
200
|
-
*
|
|
201
|
-
* `fn` must build its output graph from the input arrays in argument order and
|
|
202
|
-
* return them (most often a single array). It must not throw; a throw is
|
|
203
|
-
* captured and surfaced from apply(). The MlxArrays handed to `fn` are owned by
|
|
204
|
-
* mlx — do NOT dispose them. Lifecycle/house-rules mirror ValueAndGrad. */
|
|
205
|
-
export class Vjp {
|
|
206
|
-
readonly #cb: JSCallback;
|
|
207
|
-
readonly #closure: bigint;
|
|
208
|
-
readonly #nOut: number;
|
|
209
|
-
#closureError: string | null = null;
|
|
210
|
-
#disposed = false;
|
|
211
|
-
|
|
212
|
-
/** @param nOut number of arrays `fn` returns (length of the cotangent list). */
|
|
213
|
-
constructor(fn: (primals: MlxArray[]) => MlxArray[], nOut = 1) {
|
|
214
|
-
this.#nOut = nOut;
|
|
215
|
-
this.#cb = new JSCallback(
|
|
216
|
-
(outPtr: number, inVec: bigint, _payload: number): number => {
|
|
217
|
-
try {
|
|
218
|
-
const n = Number(C.mlx_vector_array_size(inVec));
|
|
219
|
-
const primals: MlxArray[] = [];
|
|
220
|
-
for (let i = 0; i < n; i++) {
|
|
221
|
-
const slot = new BigUint64Array([C.mlx_array_new()]);
|
|
222
|
-
const sp = ptr(slot);
|
|
223
|
-
if (C.mlx_vector_array_get(sp, inVec, BigInt(i)) !== 0)
|
|
224
|
-
throw new Error(`vector_array_get(${i}) failed`);
|
|
225
|
-
primals.push(new MlxArray(read.u64(sp, 0)));
|
|
226
|
-
}
|
|
227
|
-
const outs = fn(primals);
|
|
228
|
-
const handles = new BigUint64Array(outs.map((o) => o.handle));
|
|
229
|
-
if (C.mlx_vector_array_set_data(outPtr as never, ptr(handles), BigInt(outs.length)) !== 0)
|
|
230
|
-
throw new Error("vector_array_set_data failed");
|
|
231
|
-
for (const p of primals) p.dispose();
|
|
232
|
-
for (const o of outs) o.dispose();
|
|
233
|
-
return 0;
|
|
234
|
-
} catch (e) {
|
|
235
|
-
this.#closureError = e instanceof Error ? e.message : String(e);
|
|
236
|
-
return 1;
|
|
237
|
-
}
|
|
238
|
-
},
|
|
239
|
-
{ args: ["ptr", "u64", "ptr"], returns: "i32" },
|
|
240
|
-
);
|
|
241
|
-
this.#closure = C.mlx_closure_new_func_payload(this.#cb.ptr as never, null, null);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/** Run the vjp on `primals` with `cotangents` (one per output of `fn`).
|
|
245
|
-
* Returns the outputs (fn(primals)) and one cotangent per primal (in primal
|
|
246
|
-
* order). Caller owns all returned arrays. */
|
|
247
|
-
apply(primals: MlxArray[], cotangents: MlxArray[]): { outputs: MlxArray[]; vjps: MlxArray[] } {
|
|
248
|
-
if (this.#disposed) throw new Error("Vjp used after dispose");
|
|
249
|
-
if (cotangents.length !== this.#nOut)
|
|
250
|
-
throw new Error(`Vjp: expected ${this.#nOut} cotangents, got ${cotangents.length}`);
|
|
251
|
-
this.#closureError = null;
|
|
252
|
-
|
|
253
|
-
const pHandles = new BigUint64Array(primals.map((p) => p.handle));
|
|
254
|
-
const cHandles = new BigUint64Array(cotangents.map((c) => c.handle));
|
|
255
|
-
const inVec = C.mlx_vector_array_new_data(ptr(pHandles), BigInt(primals.length));
|
|
256
|
-
const cotVec = C.mlx_vector_array_new_data(ptr(cHandles), BigInt(cotangents.length));
|
|
257
|
-
|
|
258
|
-
const outSlot = new BigUint64Array([C.mlx_vector_array_new()]);
|
|
259
|
-
const vjpSlot = new BigUint64Array([C.mlx_vector_array_new()]);
|
|
260
|
-
const st = C.mlx_vjp(ptr(outSlot), ptr(vjpSlot), this.#closure, inVec, cotVec);
|
|
261
|
-
const outVec = read.u64(ptr(outSlot), 0);
|
|
262
|
-
const vjpVec = read.u64(ptr(vjpSlot), 0);
|
|
263
|
-
if (st !== 0) {
|
|
264
|
-
C.mlx_vector_array_free(outVec);
|
|
265
|
-
C.mlx_vector_array_free(vjpVec);
|
|
266
|
-
C.mlx_vector_array_free(inVec);
|
|
267
|
-
C.mlx_vector_array_free(cotVec);
|
|
268
|
-
const mlxErr = takeMlxError();
|
|
269
|
-
const detail = this.#closureError ?? mlxErr ?? "";
|
|
270
|
-
throw new Error(`mlx_vjp failed${detail ? `: ${detail}` : ""}`);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
const nVjp = Number(C.mlx_vector_array_size(vjpVec));
|
|
274
|
-
if (nVjp !== primals.length) {
|
|
275
|
-
C.mlx_vector_array_free(outVec);
|
|
276
|
-
C.mlx_vector_array_free(vjpVec);
|
|
277
|
-
C.mlx_vector_array_free(inVec);
|
|
278
|
-
C.mlx_vector_array_free(cotVec);
|
|
279
|
-
throw new Error(`Vjp: expected ${primals.length} vjps, got ${nVjp}`);
|
|
280
|
-
}
|
|
281
|
-
const nOut = Number(C.mlx_vector_array_size(outVec));
|
|
282
|
-
const outputs: MlxArray[] = [];
|
|
283
|
-
for (let i = 0; i < nOut; i++) outputs.push(vecGet(outVec, i));
|
|
284
|
-
const vjps: MlxArray[] = [];
|
|
285
|
-
for (let i = 0; i < nVjp; i++) vjps.push(vecGet(vjpVec, i));
|
|
286
|
-
|
|
287
|
-
C.mlx_vector_array_free(outVec);
|
|
288
|
-
C.mlx_vector_array_free(vjpVec);
|
|
289
|
-
C.mlx_vector_array_free(inVec);
|
|
290
|
-
C.mlx_vector_array_free(cotVec);
|
|
291
|
-
return { outputs, vjps };
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
dispose(): void {
|
|
295
|
-
if (this.#disposed) return;
|
|
296
|
-
this.#disposed = true;
|
|
297
|
-
C.mlx_closure_free(this.#closure);
|
|
298
|
-
this.#cb.close();
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
[Symbol.dispose](): void {
|
|
302
|
-
this.dispose();
|
|
303
|
-
}
|
|
304
|
-
}
|
package/src/mlx/checkpoint.ts
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
// Gradient checkpointing (rematerialization) via mlx-c mlx_checkpoint.
|
|
2
|
-
//
|
|
3
|
-
// Wraps a JS function (MlxArray[]) -> MlxArray[] into a closure whose forward
|
|
4
|
-
// activations are dropped and RECOMPUTED during the enclosing value_and_grad
|
|
5
|
-
// backward. Used to bound training memory on long sequences: instead of
|
|
6
|
-
// retaining every transformer layer's activations, each checkpointed unit is
|
|
7
|
-
// recomputed one at a time in the backward pass.
|
|
8
|
-
//
|
|
9
|
-
// Same FFI lifecycle as ValueAndGrad (src/mlx/autograd.ts): a JSCallback over
|
|
10
|
-
// the user fn → mlx_closure_new_func_payload → mlx_checkpoint → applied with
|
|
11
|
-
// mlx_closure_apply. The closure must not throw across the FFI boundary; a JS
|
|
12
|
-
// throw is captured and re-surfaced from apply().
|
|
13
|
-
|
|
14
|
-
import { JSCallback, ptr, read } from "bun:ffi";
|
|
15
|
-
import { C, takeMlxError } from "./ffi";
|
|
16
|
-
import { MlxArray } from "./array";
|
|
17
|
-
|
|
18
|
-
type CallbackHandle = Pick<JSCallback, "ptr" | "close">;
|
|
19
|
-
type NativeCall<F extends (...args: any[]) => any> =
|
|
20
|
-
(...args: Parameters<F>) => ReturnType<F>;
|
|
21
|
-
|
|
22
|
-
/** Constructor-only dependency seam for deterministic native failure tests. */
|
|
23
|
-
export interface CheckpointConstructorHooks {
|
|
24
|
-
callback?: (
|
|
25
|
-
callback: ConstructorParameters<typeof JSCallback>[0],
|
|
26
|
-
definition: ConstructorParameters<typeof JSCallback>[1],
|
|
27
|
-
) => CallbackHandle;
|
|
28
|
-
closureNew?: NativeCall<typeof C.mlx_closure_new_func_payload>;
|
|
29
|
-
transformedNew?: NativeCall<typeof C.mlx_closure_new>;
|
|
30
|
-
transform?: NativeCall<typeof C.mlx_checkpoint>;
|
|
31
|
-
closureFree?: NativeCall<typeof C.mlx_closure_free>;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** A reusable checkpointed wrapper over a JS-built subgraph.
|
|
35
|
-
*
|
|
36
|
-
* `fn(inputs)` receives the input arrays (in order) and returns one or more
|
|
37
|
-
* output arrays. Applying the checkpoint builds the same forward graph, but
|
|
38
|
-
* marks it for recomputation: the enclosing backward recomputes `fn` rather
|
|
39
|
-
* than reading retained activations. Gradients flow to the explicit inputs
|
|
40
|
-
* AND to any outer-trace leaves captured by `fn` (e.g. swapped-in LoRA
|
|
41
|
-
* primals), exactly as if `fn` had been inlined. */
|
|
42
|
-
export class Checkpoint {
|
|
43
|
-
readonly #cb: CallbackHandle;
|
|
44
|
-
readonly #closure: bigint;
|
|
45
|
-
readonly #ckpt: bigint;
|
|
46
|
-
readonly #freeClosure: NativeCall<typeof C.mlx_closure_free>;
|
|
47
|
-
#closureError: string | null = null;
|
|
48
|
-
#disposed = false;
|
|
49
|
-
|
|
50
|
-
constructor(
|
|
51
|
-
fn: (inputs: MlxArray[]) => MlxArray[],
|
|
52
|
-
hooks: CheckpointConstructorHooks = {},
|
|
53
|
-
) {
|
|
54
|
-
const makeCallback = hooks.callback ?? ((callback, definition) => new JSCallback(callback, definition));
|
|
55
|
-
const closureNew = hooks.closureNew ?? C.mlx_closure_new_func_payload;
|
|
56
|
-
const transformedNew = hooks.transformedNew ?? C.mlx_closure_new;
|
|
57
|
-
const transform = hooks.transform ?? C.mlx_checkpoint;
|
|
58
|
-
this.#freeClosure = hooks.closureFree ?? C.mlx_closure_free;
|
|
59
|
-
|
|
60
|
-
const cb = makeCallback(
|
|
61
|
-
(outPtr: number, inVec: bigint, _payload: number): number => {
|
|
62
|
-
try {
|
|
63
|
-
const n = Number(C.mlx_vector_array_size(inVec));
|
|
64
|
-
const inputs: MlxArray[] = [];
|
|
65
|
-
for (let i = 0; i < n; i++) {
|
|
66
|
-
const slot = new BigUint64Array([C.mlx_array_new()]);
|
|
67
|
-
const sp = ptr(slot);
|
|
68
|
-
if (C.mlx_vector_array_get(sp, inVec, BigInt(i)) !== 0)
|
|
69
|
-
throw new Error(`vector_array_get(${i}) failed`);
|
|
70
|
-
inputs.push(new MlxArray(read.u64(sp, 0)));
|
|
71
|
-
}
|
|
72
|
-
const outs = fn(inputs);
|
|
73
|
-
const handles = new BigUint64Array(outs.map((o) => o.handle));
|
|
74
|
-
if (C.mlx_vector_array_set_data(outPtr as never, ptr(handles), BigInt(outs.length)) !== 0)
|
|
75
|
-
throw new Error("vector_array_set_data failed");
|
|
76
|
-
for (const p of inputs) p.dispose();
|
|
77
|
-
for (const o of outs) o.dispose();
|
|
78
|
-
return 0;
|
|
79
|
-
} catch (e) {
|
|
80
|
-
this.#closureError = e instanceof Error ? e.message : String(e);
|
|
81
|
-
return 1;
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
{ args: ["ptr", "u64", "ptr"], returns: "i32" },
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
let closure: bigint | null = null;
|
|
88
|
-
let slot: BigUint64Array | null = null;
|
|
89
|
-
try {
|
|
90
|
-
closure = closureNew(cb.ptr as never, null, null);
|
|
91
|
-
slot = new BigUint64Array([transformedNew()]);
|
|
92
|
-
if (transform(ptr(slot), closure) !== 0)
|
|
93
|
-
throw new Error(`mlx_checkpoint failed: ${takeMlxError() ?? ""}`);
|
|
94
|
-
this.#cb = cb;
|
|
95
|
-
this.#closure = closure;
|
|
96
|
-
this.#ckpt = read.u64(ptr(slot), 0);
|
|
97
|
-
} catch (e) {
|
|
98
|
-
if (slot) this.#freeClosure(read.u64(ptr(slot), 0));
|
|
99
|
-
if (closure !== null) this.#freeClosure(closure);
|
|
100
|
-
cb.close();
|
|
101
|
-
throw e;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** Apply the checkpointed fn. Returns its outputs as owned MlxArrays. */
|
|
106
|
-
apply(inputs: MlxArray[]): MlxArray[] {
|
|
107
|
-
if (this.#disposed) throw new Error("Checkpoint used after dispose");
|
|
108
|
-
this.#closureError = null;
|
|
109
|
-
|
|
110
|
-
const handles = new BigUint64Array(inputs.map((p) => p.handle));
|
|
111
|
-
const inVec = C.mlx_vector_array_new_data(ptr(handles), BigInt(inputs.length));
|
|
112
|
-
const outSlot = new BigUint64Array([C.mlx_vector_array_new()]);
|
|
113
|
-
const st = C.mlx_closure_apply(ptr(outSlot), this.#ckpt, inVec);
|
|
114
|
-
const outVec = read.u64(ptr(outSlot), 0);
|
|
115
|
-
if (st !== 0) {
|
|
116
|
-
C.mlx_vector_array_free(outVec);
|
|
117
|
-
C.mlx_vector_array_free(inVec);
|
|
118
|
-
const detail = this.#closureError ?? takeMlxError() ?? "";
|
|
119
|
-
throw new Error(`checkpoint apply failed${detail ? `: ${detail}` : ""}`);
|
|
120
|
-
}
|
|
121
|
-
const nOut = Number(C.mlx_vector_array_size(outVec));
|
|
122
|
-
const outs: MlxArray[] = [];
|
|
123
|
-
for (let i = 0; i < nOut; i++) {
|
|
124
|
-
const slot = new BigUint64Array([C.mlx_array_new()]);
|
|
125
|
-
const sp = ptr(slot);
|
|
126
|
-
if (C.mlx_vector_array_get(sp, outVec, BigInt(i)) !== 0) {
|
|
127
|
-
C.mlx_vector_array_free(outVec);
|
|
128
|
-
C.mlx_vector_array_free(inVec);
|
|
129
|
-
throw new Error(`checkpoint output get(${i}) failed`);
|
|
130
|
-
}
|
|
131
|
-
outs.push(new MlxArray(read.u64(sp, 0)));
|
|
132
|
-
}
|
|
133
|
-
C.mlx_vector_array_free(outVec);
|
|
134
|
-
C.mlx_vector_array_free(inVec);
|
|
135
|
-
return outs;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
dispose(): void {
|
|
139
|
-
if (this.#disposed) return;
|
|
140
|
-
this.#disposed = true;
|
|
141
|
-
this.#freeClosure(this.#ckpt);
|
|
142
|
-
this.#freeClosure(this.#closure);
|
|
143
|
-
this.#cb.close();
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
[Symbol.dispose](): void {
|
|
147
|
-
this.dispose();
|
|
148
|
-
}
|
|
149
|
-
}
|
package/src/mlx/compile.ts
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
// mx.compile from Bun: wrap a JS graph-builder in an mlx_closure, hand it
|
|
2
|
-
// to mlx_compile, and replay the compiled graph in C++ thereafter.
|
|
3
|
-
//
|
|
4
|
-
// The trace function runs EXACTLY ONCE per (ndim, dtype) input signature
|
|
5
|
-
// (shapeless=true): mlx invokes our JSCallback with tracer arrays during
|
|
6
|
-
// the first mlx_closure_apply, we build the graph with the ordinary ops
|
|
7
|
-
// layer, and every later apply replays it natively — zero per-op FFI.
|
|
8
|
-
//
|
|
9
|
-
// Contract for trace functions:
|
|
10
|
-
// - receive positional MlxArray inputs, return positional MlxArray outputs
|
|
11
|
-
// - must NOT dispose the inputs (the trampoline owns them) and must NOT
|
|
12
|
-
// eval anything (tracer arrays have no data — eval inside a trace is an
|
|
13
|
-
// mlx error by design)
|
|
14
|
-
// - arrays created inside the trace (weights, scalarLike constants) are
|
|
15
|
-
// captured as graph constants — correct for weights, which never change
|
|
16
|
-
// - with shapeless=true the graph must stay valid as dim SIZES change
|
|
17
|
-
// (ndim/dtype changes retrace automatically): no reshape/slice constants
|
|
18
|
-
// derived from a varying dimension
|
|
19
|
-
|
|
20
|
-
import { JSCallback, ptr, read } from "bun:ffi";
|
|
21
|
-
import { C, type MlxHandle, takeMlxError } from "./ffi";
|
|
22
|
-
import { MlxArray } from "./array";
|
|
23
|
-
|
|
24
|
-
export type TraceFn = (inputs: MlxArray[]) => MlxArray[];
|
|
25
|
-
|
|
26
|
-
const traceRegistry = new Map<number, { fn: TraceFn; count: number; shapeless: boolean }>();
|
|
27
|
-
let nextTraceId = 1;
|
|
28
|
-
let shapelessTracing = false;
|
|
29
|
-
|
|
30
|
-
/** Fixed-shape custom kernels must fall back while a shapeless graph traces. */
|
|
31
|
-
export function isShapelessTracing(): boolean {
|
|
32
|
-
return shapelessTracing;
|
|
33
|
-
}
|
|
34
|
-
/** Error thrown by a trace fn, carried across the C boundary (the
|
|
35
|
-
* trampoline must not throw into mlx; it returns non-zero instead). */
|
|
36
|
-
let traceError: unknown = null;
|
|
37
|
-
|
|
38
|
-
/** Count of trace invocations, exposed for tests (a working shapeless
|
|
39
|
-
* compile traces once and replays thereafter). */
|
|
40
|
-
export let traceCalls = 0;
|
|
41
|
-
|
|
42
|
-
// int (*fun)(mlx_vector_array* res, const mlx_vector_array args, void* payload)
|
|
43
|
-
// mlx_vector_array is the usual one-pointer struct, by value → u64.
|
|
44
|
-
// Tracing happens synchronously inside mlx_closure_apply on the calling
|
|
45
|
-
// thread, so a non-threadsafe JSCallback is safe (same argument as the
|
|
46
|
-
// error handler in ffi.ts).
|
|
47
|
-
const trampoline = new JSCallback(
|
|
48
|
-
(resPtr: number, argsVec: bigint, payload: number): number => {
|
|
49
|
-
const previousShapeless = shapelessTracing;
|
|
50
|
-
try {
|
|
51
|
-
const entry = traceRegistry.get(payload);
|
|
52
|
-
if (!entry) throw new Error(`compile trampoline: unknown trace id ${payload}`);
|
|
53
|
-
shapelessTracing ||= entry.shapeless;
|
|
54
|
-
const fn = entry.fn;
|
|
55
|
-
entry.count++;
|
|
56
|
-
traceCalls++;
|
|
57
|
-
const n = Number(C.mlx_vector_array_size(argsVec));
|
|
58
|
-
const inputs: MlxArray[] = [];
|
|
59
|
-
const slot = new BigUint64Array(1);
|
|
60
|
-
const slotPtr = ptr(slot);
|
|
61
|
-
for (let i = 0; i < n; i++) {
|
|
62
|
-
slot[0] = C.mlx_array_new();
|
|
63
|
-
if (C.mlx_vector_array_get(slotPtr, argsVec, BigInt(i)) !== 0)
|
|
64
|
-
throw new Error(`vector_array_get(${i}) failed: ${takeMlxError() ?? ""}`);
|
|
65
|
-
inputs.push(new MlxArray(read.u64(slotPtr, 0)));
|
|
66
|
-
}
|
|
67
|
-
const outputs = fn(inputs);
|
|
68
|
-
const handles = new BigUint64Array(outputs.map((o) => o.handle));
|
|
69
|
-
if (C.mlx_vector_array_set_data(resPtr, ptr(handles), BigInt(outputs.length)) !== 0)
|
|
70
|
-
throw new Error(`vector_array_set_data failed: ${takeMlxError() ?? ""}`);
|
|
71
|
-
for (const o of outputs) o.dispose();
|
|
72
|
-
for (const a of inputs) a.dispose();
|
|
73
|
-
return 0;
|
|
74
|
-
} catch (e) {
|
|
75
|
-
traceError = e;
|
|
76
|
-
return 1;
|
|
77
|
-
} finally {
|
|
78
|
-
shapelessTracing = previousShapeless;
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
{ args: ["ptr", "u64", "ptr"], returns: "i32" },
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
/** MLX_COMPILE_MODE_* (compile.h). NO_FUSE keeps the host-side replay win
|
|
85
|
-
* while disabling kernel fusion — the escape hatch if fusion ever breaks
|
|
86
|
-
* the bit-exact gate. */
|
|
87
|
-
export function setCompileMode(mode: "disabled" | "no_simplify" | "no_fuse" | "enabled"): void {
|
|
88
|
-
const v = { disabled: 0, no_simplify: 1, no_fuse: 2, enabled: 3 }[mode];
|
|
89
|
-
if (C.mlx_set_compile_mode(v) !== 0)
|
|
90
|
-
throw new Error(`mlx_set_compile_mode failed: ${takeMlxError() ?? ""}`);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export class CompiledFunction {
|
|
94
|
-
#compiled: MlxHandle;
|
|
95
|
-
#traceId: number;
|
|
96
|
-
#disposed = false;
|
|
97
|
-
|
|
98
|
-
/** Times this function's trace ran. A shapeless decode closure must
|
|
99
|
-
* trace exactly once — its input ndims/dtypes never change — so any
|
|
100
|
-
* count > 1 is a silent retrace (per-step JS graph builds sneaking
|
|
101
|
-
* back in) and gets flagged by compiled-decode. */
|
|
102
|
-
get traceCount(): number {
|
|
103
|
-
return traceRegistry.get(this.#traceId)?.count ?? 0;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
constructor(fn: TraceFn, shapeless = true) {
|
|
107
|
-
this.#traceId = nextTraceId++;
|
|
108
|
-
traceRegistry.set(this.#traceId, { fn, count: 0, shapeless });
|
|
109
|
-
// payload is the trace id smuggled through the void* (never deref'd);
|
|
110
|
-
// dtor is null — nothing to free on the C side.
|
|
111
|
-
const raw = C.mlx_closure_new_func_payload(trampoline.ptr, this.#traceId as never, null);
|
|
112
|
-
const slot = new BigUint64Array([C.mlx_closure_new()]);
|
|
113
|
-
const slotPtr = ptr(slot);
|
|
114
|
-
const status = C.mlx_compile(slotPtr, raw, shapeless);
|
|
115
|
-
const compiled = read.u64(slotPtr, 0);
|
|
116
|
-
C.mlx_closure_free(raw);
|
|
117
|
-
if (status !== 0) {
|
|
118
|
-
C.mlx_closure_free(compiled);
|
|
119
|
-
traceRegistry.delete(this.#traceId);
|
|
120
|
-
throw new Error(`mlx_compile failed: ${takeMlxError() ?? ""}`);
|
|
121
|
-
}
|
|
122
|
-
this.#compiled = compiled;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/** Run the compiled graph. First call (per ndim/dtype signature) traces
|
|
126
|
-
* through the JS fn; later calls replay natively. Returned arrays are
|
|
127
|
-
* owned by the caller. */
|
|
128
|
-
apply(inputs: MlxArray[]): MlxArray[] {
|
|
129
|
-
if (this.#disposed) throw new Error("CompiledFunction used after dispose");
|
|
130
|
-
const handles = new BigUint64Array(inputs.length);
|
|
131
|
-
for (let i = 0; i < inputs.length; i++) handles[i] = inputs[i]!.handle;
|
|
132
|
-
const inVec = C.mlx_vector_array_new_data(ptr(handles), BigInt(inputs.length));
|
|
133
|
-
const slot = new BigUint64Array([C.mlx_vector_array_new()]);
|
|
134
|
-
const slotPtr = ptr(slot);
|
|
135
|
-
const status = C.mlx_closure_apply(slotPtr, this.#compiled, inVec);
|
|
136
|
-
const outVec = read.u64(slotPtr, 0);
|
|
137
|
-
C.mlx_vector_array_free(inVec);
|
|
138
|
-
if (status !== 0) {
|
|
139
|
-
C.mlx_vector_array_free(outVec);
|
|
140
|
-
const e = traceError;
|
|
141
|
-
traceError = null;
|
|
142
|
-
throw e instanceof Error
|
|
143
|
-
? e
|
|
144
|
-
: new Error(`compiled apply failed: ${takeMlxError() ?? "(no mlx message)"}`);
|
|
145
|
-
}
|
|
146
|
-
const n = Number(C.mlx_vector_array_size(outVec));
|
|
147
|
-
const outputs: MlxArray[] = [];
|
|
148
|
-
const aSlot = new BigUint64Array(1);
|
|
149
|
-
const aPtr = ptr(aSlot);
|
|
150
|
-
for (let i = 0; i < n; i++) {
|
|
151
|
-
aSlot[0] = C.mlx_array_new();
|
|
152
|
-
if (C.mlx_vector_array_get(aPtr, outVec, BigInt(i)) !== 0) {
|
|
153
|
-
C.mlx_vector_array_free(outVec);
|
|
154
|
-
throw new Error(`vector_array_get(out ${i}) failed: ${takeMlxError() ?? ""}`);
|
|
155
|
-
}
|
|
156
|
-
outputs.push(new MlxArray(read.u64(aPtr, 0)));
|
|
157
|
-
}
|
|
158
|
-
C.mlx_vector_array_free(outVec);
|
|
159
|
-
return outputs;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
dispose(): void {
|
|
163
|
-
if (this.#disposed) return;
|
|
164
|
-
this.#disposed = true;
|
|
165
|
-
C.mlx_closure_free(this.#compiled);
|
|
166
|
-
traceRegistry.delete(this.#traceId);
|
|
167
|
-
}
|
|
168
|
-
}
|