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
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import type { BatchableCache, Cache } from "../../model/gemma4-base";
|
|
2
|
-
import type { MlxArray } from "../../mlx/array";
|
|
3
|
-
import * as ops from "../../mlx/ops";
|
|
4
|
-
import { clearCache } from "../../mlx/ffi";
|
|
5
|
-
import type { PrefillStep } from "../../inference/prefill";
|
|
6
|
-
import { cloneKvCaches, type CacheCodecProvider } from "../../kv-store";
|
|
7
|
-
import { disposeResources, cleanupFailure } from "../../engine/resources";
|
|
8
|
-
import type { MlxGroupPreparation, Row } from "./batch-group";
|
|
9
|
-
import { evalCacheState } from "./prefill";
|
|
10
|
-
import { prefillCacheLayout } from "./cache-layout";
|
|
11
|
-
import { MlxStateRows } from "./state-rows";
|
|
12
|
-
import type { KvMaintenance } from "./kv-maintenance";
|
|
13
|
-
|
|
14
|
-
export interface MlxPrefillStep extends PrefillStep {
|
|
15
|
-
/** Some methods maintain their final target chunk before sampling. */
|
|
16
|
-
readonly maintain?: boolean;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface MlxPrefillState {
|
|
20
|
-
row: Row;
|
|
21
|
-
solo: Cache[];
|
|
22
|
-
pos: number;
|
|
23
|
-
retain?: () => void;
|
|
24
|
-
planned?: MlxPrefillStep;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** The method owns initialization, planning, companion state, snapshots and
|
|
28
|
-
* completion. This driver owns common target batching and work boundaries.
|
|
29
|
-
* Checkpoint factories return owned cache state; close/dispose are idempotent. */
|
|
30
|
-
export interface MlxPrefillRowsHost<State extends MlxPrefillState> {
|
|
31
|
-
stateCodecs?: CacheCodecProvider;
|
|
32
|
-
maintain?: KvMaintenance;
|
|
33
|
-
open(row: Row): State;
|
|
34
|
-
plan(state: State): MlxPrefillStep;
|
|
35
|
-
/** Already prepared state can complete without any target forward. */
|
|
36
|
-
ready?(state: State): boolean;
|
|
37
|
-
forward(ids: MlxArray, caches: Cache[], states: readonly State[]): Promise<MlxArray>;
|
|
38
|
-
project(hidden: MlxArray, caches: Cache[], completed: readonly State[]): MlxArray | null;
|
|
39
|
-
/** Consume method context after target maintenance, before snapshots. */
|
|
40
|
-
afterForward?(ids: MlxArray, caches: Cache[], states: readonly State[], hidden: MlxArray): void | Promise<void>;
|
|
41
|
-
checkpoint(state: State, capture: () => Cache[], row: number): void;
|
|
42
|
-
complete(state: State, logits: MlxArray | null, row: number): Promise<void>;
|
|
43
|
-
reject(row: Row, error: unknown): void;
|
|
44
|
-
close(state: State): void;
|
|
45
|
-
filterRows?(keep: readonly number[]): void;
|
|
46
|
-
dispose?(): void;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/** One target preparation lifecycle at B1/B>1. Late joins retain each row's
|
|
50
|
-
* planned chunk endpoint, precision transition and checkpoint boundary. */
|
|
51
|
-
export class MlxPrefillRows<State extends MlxPrefillState> implements MlxGroupPreparation {
|
|
52
|
-
#states: State[] = [];
|
|
53
|
-
#rows: Row[] = [];
|
|
54
|
-
#stateRows?: MlxStateRows;
|
|
55
|
-
constructor(readonly operations: MlxPrefillRowsHost<State>) {}
|
|
56
|
-
get rows(): readonly Row[] { return this.#rows; }
|
|
57
|
-
get canAdmit(): boolean { return this.#rows.length > 0; }
|
|
58
|
-
/** Keep a request's prefill weight until retirement so a nearly completed
|
|
59
|
-
* request does not repeatedly attract another long prefill into its tail. */
|
|
60
|
-
get tokenWeight(): number { return this.#states.reduce((sum, state) => sum + state.row.promptTokens - state.row.cachedTokens, 0); }
|
|
61
|
-
|
|
62
|
-
admit(row: Row): void {
|
|
63
|
-
this.#states.push(this.operations.open(row));
|
|
64
|
-
this.#rows.push(row);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
#release(state: State): void {
|
|
68
|
-
const caches = state.solo; state.solo = [];
|
|
69
|
-
const retain = state.retain; state.retain = undefined;
|
|
70
|
-
disposeResources([...caches, { dispose: () => retain?.() }, { dispose: () => this.operations.close(state) }]);
|
|
71
|
-
}
|
|
72
|
-
#filter(keep: number[]): void {
|
|
73
|
-
if (keep.length) this.#stateRows?.filterRows(keep);
|
|
74
|
-
else { const rows = this.#stateRows; this.#stateRows = undefined; rows?.dispose(); }
|
|
75
|
-
this.operations.filterRows?.(keep);
|
|
76
|
-
this.#states = keep.map(row => this.#states[row]!);
|
|
77
|
-
this.#rows = keep.map(row => this.#rows[row]!);
|
|
78
|
-
}
|
|
79
|
-
/** Admission changes membership only between forwards. Existing planned
|
|
80
|
-
* endpoints survive a join, including partially consumed drain chunks. */
|
|
81
|
-
#synchronizeRows(): void {
|
|
82
|
-
if (!this.#stateRows && this.#states.length === 1) return;
|
|
83
|
-
if (!this.#stateRows) {
|
|
84
|
-
for (const state of this.#states) this.operations.maintain?.preparePrefill?.(state.solo);
|
|
85
|
-
const layouts: BatchableCache[] = [];
|
|
86
|
-
try { for (const cache of this.#states[0]!.solo) layouts.push(prefillCacheLayout(cache)); }
|
|
87
|
-
catch (error) { return cleanupFailure(error, () => disposeResources(layouts)); }
|
|
88
|
-
this.#stateRows = new MlxStateRows(layouts);
|
|
89
|
-
this.#stateRows.mergeRows(this.#states.map(state => state.solo));
|
|
90
|
-
} else {
|
|
91
|
-
for (const state of this.#states.slice(this.#stateRows.rowCount)) {
|
|
92
|
-
this.operations.maintain?.preparePrefill?.(state.solo);
|
|
93
|
-
this.#stateRows.append(state.solo);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Resolve input-backed copies before releasing SSD restore leases.
|
|
97
|
-
if (this.#states.some(state => state.solo.length)) {
|
|
98
|
-
evalCacheState(this.#stateRows.caches);
|
|
99
|
-
for (const state of this.#states) {
|
|
100
|
-
const caches = state.solo; state.solo = [];
|
|
101
|
-
const retain = state.retain; state.retain = undefined;
|
|
102
|
-
disposeResources([...caches, { dispose: () => retain?.() }]);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
for (const cache of this.#stateRows.caches) cache.prefillMaintenance?.beginPrefill();
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
async advance(): Promise<boolean> {
|
|
109
|
-
// Complete restored inputs before merging: their cache coverage must not
|
|
110
|
-
// introduce padding or a zero-width forward into unrelated cold rows.
|
|
111
|
-
if (this.operations.ready && this.#states.some(state => this.operations.ready!(state))) {
|
|
112
|
-
const remaining: State[] = [];
|
|
113
|
-
for (const state of this.#states) {
|
|
114
|
-
if (!this.operations.ready(state)) { remaining.push(state); continue; }
|
|
115
|
-
try {
|
|
116
|
-
state.row.req.signal?.throwIfAborted();
|
|
117
|
-
await this.operations.complete(state, null, -1);
|
|
118
|
-
state.solo = []; state.retain = undefined;
|
|
119
|
-
} catch (error) { this.operations.reject(state.row, error); this.#release(state); }
|
|
120
|
-
finally { this.operations.close(state); }
|
|
121
|
-
}
|
|
122
|
-
this.#states = remaining; this.#rows = remaining.map(state => state.row);
|
|
123
|
-
if (!remaining.length) { this.dispose(); return true; }
|
|
124
|
-
}
|
|
125
|
-
this.#synchronizeRows();
|
|
126
|
-
const keep: number[] = [];
|
|
127
|
-
for (const [index, state] of this.#states.entries()) {
|
|
128
|
-
if (!state.row.req.signal?.aborted) { keep.push(index); continue; }
|
|
129
|
-
this.#release(state); this.operations.reject(state.row, state.row.req.signal.reason);
|
|
130
|
-
}
|
|
131
|
-
if (keep.length !== this.#states.length) this.#filter(keep);
|
|
132
|
-
if (!this.#states.length) { this.dispose(); return true; }
|
|
133
|
-
while (this.#states.length) {
|
|
134
|
-
for (const state of this.#states) state.planned ??= this.operations.plan(state);
|
|
135
|
-
const count = Math.min(...this.#states.map(state => state.planned!.end - state.pos));
|
|
136
|
-
const closes = this.#states.map(state => state.row.req.trace?.begin("prefill.chunk", {
|
|
137
|
-
mechanism: "continuous", startToken: state.pos, batchSize: this.#states.length,
|
|
138
|
-
}));
|
|
139
|
-
const caches = this.#stateRows?.caches ?? this.#states[0]!.solo;
|
|
140
|
-
try {
|
|
141
|
-
using ids = count ? ops.fromInt32(this.#states.flatMap(state => state.row.req.promptIds.slice(state.pos, state.pos + count)),
|
|
142
|
-
[this.#states.length, count]) : null;
|
|
143
|
-
using hidden = ids ? await this.operations.forward(ids, caches, this.#states) : null;
|
|
144
|
-
const drains: number[] = [], finals: number[] = [];
|
|
145
|
-
let batchYield = false;
|
|
146
|
-
for (const [row, state] of this.#states.entries()) {
|
|
147
|
-
state.pos += count;
|
|
148
|
-
if (state.pos !== state.planned!.end) continue;
|
|
149
|
-
if (state.planned!.kind === "final") finals.push(row);
|
|
150
|
-
else drains.push(row);
|
|
151
|
-
batchYield ||= state.planned!.batchYield;
|
|
152
|
-
}
|
|
153
|
-
const maintained = [...drains, ...finals.filter(row => this.#states[row]!.planned!.maintain)];
|
|
154
|
-
if (count && (maintained.length || !finals.length)) {
|
|
155
|
-
evalCacheState(caches);
|
|
156
|
-
if (this.#stateRows) {
|
|
157
|
-
for (const cache of caches) cache.prefillMaintenance?.commitPrefill(maintained);
|
|
158
|
-
} else if (maintained.length) this.operations.maintain?.(this.#states[0]!.solo);
|
|
159
|
-
clearCache();
|
|
160
|
-
}
|
|
161
|
-
if (ids) {
|
|
162
|
-
const companion = this.operations.afterForward?.(ids, caches, this.#states, hidden!);
|
|
163
|
-
if (companion) await companion;
|
|
164
|
-
}
|
|
165
|
-
for (const row of [...drains, ...finals]) {
|
|
166
|
-
const state = this.#states[row]!;
|
|
167
|
-
if (state.planned!.snapshot) this.operations.checkpoint(state, () =>
|
|
168
|
-
this.#stateRows ? this.#stateRows.extractRow(row) : cloneKvCaches(state.solo, this.operations.stateCodecs), row);
|
|
169
|
-
if (!finals.includes(row)) state.planned = undefined;
|
|
170
|
-
}
|
|
171
|
-
using logits = hidden && finals.length ? this.operations.project(hidden, caches, finals.map(row => this.#states[row]!)) : null;
|
|
172
|
-
for (const row of finals) {
|
|
173
|
-
const state = this.#states[row]!;
|
|
174
|
-
if (this.#stateRows) state.solo = this.#stateRows.extractRow(row);
|
|
175
|
-
using part = logits ? logits.slice([row, logits.shape[1]! - 1, 0], [row + 1, logits.shape[1]!, logits.shape[2]!]) : null;
|
|
176
|
-
try {
|
|
177
|
-
state.row.req.signal?.throwIfAborted();
|
|
178
|
-
await this.operations.complete(state, part, row);
|
|
179
|
-
state.solo = []; state.retain = undefined;
|
|
180
|
-
} catch (error) {
|
|
181
|
-
this.operations.reject(state.row, error);
|
|
182
|
-
this.#release(state);
|
|
183
|
-
} finally { this.operations.close(state); }
|
|
184
|
-
}
|
|
185
|
-
for (const cache of caches) (cache as { releaseRopeArr?: () => void }).releaseRopeArr?.();
|
|
186
|
-
if (finals.length) this.#filter(this.#states.flatMap((_, row) => finals.includes(row) ? [] : [row]));
|
|
187
|
-
if (!this.#states.length) { this.dispose(); return true; }
|
|
188
|
-
if (batchYield || finals.length) return false;
|
|
189
|
-
} finally { for (const close of closes) close?.(); }
|
|
190
|
-
}
|
|
191
|
-
return true;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
dispose(): void {
|
|
195
|
-
const states = this.#states; this.#states = []; this.#rows = [];
|
|
196
|
-
const rows = this.#stateRows; this.#stateRows = undefined;
|
|
197
|
-
disposeResources([...(rows ? [rows] : []), ...states.map(state => ({ dispose: () => this.#release(state) })),
|
|
198
|
-
{ dispose: () => this.operations.dispose?.() }]);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { PrefillStep } from "../../inference/prefill";
|
|
2
|
-
import type { MlxArray } from "../../mlx/array";
|
|
3
|
-
import type { Cache } from "../../model/gemma4";
|
|
4
|
-
import * as ops from "../../mlx/ops";
|
|
5
|
-
import { clearCache } from "../../mlx/ffi";
|
|
6
|
-
import { leaseCacheStates } from "./state-views";
|
|
7
|
-
import { withResource } from "../../engine/resources";
|
|
8
|
-
|
|
9
|
-
/** State views with explicit ownership are released even on deferred errors.
|
|
10
|
-
* Owned views precede borrowed state, preserving the serial eval ordering. */
|
|
11
|
-
export function evalCacheState(cache: Cache[]): void {
|
|
12
|
-
withResource(leaseCacheStates(cache), (state) => { if (state.length) ops.evalAll([...state]); });
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** Forward once. Drains evaluate state, apply KV maintenance, then clear the
|
|
16
|
-
* allocator cache. Finals return owned hidden state without forcing eval. */
|
|
17
|
-
export async function executeMlxPrefillStep(
|
|
18
|
-
forward: (ids: MlxArray, cache: Cache[]) => MlxArray | Promise<MlxArray>,
|
|
19
|
-
cache: Cache[], prompt: readonly number[], step: PrefillStep,
|
|
20
|
-
maintain: () => void,
|
|
21
|
-
): Promise<MlxArray | null> {
|
|
22
|
-
const chunk = prompt.slice(step.start, step.end);
|
|
23
|
-
const ids = ops.fromInt32(chunk, [1, chunk.length]);
|
|
24
|
-
let hidden: MlxArray;
|
|
25
|
-
try { hidden = await forward(ids, cache); }
|
|
26
|
-
finally { ids.dispose(); }
|
|
27
|
-
if (step.kind === "final") return hidden;
|
|
28
|
-
hidden.dispose();
|
|
29
|
-
evalCacheState(cache);
|
|
30
|
-
maintain();
|
|
31
|
-
clearCache();
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../../mlx/array";
|
|
2
|
-
import { Dtype } from "../../mlx/ffi";
|
|
3
|
-
import * as ops from "../../mlx/ops";
|
|
4
|
-
import { BatchedKVCache } from "../../model/batched-kv";
|
|
5
|
-
import type { Cache } from "../../model/gemma4-base";
|
|
6
|
-
import { MlxStateRows } from "./state-rows";
|
|
7
|
-
import { disposeResources } from "../../engine/resources";
|
|
8
|
-
|
|
9
|
-
export interface ProjectedContext { k: MlxArray; v: MlxArray; }
|
|
10
|
-
export interface ContextProjection {
|
|
11
|
-
project(hidden: MlxArray, positions: number | MlxArray): ProjectedContext[];
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/** Incremental projected context reuses ordinary full-attention row storage.
|
|
15
|
-
* The projection graph owns numerics; this object owns positions and validity. */
|
|
16
|
-
export class MlxProjectedContextRows {
|
|
17
|
-
readonly state: MlxStateRows<BatchedKVCache>;
|
|
18
|
-
constructor(layers: number, readonly graph: ContextProjection) {
|
|
19
|
-
this.state = new MlxStateRows(Array.from({ length: layers }, () => new BatchedKVCache()));
|
|
20
|
-
}
|
|
21
|
-
get positions(): readonly number[] { return this.state.caches[0]!.rowOffsets; }
|
|
22
|
-
prepareAppend(rows: readonly (readonly Cache[])[]) { return this.state.prepareAppendMany(rows); }
|
|
23
|
-
append(hidden: MlxArray, lengths: readonly number[]): void {
|
|
24
|
-
const width = Math.max(...lengths), B = lengths.length, positions = this.positions;
|
|
25
|
-
using context = hidden.slice([0, 0, 0], [B, width, hidden.shape[2]!]);
|
|
26
|
-
using offsets = positions.every(position => position === positions[0]) ? null : ops.fromInt32([...positions], [B]);
|
|
27
|
-
const projected = this.graph.project(context, offsets ?? positions[0]!);
|
|
28
|
-
try {
|
|
29
|
-
for (const [layer, cache] of this.state.caches.entries()) {
|
|
30
|
-
cache.specRoundBegin();
|
|
31
|
-
for (const array of cache.updateAndFetch(projected[layer]!.k, projected[layer]!.v)) array.dispose();
|
|
32
|
-
if (lengths.every(length => length === width)) cache.specRoundCommit();
|
|
33
|
-
else cache.specRoundRollback(lengths);
|
|
34
|
-
}
|
|
35
|
-
} finally { disposeResources(projected.flatMap(pair => [pair.k, pair.v])); }
|
|
36
|
-
}
|
|
37
|
-
materialize(): void { ops.evalAll(this.state.caches.flatMap(cache => cache.state())); }
|
|
38
|
-
readAttention() {
|
|
39
|
-
const views: import("../../model/gemma4-base").KvDonorRows[] = [];
|
|
40
|
-
try { for (const cache of this.state.caches) views.push(cache.captureDonorRows()); }
|
|
41
|
-
catch (error) { disposeResources(views.flatMap(view => [view.keys, view.values])); throw error; }
|
|
42
|
-
const masks = new Map<string, MlxArray | null>();
|
|
43
|
-
return {
|
|
44
|
-
attend(layer: number, query: MlxArray, blockKeys: MlxArray, blockValues: MlxArray, scale = 1): MlxArray {
|
|
45
|
-
const view = views[layer]!, width = view.keys.shape[2]!, block = blockKeys.shape[2]!, B = view.offsets.length;
|
|
46
|
-
// Membership and coverage advance together in every context layer.
|
|
47
|
-
const key = `${width}:${block}:${view.keys.dtype}`;
|
|
48
|
-
if (!masks.has(key)) {
|
|
49
|
-
let mask: MlxArray | null = null;
|
|
50
|
-
if (view.starts.some(start => start !== 0) || view.ends.some(end => end !== width)) {
|
|
51
|
-
using columns = ops.arange(0, width, 1, Dtype.int32);
|
|
52
|
-
using lower = ops.fromInt32([...view.starts], [B, 1, 1, 1]);
|
|
53
|
-
using upper = ops.fromInt32([...view.ends], [B, 1, 1, 1]);
|
|
54
|
-
using before = ops.less(columns, lower), after = ops.greaterEqual(columns, upper);
|
|
55
|
-
using invalid = ops.logicalOr(before, after);
|
|
56
|
-
using floats = invalid.astype(view.keys.dtype);
|
|
57
|
-
using prefix = ops.mulScalar(floats, -1e9);
|
|
58
|
-
using suffix = ops.zeros([B, 1, 1, block], view.keys.dtype);
|
|
59
|
-
mask = ops.concatAxis([prefix, suffix], 3);
|
|
60
|
-
}
|
|
61
|
-
masks.set(key, mask);
|
|
62
|
-
}
|
|
63
|
-
using keys = ops.concatAxis([view.keys, blockKeys], 2);
|
|
64
|
-
using values = ops.concatAxis([view.values, blockValues], 2);
|
|
65
|
-
const mask = masks.get(key)!;
|
|
66
|
-
return ops.sdpa(query, keys, values, scale, mask ? "array" : "", mask);
|
|
67
|
-
},
|
|
68
|
-
dispose() { disposeResources([...views.flatMap(view => [view.keys, view.values]), ...[...masks.values()].filter(value => value !== null)]); },
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
dispose(): void { this.state.dispose(); }
|
|
72
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { GenerateOptions } from "../../generate";
|
|
2
|
-
|
|
3
|
-
/** Copy policy data without cloning native caches, controllers or callbacks. */
|
|
4
|
-
export function snapshotGenerationPolicy<T extends GenerateOptions & { stopSequences?: readonly string[] }>(options: T): T {
|
|
5
|
-
const snapshot = { ...options };
|
|
6
|
-
const freeze = (value: unknown): void => {
|
|
7
|
-
if (!value || typeof value !== "object") return;
|
|
8
|
-
for (const item of Object.values(value)) freeze(item);
|
|
9
|
-
Object.freeze(value);
|
|
10
|
-
};
|
|
11
|
-
for (const key of ["stopSequences", "eosTokenIds", "adapters", "xtcSpecialTokens", "logitBias",
|
|
12
|
-
"kvConfig", "turboQuant", "pagedKv", "hlg", "curve", "decodePolicy"] as const) {
|
|
13
|
-
if (snapshot[key] === undefined) continue;
|
|
14
|
-
const value = structuredClone(snapshot[key]);
|
|
15
|
-
freeze(value);
|
|
16
|
-
Object.assign(snapshot, { [key]: value });
|
|
17
|
-
}
|
|
18
|
-
return Object.freeze(snapshot);
|
|
19
|
-
}
|
|
20
|
-
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { GenerateOptions } from "../../generate";
|
|
2
|
-
import type { RuntimeModel } from "../../model/factory";
|
|
3
|
-
import { KVCache, type Cache } from "../../model/gemma4-base";
|
|
4
|
-
import { PagedKVCache } from "../../lab/paged-kv/paged-kv";
|
|
5
|
-
import type { RowPromptCache } from "./batch-group";
|
|
6
|
-
import { disposeResources } from "../../engine/resources";
|
|
7
|
-
|
|
8
|
-
/** Request state construction and reusable-prefix policy. Equal keys declare
|
|
9
|
-
* compatible state layouts; the executor need not inspect their settings. */
|
|
10
|
-
export interface MlxRequestStatePolicy {
|
|
11
|
-
readonly key: string;
|
|
12
|
-
readonly promptCache?: RowPromptCache;
|
|
13
|
-
create(): Cache[];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/** Replace fresh full-attention storage before prefill. Sliding layers retain
|
|
17
|
-
* their layout; pre-warmed library caches retain their existing storage. */
|
|
18
|
-
export function maybePageKv(
|
|
19
|
-
cache: Cache[], options: GenerateOptions, capacityTokens: number,
|
|
20
|
-
): void {
|
|
21
|
-
if (!options.pagedKv) return;
|
|
22
|
-
if (cache.some((c) => c.offset > 0)) return;
|
|
23
|
-
const blockSize = options.pagedKv.blockSize ?? PagedKVCache.DEFAULT_BLOCK_SIZE;
|
|
24
|
-
for (let i = 0; i < cache.length; i++) {
|
|
25
|
-
if (cache[i] instanceof KVCache) {
|
|
26
|
-
cache[i]!.dispose(); // fresh (offset 0) — nothing stored yet
|
|
27
|
-
cache[i] = new PagedKVCache(capacityTokens, blockSize);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function bindPagedRequestState(model: RuntimeModel, options: GenerateOptions,
|
|
33
|
-
capacityTokens: number): MlxRequestStatePolicy | undefined {
|
|
34
|
-
if (!options.pagedKv) return undefined;
|
|
35
|
-
const blockSize = options.pagedKv.blockSize ?? PagedKVCache.DEFAULT_BLOCK_SIZE;
|
|
36
|
-
return { key: `paged:${blockSize}`, create() {
|
|
37
|
-
const caches = model.makeCache();
|
|
38
|
-
try { maybePageKv(caches, { pagedKv: { blockSize } }, capacityTokens); return caches; }
|
|
39
|
-
catch (error) { disposeResources(caches); throw error; }
|
|
40
|
-
} };
|
|
41
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import type { SpeculativeTransaction } from "../../inference/rollback";
|
|
2
|
-
import type { Cache } from "../../model/gemma4-base";
|
|
3
|
-
|
|
4
|
-
interface TransactionLayer<Acceptance> {
|
|
5
|
-
fits(drafts: number): boolean;
|
|
6
|
-
begin(): void;
|
|
7
|
-
resolve(accepted: Acceptance, drafts: number): void;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/** State storage that can retain a different verified prefix for each row.
|
|
11
|
-
* Both attention and recurrent layouts implement this same transaction. */
|
|
12
|
-
export interface RowSpeculativeState {
|
|
13
|
-
specRoundBegin(): void;
|
|
14
|
-
specRoundCommit(): void;
|
|
15
|
-
specRoundRollback(keep: number | readonly number[]): void;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function bindRowCacheRollback(
|
|
19
|
-
caches: readonly RowSpeculativeState[], rows: number,
|
|
20
|
-
): SpeculativeTransaction<readonly number[]> {
|
|
21
|
-
return bindTransaction(caches.map(cache => ({
|
|
22
|
-
fits: () => true,
|
|
23
|
-
begin: () => cache.specRoundBegin(),
|
|
24
|
-
resolve(accepted: readonly number[], drafts: number) {
|
|
25
|
-
if (accepted.every(count => count === drafts)) cache.specRoundCommit();
|
|
26
|
-
else cache.specRoundRollback(accepted.every(count => count === accepted[0])
|
|
27
|
-
? accepted[0]! + 1 : accepted.map(count => count + 1));
|
|
28
|
-
},
|
|
29
|
-
})), (accepted, drafts) => accepted.length === rows &&
|
|
30
|
-
accepted.every(count => Number.isSafeInteger(count) && count >= 0 && count <= drafts));
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** Bind the recurrent transaction or the trim implementation once.
|
|
34
|
-
* Ring-capacity checks still happen at each safe boundary before any writes. */
|
|
35
|
-
export function bindCacheRollback(caches: readonly Cache[]): SpeculativeTransaction {
|
|
36
|
-
const layers = caches.map((cache) => {
|
|
37
|
-
const { specRoundBegin: begin, specRoundCommit: commit, specRoundRollback: rollback } = cache;
|
|
38
|
-
const hasRound = [begin, commit, rollback].some((method) => method !== undefined);
|
|
39
|
-
if (hasRound && !(typeof begin === "function" && typeof commit === "function" && typeof rollback === "function"))
|
|
40
|
-
throw new Error("cache exposes an incomplete speculative transaction");
|
|
41
|
-
return {
|
|
42
|
-
fits(drafts: number) {
|
|
43
|
-
if ("maxSize" in cache && typeof cache.maxSize === "number")
|
|
44
|
-
return cache.offset + drafts + 1 < cache.maxSize;
|
|
45
|
-
return hasRound || cache.isTrimmable();
|
|
46
|
-
},
|
|
47
|
-
begin: () => begin?.call(cache),
|
|
48
|
-
resolve(accepted: number, drafts: number) {
|
|
49
|
-
if (accepted < drafts) {
|
|
50
|
-
if (rollback) rollback.call(cache, accepted + 1);
|
|
51
|
-
else cache.trim(drafts - accepted);
|
|
52
|
-
} else commit?.call(cache);
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
});
|
|
56
|
-
return bindTransaction(layers, (accepted, drafts) =>
|
|
57
|
-
Number.isSafeInteger(accepted) && accepted >= 0 && accepted <= drafts);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** One transaction lifecycle for scalar and row-wise state bindings. */
|
|
61
|
-
function bindTransaction<Acceptance>(
|
|
62
|
-
layers: readonly TransactionLayer<Acceptance>[],
|
|
63
|
-
accepts: (accepted: Acceptance, drafts: number) => boolean,
|
|
64
|
-
): SpeculativeTransaction<Acceptance> {
|
|
65
|
-
let active: number | undefined;
|
|
66
|
-
let invalid = false;
|
|
67
|
-
const validate = (drafts: number) => {
|
|
68
|
-
if (invalid) throw new Error("speculative state is invalid and must be discarded");
|
|
69
|
-
if (!Number.isSafeInteger(drafts) || drafts < 0) throw new Error("invalid speculative draft count");
|
|
70
|
-
};
|
|
71
|
-
return {
|
|
72
|
-
canBegin(drafts) { validate(drafts); return active === undefined && layers.every((layer) => layer.fits(drafts)); },
|
|
73
|
-
begin(drafts) {
|
|
74
|
-
validate(drafts);
|
|
75
|
-
if (active !== undefined || !layers.every((layer) => layer.fits(drafts)))
|
|
76
|
-
throw new Error("speculative state cannot begin this round");
|
|
77
|
-
active = drafts;
|
|
78
|
-
try { for (const layer of layers) layer.begin(); }
|
|
79
|
-
catch (error) { invalid = true; throw error; }
|
|
80
|
-
},
|
|
81
|
-
resolve(accepted) {
|
|
82
|
-
if (invalid) throw new Error("speculative state is invalid and must be discarded");
|
|
83
|
-
if (active === undefined || !accepts(accepted, active)) throw new Error("invalid speculative acceptance count");
|
|
84
|
-
try { for (const layer of layers) layer.resolve(accepted, active); }
|
|
85
|
-
catch (error) { invalid = true; throw error; }
|
|
86
|
-
active = undefined;
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../../mlx/array";
|
|
2
|
-
import * as ops from "../../mlx/ops";
|
|
3
|
-
import type { TokenLogprobs } from "../../contracts/generation";
|
|
4
|
-
import { readStepExtras, stepExtrasArrays, disposeStepExtras,
|
|
5
|
-
type DeviceStepSampler, type StepExtras } from "../../sampler";
|
|
6
|
-
import { disposeResources, cleanupFailure } from "../../engine/resources";
|
|
7
|
-
|
|
8
|
-
type TokenSink = (token: number, logprobs?: TokenLogprobs) => void | boolean | Promise<void | boolean>;
|
|
9
|
-
|
|
10
|
-
/** Request-owned sampling and output metadata. Execution groups receive token
|
|
11
|
-
* tensors and an output callback; they need no logprob or retention policy. */
|
|
12
|
-
export function createRowSampling(
|
|
13
|
-
sampler: DeviceStepSampler, onToken: TokenSink,
|
|
14
|
-
) {
|
|
15
|
-
if (!sampler.capturesLogprobs) return {
|
|
16
|
-
sample: (logits: MlxArray, step: number) => sampler.sample(logits, step).token,
|
|
17
|
-
plainGreedy: sampler.isPlainGreedy, onToken, dispose: () => sampler.dispose(),
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
// A pipelined group can sample the next token before emitting the previous
|
|
21
|
-
// one. Keep captures by request-local step, independently of row position.
|
|
22
|
-
const pending = new Map<number, StepExtras>();
|
|
23
|
-
let emitted = 0;
|
|
24
|
-
return {
|
|
25
|
-
sample(logits: MlxArray, step: number): MlxArray {
|
|
26
|
-
const result = sampler.sample(logits, step);
|
|
27
|
-
try {
|
|
28
|
-
ops.asyncEvalAll([result.token, ...stepExtrasArrays(result.extras)]);
|
|
29
|
-
if (result.extras) pending.set(step, result.extras);
|
|
30
|
-
return result.token;
|
|
31
|
-
} catch (error) {
|
|
32
|
-
return cleanupFailure(error, () => disposeResources([result.token,
|
|
33
|
-
{ dispose: () => disposeStepExtras(result.extras) }]));
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
// The vectorized token-only shortcut bypasses the per-request sampler.
|
|
37
|
-
plainGreedy: false,
|
|
38
|
-
onToken(token: number) {
|
|
39
|
-
const extras = pending.get(emitted) ?? null;
|
|
40
|
-
pending.delete(emitted++);
|
|
41
|
-
return onToken(token, readStepExtras(extras));
|
|
42
|
-
},
|
|
43
|
-
dispose() {
|
|
44
|
-
const extras = [...pending.values()];
|
|
45
|
-
pending.clear();
|
|
46
|
-
disposeResources([sampler, ...extras.map(value => ({ dispose: () => disposeStepExtras(value) }))]);
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
}
|