mlx-bun 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import type { Cache } from "../../model/gemma4-base";
|
|
2
|
-
import type { RuntimeModel } from "../../model/factory";
|
|
3
|
-
import type { MlxArray } from "../../mlx/array";
|
|
4
|
-
import { nextPrefillStep } from "../../inference/prefill";
|
|
5
|
-
import type { CacheCodecProvider } from "../../kv-store";
|
|
6
|
-
import { disposeResources, cleanupFailure } from "../../engine/resources";
|
|
7
|
-
import type { Row, RowPromptCache } from "./batch-group";
|
|
8
|
-
import type { KvMaintenance } from "./kv-maintenance";
|
|
9
|
-
import { MlxPrefillRows, type MlxPrefillState } from "./prefill-rows";
|
|
10
|
-
|
|
11
|
-
export interface PrefillState extends MlxPrefillState {
|
|
12
|
-
snapAt: number | null;
|
|
13
|
-
continuation?: import("./continuation").OrdinaryContinuationState;
|
|
14
|
-
closePrefill?: () => void;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface PrefillHost {
|
|
18
|
-
model: RuntimeModel;
|
|
19
|
-
chunkSize: number;
|
|
20
|
-
tailSplit: boolean;
|
|
21
|
-
promptCache?: RowPromptCache;
|
|
22
|
-
stateCodecs?: CacheCodecProvider;
|
|
23
|
-
maintain?: KvMaintenance;
|
|
24
|
-
forward(ids: MlxArray, caches: Cache[]): Promise<MlxArray>;
|
|
25
|
-
/** Target projection preserves the forward batch geometry before sampling. */
|
|
26
|
-
project(hidden: MlxArray, caches: Cache[], completed: readonly PrefillState[]): MlxArray;
|
|
27
|
-
/** Borrows [1,1,V] logits; takes ownership of the completed request caches. */
|
|
28
|
-
complete(state: PrefillState, logits: MlxArray): Promise<void>;
|
|
29
|
-
resume?(state: PrefillState): Promise<void>;
|
|
30
|
-
reject(row: Row, error: unknown): void;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** Ordinary sampling/cache policy over the shared target preparation driver. */
|
|
34
|
-
export class MlxPrefillCohort extends MlxPrefillRows<PrefillState> {
|
|
35
|
-
override get canAdmit(): boolean {
|
|
36
|
-
return super.canAdmit && this.supportsMixedWork;
|
|
37
|
-
}
|
|
38
|
-
get supportsMixedWork(): boolean { return !this.rows.some(row => row.req.promptInput); }
|
|
39
|
-
constructor(readonly host: PrefillHost) {
|
|
40
|
-
super({
|
|
41
|
-
stateCodecs: host.stateCodecs, maintain: host.maintain,
|
|
42
|
-
open(row) {
|
|
43
|
-
let owned: { caches: Cache[]; retain?: () => void } | undefined;
|
|
44
|
-
let closeCache: (() => void) | undefined;
|
|
45
|
-
let closePrefill: (() => void) | undefined;
|
|
46
|
-
try {
|
|
47
|
-
closeCache = row.req.trace?.begin("cache.lookup_restore", { mechanism: "continuous" });
|
|
48
|
-
const continuation = row.req.continuation?.restore(row.cacheNamespace ?? "");
|
|
49
|
-
if (continuation) {
|
|
50
|
-
owned = { caches: continuation.caches };
|
|
51
|
-
return { row, solo: continuation.caches, pos: row.req.promptIds.length,
|
|
52
|
-
snapAt: null, continuation };
|
|
53
|
-
}
|
|
54
|
-
const hit = host.promptCache?.take(row.req.promptIds, row.cacheNamespace, row.req.cacheSessionId) ?? null;
|
|
55
|
-
if (hit) owned = hit;
|
|
56
|
-
closeCache?.(); closeCache = undefined;
|
|
57
|
-
if (hit) row.cachedTokens = hit.tokens.length;
|
|
58
|
-
const length = row.req.promptIds.length;
|
|
59
|
-
const boundary = Math.min(row.req.snapshotAt ?? length, length - 1);
|
|
60
|
-
const snapAt = host.promptCache && boundary >= 256 && boundary > (hit?.tokens.length ?? 0) ? boundary : null;
|
|
61
|
-
closePrefill = row.req.trace?.begin("prefill.total", {
|
|
62
|
-
mechanism: "continuous", promptTokens: row.promptTokens, cachedTokens: row.cachedTokens,
|
|
63
|
-
});
|
|
64
|
-
const closeSetup = row.req.trace?.begin("prefill.batch_setup", { mechanism: "continuous" });
|
|
65
|
-
owned ??= { caches: row.req.statePolicy?.create() ?? host.model.makeCache() }; closeSetup?.();
|
|
66
|
-
if (row.req.promptInput) host.maintain?.(owned.caches);
|
|
67
|
-
return { row, solo: owned.caches, pos: hit?.tokens.length ?? 0, retain: owned.retain, snapAt, closePrefill };
|
|
68
|
-
} catch (error) {
|
|
69
|
-
return cleanupFailure(error, () => disposeResources([...(owned?.caches ?? []),
|
|
70
|
-
{ dispose: () => owned?.retain?.() }, { dispose: () => closePrefill?.() }]));
|
|
71
|
-
} finally { closeCache?.(); }
|
|
72
|
-
},
|
|
73
|
-
ready: state => !!state.continuation,
|
|
74
|
-
plan(state) {
|
|
75
|
-
if (state.row.req.promptInput) return { kind: "final", start: state.pos,
|
|
76
|
-
end: state.row.promptTokens, snapshot: false, batchYield: false, atomic: true };
|
|
77
|
-
return nextPrefillStep({ length: state.row.promptTokens, position: state.pos,
|
|
78
|
-
chunkSize: state.row.req.prefillChunkSize ?? host.chunkSize,
|
|
79
|
-
tailSplit: host.tailSplit, snapshotAt: state.snapAt }); },
|
|
80
|
-
forward: (ids, caches, states, work) => states[0]?.row.req.promptInput
|
|
81
|
-
? Promise.resolve(states[0].row.req.promptInput.forward(ids, caches, states[0].pos))
|
|
82
|
-
: work ? work(ids, caches) : host.forward(ids, caches),
|
|
83
|
-
project: host.project.bind(host),
|
|
84
|
-
complete: (state, logits) => state.continuation ? host.resume!(state) : host.complete(state, logits!), reject: host.reject.bind(host),
|
|
85
|
-
checkpoint(state, capture) {
|
|
86
|
-
let snapshot: Cache[] | undefined;
|
|
87
|
-
try {
|
|
88
|
-
snapshot = capture();
|
|
89
|
-
host.promptCache!.put(state.row.req.promptIds.slice(0, state.pos), snapshot, state.row.cacheNamespace, undefined, undefined, state.row.req.cacheSessionId);
|
|
90
|
-
snapshot = undefined;
|
|
91
|
-
} catch (error) {
|
|
92
|
-
if (snapshot) disposeResources(snapshot);
|
|
93
|
-
console.warn(`batch-lane boundary snapshot skipped: ${(error as Error).message}`);
|
|
94
|
-
}
|
|
95
|
-
state.snapAt = null;
|
|
96
|
-
},
|
|
97
|
-
close(state) { const close = state.closePrefill; state.closePrefill = undefined; close?.(); },
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { ModelConfig } from "../../config";
|
|
2
|
-
import type { PrefillPolicy } from "../../inference/prefill";
|
|
3
|
-
import { sdpaFallbackBytes } from "../../kv-scheme";
|
|
4
|
-
import type { RuntimeConfig } from "../../runtime-config";
|
|
5
|
-
|
|
6
|
-
/** Retain large chunks for short prompts, but bound the materialized attention
|
|
7
|
-
* score workspace of recurrent-attention models at long context. This changes
|
|
8
|
-
* work size, never request admission. Explicit chunk settings remain exact. */
|
|
9
|
-
export function resolveMlxPrefillPolicy(config: ModelConfig, runtime: RuntimeConfig,
|
|
10
|
-
override?: number): PrefillPolicy {
|
|
11
|
-
const explicit = override ?? (runtime.value("MLX_BUN_RD_PREFILL_CHUNK") === undefined
|
|
12
|
-
? undefined : runtime.number("MLX_BUN_RD_PREFILL_CHUNK", 2048));
|
|
13
|
-
if (explicit !== undefined) {
|
|
14
|
-
const chunk = Math.max(1, Math.floor(explicit));
|
|
15
|
-
return { chunkSize: () => chunk };
|
|
16
|
-
}
|
|
17
|
-
if (!config.text?.layerTypes?.includes("linear_attention")) return { chunkSize: () => 2048 };
|
|
18
|
-
// Capture geometry now, independently of later configuration mutation.
|
|
19
|
-
const geometry = { ...config, text: { ...config.text, layerTypes: [...config.text.layerTypes] } };
|
|
20
|
-
const workspaceBytes = 1024 ** 3;
|
|
21
|
-
return { chunkSize(promptTokens) {
|
|
22
|
-
let chunk = 2048;
|
|
23
|
-
while (chunk > 8 && sdpaFallbackBytes(geometry, chunk, promptTokens) > workspaceBytes) chunk /= 2;
|
|
24
|
-
return chunk;
|
|
25
|
-
} };
|
|
26
|
-
}
|
|
@@ -1,244 +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 { P2RTracePhase, P2RTraceAttributes } from "../../serve/prompt-response-trace";
|
|
13
|
-
import type { MlxForwardWork, MlxPreparationWork } from "./mixed-iteration";
|
|
14
|
-
import type { KvMaintenance } from "./kv-maintenance";
|
|
15
|
-
|
|
16
|
-
// Shared work is recorded on every participating request. workId identifies
|
|
17
|
-
// duplicates when constructing a process timeline; row spans are not additive.
|
|
18
|
-
let nextWorkId = 0;
|
|
19
|
-
function traceRows(states: readonly MlxPrefillState[], phase: P2RTracePhase, attributes: P2RTraceAttributes) {
|
|
20
|
-
if (!states.some(state => state.row.req.trace)) return null;
|
|
21
|
-
const closes = states.map(state => state.row.req.trace?.begin(phase, attributes));
|
|
22
|
-
return { [Symbol.dispose]() { for (const close of closes) close?.(); } };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface MlxPrefillStep extends PrefillStep {
|
|
26
|
-
/** A non-causal input cannot be split at a scheduler token budget.
|
|
27
|
-
* Its preparation must decline joins until this step completes. */
|
|
28
|
-
readonly atomic?: boolean;
|
|
29
|
-
/** Some methods maintain their final target chunk before sampling. */
|
|
30
|
-
readonly maintain?: boolean;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface MlxPrefillState {
|
|
34
|
-
row: Row;
|
|
35
|
-
solo: Cache[];
|
|
36
|
-
pos: number;
|
|
37
|
-
retain?: () => void;
|
|
38
|
-
planned?: MlxPrefillStep;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** The method owns initialization, planning, companion state, snapshots and
|
|
42
|
-
* completion. This driver owns common target batching and work boundaries.
|
|
43
|
-
* Checkpoint factories return owned cache state; close/dispose are idempotent. */
|
|
44
|
-
export interface MlxPrefillRowsHost<State extends MlxPrefillState> {
|
|
45
|
-
stateCodecs?: CacheCodecProvider;
|
|
46
|
-
maintain?: KvMaintenance;
|
|
47
|
-
open(row: Row): State;
|
|
48
|
-
plan(state: State): MlxPrefillStep;
|
|
49
|
-
/** Already prepared state can complete without any target forward. */
|
|
50
|
-
ready?(state: State): boolean;
|
|
51
|
-
forward(ids: MlxArray, caches: Cache[], states: readonly State[], work?: MlxForwardWork): Promise<MlxArray>;
|
|
52
|
-
project(hidden: MlxArray, caches: Cache[], completed: readonly State[]): MlxArray | null;
|
|
53
|
-
/** Consume method context after target maintenance, before snapshots. */
|
|
54
|
-
afterForward?(ids: MlxArray, caches: Cache[], states: readonly State[], hidden: MlxArray): void | Promise<void>;
|
|
55
|
-
checkpoint(state: State, capture: () => Cache[], row: number): void;
|
|
56
|
-
complete(state: State, logits: MlxArray | null, row: number): Promise<void>;
|
|
57
|
-
reject(row: Row, error: unknown): void;
|
|
58
|
-
close(state: State): void;
|
|
59
|
-
filterRows?(keep: readonly number[]): void;
|
|
60
|
-
dispose?(): void;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** One target preparation lifecycle at B1/B>1. Late joins retain each row's
|
|
64
|
-
* planned chunk endpoint, precision transition and checkpoint boundary. */
|
|
65
|
-
export class MlxPrefillRows<State extends MlxPrefillState> implements MlxGroupPreparation {
|
|
66
|
-
#states: State[] = [];
|
|
67
|
-
#rows: Row[] = [];
|
|
68
|
-
#stateRows?: MlxStateRows;
|
|
69
|
-
constructor(readonly operations: MlxPrefillRowsHost<State>) {}
|
|
70
|
-
get rows(): readonly Row[] { return this.#rows; }
|
|
71
|
-
get canAdmit(): boolean { return this.#rows.length > 0; }
|
|
72
|
-
/** Keep a request's prefill weight until retirement so a nearly completed
|
|
73
|
-
* request does not repeatedly attract another long prefill into its tail. */
|
|
74
|
-
get tokenWeight(): number { return this.#states.reduce((sum, state) => sum + state.row.promptTokens - state.row.cachedTokens, 0); }
|
|
75
|
-
|
|
76
|
-
admit(row: Row): void {
|
|
77
|
-
this.#states.push(this.operations.open(row));
|
|
78
|
-
this.#rows.push(row);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
#release(state: State): void {
|
|
82
|
-
const caches = state.solo; state.solo = [];
|
|
83
|
-
const retain = state.retain; state.retain = undefined;
|
|
84
|
-
disposeResources([...caches, { dispose: () => retain?.() }, { dispose: () => this.operations.close(state) }]);
|
|
85
|
-
}
|
|
86
|
-
#filter(keep: number[]): void {
|
|
87
|
-
if (keep.length) this.#stateRows?.filterRows(keep);
|
|
88
|
-
else { const rows = this.#stateRows; this.#stateRows = undefined; rows?.dispose(); }
|
|
89
|
-
this.operations.filterRows?.(keep);
|
|
90
|
-
this.#states = keep.map(row => this.#states[row]!);
|
|
91
|
-
this.#rows = keep.map(row => this.#rows[row]!);
|
|
92
|
-
}
|
|
93
|
-
/** Admission changes membership only between forwards. Existing planned
|
|
94
|
-
* endpoints survive a join, including partially consumed drain chunks. */
|
|
95
|
-
#synchronizeRows(): void {
|
|
96
|
-
if (!this.#stateRows && this.#states.length === 1) return;
|
|
97
|
-
if (!this.#stateRows) {
|
|
98
|
-
for (const state of this.#states) this.operations.maintain?.preparePrefill?.(state.solo);
|
|
99
|
-
const layouts: BatchableCache[] = [];
|
|
100
|
-
try { for (const cache of this.#states[0]!.solo) layouts.push(prefillCacheLayout(cache)); }
|
|
101
|
-
catch (error) { return cleanupFailure(error, () => disposeResources(layouts)); }
|
|
102
|
-
this.#stateRows = new MlxStateRows(layouts);
|
|
103
|
-
this.#stateRows.mergeRows(this.#states.map(state => state.solo));
|
|
104
|
-
} else {
|
|
105
|
-
for (const state of this.#states.slice(this.#stateRows.rowCount)) {
|
|
106
|
-
this.operations.maintain?.preparePrefill?.(state.solo);
|
|
107
|
-
this.#stateRows.append(state.solo);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// Resolve input-backed copies before releasing SSD restore leases.
|
|
111
|
-
if (this.#states.some(state => state.solo.length)) {
|
|
112
|
-
evalCacheState(this.#stateRows.caches);
|
|
113
|
-
for (const state of this.#states) {
|
|
114
|
-
const caches = state.solo; state.solo = [];
|
|
115
|
-
const retain = state.retain; state.retain = undefined;
|
|
116
|
-
disposeResources([...caches, { dispose: () => retain?.() }]);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
for (const cache of this.#stateRows.caches) cache.prefillMaintenance?.beginPrefill();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
async advance(workLimit?: MlxPreparationWork): Promise<boolean> {
|
|
123
|
-
let remaining = workLimit?.maxTokens ?? Infinity;
|
|
124
|
-
// Complete restored inputs before merging: their cache coverage must not
|
|
125
|
-
// introduce padding or a zero-width forward into unrelated cold rows.
|
|
126
|
-
if (this.operations.ready && this.#states.some(state => this.operations.ready!(state))) {
|
|
127
|
-
const remaining: State[] = [];
|
|
128
|
-
for (const state of this.#states) {
|
|
129
|
-
if (!this.operations.ready(state)) { remaining.push(state); continue; }
|
|
130
|
-
try {
|
|
131
|
-
state.row.req.signal?.throwIfAborted();
|
|
132
|
-
await this.operations.complete(state, null, -1);
|
|
133
|
-
state.solo = []; state.retain = undefined;
|
|
134
|
-
} catch (error) { this.operations.reject(state.row, error); this.#release(state); }
|
|
135
|
-
finally { this.operations.close(state); }
|
|
136
|
-
}
|
|
137
|
-
this.#states = remaining; this.#rows = remaining.map(state => state.row);
|
|
138
|
-
if (!remaining.length) { this.dispose(); return true; }
|
|
139
|
-
}
|
|
140
|
-
{
|
|
141
|
-
using span = traceRows(this.#states, "prefill.row_sync", { workId: ++nextWorkId, batchSize: this.#states.length });
|
|
142
|
-
this.#synchronizeRows();
|
|
143
|
-
}
|
|
144
|
-
const keep: number[] = [];
|
|
145
|
-
for (const [index, state] of this.#states.entries()) {
|
|
146
|
-
if (!state.row.req.signal?.aborted) { keep.push(index); continue; }
|
|
147
|
-
this.#release(state); this.operations.reject(state.row, state.row.req.signal.reason);
|
|
148
|
-
}
|
|
149
|
-
if (keep.length !== this.#states.length) this.#filter(keep);
|
|
150
|
-
if (!this.#states.length) { this.dispose(); return true; }
|
|
151
|
-
while (this.#states.length) {
|
|
152
|
-
for (const state of this.#states) state.planned ??= this.operations.plan(state);
|
|
153
|
-
const count = Math.min(this.#states.some(state => state.planned!.atomic) ? Infinity
|
|
154
|
-
: Math.max(1, Math.floor(remaining / this.#states.length)),
|
|
155
|
-
...this.#states.map(state => state.planned!.end - state.pos));
|
|
156
|
-
const work = { workId: ++nextWorkId, batchSize: this.#states.length, tokensPerRow: count };
|
|
157
|
-
const closes = this.#states.map(state => state.row.req.trace?.begin("prefill.chunk", {
|
|
158
|
-
mechanism: "continuous", startToken: state.pos, ...work,
|
|
159
|
-
}));
|
|
160
|
-
const caches = this.#stateRows?.caches ?? this.#states[0]!.solo;
|
|
161
|
-
try {
|
|
162
|
-
using ids = count ? ops.fromInt32(this.#states.flatMap(state => state.row.req.promptIds.slice(state.pos, state.pos + count)),
|
|
163
|
-
[this.#states.length, count]) : null;
|
|
164
|
-
let forwarded: MlxArray | null;
|
|
165
|
-
{
|
|
166
|
-
using span = traceRows(this.#states, "prefill.forward", work);
|
|
167
|
-
forwarded = ids ? await this.operations.forward(ids, caches, this.#states, workLimit?.forward) : null;
|
|
168
|
-
}
|
|
169
|
-
using hidden = forwarded;
|
|
170
|
-
const drains: number[] = [], finals: number[] = [];
|
|
171
|
-
let batchYield = false;
|
|
172
|
-
for (const [row, state] of this.#states.entries()) {
|
|
173
|
-
state.pos += count;
|
|
174
|
-
if (state.pos !== state.planned!.end) continue;
|
|
175
|
-
if (state.planned!.kind === "final") finals.push(row);
|
|
176
|
-
else drains.push(row);
|
|
177
|
-
batchYield ||= state.planned!.batchYield;
|
|
178
|
-
}
|
|
179
|
-
const maintained = [...drains, ...finals.filter(row => this.#states[row]!.planned!.maintain)];
|
|
180
|
-
if (count && (maintained.length || !finals.length)) {
|
|
181
|
-
{
|
|
182
|
-
using span = traceRows(this.#states, "prefill.evaluate", work);
|
|
183
|
-
evalCacheState(caches);
|
|
184
|
-
}
|
|
185
|
-
using span = traceRows(this.#states, "prefill.kv_maintenance", work);
|
|
186
|
-
if (this.#stateRows) {
|
|
187
|
-
for (const cache of caches) cache.prefillMaintenance?.commitPrefill(maintained);
|
|
188
|
-
} else if (maintained.length) this.operations.maintain?.(this.#states[0]!.solo);
|
|
189
|
-
// A scheduler budget can split one planned chunk into many pieces.
|
|
190
|
-
// Resolve state at each yield, but retain allocator reuse until the
|
|
191
|
-
// method's maintenance boundary instead of purging it every piece.
|
|
192
|
-
if (maintained.length) clearCache();
|
|
193
|
-
}
|
|
194
|
-
if (ids && this.operations.afterForward) {
|
|
195
|
-
using span = traceRows(this.#states, "prefill.companion", work);
|
|
196
|
-
const companion = this.operations.afterForward?.(ids, caches, this.#states, hidden!);
|
|
197
|
-
if (companion) await companion;
|
|
198
|
-
}
|
|
199
|
-
for (const row of [...drains, ...finals]) {
|
|
200
|
-
const state = this.#states[row]!;
|
|
201
|
-
if (state.planned!.snapshot) {
|
|
202
|
-
using span = traceRows([state], "prefill.checkpoint", { ...work, row });
|
|
203
|
-
this.operations.checkpoint(state, () =>
|
|
204
|
-
this.#stateRows ? this.#stateRows.extractRow(row) : cloneKvCaches(state.solo, this.operations.stateCodecs), row);
|
|
205
|
-
}
|
|
206
|
-
if (!finals.includes(row)) state.planned = undefined;
|
|
207
|
-
}
|
|
208
|
-
let projected: MlxArray | null = null;
|
|
209
|
-
if (hidden && finals.length) {
|
|
210
|
-
using span = traceRows(this.#states, "prefill.project", work);
|
|
211
|
-
projected = this.operations.project(hidden, caches, finals.map(row => this.#states[row]!));
|
|
212
|
-
}
|
|
213
|
-
using logits = projected;
|
|
214
|
-
for (const row of finals) {
|
|
215
|
-
const state = this.#states[row]!;
|
|
216
|
-
using span = traceRows([state], "prefill.complete", { ...work, row });
|
|
217
|
-
if (this.#stateRows) state.solo = this.#stateRows.extractRow(row);
|
|
218
|
-
using part = logits ? logits.slice([row, logits.shape[1]! - 1, 0], [row + 1, logits.shape[1]!, logits.shape[2]!]) : null;
|
|
219
|
-
try {
|
|
220
|
-
state.row.req.signal?.throwIfAborted();
|
|
221
|
-
await this.operations.complete(state, part, row);
|
|
222
|
-
state.solo = []; state.retain = undefined;
|
|
223
|
-
} catch (error) {
|
|
224
|
-
this.operations.reject(state.row, error);
|
|
225
|
-
this.#release(state);
|
|
226
|
-
} finally { this.operations.close(state); }
|
|
227
|
-
}
|
|
228
|
-
for (const cache of caches) (cache as { releaseRopeArr?: () => void }).releaseRopeArr?.();
|
|
229
|
-
if (finals.length) this.#filter(this.#states.flatMap((_, row) => finals.includes(row) ? [] : [row]));
|
|
230
|
-
if (!this.#states.length) { this.dispose(); return true; }
|
|
231
|
-
remaining -= count * work.batchSize;
|
|
232
|
-
if (batchYield || finals.length || remaining < this.#states.length) return false;
|
|
233
|
-
} finally { for (const close of closes) close?.(); }
|
|
234
|
-
}
|
|
235
|
-
return true;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
dispose(): void {
|
|
239
|
-
const states = this.#states; this.#states = []; this.#rows = [];
|
|
240
|
-
const rows = this.#stateRows; this.#stateRows = undefined;
|
|
241
|
-
disposeResources([...(rows ? [rows] : []), ...states.map(state => ({ dispose: () => this.#release(state) })),
|
|
242
|
-
{ dispose: () => this.operations.dispose?.() }]);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
@@ -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,29 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../../mlx/array";
|
|
2
|
-
import type { Cache } from "../../model/gemma4-base";
|
|
3
|
-
|
|
4
|
-
/** Prepared native input with an indivisible prefill. The preparation owner
|
|
5
|
-
* retains its tensors; the model binding returns an owned final hidden row.
|
|
6
|
-
* Decode, sampling and row retirement use the ordinary execution group. */
|
|
7
|
-
export interface MlxPromptInput {
|
|
8
|
-
forward(ids: MlxArray, caches: Cache[], start?: number): MlxArray;
|
|
9
|
-
readonly decodeState?: MlxDecodeState;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/** Additional model-owned forward state. Equal keys declare compatible row
|
|
13
|
-
* state; the backend supplies the current row order after joins/retirement. */
|
|
14
|
-
export interface MlxDecodeState {
|
|
15
|
-
readonly key: string;
|
|
16
|
-
forward(ids: MlxArray, caches: Cache[], rows: readonly MlxDecodeState[]): MlxArray;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** Preserve the ordinary generator's projection geometry for a prepared
|
|
20
|
-
* embedding sequence: process the whole prompt, then project only its tip. */
|
|
21
|
-
export function bindEmbeddingsInput(
|
|
22
|
-
forward: (ids: MlxArray, caches: Cache[], start: number) => MlxArray,
|
|
23
|
-
): MlxPromptInput {
|
|
24
|
-
return { forward(ids, caches, start = 0) {
|
|
25
|
-
using hidden = forward(ids, caches, start);
|
|
26
|
-
const [batch, length, width] = hidden.shape;
|
|
27
|
-
return hidden.slice([0, length! - 1, 0], [batch!, length!, width!]);
|
|
28
|
-
} };
|
|
29
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { Qwen35Model } from "../../model/qwen3_5";
|
|
2
|
-
import { mropePositionIds, type MropeRequestState } from "../../model/qwen3-mrope";
|
|
3
|
-
import type { MlxArray } from "../../mlx/array";
|
|
4
|
-
import type { Cache } from "../../model/gemma4-base";
|
|
5
|
-
import * as ops from "../../mlx/ops";
|
|
6
|
-
import { Dtype } from "../../mlx/ffi";
|
|
7
|
-
import { bindEmbeddingsInput, type MlxDecodeState, type MlxPromptInput } from "./prompt-input";
|
|
8
|
-
|
|
9
|
-
class QwenMediaDecodeState implements MlxDecodeState {
|
|
10
|
-
readonly key = "qwen-interleaved-mrope";
|
|
11
|
-
constructor(readonly model: Qwen35Model, readonly delta: number) {}
|
|
12
|
-
|
|
13
|
-
forward(ids: MlxArray, caches: Cache[], rows: readonly MlxDecodeState[]): MlxArray {
|
|
14
|
-
const B = rows.length, L = ids.shape[1]!;
|
|
15
|
-
const cache = caches[this.model.faIdx]!;
|
|
16
|
-
// The cache supplies logical positions, including left padding, on device.
|
|
17
|
-
// No offset readback or request-global position mutation is needed.
|
|
18
|
-
const offsets = (cache as Cache & { ropeOffsetArr?: MlxArray }).ropeOffsetArr;
|
|
19
|
-
using deltas = ops.fromInt32(rows.map(row => (row as QwenMediaDecodeState).delta), [B]);
|
|
20
|
-
using scalar = offsets ? null : ops.fromInt32([cache.offset], []);
|
|
21
|
-
using starts = ops.add(offsets ?? scalar!, deltas);
|
|
22
|
-
using startRows = ops.reshape(starts, [B, 1]);
|
|
23
|
-
using indices = ops.arange(0, L, 1, Dtype.int32);
|
|
24
|
-
using positions = ops.add(startRows, indices);
|
|
25
|
-
using axis = ops.reshape(positions, [1, B, L]);
|
|
26
|
-
using grid = ops.concatAxis([axis, axis, axis], 0);
|
|
27
|
-
return this.model.forwardHiddenAtPositions(ids, caches, grid);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** The prompt owns its grid; only its continuation delta survives into decode. */
|
|
32
|
-
export function bindQwenMediaInput(model: Qwen35Model, embeddings: MlxArray,
|
|
33
|
-
state: MropeRequestState): MlxPromptInput {
|
|
34
|
-
const input = bindEmbeddingsInput((ids, caches, start) => {
|
|
35
|
-
using positions = mropePositionIds(state, start, ids.shape[1]!);
|
|
36
|
-
return start > 0 ? model.forwardHiddenAtPositions(ids, caches, positions)
|
|
37
|
-
: model.forwardEmbeddingsAtPositions(embeddings, caches, positions);
|
|
38
|
-
});
|
|
39
|
-
return { ...input, decodeState: new QwenMediaDecodeState(model, state.delta) };
|
|
40
|
-
}
|
|
@@ -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,54 +0,0 @@
|
|
|
1
|
-
import { namespacedCache } from "../../engine/namespaced-cache";
|
|
2
|
-
import { runtimeConfig, runtimeFlag, withRuntimeConfig, type RuntimeConfig } from "../../runtime-config";
|
|
3
|
-
import type { GenerateOptions } from "../../generate";
|
|
4
|
-
import type { RuntimeModel } from "../../model/factory";
|
|
5
|
-
import { KVCache, type Cache } from "../../model/gemma4-base";
|
|
6
|
-
import { PagedKVCache } from "../../lab/paged-kv/paged-kv";
|
|
7
|
-
import type { RowPromptCache } from "./batch-group";
|
|
8
|
-
import { disposeResources } from "../../engine/resources";
|
|
9
|
-
|
|
10
|
-
/** Request state construction and reusable-prefix policy. Equal keys declare
|
|
11
|
-
* compatible state layouts; the executor need not inspect their settings. */
|
|
12
|
-
export interface MlxRequestStatePolicy {
|
|
13
|
-
readonly key: string;
|
|
14
|
-
readonly promptCache?: RowPromptCache;
|
|
15
|
-
create(): Cache[];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** Replace fresh full-attention storage before prefill. Sliding layers retain
|
|
19
|
-
* their layout; pre-warmed library caches retain their existing storage. */
|
|
20
|
-
export function maybePageKv(
|
|
21
|
-
cache: Cache[], options: GenerateOptions, capacityTokens: number,
|
|
22
|
-
): void {
|
|
23
|
-
if (!options.pagedKv) return;
|
|
24
|
-
if (cache.some((c) => c.offset > 0)) return;
|
|
25
|
-
const blockSize = options.pagedKv.blockSize ?? PagedKVCache.DEFAULT_BLOCK_SIZE;
|
|
26
|
-
for (let i = 0; i < cache.length; i++) {
|
|
27
|
-
if (cache[i] instanceof KVCache) {
|
|
28
|
-
cache[i]!.dispose(); // fresh (offset 0) — nothing stored yet
|
|
29
|
-
cache[i] = new PagedKVCache(capacityTokens, blockSize, undefined,
|
|
30
|
-
options.kvBits === 4 || options.kvBits === 8 ? { bits: options.kvBits, groupSize: options.kvGroupSize ?? 64 } : undefined);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function pagedPrefixNamespace(options: GenerateOptions, base: string,
|
|
36
|
-
direct = runtimeFlag("MLX_BUN_PAGED_ATTN", false)): string {
|
|
37
|
-
return JSON.stringify(["paged-v1", options.pagedKv?.blockSize ?? PagedKVCache.DEFAULT_BLOCK_SIZE,
|
|
38
|
-
options.kvBits ?? 0, options.kvGroupSize ?? 64, direct, base]);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function bindPagedRequestState(model: RuntimeModel, options: GenerateOptions,
|
|
42
|
-
capacityTokens: number, cache?: RowPromptCache, runtime: RuntimeConfig = runtimeConfig()): MlxRequestStatePolicy | undefined {
|
|
43
|
-
if (!options.pagedKv) return undefined;
|
|
44
|
-
const blockSize = options.pagedKv.blockSize ?? PagedKVCache.DEFAULT_BLOCK_SIZE;
|
|
45
|
-
const stateOptions = { pagedKv: { blockSize }, kvBits: options.kvBits, kvGroupSize: options.kvGroupSize };
|
|
46
|
-
const direct = runtime.flag("MLX_BUN_PAGED_ATTN", false);
|
|
47
|
-
const namespace = (base: string) => pagedPrefixNamespace(stateOptions, base, direct);
|
|
48
|
-
return { key: namespace(""),
|
|
49
|
-
promptCache: cache ? namespacedCache(cache, namespace) : undefined, create: () => withRuntimeConfig(runtime, () => {
|
|
50
|
-
const caches = model.makeCache();
|
|
51
|
-
try { maybePageKv(caches, stateOptions, capacityTokens); return caches; }
|
|
52
|
-
catch (error) { disposeResources(caches); throw error; }
|
|
53
|
-
}) };
|
|
54
|
-
}
|