mlx-bun 0.4.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 +1453 -88
- 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 +10 -8
- 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 +12 -10
- package/src/{serve → server}/chat-stage.ts +27 -22
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +42 -42
- 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 +42 -83
- package/src/server/generated-token-history.ts +57 -0
- 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 +8 -8
- package/src/{serve → server}/request-prep.ts +82 -68
- 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 -94
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- 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/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -1841
- package/docs/design/decode-speed-program.md +0 -2349
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -705
- package/docs/design/kv-cache.md +0 -824
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -1990
- package/docs/design/turboquant.md +0 -2212
- package/docs/design/unified-engine-frontier-plan.md +0 -1880
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -594
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/release-notes-v0.4.0.md +0 -45
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3613
- package/docs/reference/cli.md +0 -585
- package/docs/reference/distribution.md +0 -355
- package/docs/reference/environment.md +0 -398
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -674
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -334
- package/docs/reference/server-api.md +0 -1775
- package/docs/reference/server-config.md +0 -846
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/conformer.ts +0 -647
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/transcode.ts +0 -67
- 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 -108
- package/src/backends/mlx/batch-group.ts +0 -1790
- 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 -106
- 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/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -45
- 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 -130
- 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 -133
- 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/model-prompt.ts +0 -164
- package/src/backends/mlx/model-serving.ts +0 -79
- package/src/backends/mlx/prefill-cohort.ts +0 -89
- package/src/backends/mlx/prefill-rows.ts +0 -200
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -41
- package/src/backends/mlx/rollback.ts +0 -89
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -242
- package/src/backends/mlx/speculative-group.ts +0 -359
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -114
- 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 -165
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3168
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -60
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -259
- package/src/contracts/prefix-cache.ts +0 -23
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -45
- 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 -53
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -72
- 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 -452
- 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 -1346
- package/src/grammar.ts +0 -591
- 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 -39
- 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 -257
- package/src/kv-store.ts +0 -1099
- package/src/lab/README.md +0 -18
- 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-kv-rows.ts +0 -83
- package/src/lab/paged-kv/paged-kv.ts +0 -270
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -49
- 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 -388
- 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 -512
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/ops.ts +0 -1021
- 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 -93
- 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 -55
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -189
- package/src/model/fingerprint.ts +0 -33
- 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 -2351
- package/src/model/gemma4.ts +0 -1315
- 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 -67
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -443
- 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 -252
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -819
- 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 -102
- 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 -83
- 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/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native-pack.ts +0 -162
- 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 -1932
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -460
- 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 -81
- package/src/safetensors.ts +0 -158
- package/src/sampler.ts +0 -1011
- 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/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 -496
- 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 -43
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -147
- 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/server.ts +0 -1314
- package/src/spec/assistant-rows.ts +0 -92
- 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 -317
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -204
- 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 -219
- package/src/spec/qwen-mtp-source.ts +0 -383
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -585
- package/src/spec/source.ts +0 -215
- package/src/spec/two-model-rows.ts +0 -61
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -372
- package/src/ssd-durability.ts +0 -211
- 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 -168
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -373
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -196
- package/src/vision/qwen3vl-tower.ts +0 -555
- package/src/vision/siglip.ts +0 -599
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2143
- package/src/web/app.js +0 -5703
- 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 -1057
- package/src/web/src/composer.ts +0 -959
- 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/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/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/model/qwen3-delta.ts
DELETED
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
// Gated DeltaNet recurrence for Qwen3.5 linear-attention layers.
|
|
2
|
-
//
|
|
3
|
-
// Port target: mlx_lm.models.gated_delta (compute_g + the `gated_delta_step`
|
|
4
|
-
// Metal kernel) and the recurrent-state cache. mlx-lm runs the GPU kernel by
|
|
5
|
-
// default (use_kernel = not training), and its float accumulation / simd_sum
|
|
6
|
-
// reduction order differ from the pure-ops fallback — so BIT-EXACT parity with
|
|
7
|
-
// mlx-lm requires the SAME kernel, dispatched with the SAME grid/threadgroup.
|
|
8
|
-
// We port the non-vectorized variant (g.ndim == 3). Padded prefill selects
|
|
9
|
-
// the oracle masked specialization; unpadded execution retains its kernel.
|
|
10
|
-
//
|
|
11
|
-
// Numerics (must match the reference dtypes exactly — mlx infers the kernel's
|
|
12
|
-
// pointer element types from the input arrays):
|
|
13
|
-
// q, k bf16 [B, T, Hk, Dk] (after inv_scale * rms_norm(., None))
|
|
14
|
-
// v bf16 [B, T, Hv, Dv]
|
|
15
|
-
// g f32 [B, T, Hv] (= exp(-exp(A_log_f32) * softplus(a+dt_bias)))
|
|
16
|
-
// beta bf16 [B, T, Hv] (= sigmoid(b))
|
|
17
|
-
// state_in f32 [B, Hv, Dv, Dk]
|
|
18
|
-
// y (out) bf16 [B, T, Hv, Dv] (InT)
|
|
19
|
-
// state_out f32 [B, Hv, Dv, Dk] (StT)
|
|
20
|
-
// GQA is handled inside the kernel (hk_idx = hv_idx / (Hv/Hk)); q/k stay at Hk.
|
|
21
|
-
|
|
22
|
-
import { MlxArray } from "../mlx/array";
|
|
23
|
-
import { materializeCopy } from "../mlx/materialize";
|
|
24
|
-
import { Dtype } from "../mlx/ffi";
|
|
25
|
-
import { MetalKernel } from "../mlx/metal-kernel";
|
|
26
|
-
import { CompiledFunction } from "../mlx/compile";
|
|
27
|
-
import * as ops from "../mlx/ops";
|
|
28
|
-
import type { SsmPrefillPadding } from "./ssm-prefill-padding";
|
|
29
|
-
import type { Cache, Mask } from "./gemma4-base";
|
|
30
|
-
|
|
31
|
-
// Verbatim body of mlx-lm's gated_delta_step (has_mask=False, vectorized=False),
|
|
32
|
-
// with the only change being that the time count `T` arrives as a 1-element
|
|
33
|
-
// int32 input (`Tin`) and is read once — numerically identical to the
|
|
34
|
-
// reference (T only drives loop bounds and integer offsets), but avoids a
|
|
35
|
-
// kernel recompile per distinct sequence length.
|
|
36
|
-
const SOURCE = String.raw`
|
|
37
|
-
const int T = Tin[0];
|
|
38
|
-
auto n = thread_position_in_grid.z;
|
|
39
|
-
auto b_idx = n / Hv;
|
|
40
|
-
auto hv_idx = n % Hv;
|
|
41
|
-
auto hk_idx = hv_idx / (Hv / Hk);
|
|
42
|
-
constexpr int n_per_t = Dk / 32;
|
|
43
|
-
|
|
44
|
-
// q, k: [B, T, Hk, Dk]
|
|
45
|
-
auto q_ = q + b_idx * T * Hk * Dk + hk_idx * Dk;
|
|
46
|
-
auto k_ = k + b_idx * T * Hk * Dk + hk_idx * Dk;
|
|
47
|
-
|
|
48
|
-
// v, y: [B, T, Hv, Dv]
|
|
49
|
-
auto v_ = v + b_idx * T * Hv * Dv + hv_idx * Dv;
|
|
50
|
-
y += b_idx * T * Hv * Dv + hv_idx * Dv;
|
|
51
|
-
|
|
52
|
-
auto dk_idx = thread_position_in_threadgroup.x;
|
|
53
|
-
auto dv_idx = thread_position_in_grid.y;
|
|
54
|
-
|
|
55
|
-
// state_in, state_out: [B, Hv, Dv, Dk]
|
|
56
|
-
auto i_state = state_in + (n * Dv + dv_idx) * Dk;
|
|
57
|
-
auto o_state = state_out + (n * Dv + dv_idx) * Dk;
|
|
58
|
-
|
|
59
|
-
float state[n_per_t];
|
|
60
|
-
for (int i = 0; i < n_per_t; ++i) {
|
|
61
|
-
auto s_idx = n_per_t * dk_idx + i;
|
|
62
|
-
state[i] = static_cast<float>(i_state[s_idx]);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// g: [B, T, Hv]
|
|
66
|
-
auto g_ = g + b_idx * T * Hv;
|
|
67
|
-
auto beta_ = beta + b_idx * T * Hv;
|
|
68
|
-
|
|
69
|
-
for (int t = 0; t < T; ++t) {
|
|
70
|
-
if (true) {
|
|
71
|
-
float kv_mem = 0.0f;
|
|
72
|
-
for (int i = 0; i < n_per_t; ++i) {
|
|
73
|
-
auto s_idx = n_per_t * dk_idx + i;
|
|
74
|
-
state[i] = state[i] * g_[hv_idx];
|
|
75
|
-
kv_mem += state[i] * k_[s_idx];
|
|
76
|
-
}
|
|
77
|
-
kv_mem = simd_sum(kv_mem);
|
|
78
|
-
|
|
79
|
-
auto delta = (v_[dv_idx] - kv_mem) * beta_[hv_idx];
|
|
80
|
-
|
|
81
|
-
float out = 0.0f;
|
|
82
|
-
for (int i = 0; i < n_per_t; ++i) {
|
|
83
|
-
auto s_idx = n_per_t * dk_idx + i;
|
|
84
|
-
state[i] = state[i] + k_[s_idx] * delta;
|
|
85
|
-
out += state[i] * q_[s_idx];
|
|
86
|
-
}
|
|
87
|
-
out = simd_sum(out);
|
|
88
|
-
if (thread_index_in_simdgroup == 0) {
|
|
89
|
-
y[dv_idx] = static_cast<InT>(out);
|
|
90
|
-
}
|
|
91
|
-
} else {
|
|
92
|
-
y[dv_idx] = static_cast<InT>(0);
|
|
93
|
-
}
|
|
94
|
-
// Increment data pointers to next time step
|
|
95
|
-
q_ += Hk * Dk;
|
|
96
|
-
k_ += Hk * Dk;
|
|
97
|
-
v_ += Hv * Dv;
|
|
98
|
-
y += Hv * Dv;
|
|
99
|
-
g_ += Hv;
|
|
100
|
-
beta_ += Hv;
|
|
101
|
-
}
|
|
102
|
-
for (int i = 0; i < n_per_t; ++i) {
|
|
103
|
-
auto s_idx = n_per_t * dk_idx + i;
|
|
104
|
-
o_state[s_idx] = static_cast<StT>(state[i]);
|
|
105
|
-
}
|
|
106
|
-
`;
|
|
107
|
-
|
|
108
|
-
let kernel: MetalKernel | null = null;
|
|
109
|
-
let maskedKernel: MetalKernel | null = null;
|
|
110
|
-
function getKernel(masked = false): MetalKernel {
|
|
111
|
-
if (masked) return maskedKernel ??= new MetalKernel({
|
|
112
|
-
name: "gated_delta_step_mask",
|
|
113
|
-
inputNames: ["q", "k", "v", "g", "beta", "state_in", "Tin", "mask"],
|
|
114
|
-
outputNames: ["y", "state_out"],
|
|
115
|
-
source: SOURCE.replace("if (true)", "if (mask[b_idx * T + t])"),
|
|
116
|
-
ensureRowContiguous: true,
|
|
117
|
-
});
|
|
118
|
-
if (!kernel)
|
|
119
|
-
kernel = new MetalKernel({
|
|
120
|
-
name: "gated_delta_step",
|
|
121
|
-
inputNames: ["q", "k", "v", "g", "beta", "state_in", "Tin"],
|
|
122
|
-
outputNames: ["y", "state_out"],
|
|
123
|
-
source: SOURCE,
|
|
124
|
-
ensureRowContiguous: true,
|
|
125
|
-
});
|
|
126
|
-
return kernel;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/** compute_g: exp(-exp(A_log_f32) * softplus(a + dt_bias)). Output is f32
|
|
130
|
-
* (the f32 exp(A_log) promotes the bf16 softplus term) — the kernel reads g
|
|
131
|
-
* as float, so this dtype is load-bearing. */
|
|
132
|
-
let _computeGFn: CompiledFunction | null = null;
|
|
133
|
-
export function computeG(aLog: MlxArray, a: MlxArray, dtBias: MlxArray): MlxArray {
|
|
134
|
-
// mlx-lm gated_delta.py: `@partial(mx.compile, shapeless=True) compute_g` — the
|
|
135
|
-
// WHOLE chain (exp/neg/softplus/mul/exp) is ONE fused kernel there, not five
|
|
136
|
-
// separate dispatches. Traced once, replayed.
|
|
137
|
-
if (!_computeGFn) {
|
|
138
|
-
_computeGFn = new CompiledFunction((inp) => {
|
|
139
|
-
const aL = inp[0]!, aa = inp[1]!, dt = inp[2]!;
|
|
140
|
-
const aLogF = aL.astype(Dtype.float32);
|
|
141
|
-
const expA = ops.exp(aLogF); aLogF.dispose();
|
|
142
|
-
const negExpA = ops.neg(expA); expA.dispose();
|
|
143
|
-
const adt = ops.add(aa, dt);
|
|
144
|
-
// mlx nn.softplus(x) = mx.logaddexp(x, 0), where 0 is a weak Python int
|
|
145
|
-
// (no cast node). ops.softplus builds the 0 via scalarLike (fromFloat32 →
|
|
146
|
-
// f32→bf16 AsType). Build the 0 at adt's dtype from raw bytes so there is
|
|
147
|
-
// no cast — matching mlx's graph exactly.
|
|
148
|
-
const zbytes = adt.dtype === Dtype.float32
|
|
149
|
-
? new Uint8Array([0, 0, 0, 0])
|
|
150
|
-
: new Uint8Array([0, 0]);
|
|
151
|
-
const zero = MlxArray.fromBytesCopy(zbytes, [], adt.dtype);
|
|
152
|
-
const sp = ops.logaddexp(adt, zero); adt.dispose(); zero.dispose();
|
|
153
|
-
const prod = ops.mul(negExpA, sp); negExpA.dispose(); sp.dispose();
|
|
154
|
-
const g = ops.exp(prod); prod.dispose();
|
|
155
|
-
return [g];
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
return _computeGFn.apply([aLog, a, dtBias])[0]!;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/** gated_delta_update (use_kernel path): returns [y, newState].
|
|
162
|
-
* q, k: [B, S, Hk, Dk] bf16 v: [B, S, Hv, Dv] bf16
|
|
163
|
-
* a, b: [B, S, Hv] bf16 aLog, dtBias: [Hv]
|
|
164
|
-
* state: [B, Hv, Dv, Dk] f32 (or null → zeros) */
|
|
165
|
-
export function gatedDeltaUpdate(
|
|
166
|
-
q: MlxArray, k: MlxArray, v: MlxArray, a: MlxArray, b: MlxArray,
|
|
167
|
-
aLog: MlxArray, dtBias: MlxArray, state: MlxArray | null, mask: MlxArray | null = null,
|
|
168
|
-
): [MlxArray, MlxArray] {
|
|
169
|
-
const [B, , Hk, Dk] = q.shape as [number, number, number, number];
|
|
170
|
-
const [, , Hv, Dv] = v.shape as [number, number, number, number];
|
|
171
|
-
|
|
172
|
-
const beta = ops.sigmoid(b); // bf16
|
|
173
|
-
const g = computeG(aLog, a, dtBias); // f32
|
|
174
|
-
|
|
175
|
-
let stateIn = state;
|
|
176
|
-
let ownState = false;
|
|
177
|
-
if (!stateIn) {
|
|
178
|
-
stateIn = ops.zeros([B, Hv, Dv, Dk], Dtype.float32);
|
|
179
|
-
ownState = true;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const T = q.shape[1]!;
|
|
183
|
-
const tArr = MlxArray.fromInt32(new Int32Array([T]), [1]);
|
|
184
|
-
const inputs = [q, k, v, g, beta, stateIn, tArr];
|
|
185
|
-
if (mask) inputs.push(mask);
|
|
186
|
-
const [y, stateOut] = getKernel(mask !== null).apply(inputs, {
|
|
187
|
-
outputs: [
|
|
188
|
-
{ shape: [B, T, Hv, Dv], dtype: q.dtype },
|
|
189
|
-
{ shape: [B, Hv, Dv, Dk], dtype: Dtype.float32 },
|
|
190
|
-
],
|
|
191
|
-
grid: [32, Dv, B * Hv],
|
|
192
|
-
threadGroup: [32, 4, 1],
|
|
193
|
-
templateInts: { Dk, Dv, Hk, Hv },
|
|
194
|
-
templateDtypes: { InT: q.dtype, StT: Dtype.float32 },
|
|
195
|
-
});
|
|
196
|
-
beta.dispose();
|
|
197
|
-
g.dispose();
|
|
198
|
-
tArr.dispose();
|
|
199
|
-
if (ownState) stateIn.dispose();
|
|
200
|
-
return [y!, stateOut!];
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/** Recurrent cache for a gated-DeltaNet layer — port of mlx-lm
|
|
204
|
-
* cache.ArraysCache(size=2): slot 0 = causal-conv state [B, K-1, conv_dim],
|
|
205
|
-
* slot 1 = recurrent state [B, Hv, Dv, Dk] f32. The linear-attn layer reads
|
|
206
|
-
* and writes these slots directly; `advance(N)` only tracks token count for
|
|
207
|
-
* B=1 single-stream (lengths / left_padding are batched-decode concerns).
|
|
208
|
-
* Not a KVCache, so maybeQuantizeKv skips it. */
|
|
209
|
-
/** One armed speculative verify round on an SSMCache: the pre-round state
|
|
210
|
-
* snapshot (retained refs — MLX arrays are immutable, so this is free) plus
|
|
211
|
-
* the layer's recorded position-local kernel inputs, which make a partial
|
|
212
|
-
* reject bit-exactly replayable: state after the first `keep` window tokens
|
|
213
|
-
* is the same arithmetic prefix whether or not the rejected tail was ever
|
|
214
|
-
* processed. The replay is installed by the OWNING layer (it needs the conv
|
|
215
|
-
* weight / A_log / dt_bias); the cache only stores and frees. */
|
|
216
|
-
export interface SsmSpecRound {
|
|
217
|
-
/** True from specRoundBegin() until the layer's forward records. */
|
|
218
|
-
armed: boolean;
|
|
219
|
-
prevConv: MlxArray | null;
|
|
220
|
-
prevRecurrent: MlxArray | null;
|
|
221
|
-
prevOffset: number;
|
|
222
|
-
prevOffsets: number[] | null;
|
|
223
|
-
/** Pre-conv in_proj output [B,S,convDim] — position-local. */
|
|
224
|
-
qkv: MlxArray | null;
|
|
225
|
-
/** Gate/beta projections [B,S,Hv] — position-local. */
|
|
226
|
-
a: MlxArray | null;
|
|
227
|
-
b: MlxArray | null;
|
|
228
|
-
/** Window length S of the recorded verify forward. */
|
|
229
|
-
S: number;
|
|
230
|
-
/** Layer-bound prefix replay: called AFTER the snapshot is restored onto
|
|
231
|
-
* the cache; advances conv/recurrent/offset by `keep` tokens. */
|
|
232
|
-
replay: ((cache: SSMCache, keep: number | readonly number[]) => void) | null;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export class SSMCache implements Cache {
|
|
236
|
-
conv: MlxArray | null = null;
|
|
237
|
-
recurrent: MlxArray | null = null;
|
|
238
|
-
offset = 0;
|
|
239
|
-
prefillPadding: SsmPrefillPadding | null = null;
|
|
240
|
-
/** Live speculative verify round; null outside a verify transaction. */
|
|
241
|
-
specRound: SsmSpecRound | null = null;
|
|
242
|
-
/** Per-row token coverage (batch lane only; null on serial B=1 caches,
|
|
243
|
-
* where `offset` IS the row's count). mlx-lm's ArraysCache tracks no
|
|
244
|
-
* offset at all (cache.py:594-722) — per-sequence coverage is the
|
|
245
|
-
* server's bookkeeping; ours lives here because prompt-cache put()
|
|
246
|
-
* keys on EXACT coverage (#putOrDispose offset === tokens.length) and
|
|
247
|
-
* merged rows carry different totals. Seeded by mergeRows, advanced in
|
|
248
|
-
* lockstep by advance(), row-filtered by filter(). */
|
|
249
|
-
offsets: number[] | null = null;
|
|
250
|
-
|
|
251
|
-
signature(): string { return "ssm"; }
|
|
252
|
-
bytesPerToken(): number { return 0; }
|
|
253
|
-
get batchSize(): number { return this.offsets?.length ?? 1; }
|
|
254
|
-
|
|
255
|
-
/** Row `i`'s own token coverage (per-row when batched, `offset` serial). */
|
|
256
|
-
rowOffset(i: number): number {
|
|
257
|
-
return this.offsets ? this.offsets[i]! : this.offset;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/** Linear-attn layers don't go through the KV update path. */
|
|
261
|
-
updateAndFetch(): [MlxArray, MlxArray] {
|
|
262
|
-
throw new Error("SSMCache has no KV updateAndFetch (gated-DeltaNet layer)");
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
makeMask(N: number, _windowSize: number | null): Mask {
|
|
266
|
-
const arr = this.prefillPadding?.makeMask(N) ?? null;
|
|
267
|
-
return { mode: arr ? "array" : "", arr };
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
advance(n: number): void {
|
|
271
|
-
if (this.prefillPadding) { this.advanceRows(this.prefillPadding.advance(n)); return; }
|
|
272
|
-
this.offset += n;
|
|
273
|
-
// Batched rows step together (one forward advances every row), so the
|
|
274
|
-
// per-row counts move in lockstep; they DIFFER only in their merge-time
|
|
275
|
-
// seeds (each row's prompt length).
|
|
276
|
-
if (this.offsets) for (let i = 0; i < this.offsets.length; i++) this.offsets[i]! += n;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/** Methods may retain different verified prefixes for each active request. */
|
|
280
|
-
advanceRows(counts: readonly number[]): void {
|
|
281
|
-
if (!this.offsets) { this.offset += counts[0]!; return; }
|
|
282
|
-
for (let row = 0; row < this.offsets.length; row++) this.offsets[row]! += counts[row]!;
|
|
283
|
-
this.offset = Math.max(...this.offsets);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
state(): MlxArray[] {
|
|
287
|
-
const out: MlxArray[] = [];
|
|
288
|
-
if (this.conv) out.push(this.conv);
|
|
289
|
-
if (this.recurrent) out.push(this.recurrent);
|
|
290
|
-
return out;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
isTrimmable(): boolean {
|
|
294
|
-
return false; // recurrent state can't be trimmed per token — see specRound*
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
trim(_n: number): void {
|
|
298
|
-
throw new Error("SSMCache is not trimmable");
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// --- speculative verify-round support -----------------------------------
|
|
302
|
-
// The serve loop arms a round before the verify forward and resolves it
|
|
303
|
-
// after the accept walk. The layer's forward, seeing an armed round, hands
|
|
304
|
-
// its replaced state slots to the round instead of disposing them, records
|
|
305
|
-
// qkv/a/b, and installs the replay. Cache/interface contract:
|
|
306
|
-
// rollback(keep) restores the snapshot then replays `keep` window tokens
|
|
307
|
-
// bit-exactly; commit frees the snapshot + recordings.
|
|
308
|
-
|
|
309
|
-
specRoundBegin(): void {
|
|
310
|
-
this.#dropSpecRound(); // defensive: a mid-round throw left a stale round
|
|
311
|
-
this.specRound = {
|
|
312
|
-
armed: true,
|
|
313
|
-
prevConv: null,
|
|
314
|
-
prevRecurrent: null,
|
|
315
|
-
prevOffset: this.offset,
|
|
316
|
-
prevOffsets: this.offsets ? [...this.offsets] : null,
|
|
317
|
-
qkv: null,
|
|
318
|
-
a: null,
|
|
319
|
-
b: null,
|
|
320
|
-
S: 0,
|
|
321
|
-
replay: null,
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
specRoundCommit(): void {
|
|
326
|
-
this.#dropSpecRound();
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
specRoundRollback(keep: number | readonly number[]): void {
|
|
330
|
-
const r = this.specRound;
|
|
331
|
-
if (!r) throw new Error("SSMCache.specRoundRollback without an armed round");
|
|
332
|
-
if (r.armed)
|
|
333
|
-
throw new Error("SSMCache.specRoundRollback before the verify forward recorded");
|
|
334
|
-
if (typeof keep === "number" ? keep < 0 || keep > r.S : keep.some(count => count < 0 || count > r.S))
|
|
335
|
-
throw new Error(`SSMCache.specRoundRollback keep=${keep} outside window S=${r.S}`);
|
|
336
|
-
// Restore the pre-round snapshot (ownership moves back to the cache).
|
|
337
|
-
this.conv?.dispose();
|
|
338
|
-
this.recurrent?.dispose();
|
|
339
|
-
this.conv = r.prevConv;
|
|
340
|
-
this.recurrent = r.prevRecurrent;
|
|
341
|
-
r.prevConv = null;
|
|
342
|
-
r.prevRecurrent = null;
|
|
343
|
-
this.offset = r.prevOffset;
|
|
344
|
-
this.offsets = r.prevOffsets;
|
|
345
|
-
if (typeof keep === "number" ? keep > 0 : keep.some(count => count > 0)) {
|
|
346
|
-
if (!r.replay) throw new Error("SSMCache.specRoundRollback with no recorded replay");
|
|
347
|
-
r.replay(this, keep); // advances conv/recurrent/offset by `keep`
|
|
348
|
-
}
|
|
349
|
-
this.#dropSpecRound();
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
#dropSpecRound(): void {
|
|
353
|
-
const r = this.specRound;
|
|
354
|
-
if (!r) return;
|
|
355
|
-
r.prevConv?.dispose();
|
|
356
|
-
r.prevRecurrent?.dispose();
|
|
357
|
-
r.qkv?.dispose();
|
|
358
|
-
r.a?.dispose();
|
|
359
|
-
r.b?.dispose();
|
|
360
|
-
this.specRound = null;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
dispose(): void {
|
|
364
|
-
this.#dropSpecRound();
|
|
365
|
-
this.conv?.dispose();
|
|
366
|
-
this.recurrent?.dispose();
|
|
367
|
-
this.conv = null;
|
|
368
|
-
this.recurrent = null;
|
|
369
|
-
this.prefillPadding = null;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
// --- batch-lane dynamic-B ops (BatchScheduler only) ----------------------
|
|
373
|
-
// Both state slots are plain [B, ...] tensors with no temporal axis and no
|
|
374
|
-
// left-padding, so the batched twins of mergeKVRows/filterKVRows collapse
|
|
375
|
-
// to B-axis concat/take. `offset` is bookkeeping only for SSM layers (RoPE
|
|
376
|
-
// reads the FULL-attention caches; the linear-attn forward never reads it),
|
|
377
|
-
// so merged rows carrying different token counts share the max; the exact
|
|
378
|
-
// per-row counts live in `offsets` (extraction's coverage key).
|
|
379
|
-
|
|
380
|
-
/** Merge a fully-prefilled solo row into a running batched cache (`prev`
|
|
381
|
-
* null ⇒ the solo row becomes the batch). The returned cache owns fresh
|
|
382
|
-
* arrays — or, when there is nothing to concat, arrays STOLEN from `solo`
|
|
383
|
-
* (nulled there so the scheduler's unconditional dispose of the solo
|
|
384
|
-
* caches stays safe). `prev`/`solo` disposal remains the caller's job. */
|
|
385
|
-
static mergeRows(prev: SSMCache | null, solo: SSMCache): SSMCache {
|
|
386
|
-
if (!solo.conv || !solo.recurrent)
|
|
387
|
-
throw new Error("SSMCache.mergeRows: solo row has no state (prefill first)");
|
|
388
|
-
const out = new SSMCache();
|
|
389
|
-
if (prev) {
|
|
390
|
-
if (!prev.conv || !prev.recurrent)
|
|
391
|
-
throw new Error("SSMCache.mergeRows: batched cache has no state");
|
|
392
|
-
out.conv = ops.concatAxis([prev.conv, solo.conv], 0);
|
|
393
|
-
out.recurrent = ops.concatAxis([prev.recurrent, solo.recurrent], 0);
|
|
394
|
-
} else {
|
|
395
|
-
out.conv = solo.conv;
|
|
396
|
-
out.recurrent = solo.recurrent;
|
|
397
|
-
solo.conv = null;
|
|
398
|
-
solo.recurrent = null;
|
|
399
|
-
}
|
|
400
|
-
out.offset = Math.max(prev?.offset ?? 0, solo.offset);
|
|
401
|
-
// Seed per-row coverage: an adopted serial `prev` (offsets null) is one
|
|
402
|
-
// row whose exact count is its scalar offset.
|
|
403
|
-
out.offsets = [...(prev ? prev.offsets ?? [prev.offset] : []), solo.offset];
|
|
404
|
-
return out;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/** Evict rows not in `keep` (ascending row indices), in place. */
|
|
408
|
-
filter(keep: number[]): void {
|
|
409
|
-
if (this.conv && this.recurrent) {
|
|
410
|
-
const idx = ops.fromInt32(keep, [keep.length]);
|
|
411
|
-
const conv = ops.takeAxis(this.conv, idx, 0);
|
|
412
|
-
const recurrent = ops.takeAxis(this.recurrent, idx, 0);
|
|
413
|
-
idx.dispose();
|
|
414
|
-
this.conv.dispose();
|
|
415
|
-
this.recurrent.dispose();
|
|
416
|
-
this.conv = conv;
|
|
417
|
-
this.recurrent = recurrent;
|
|
418
|
-
}
|
|
419
|
-
this.prefillPadding?.filter(keep);
|
|
420
|
-
if (this.offsets) {
|
|
421
|
-
this.offsets = keep.map((i) => this.offsets![i]!);
|
|
422
|
-
this.offset = Math.max(0, ...this.offsets);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
filterRows(keep: readonly number[]): void { this.filter([...keep]); }
|
|
427
|
-
|
|
428
|
-
/** Row `i` as a fresh SERIAL cache — port of mlx-lm ArraysCache.extract
|
|
429
|
-
* (cache.py:673-676: `cache.cache = [c[idx : idx + 1] for c in self.cache]`,
|
|
430
|
-
* a B-axis slice of every state slot). A proper subset gets compact storage
|
|
431
|
-
* so retaining one row does not pin the other rows. A singleton retains an
|
|
432
|
-
* independent handle over its complete allocation. Offset =
|
|
433
|
-
* the row's OWN coverage, not the shared max. */
|
|
434
|
-
extractRow(i: number): SSMCache {
|
|
435
|
-
if (!this.conv || !this.recurrent)
|
|
436
|
-
throw new Error("SSMCache.extractRow: empty cache");
|
|
437
|
-
const cut = (a: MlxArray): MlxArray => {
|
|
438
|
-
const lo = a.shape.map(() => 0);
|
|
439
|
-
lo[0] = i;
|
|
440
|
-
const hi = [...a.shape];
|
|
441
|
-
hi[0] = i + 1;
|
|
442
|
-
using view = a.slice(lo, hi);
|
|
443
|
-
return a.shape[0] === 1 ? ops.contiguous(view) : materializeCopy(view);
|
|
444
|
-
};
|
|
445
|
-
const out = new SSMCache();
|
|
446
|
-
out.conv = cut(this.conv);
|
|
447
|
-
out.recurrent = cut(this.recurrent);
|
|
448
|
-
out.offset = this.rowOffset(i);
|
|
449
|
-
return out;
|
|
450
|
-
}
|
|
451
|
-
}
|