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
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import type { BatchableCache, Cache, Mask, KvAttentionView } from "../../model/gemma4-base";
|
|
2
|
-
import { buildBatchedDecodeMask, mergeKVRows } from "../../model/batched-mask";
|
|
3
|
-
import * as ops from "../../mlx/ops";
|
|
4
|
-
import { runtimeFlag } from "../../runtime-config";
|
|
5
|
-
import { MlxArray } from "../../mlx/array";
|
|
6
|
-
import { disposeResources } from "../../engine/resources";
|
|
7
|
-
import { PagedKVCache, poolBlocksFor, type PagedQuantization } from "./paged-kv";
|
|
8
|
-
|
|
9
|
-
/** Block storage owns row membership; attention consumes the same gathered
|
|
10
|
-
* K/V representation as the existing paged cache. No scheduler policy here. */
|
|
11
|
-
export class PagedKvRows implements BatchableCache {
|
|
12
|
-
#rows: PagedKVCache[] = [];
|
|
13
|
-
#rope?: MlxArray;
|
|
14
|
-
#ropeOffset = -1;
|
|
15
|
-
|
|
16
|
-
constructor(readonly capacityTokens: number, readonly blockSize: number, readonly direct = runtimeFlag("MLX_BUN_PAGED_ATTN", false), readonly quantization?: PagedQuantization) {}
|
|
17
|
-
signature(): string { return "kv:paged-rows"; }
|
|
18
|
-
get batchSize(): number { return this.#rows.length; }
|
|
19
|
-
get offset(): number { return Math.max(0, ...this.#rows.map(row => row.offset)); }
|
|
20
|
-
get rowOffsets(): number[] { return this.#rows.map(row => row.offset); }
|
|
21
|
-
get leftPad(): number[] { const width = this.offset; return this.#rows.map(row => width - row.offset); }
|
|
22
|
-
get ropeOffsetArr(): MlxArray | undefined {
|
|
23
|
-
if (this.#rows.length < 2) return undefined;
|
|
24
|
-
if (!this.#rope || this.#ropeOffset !== this.offset) {
|
|
25
|
-
this.releaseRopeArr();
|
|
26
|
-
this.#rope = MlxArray.fromInt32(Int32Array.from(this.rowOffsets), [this.batchSize]);
|
|
27
|
-
this.#ropeOffset = this.offset;
|
|
28
|
-
}
|
|
29
|
-
return this.#rope;
|
|
30
|
-
}
|
|
31
|
-
releaseRopeArr(): void { this.#rope?.dispose(); this.#rope = undefined; this.#ropeOffset = -1; }
|
|
32
|
-
makeEmptyBatch(): PagedKvRows { return new PagedKvRows(this.capacityTokens, this.blockSize, this.direct, this.quantization); }
|
|
33
|
-
|
|
34
|
-
mergeRows(rows: readonly Cache[]): void {
|
|
35
|
-
const next: PagedKVCache[] = [];
|
|
36
|
-
try {
|
|
37
|
-
for (const source of rows) {
|
|
38
|
-
if (source instanceof PagedKvRows) {
|
|
39
|
-
for (const row of source.#rows) next.push(row.clone());
|
|
40
|
-
} else if (source instanceof PagedKVCache) next.push(source.clone());
|
|
41
|
-
else throw new Error(`Paged rows cannot merge ${source.signature()}`);
|
|
42
|
-
}
|
|
43
|
-
} catch (error) { disposeResources(next); throw error; }
|
|
44
|
-
const previous = this.#rows; this.#rows = next;
|
|
45
|
-
this.releaseRopeArr(); disposeResources(previous);
|
|
46
|
-
}
|
|
47
|
-
extractRow(row: number): PagedKVCache { return this.#rows[row]!.clone(); }
|
|
48
|
-
filterRows(keep: readonly number[]): void {
|
|
49
|
-
const previous = this.#rows;
|
|
50
|
-
this.#rows = keep.map(row => previous[row]!);
|
|
51
|
-
const retained = new Set(keep);
|
|
52
|
-
this.releaseRopeArr();
|
|
53
|
-
disposeResources(previous.filter((_, row) => !retained.has(row)));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
get attentionState(): this | undefined { return this.direct || this.quantization ? this : undefined; }
|
|
57
|
-
appendAndFetch(keys: MlxArray, values: MlxArray): KvAttentionView {
|
|
58
|
-
const views: KvAttentionView[] = [];
|
|
59
|
-
try {
|
|
60
|
-
for (const [row, storage] of this.#rows.entries()) {
|
|
61
|
-
using k = keys.slice([row, 0, 0, 0], [row + 1, ...keys.shape.slice(1)]);
|
|
62
|
-
using v = values.slice([row, 0, 0, 0], [row + 1, ...values.shape.slice(1)]);
|
|
63
|
-
views.push(storage.appendAndFetch(k, v));
|
|
64
|
-
}
|
|
65
|
-
} catch (error) { disposeResources(views); throw error; }
|
|
66
|
-
return {
|
|
67
|
-
attend(q, scale, mask) {
|
|
68
|
-
const outputs: MlxArray[] = [];
|
|
69
|
-
try {
|
|
70
|
-
for (const [row, view] of views.entries()) {
|
|
71
|
-
using query = q.slice([row, 0, 0, 0], [row + 1, ...q.shape.slice(1)]);
|
|
72
|
-
outputs.push(view.attend(query, scale, mask));
|
|
73
|
-
}
|
|
74
|
-
return ops.concatAxis(outputs, 0);
|
|
75
|
-
} finally { disposeResources(outputs); }
|
|
76
|
-
},
|
|
77
|
-
dispose() { disposeResources(views); },
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
updateAndFetch(keys: MlxArray, values: MlxArray): [MlxArray, MlxArray] {
|
|
82
|
-
if (this.#rows.length === 1) return this.#rows[0]!.updateAndFetch(keys, values);
|
|
83
|
-
const fetched: Array<{ keys: MlxArray; values: MlxArray }> = [];
|
|
84
|
-
try {
|
|
85
|
-
for (const [row, storage] of this.#rows.entries()) {
|
|
86
|
-
using k = keys.slice([row, 0, 0, 0], [row + 1, ...keys.shape.slice(1)]);
|
|
87
|
-
using v = values.slice([row, 0, 0, 0], [row + 1, ...values.shape.slice(1)]);
|
|
88
|
-
const [nextK, nextV] = storage.updateAndFetch(k, v);
|
|
89
|
-
fetched.push({ keys: nextK, values: nextV });
|
|
90
|
-
}
|
|
91
|
-
const result = mergeKVRows(fetched);
|
|
92
|
-
return [result.keys, result.values];
|
|
93
|
-
} finally { disposeResources(fetched.flatMap(row => [row.keys, row.values])); }
|
|
94
|
-
}
|
|
95
|
-
makeMask(tokens: number, window: number | null): Mask {
|
|
96
|
-
if (this.attentionState && window === null) return { mode: tokens === 1 ? "" : "causal", arr: null };
|
|
97
|
-
if (this.#rows.length === 1) return this.#rows[0]!.makeMask(tokens, window);
|
|
98
|
-
return { mode: "array", arr: buildBatchedDecodeMask(this.batchSize, tokens,
|
|
99
|
-
this.offset + tokens, this.leftPad, window) };
|
|
100
|
-
}
|
|
101
|
-
state(): MlxArray[] { return this.#rows.flatMap(row => row.state()); }
|
|
102
|
-
isTrimmable(): boolean { return true; }
|
|
103
|
-
trim(tokens: number): void { for (const row of this.#rows) row.trim(tokens); this.releaseRopeArr(); }
|
|
104
|
-
projectedBytes(tokens: number): number {
|
|
105
|
-
const pool = this.#rows.find(row => row.pool)?.pool;
|
|
106
|
-
if (!pool) return 0;
|
|
107
|
-
const bytesPerBlock = pool.arrays().reduce((bytes, array) => bytes + array.nbytes, 0) / pool.numBlocks;
|
|
108
|
-
return poolBlocksFor(tokens, this.blockSize) * bytesPerBlock;
|
|
109
|
-
}
|
|
110
|
-
dispose(): void { const rows = this.#rows; this.#rows = []; this.releaseRopeArr(); disposeResources(rows); }
|
|
111
|
-
}
|
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
// Paged KV storage behind the common cache and attention interfaces.
|
|
2
|
-
// Full-attention pools support bf16 and affine KV4/KV8. The established
|
|
3
|
-
// gather + SDPA arm is the numerical control; direct Metal reads are Lab.
|
|
4
|
-
// Published views and SSD snapshots own immutable buffers independently of
|
|
5
|
-
// appends, row membership and RAM eviction.
|
|
6
|
-
|
|
7
|
-
import { disposeResources } from "../../engine/resources";
|
|
8
|
-
import { pagedAttentionView } from "./paged-attention";
|
|
9
|
-
import { runtimeFlag } from "../../runtime-config";
|
|
10
|
-
import { MlxArray } from "../../mlx/array";
|
|
11
|
-
import { Dtype } from "../../mlx/ffi";
|
|
12
|
-
import * as ops from "../../mlx/ops";
|
|
13
|
-
import { createCausalMask, type Cache, type Mask, type KvAttentionView } from "../../model/gemma4-base";
|
|
14
|
-
|
|
15
|
-
/** Typed pool-exhaustion error: a generation outgrew its pool. Sizing from
|
|
16
|
-
* prompt+maxTokens at construction makes this unreachable in practice;
|
|
17
|
-
* it exists so an accounting bug is a clear throw, never silent
|
|
18
|
-
* truncation or an allocator OOM (the byte-capped-not-count-capped
|
|
19
|
-
* lesson). */
|
|
20
|
-
export class PagedPoolExhausted extends Error {
|
|
21
|
-
constructor(numBlocks: number) {
|
|
22
|
-
super(`paged KV pool exhausted (${numBlocks} blocks) — capacity accounting bug`);
|
|
23
|
-
this.name = "PagedPoolExhausted";
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Per-layer block arena. One K and one V pool tensor, mlx-owned
|
|
28
|
-
* (ops.zeros — no host-pointer alignment/dtor hazards), shaped
|
|
29
|
-
* [numBlocks, H, blockSize, D]. alloc()/free() manage physical slot
|
|
30
|
-
* indices; the owning PagedKVCache writes/gathers through the pool. */
|
|
31
|
-
export interface PagedQuantization { bits: 4 | 8; groupSize: number }
|
|
32
|
-
|
|
33
|
-
export class BlockPool {
|
|
34
|
-
keyScales?: MlxArray; keyBiases?: MlxArray;
|
|
35
|
-
valueScales?: MlxArray; valueBiases?: MlxArray;
|
|
36
|
-
readonly headDim: number;
|
|
37
|
-
readonly vHeadDim: number;
|
|
38
|
-
readonly dtype: Dtype;
|
|
39
|
-
readonly quantization?: PagedQuantization;
|
|
40
|
-
keys: MlxArray;
|
|
41
|
-
values: MlxArray;
|
|
42
|
-
numBlocks: number;
|
|
43
|
-
readonly blockSize: number;
|
|
44
|
-
#free: number[];
|
|
45
|
-
|
|
46
|
-
constructor(opts: {
|
|
47
|
-
numBlocks: number;
|
|
48
|
-
blockSize: number;
|
|
49
|
-
numKvHeads: number;
|
|
50
|
-
headDim: number;
|
|
51
|
-
/** V head dim when it differs from K's (attention_k_eq_v models don't
|
|
52
|
-
* reach v1's gemma4 scope, but the pool stays shape-honest). */
|
|
53
|
-
vHeadDim?: number;
|
|
54
|
-
dtype: Dtype;
|
|
55
|
-
quantization?: PagedQuantization;
|
|
56
|
-
}, source?: BlockPool) {
|
|
57
|
-
this.headDim = opts.headDim; this.vHeadDim = opts.vHeadDim ?? opts.headDim;
|
|
58
|
-
this.dtype = opts.dtype; this.quantization = opts.quantization;
|
|
59
|
-
this.numBlocks = opts.numBlocks;
|
|
60
|
-
this.blockSize = opts.blockSize;
|
|
61
|
-
this.keys = source ? ops.contiguous(source.keys) : ops.zeros(
|
|
62
|
-
[opts.numBlocks, opts.numKvHeads, opts.blockSize, opts.headDim], opts.dtype);
|
|
63
|
-
this.values = source ? ops.contiguous(source.values) : ops.zeros(
|
|
64
|
-
[opts.numBlocks, opts.numKvHeads, opts.blockSize, opts.vHeadDim ?? opts.headDim],
|
|
65
|
-
opts.dtype);
|
|
66
|
-
if (source?.quantization) {
|
|
67
|
-
this.keyScales = ops.contiguous(source.keyScales!); this.keyBiases = ops.contiguous(source.keyBiases!);
|
|
68
|
-
this.valueScales = ops.contiguous(source.valueScales!); this.valueBiases = ops.contiguous(source.valueBiases!);
|
|
69
|
-
} else if (this.quantization) {
|
|
70
|
-
const { bits, groupSize } = this.quantization;
|
|
71
|
-
const k = ops.quantize(this.keys, groupSize, bits), v = ops.quantize(this.values, groupSize, bits);
|
|
72
|
-
this.keys.dispose(); this.values.dispose();
|
|
73
|
-
this.keys = k.packed; this.keyScales = k.scales; this.keyBiases = k.biases;
|
|
74
|
-
this.values = v.packed; this.valueScales = v.scales; this.valueBiases = v.biases;
|
|
75
|
-
}
|
|
76
|
-
// LIFO free list, low indices first — deterministic layout for tests.
|
|
77
|
-
this.#free = source ? [...source.#free] : Array.from({ length: opts.numBlocks }, (_, i) => opts.numBlocks - 1 - i);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/** Independent ownership and allocation metadata over immutable MLX buffers.
|
|
81
|
-
* Functional writes detach storage while another snapshot retains it. */
|
|
82
|
-
clone(): BlockPool {
|
|
83
|
-
return new BlockPool({ numBlocks: this.numBlocks, blockSize: this.blockSize,
|
|
84
|
-
numKvHeads: this.keys.shape[1]!, headDim: this.headDim,
|
|
85
|
-
vHeadDim: this.vHeadDim, dtype: this.dtype, quantization: this.quantization }, this);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
restoreArrays(arrays: MlxArray[], occupied: readonly number[]): void {
|
|
89
|
-
disposeResources(this.arrays());
|
|
90
|
-
[this.keys, this.values] = [arrays[0]!, arrays[1]!];
|
|
91
|
-
[this.keyScales, this.keyBiases, this.valueScales, this.valueBiases] = arrays.slice(2);
|
|
92
|
-
const used = new Set(occupied);
|
|
93
|
-
this.#free = Array.from({ length: this.numBlocks }, (_, i) => this.numBlocks - 1 - i).filter(i => !used.has(i));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
grow(blocks: number): void {
|
|
97
|
-
if (blocks <= this.numBlocks) return;
|
|
98
|
-
const grow = (array: MlxArray) => {
|
|
99
|
-
using zeros = ops.zeros([blocks - this.numBlocks, ...array.shape.slice(1)], array.dtype);
|
|
100
|
-
const next = ops.concatAxis([array, zeros], 0); array.dispose(); return next;
|
|
101
|
-
};
|
|
102
|
-
this.keys = grow(this.keys); this.values = grow(this.values);
|
|
103
|
-
if (this.quantization) {
|
|
104
|
-
this.keyScales = grow(this.keyScales!); this.keyBiases = grow(this.keyBiases!);
|
|
105
|
-
this.valueScales = grow(this.valueScales!); this.valueBiases = grow(this.valueBiases!);
|
|
106
|
-
}
|
|
107
|
-
for (let i = blocks - 1; i >= this.numBlocks; i--) this.#free.push(i);
|
|
108
|
-
this.numBlocks = blocks;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
get freeBlocks(): number {
|
|
112
|
-
return this.#free.length;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
alloc(): number {
|
|
116
|
-
const idx = this.#free.pop();
|
|
117
|
-
if (idx === undefined) throw new PagedPoolExhausted(this.numBlocks);
|
|
118
|
-
return idx;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
free(physIdx: number): void {
|
|
122
|
-
this.#free.push(physIdx);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/** Write `k`/`v` ([1, H, l, D], l ≤ blockSize − within) into physical
|
|
126
|
-
* block `physIdx` starting at row `within`. Functional slice_update:
|
|
127
|
-
* the pool tensors are single-referenced here, so mlx donates the
|
|
128
|
-
* buffer and the write is in-place in the steady state. */
|
|
129
|
-
writeBlock(physIdx: number, k: MlxArray, v: MlxArray, within: number): void {
|
|
130
|
-
if (this.quantization) {
|
|
131
|
-
const { bits, groupSize } = this.quantization;
|
|
132
|
-
const kq = ops.quantize(k, groupSize, bits), vq = ops.quantize(v, groupSize, bits);
|
|
133
|
-
const replace = (target: MlxArray, input: MlxArray): MlxArray => {
|
|
134
|
-
const result = ops.sliceUpdate(target, input, [physIdx, 0, within, 0],
|
|
135
|
-
[physIdx + 1, input.shape[1]!, within + input.shape[2]!, input.shape[3]!]);
|
|
136
|
-
target.dispose(); return result;
|
|
137
|
-
};
|
|
138
|
-
try {
|
|
139
|
-
this.keys = replace(this.keys, kq.packed); this.keyScales = replace(this.keyScales!, kq.scales); this.keyBiases = replace(this.keyBiases!, kq.biases);
|
|
140
|
-
this.values = replace(this.values, vq.packed); this.valueScales = replace(this.valueScales!, vq.scales); this.valueBiases = replace(this.valueBiases!, vq.biases);
|
|
141
|
-
} finally { disposeResources([kq.packed, kq.scales, kq.biases, vq.packed, vq.scales, vq.biases]); }
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
const l = k.shape[2]!;
|
|
145
|
-
const [, H, , kD] = this.keys.shape as [number, number, number, number];
|
|
146
|
-
const vD = this.values.shape[3]!;
|
|
147
|
-
const k2 = ops.sliceUpdate(
|
|
148
|
-
this.keys, k, [physIdx, 0, within, 0], [physIdx + 1, H, within + l, kD]);
|
|
149
|
-
this.keys.dispose();
|
|
150
|
-
this.keys = k2;
|
|
151
|
-
const v2 = ops.sliceUpdate(
|
|
152
|
-
this.values, v, [physIdx, 0, within, 0], [physIdx + 1, H, within + l, vD]);
|
|
153
|
-
this.values.dispose();
|
|
154
|
-
this.values = v2;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/** Gather `blockTable`'s blocks in logical order into one contiguous
|
|
158
|
-
* [1, H, nb·blockSize, D] pair (the fetch copy). Caller owns both. */
|
|
159
|
-
gather(blockTable: number[]): [MlxArray, MlxArray] {
|
|
160
|
-
const idx = MlxArray.fromInt32(Int32Array.from(blockTable), [blockTable.length]);
|
|
161
|
-
const pick = (pool: MlxArray): MlxArray => {
|
|
162
|
-
const took = ops.takeAxis(pool, idx, 0); // [nb, H, bs, D]
|
|
163
|
-
const [nb, H, bs, D] = took.shape as [number, number, number, number];
|
|
164
|
-
const t = ops.transposeAxes(took, [1, 0, 2, 3]); // [H, nb, bs, D] (view)
|
|
165
|
-
took.dispose();
|
|
166
|
-
const out = ops.reshape(t, [1, H, nb * bs, D]); // materializes seq order
|
|
167
|
-
t.dispose();
|
|
168
|
-
return out;
|
|
169
|
-
};
|
|
170
|
-
const read = (data: MlxArray, scales?: MlxArray, biases?: MlxArray) => {
|
|
171
|
-
const packed = pick(data);
|
|
172
|
-
if (!this.quantization) return packed;
|
|
173
|
-
using owned = packed; using s = pick(scales!), b = pick(biases!);
|
|
174
|
-
return ops.dequantize(owned, s, b, { ...this.quantization, mode: "affine" });
|
|
175
|
-
};
|
|
176
|
-
const k = read(this.keys, this.keyScales, this.keyBiases);
|
|
177
|
-
const v = read(this.values, this.valueScales, this.valueBiases);
|
|
178
|
-
idx.dispose();
|
|
179
|
-
return [k, v];
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
arrays(): MlxArray[] {
|
|
183
|
-
return [this.keys, this.values, this.keyScales, this.keyBiases, this.valueScales, this.valueBiases].filter((a): a is MlxArray => !!a);
|
|
184
|
-
}
|
|
185
|
-
dispose(): void {
|
|
186
|
-
disposeResources([this.keyScales, this.keyBiases, this.valueScales, this.valueBiases].filter((a): a is MlxArray => !!a));
|
|
187
|
-
this.keys.dispose();
|
|
188
|
-
this.values.dispose();
|
|
189
|
-
this.#free = [];
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/** Cache implementation over a BlockPool. Same values as a plain KVCache
|
|
194
|
-
* at every step (parity-gated); only the physical arrangement differs.
|
|
195
|
-
* The pool allocates lazily on the first write (KVCache's lazy-alloc
|
|
196
|
-
* shape): head count / head dims / dtype come from the first k/v pair,
|
|
197
|
-
* so the wiring (maybePageKv) needs no per-model shape plumbing. */
|
|
198
|
-
export class PagedKVCache implements Cache {
|
|
199
|
-
/** Distinct storage kind; the row adapter preserves its block pools. */
|
|
200
|
-
signature(): string { return "kv:paged"; }
|
|
201
|
-
/** Matches KVCache.STEP: v1's growth granularity is a permutation of
|
|
202
|
-
* today's 256-token step into fixed reusable slots, not a new tuning
|
|
203
|
-
* axis (--paged-kv-block-size overrides for experiments). */
|
|
204
|
-
static readonly DEFAULT_BLOCK_SIZE = 256;
|
|
205
|
-
/** Compiled-decode trace adapters never wrap paged caches (see Cache);
|
|
206
|
-
* always unset here. */
|
|
207
|
-
readonly ropeOffsetArr?: MlxArray;
|
|
208
|
-
offset = 0;
|
|
209
|
-
/** Logical block order → physical pool slot. */
|
|
210
|
-
blockTable: number[] = [];
|
|
211
|
-
pool: BlockPool | null = null;
|
|
212
|
-
|
|
213
|
-
constructor(
|
|
214
|
-
/** Tokens this cache must be able to hold (prompt + maxTokens). */
|
|
215
|
-
readonly capacityTokens: number,
|
|
216
|
-
readonly blockSize: number,
|
|
217
|
-
readonly direct = runtimeFlag("MLX_BUN_PAGED_ATTN", false),
|
|
218
|
-
readonly quantization?: PagedQuantization,
|
|
219
|
-
) {}
|
|
220
|
-
|
|
221
|
-
clone(): PagedKVCache {
|
|
222
|
-
const copy = new PagedKVCache(this.capacityTokens, this.blockSize, this.direct, this.quantization);
|
|
223
|
-
copy.offset = this.offset;
|
|
224
|
-
copy.blockTable = [...this.blockTable];
|
|
225
|
-
copy.pool = this.pool?.clone() ?? null;
|
|
226
|
-
return copy;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
get #blockSize(): number {
|
|
230
|
-
return this.blockSize;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/** Blocks needed to hold `n` tokens. */
|
|
234
|
-
#blocksFor(n: number): number {
|
|
235
|
-
return Math.ceil(n / this.#blockSize);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
get attentionState(): this | undefined { return this.direct || this.quantization ? this : undefined; }
|
|
239
|
-
appendAndFetch(k: MlxArray, v: MlxArray): KvAttentionView {
|
|
240
|
-
this.append(k, v);
|
|
241
|
-
return pagedAttentionView(this.pool!, [...this.blockTable], this.offset, this.direct);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
updateAndFetch(k: MlxArray, v: MlxArray): [MlxArray, MlxArray] {
|
|
245
|
-
this.append(k, v);
|
|
246
|
-
const H = this.pool!.keys.shape[1]!, kD = this.pool!.headDim, vD = this.pool!.vHeadDim;
|
|
247
|
-
const [gk, gv] = this.pool!.gather(this.blockTable);
|
|
248
|
-
const keys = gk.slice([0, 0, 0, 0], [1, H, this.offset, kD]);
|
|
249
|
-
const values = gv.slice([0, 0, 0, 0], [1, H, this.offset, vD]);
|
|
250
|
-
gk.dispose(); gv.dispose();
|
|
251
|
-
return [keys, values];
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
append(k: MlxArray, v: MlxArray): void {
|
|
255
|
-
const L = k.shape[2]!;
|
|
256
|
-
const [, H, , kD] = k.shape as [number, number, number, number];
|
|
257
|
-
const vD = v.shape[3]!;
|
|
258
|
-
if (!this.pool)
|
|
259
|
-
this.pool = new BlockPool({
|
|
260
|
-
numBlocks: poolBlocksFor(this.capacityTokens, this.blockSize),
|
|
261
|
-
blockSize: this.blockSize,
|
|
262
|
-
numKvHeads: H,
|
|
263
|
-
headDim: kD,
|
|
264
|
-
vHeadDim: vD,
|
|
265
|
-
dtype: k.dtype, quantization: this.quantization,
|
|
266
|
-
});
|
|
267
|
-
// Write, splitting the incoming L along block boundaries. Blocks past
|
|
268
|
-
// the current tail allocate from the free list as they're reached.
|
|
269
|
-
let written = 0;
|
|
270
|
-
while (written < L) {
|
|
271
|
-
const pos = this.offset + written;
|
|
272
|
-
const bi = Math.floor(pos / this.#blockSize);
|
|
273
|
-
const within = pos % this.#blockSize;
|
|
274
|
-
while (this.blockTable.length <= bi) {
|
|
275
|
-
if (!this.pool.freeBlocks) this.pool.grow(Math.max(this.pool.numBlocks + 1, Math.ceil(this.pool.numBlocks * 1.5)));
|
|
276
|
-
this.blockTable.push(this.pool.alloc());
|
|
277
|
-
}
|
|
278
|
-
const l = Math.min(this.#blockSize - within, L - written);
|
|
279
|
-
// Full-range pieces skip the slice (fresh-view slice would be a
|
|
280
|
-
// gratuitous op); partial pieces slice the [written, written+l) rows.
|
|
281
|
-
if (l === L && written === 0) {
|
|
282
|
-
this.pool.writeBlock(this.blockTable[bi]!, k, v, within);
|
|
283
|
-
} else {
|
|
284
|
-
const kp = k.slice([0, 0, written, 0], [1, H, written + l, kD]);
|
|
285
|
-
const vp = v.slice([0, 0, written, 0], [1, H, written + l, vD]);
|
|
286
|
-
this.pool.writeBlock(this.blockTable[bi]!, kp, vp, within);
|
|
287
|
-
kp.dispose();
|
|
288
|
-
vp.dispose();
|
|
289
|
-
}
|
|
290
|
-
written += l;
|
|
291
|
-
}
|
|
292
|
-
this.offset += L;
|
|
293
|
-
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/** Same mask policy as KVCache.makeMask (it reads only offset). */
|
|
297
|
-
makeMask(N: number, windowSize: number | null): Mask {
|
|
298
|
-
if (N === 1) return { mode: "", arr: null };
|
|
299
|
-
if (windowSize === null) return { mode: "causal", arr: null };
|
|
300
|
-
if (this.offset === 0 && N <= windowSize) return { mode: "causal", arr: null };
|
|
301
|
-
return { mode: "array", arr: createCausalMask(N, this.offset, windowSize) };
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/** Owned planes materialized at prefill and immutable publication boundaries. */
|
|
305
|
-
state(): MlxArray[] {
|
|
306
|
-
return this.pool ? this.pool.arrays() : [];
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
isTrimmable(): boolean {
|
|
310
|
-
return true;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/** Rewind the last n tokens and return now-unoccupied tail blocks to
|
|
314
|
-
* the free list. Stale bytes past offset are never read (fetch slices
|
|
315
|
-
* to offset; writes cover exact ranges) — the KVCache padding
|
|
316
|
-
* invariant, block-shaped. */
|
|
317
|
-
trim(n: number): void {
|
|
318
|
-
this.offset = Math.max(0, this.offset - n);
|
|
319
|
-
const need = this.#blocksFor(this.offset);
|
|
320
|
-
while (this.blockTable.length > need) this.pool!.free(this.blockTable.pop()!);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
dispose(): void {
|
|
324
|
-
// The cache owns its pool in v1 (one sequence per pool).
|
|
325
|
-
this.pool?.dispose();
|
|
326
|
-
this.pool = null;
|
|
327
|
-
this.blockTable = [];
|
|
328
|
-
this.offset = 0;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/** Size a pool for one request: capacity tokens rounded up to whole
|
|
333
|
-
* blocks. Exported for the wiring in generate.ts (maybePageKv). */
|
|
334
|
-
export function poolBlocksFor(capacityTokens: number, blockSize: number): number {
|
|
335
|
-
return Math.max(1, Math.ceil(capacityTokens / blockSize));
|
|
336
|
-
}
|
package/src/library.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/** CPU-safe high-level entry. Native modules load only after bootstrap. */
|
|
2
|
-
export { createInferenceEngine } from "./engine/engine";
|
|
3
|
-
export { CancellationSource } from "./engine/cancellation";
|
|
4
|
-
export { createCompletionClient, createDirectHost } from "./client";
|
|
5
|
-
export type * from "./contracts/generation";
|
|
6
|
-
export type * from "./contracts/completion";
|
|
7
|
-
export type * from "./contracts/host";
|
|
8
|
-
|
|
9
|
-
/** Install/locate the native pack before importing the compatibility API. */
|
|
10
|
-
export async function initializeMlx(): Promise<typeof import("./index")> {
|
|
11
|
-
const { ensureNativeRuntime } = await import("./native-pack");
|
|
12
|
-
await ensureNativeRuntime();
|
|
13
|
-
return import("./index");
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/** Own one local worker. Model resolution and native initialization remain in
|
|
17
|
-
* the existing CLI; importing this module does not start it or download weights. */
|
|
18
|
-
export async function openIsolatedHost(model: string, options: {
|
|
19
|
-
arguments?: readonly string[];
|
|
20
|
-
command?: readonly string[];
|
|
21
|
-
readyTimeoutMs?: number;
|
|
22
|
-
} = {}): Promise<import("./contracts/host").EngineHost<Request, Response>> {
|
|
23
|
-
const { EngineChild } = await import("./serve/isolate");
|
|
24
|
-
const { tmpdir } = await import("node:os");
|
|
25
|
-
const { join } = await import("node:path");
|
|
26
|
-
const { fileURLToPath } = await import("node:url");
|
|
27
|
-
const source = fileURLToPath(new URL("./cli.ts", import.meta.url));
|
|
28
|
-
if (!options.command && source.includes("$bunfs"))
|
|
29
|
-
throw new Error("a compiled library consumer must supply the mlx-bun executable as command");
|
|
30
|
-
const command = options.command ?? [process.execPath, source];
|
|
31
|
-
if (!command.length) throw new Error("engine command must not be empty");
|
|
32
|
-
const socketPath = join(tmpdir(), `mlx-bun-library-${crypto.randomUUID()}.sock`);
|
|
33
|
-
const host = new EngineChild({
|
|
34
|
-
argv: [...command,
|
|
35
|
-
"serve", "--model", model, ...options.arguments ?? [], "--unix", socketPath, "--no-open"],
|
|
36
|
-
socketPath, readyTimeoutMs: options.readyTimeoutMs,
|
|
37
|
-
});
|
|
38
|
-
try { await host.ready; return host; }
|
|
39
|
-
catch (error) { await host.close(); throw error; }
|
|
40
|
-
}
|