mlx-bun 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
package/src/model/profile.ts
DELETED
|
@@ -1,468 +0,0 @@
|
|
|
1
|
-
import type { ModelConfig } from "../config";
|
|
2
|
-
import { configFingerprint } from "./fingerprint";
|
|
3
|
-
import {
|
|
4
|
-
isDiffusionGemmaConfig,
|
|
5
|
-
isGlm52Config,
|
|
6
|
-
isMiniCPM5Config,
|
|
7
|
-
isQwen35Config,
|
|
8
|
-
isQwen3Config,
|
|
9
|
-
isQwen3MoeConfig,
|
|
10
|
-
isWhisperConfig,
|
|
11
|
-
} from "./support";
|
|
12
|
-
import { GENERATED } from "./generated";
|
|
13
|
-
import { GENERIC_MODEL_TYPES, genericArgsFor, remapModelType } from "./universal/archs";
|
|
14
|
-
|
|
15
|
-
export const ENGINE_CAPABILITIES = Object.freeze([
|
|
16
|
-
"autoregressive",
|
|
17
|
-
"colibri-container",
|
|
18
|
-
"diffusion",
|
|
19
|
-
"diffusion-gemma-graph",
|
|
20
|
-
"encoder-decoder",
|
|
21
|
-
"gemma4-graph",
|
|
22
|
-
"generated-graph",
|
|
23
|
-
"glm5.2-graph",
|
|
24
|
-
"minicpm5-graph",
|
|
25
|
-
"mixed-precision-kv",
|
|
26
|
-
"native-mtp",
|
|
27
|
-
"qwen3-graph",
|
|
28
|
-
"qwen3-moe-graph",
|
|
29
|
-
"qwen3.5-graph",
|
|
30
|
-
"recurrent-state",
|
|
31
|
-
"safetensors",
|
|
32
|
-
"streamed-experts",
|
|
33
|
-
"universal-dense-graph",
|
|
34
|
-
"vision-sidecar",
|
|
35
|
-
"whisper-graph",
|
|
36
|
-
] as const);
|
|
37
|
-
|
|
38
|
-
export type EngineCapability = typeof ENGINE_CAPABILITIES[number];
|
|
39
|
-
export type FidelityTier = "l1" | "l2" | "l3";
|
|
40
|
-
|
|
41
|
-
export type FidelityTarget =
|
|
42
|
-
| Readonly<{ tier: "l1"; oracle: "mlx-lm"; claim: "bit-exact" }>
|
|
43
|
-
| Readonly<{ tier: "l1"; oracle: "mlx-whisper"; claim: "bit-exact" }>
|
|
44
|
-
| Readonly<{ tier: "l2"; oracle: "mlx-optiq"; claim: "bit-exact" }>
|
|
45
|
-
| Readonly<{ tier: "l3"; oracle: null; claim: "measured" }>;
|
|
46
|
-
|
|
47
|
-
export type ModelLoader = "safetensors" | "colibri";
|
|
48
|
-
export type ModelGraph =
|
|
49
|
-
| "gemma4"
|
|
50
|
-
| "minicpm5"
|
|
51
|
-
| "qwen3.5"
|
|
52
|
-
| "qwen3"
|
|
53
|
-
| "qwen3-moe"
|
|
54
|
-
| "diffusion-gemma"
|
|
55
|
-
| "glm5.2"
|
|
56
|
-
| "universal-dense"
|
|
57
|
-
| "whisper";
|
|
58
|
-
export type GenerationLoop = "autoregressive" | "diffusion" | "encoder-decoder";
|
|
59
|
-
export type ModelSpecialization = "artifact" | "dedicated" | "generated" | "generic";
|
|
60
|
-
|
|
61
|
-
export interface ModelExecutionComposition {
|
|
62
|
-
readonly loader: ModelLoader;
|
|
63
|
-
readonly graph: ModelGraph;
|
|
64
|
-
readonly loop: GenerationLoop;
|
|
65
|
-
readonly specialization: ModelSpecialization;
|
|
66
|
-
/** Engine-owned code registration. Model files never supply executable code.
|
|
67
|
-
* Omit to retain the existing graph implementation. */
|
|
68
|
-
readonly implementation?: string;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/** A profile declares construction only. Request methods such as MTP, KV
|
|
72
|
-
* schemes, adapters, grammar, and sampling are resolved independently and
|
|
73
|
-
* cannot be rewritten by profile selection. */
|
|
74
|
-
export interface ModelProfile {
|
|
75
|
-
readonly id: string;
|
|
76
|
-
/** Exact external identity. Family profiles omit this field. */
|
|
77
|
-
readonly artifactFingerprint?: string;
|
|
78
|
-
/** Structural guard for an exact artifact declaration. */
|
|
79
|
-
readonly configFingerprint?: string;
|
|
80
|
-
readonly fidelity: FidelityTarget;
|
|
81
|
-
readonly requiredCapabilities: readonly EngineCapability[];
|
|
82
|
-
readonly execution: ModelExecutionComposition;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export interface ArtifactModelProfile extends ModelProfile {
|
|
86
|
-
readonly artifactFingerprint: string;
|
|
87
|
-
readonly configFingerprint: string;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export interface ModelArtifactIdentity {
|
|
91
|
-
readonly fingerprint: string | null;
|
|
92
|
-
readonly configFingerprint: string;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export interface ResolvedModelProfile {
|
|
96
|
-
readonly profile: ModelProfile;
|
|
97
|
-
readonly artifact: ModelArtifactIdentity;
|
|
98
|
-
readonly exactArtifact: boolean;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export interface ResolveModelProfileOptions {
|
|
102
|
-
/** Explicit identity for a non-Hugging-Face artifact. The caller owns its
|
|
103
|
-
* provenance; mlx-bun never mistakes a local path for a content identity. */
|
|
104
|
-
readonly artifactFingerprint?: string | null;
|
|
105
|
-
/** Additional exact declarations composed with the shipped profiles. */
|
|
106
|
-
readonly artifactProfiles?: readonly ArtifactModelProfile[];
|
|
107
|
-
readonly engineCapabilities?: readonly EngineCapability[];
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const L1: FidelityTarget = Object.freeze({
|
|
111
|
-
tier: "l1", oracle: "mlx-lm", claim: "bit-exact",
|
|
112
|
-
});
|
|
113
|
-
/** L1 for speech: the capability's own reference implementation (mlx-whisper)
|
|
114
|
-
* plays the mlx-lm role — no mlx-lm arm exists for Whisper. */
|
|
115
|
-
const L1_WHISPER: FidelityTarget = Object.freeze({
|
|
116
|
-
tier: "l1", oracle: "mlx-whisper", claim: "bit-exact",
|
|
117
|
-
});
|
|
118
|
-
const L2: FidelityTarget = Object.freeze({
|
|
119
|
-
tier: "l2", oracle: "mlx-optiq", claim: "bit-exact",
|
|
120
|
-
});
|
|
121
|
-
const L3: FidelityTarget = Object.freeze({
|
|
122
|
-
tier: "l3", oracle: null, claim: "measured",
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
function freezeProfile<T extends ModelProfile>(profile: T): T {
|
|
126
|
-
Object.freeze(profile.fidelity);
|
|
127
|
-
Object.freeze(profile.requiredCapabilities);
|
|
128
|
-
Object.freeze(profile.execution);
|
|
129
|
-
return Object.freeze(profile);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function snapshotProfile(profile: ModelProfile): ModelProfile {
|
|
133
|
-
return freezeProfile({
|
|
134
|
-
...profile,
|
|
135
|
-
fidelity: { ...profile.fidelity },
|
|
136
|
-
requiredCapabilities: [...profile.requiredCapabilities],
|
|
137
|
-
execution: { ...profile.execution },
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** Exact artifact declarations already backed by this repository's parity or
|
|
142
|
-
* measured evidence. A new revision gets the family profile until it earns a
|
|
143
|
-
* declaration of its own. */
|
|
144
|
-
export const BUILTIN_ARTIFACT_PROFILES: readonly ArtifactModelProfile[] = Object.freeze([
|
|
145
|
-
freezeProfile({
|
|
146
|
-
id: "qwen3.8-27b-optiq-4bit",
|
|
147
|
-
artifactFingerprint:
|
|
148
|
-
"hf:mlx-community/Qwen3.8-27B-OptiQ-4bit@b04599de95d7a9bfbd7f208d347c0f10d9432a42",
|
|
149
|
-
configFingerprint: "50117975cb405944",
|
|
150
|
-
fidelity: L1,
|
|
151
|
-
requiredCapabilities: Object.freeze([
|
|
152
|
-
"safetensors", "autoregressive", "qwen3.5-graph", "recurrent-state", "vision-sidecar",
|
|
153
|
-
]),
|
|
154
|
-
execution: Object.freeze({
|
|
155
|
-
loader: "safetensors",
|
|
156
|
-
graph: "qwen3.5",
|
|
157
|
-
loop: "autoregressive",
|
|
158
|
-
specialization: "artifact",
|
|
159
|
-
}),
|
|
160
|
-
}),
|
|
161
|
-
freezeProfile({
|
|
162
|
-
id: "glm5.2-colibri-int4-int8-mtp",
|
|
163
|
-
artifactFingerprint:
|
|
164
|
-
"hf:mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp@3cc8db99b1b13fc79325d987ba3c1c430766b3b8",
|
|
165
|
-
configFingerprint: "8b49d0941e18f1b9",
|
|
166
|
-
fidelity: L3,
|
|
167
|
-
requiredCapabilities: Object.freeze([
|
|
168
|
-
"colibri-container", "autoregressive", "glm5.2-graph", "streamed-experts",
|
|
169
|
-
]),
|
|
170
|
-
execution: Object.freeze({
|
|
171
|
-
loader: "colibri",
|
|
172
|
-
graph: "glm5.2",
|
|
173
|
-
loop: "autoregressive",
|
|
174
|
-
specialization: "artifact",
|
|
175
|
-
}),
|
|
176
|
-
}),
|
|
177
|
-
]);
|
|
178
|
-
|
|
179
|
-
const FAMILY_PROFILES = {
|
|
180
|
-
gemma4Generated: freezeProfile({
|
|
181
|
-
id: "gemma4-generated",
|
|
182
|
-
fidelity: L1,
|
|
183
|
-
requiredCapabilities: ["safetensors", "autoregressive", "gemma4-graph", "generated-graph"],
|
|
184
|
-
execution: {
|
|
185
|
-
loader: "safetensors", graph: "gemma4", loop: "autoregressive", specialization: "generated",
|
|
186
|
-
},
|
|
187
|
-
}),
|
|
188
|
-
gemma4: freezeProfile({
|
|
189
|
-
id: "gemma4-dedicated",
|
|
190
|
-
fidelity: L1,
|
|
191
|
-
requiredCapabilities: ["safetensors", "autoregressive", "gemma4-graph"],
|
|
192
|
-
execution: {
|
|
193
|
-
loader: "safetensors", graph: "gemma4", loop: "autoregressive", specialization: "dedicated",
|
|
194
|
-
},
|
|
195
|
-
}),
|
|
196
|
-
minicpm5: freezeProfile({
|
|
197
|
-
id: "minicpm5-dedicated",
|
|
198
|
-
fidelity: L1,
|
|
199
|
-
requiredCapabilities: ["safetensors", "autoregressive", "minicpm5-graph"],
|
|
200
|
-
execution: {
|
|
201
|
-
loader: "safetensors", graph: "minicpm5", loop: "autoregressive", specialization: "dedicated",
|
|
202
|
-
},
|
|
203
|
-
}),
|
|
204
|
-
qwen35: freezeProfile({
|
|
205
|
-
id: "qwen3.5-dedicated",
|
|
206
|
-
fidelity: L1,
|
|
207
|
-
requiredCapabilities: ["safetensors", "autoregressive", "qwen3.5-graph", "recurrent-state"],
|
|
208
|
-
execution: {
|
|
209
|
-
loader: "safetensors", graph: "qwen3.5", loop: "autoregressive", specialization: "dedicated",
|
|
210
|
-
},
|
|
211
|
-
}),
|
|
212
|
-
qwen3: freezeProfile({
|
|
213
|
-
id: "qwen3-dedicated",
|
|
214
|
-
fidelity: L1,
|
|
215
|
-
requiredCapabilities: ["safetensors", "autoregressive", "qwen3-graph"],
|
|
216
|
-
execution: {
|
|
217
|
-
loader: "safetensors", graph: "qwen3", loop: "autoregressive", specialization: "dedicated",
|
|
218
|
-
},
|
|
219
|
-
}),
|
|
220
|
-
qwen3Moe: freezeProfile({
|
|
221
|
-
id: "qwen3-moe-dedicated",
|
|
222
|
-
fidelity: L1,
|
|
223
|
-
requiredCapabilities: ["safetensors", "autoregressive", "qwen3-moe-graph"],
|
|
224
|
-
execution: {
|
|
225
|
-
loader: "safetensors", graph: "qwen3-moe", loop: "autoregressive", specialization: "dedicated",
|
|
226
|
-
},
|
|
227
|
-
}),
|
|
228
|
-
diffusionGemma: freezeProfile({
|
|
229
|
-
id: "diffusion-gemma-dedicated",
|
|
230
|
-
fidelity: L2,
|
|
231
|
-
requiredCapabilities: ["safetensors", "diffusion", "diffusion-gemma-graph"],
|
|
232
|
-
execution: {
|
|
233
|
-
loader: "safetensors", graph: "diffusion-gemma", loop: "diffusion", specialization: "dedicated",
|
|
234
|
-
},
|
|
235
|
-
}),
|
|
236
|
-
glm52: freezeProfile({
|
|
237
|
-
id: "glm5.2-colibri",
|
|
238
|
-
fidelity: L3,
|
|
239
|
-
requiredCapabilities: ["colibri-container", "autoregressive", "glm5.2-graph", "streamed-experts"],
|
|
240
|
-
execution: {
|
|
241
|
-
loader: "colibri", graph: "glm5.2", loop: "autoregressive", specialization: "dedicated",
|
|
242
|
-
},
|
|
243
|
-
}),
|
|
244
|
-
whisper: freezeProfile({
|
|
245
|
-
id: "whisper-dedicated",
|
|
246
|
-
fidelity: L1_WHISPER,
|
|
247
|
-
requiredCapabilities: ["safetensors", "encoder-decoder", "whisper-graph"],
|
|
248
|
-
execution: {
|
|
249
|
-
loader: "safetensors", graph: "whisper", loop: "encoder-decoder", specialization: "dedicated",
|
|
250
|
-
},
|
|
251
|
-
}),
|
|
252
|
-
universal: freezeProfile({
|
|
253
|
-
id: "universal-dense",
|
|
254
|
-
fidelity: L1,
|
|
255
|
-
requiredCapabilities: ["safetensors", "autoregressive", "universal-dense-graph"],
|
|
256
|
-
execution: {
|
|
257
|
-
loader: "safetensors", graph: "universal-dense", loop: "autoregressive", specialization: "generic",
|
|
258
|
-
},
|
|
259
|
-
}),
|
|
260
|
-
} satisfies Record<string, ModelProfile>;
|
|
261
|
-
|
|
262
|
-
/** Return a stable external fingerprint only when the directory is an exact HF
|
|
263
|
-
* snapshot revision. Relocation does not change the identity. Arbitrary local
|
|
264
|
-
* directories and mutable aliases intentionally return null. */
|
|
265
|
-
export function externalArtifactFingerprint(modelDir: string): string | null {
|
|
266
|
-
const match = modelDir.replaceAll("\\", "/").match(
|
|
267
|
-
/(?:^|\/)models--([^/]+)\/snapshots\/([0-9a-f]{40,64})(?:\/|$)/i,
|
|
268
|
-
);
|
|
269
|
-
if (!match) return null;
|
|
270
|
-
const encodedRepo = match[1]!;
|
|
271
|
-
const separator = encodedRepo.indexOf("--");
|
|
272
|
-
if (separator <= 0 || separator === encodedRepo.length - 2) return null;
|
|
273
|
-
const repo = `${encodedRepo.slice(0, separator)}/${encodedRepo.slice(separator + 2)}`;
|
|
274
|
-
return `hf:${repo}@${match[2]!.toLowerCase()}`;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
function familyProfile(config: ModelConfig, fingerprint: string): ModelProfile {
|
|
278
|
-
if (isGlm52Config(config)) return FAMILY_PROFILES.glm52;
|
|
279
|
-
if (isDiffusionGemmaConfig(config)) return FAMILY_PROFILES.diffusionGemma;
|
|
280
|
-
if (isMiniCPM5Config(config)) return FAMILY_PROFILES.minicpm5;
|
|
281
|
-
if (isQwen35Config(config)) return FAMILY_PROFILES.qwen35;
|
|
282
|
-
if (isQwen3MoeConfig(config)) return FAMILY_PROFILES.qwen3Moe;
|
|
283
|
-
if (isQwen3Config(config)) return FAMILY_PROFILES.qwen3;
|
|
284
|
-
if (isWhisperConfig(config)) return FAMILY_PROFILES.whisper;
|
|
285
|
-
if (config.modelType.startsWith("gemma4"))
|
|
286
|
-
return GENERATED.has(fingerprint) ? FAMILY_PROFILES.gemma4Generated : FAMILY_PROFILES.gemma4;
|
|
287
|
-
if (genericArgsFor(config)) return FAMILY_PROFILES.universal;
|
|
288
|
-
|
|
289
|
-
const arch = remapModelType(config.modelType);
|
|
290
|
-
throw new Error(
|
|
291
|
-
`unsupported model_type "${config.modelType}"` +
|
|
292
|
-
(arch !== config.modelType ? ` (mlx-lm remaps it to "${arch}")` : "") +
|
|
293
|
-
` — targeted: gemma4*, diffusion_gemma, glm_moe_dsa, qwen3_5, qwen3, qwen3_moe, whisper, MiniCPM5;` +
|
|
294
|
-
` generic (Tier-0): ${[...GENERIC_MODEL_TYPES].sort().join(", ")}`,
|
|
295
|
-
);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
interface GraphMetadata {
|
|
299
|
-
readonly accepts: (config: ModelConfig) => boolean;
|
|
300
|
-
readonly capabilities: readonly EngineCapability[];
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
const GRAPH_METADATA: Readonly<Record<ModelGraph, GraphMetadata>> = Object.freeze({
|
|
304
|
-
"gemma4": {
|
|
305
|
-
accepts: (config) => config.modelType.startsWith("gemma4"),
|
|
306
|
-
capabilities: ["gemma4-graph"],
|
|
307
|
-
},
|
|
308
|
-
"minicpm5": { accepts: isMiniCPM5Config, capabilities: ["minicpm5-graph"] },
|
|
309
|
-
"qwen3.5": {
|
|
310
|
-
accepts: isQwen35Config,
|
|
311
|
-
capabilities: ["qwen3.5-graph", "recurrent-state"],
|
|
312
|
-
},
|
|
313
|
-
"qwen3": { accepts: isQwen3Config, capabilities: ["qwen3-graph"] },
|
|
314
|
-
"qwen3-moe": { accepts: isQwen3MoeConfig, capabilities: ["qwen3-moe-graph"] },
|
|
315
|
-
"diffusion-gemma": {
|
|
316
|
-
accepts: isDiffusionGemmaConfig,
|
|
317
|
-
capabilities: ["diffusion-gemma-graph"],
|
|
318
|
-
},
|
|
319
|
-
"glm5.2": {
|
|
320
|
-
accepts: isGlm52Config,
|
|
321
|
-
capabilities: ["glm5.2-graph", "streamed-experts"],
|
|
322
|
-
},
|
|
323
|
-
"whisper": { accepts: isWhisperConfig, capabilities: ["whisper-graph"] },
|
|
324
|
-
"universal-dense": {
|
|
325
|
-
accepts: (config) => {
|
|
326
|
-
try { return genericArgsFor(config) !== null; } catch { return false; }
|
|
327
|
-
},
|
|
328
|
-
capabilities: ["universal-dense-graph"],
|
|
329
|
-
},
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
function graphAccepts(profile: ModelProfile, config: ModelConfig): boolean {
|
|
333
|
-
return GRAPH_METADATA[profile.execution.graph].accepts(config);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
function executionCapabilities(profile: ModelProfile): EngineCapability[] {
|
|
337
|
-
const required: EngineCapability[] = [profile.execution.loader === "colibri"
|
|
338
|
-
? "colibri-container"
|
|
339
|
-
: "safetensors"];
|
|
340
|
-
if (profile.execution.loop === "diffusion") required.push("diffusion");
|
|
341
|
-
else if (profile.execution.loop === "encoder-decoder") required.push("encoder-decoder");
|
|
342
|
-
else required.push("autoregressive");
|
|
343
|
-
required.push(...GRAPH_METADATA[profile.execution.graph].capabilities);
|
|
344
|
-
if (profile.execution.specialization === "generated") required.push("generated-graph");
|
|
345
|
-
return required;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
function validateProfile(profile: ModelProfile): void {
|
|
349
|
-
if (!profile.id) throw new Error("model profile id must not be empty");
|
|
350
|
-
if (profile.execution.implementation !== undefined &&
|
|
351
|
-
(!profile.execution.implementation.trim() || !profile.artifactFingerprint ||
|
|
352
|
-
profile.execution.specialization !== "artifact"))
|
|
353
|
-
throw new Error(`model profile ${profile.id} must bind a named implementation to an exact artifact`);
|
|
354
|
-
if ((profile.artifactFingerprint === undefined) !== (profile.configFingerprint === undefined))
|
|
355
|
-
throw new Error(
|
|
356
|
-
`model profile ${profile.id} must declare artifactFingerprint and configFingerprint together`,
|
|
357
|
-
);
|
|
358
|
-
const fidelityOk =
|
|
359
|
-
(profile.fidelity.tier === "l1" && profile.fidelity.oracle === "mlx-lm" &&
|
|
360
|
-
profile.fidelity.claim === "bit-exact") ||
|
|
361
|
-
(profile.fidelity.tier === "l1" && profile.fidelity.oracle === "mlx-whisper" &&
|
|
362
|
-
profile.fidelity.claim === "bit-exact" && profile.execution.graph === "whisper") ||
|
|
363
|
-
(profile.fidelity.tier === "l2" && profile.fidelity.oracle === "mlx-optiq" &&
|
|
364
|
-
profile.fidelity.claim === "bit-exact") ||
|
|
365
|
-
(profile.fidelity.tier === "l3" && profile.fidelity.oracle === null &&
|
|
366
|
-
profile.fidelity.claim === "measured");
|
|
367
|
-
if (!fidelityOk) throw new Error(`model profile ${profile.id} has an invalid fidelity contract`);
|
|
368
|
-
const expectedLoader = profile.execution.graph === "glm5.2" ? "colibri" : "safetensors";
|
|
369
|
-
const expectedLoop = profile.execution.graph === "diffusion-gemma"
|
|
370
|
-
? "diffusion"
|
|
371
|
-
: profile.execution.graph === "whisper"
|
|
372
|
-
? "encoder-decoder"
|
|
373
|
-
: "autoregressive";
|
|
374
|
-
if (profile.execution.loader !== expectedLoader || profile.execution.loop !== expectedLoop)
|
|
375
|
-
throw new Error(
|
|
376
|
-
`model profile ${profile.id} has an invalid execution composition for ` +
|
|
377
|
-
`${profile.execution.graph}`,
|
|
378
|
-
);
|
|
379
|
-
const declared = new Set(profile.requiredCapabilities);
|
|
380
|
-
const underdeclared = executionCapabilities(profile).filter((capability) => !declared.has(capability));
|
|
381
|
-
if (underdeclared.length)
|
|
382
|
-
throw new Error(
|
|
383
|
-
`model profile ${profile.id} does not declare execution capabilities: ` +
|
|
384
|
-
`${underdeclared.join(", ")}`,
|
|
385
|
-
);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
export function resolveModelProfile(
|
|
389
|
-
config: ModelConfig,
|
|
390
|
-
options: ResolveModelProfileOptions = {},
|
|
391
|
-
): ResolvedModelProfile {
|
|
392
|
-
const fingerprint = configFingerprint(config);
|
|
393
|
-
const artifactFingerprint = options.artifactFingerprint === undefined
|
|
394
|
-
? externalArtifactFingerprint(config.modelDir)
|
|
395
|
-
: options.artifactFingerprint;
|
|
396
|
-
const artifactProfiles = options.artifactProfiles
|
|
397
|
-
? [...BUILTIN_ARTIFACT_PROFILES, ...options.artifactProfiles]
|
|
398
|
-
: BUILTIN_ARTIFACT_PROFILES;
|
|
399
|
-
const capabilities = new Set(options.engineCapabilities ?? ENGINE_CAPABILITIES);
|
|
400
|
-
|
|
401
|
-
let profile: ModelProfile | undefined;
|
|
402
|
-
let exactArtifact = false;
|
|
403
|
-
if (artifactFingerprint) {
|
|
404
|
-
const matches = artifactProfiles.filter((entry) => {
|
|
405
|
-
validateProfile(entry);
|
|
406
|
-
return entry.artifactFingerprint === artifactFingerprint;
|
|
407
|
-
});
|
|
408
|
-
if (matches.length > 1)
|
|
409
|
-
throw new Error(`multiple model profiles declare artifact ${artifactFingerprint}`);
|
|
410
|
-
profile = matches[0];
|
|
411
|
-
if (profile) {
|
|
412
|
-
exactArtifact = true;
|
|
413
|
-
if (profile.configFingerprint !== fingerprint)
|
|
414
|
-
throw new Error(
|
|
415
|
-
`model profile ${profile.id} matched artifact ${artifactFingerprint}, but config fingerprint ` +
|
|
416
|
-
`${fingerprint} != declared ${profile.configFingerprint}; refusing to fall back`,
|
|
417
|
-
);
|
|
418
|
-
if (!graphAccepts(profile, config))
|
|
419
|
-
throw new Error(
|
|
420
|
-
`model profile ${profile.id} selects ${profile.execution.graph}, which is incompatible with ` +
|
|
421
|
-
`${config.modelType}; refusing to fall back`,
|
|
422
|
-
);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
profile ??= familyProfile(config, fingerprint);
|
|
426
|
-
validateProfile(profile);
|
|
427
|
-
profile = snapshotProfile(profile);
|
|
428
|
-
|
|
429
|
-
const missing = profile.requiredCapabilities.filter((capability) => !capabilities.has(capability));
|
|
430
|
-
if (missing.length)
|
|
431
|
-
throw new Error(
|
|
432
|
-
`model profile ${profile.id} requires missing engine capabilities: ${missing.join(", ")}; ` +
|
|
433
|
-
`refusing to fall back`,
|
|
434
|
-
);
|
|
435
|
-
|
|
436
|
-
return Object.freeze({
|
|
437
|
-
profile,
|
|
438
|
-
artifact: Object.freeze({ fingerprint: artifactFingerprint, configFingerprint: fingerprint }),
|
|
439
|
-
exactArtifact,
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
/** Guard the factory seam when a caller passes a previously resolved profile. */
|
|
444
|
-
export function assertResolvedModelProfile(
|
|
445
|
-
config: ModelConfig,
|
|
446
|
-
resolved: ResolvedModelProfile,
|
|
447
|
-
): void {
|
|
448
|
-
validateProfile(resolved.profile);
|
|
449
|
-
const fingerprint = configFingerprint(config);
|
|
450
|
-
if (resolved.artifact.configFingerprint !== fingerprint)
|
|
451
|
-
throw new Error(
|
|
452
|
-
`model profile ${resolved.profile.id} was resolved for config ` +
|
|
453
|
-
`${resolved.artifact.configFingerprint}, not ${fingerprint}`,
|
|
454
|
-
);
|
|
455
|
-
if (!graphAccepts(resolved.profile, config))
|
|
456
|
-
throw new Error(
|
|
457
|
-
`model profile ${resolved.profile.id} selects ${resolved.profile.execution.graph}, ` +
|
|
458
|
-
`which is incompatible with ${config.modelType}`,
|
|
459
|
-
);
|
|
460
|
-
if (resolved.exactArtifact !== (resolved.profile.artifactFingerprint !== undefined) ||
|
|
461
|
-
(resolved.exactArtifact &&
|
|
462
|
-
(resolved.profile.artifactFingerprint !== resolved.artifact.fingerprint ||
|
|
463
|
-
resolved.profile.configFingerprint !== fingerprint)))
|
|
464
|
-
throw new Error(
|
|
465
|
-
`model profile ${resolved.profile.id} does not match artifact ` +
|
|
466
|
-
`${resolved.artifact.fingerprint ?? "<unidentified>"}`,
|
|
467
|
-
);
|
|
468
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../mlx/array";
|
|
2
|
-
import * as ops from "../mlx/ops";
|
|
3
|
-
import { quantizedSdpa } from "./gemma4-base";
|
|
4
|
-
|
|
5
|
-
/** Committed positions retain single-token attention arithmetic. Projection
|
|
6
|
-
* work can still share the span; each query sees its own causal KV prefix. */
|
|
7
|
-
export function quantizedAppendAttention(
|
|
8
|
-
q: MlxArray, keys: ops.QuantizedTensor, values: ops.QuantizedTensor,
|
|
9
|
-
scale: number, groupSize: number, bits: number,
|
|
10
|
-
): MlxArray {
|
|
11
|
-
const [batch, heads, length, dim] = q.shape as [number, number, number, number];
|
|
12
|
-
const prefix = keys.packed.shape[2]! - length;
|
|
13
|
-
const outputs: MlxArray[] = [];
|
|
14
|
-
const trim = (tensor: ops.QuantizedTensor, end: number) => {
|
|
15
|
-
const slice = (a: MlxArray) => a.slice([0, 0, 0, 0],
|
|
16
|
-
[a.shape[0]!, a.shape[1]!, end, a.shape[3]!]);
|
|
17
|
-
return { packed: slice(tensor.packed), scales: slice(tensor.scales), biases: slice(tensor.biases) };
|
|
18
|
-
};
|
|
19
|
-
try {
|
|
20
|
-
for (let row = 0; row < length; row++) {
|
|
21
|
-
using queryView = q.slice([0, 0, row, 0], [batch, heads, row + 1, dim]);
|
|
22
|
-
using query = ops.contiguous(queryView);
|
|
23
|
-
const k = trim(keys, prefix + row + 1), v = trim(values, prefix + row + 1);
|
|
24
|
-
try { outputs.push(quantizedSdpa(query, k, v, scale, { mode: "", arr: null }, groupSize, bits)); }
|
|
25
|
-
finally {
|
|
26
|
-
for (const t of [k, v]) { t.packed.dispose(); t.scales.dispose(); t.biases.dispose(); }
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return ops.concatAxis(outputs, 2);
|
|
30
|
-
} finally { for (const output of outputs) output.dispose(); }
|
|
31
|
-
}
|
package/src/model/qwen-append.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// MLX 0.32.2, mlx/backend/metal/scaled_dot_product_attention.cpp (MIT):
|
|
2
|
-
// https://github.com/ml-explore/mlx/blob/v0.32.2/mlx/backend/metal/scaled_dot_product_attention.cpp
|
|
3
|
-
// For the qualified Qwen GQA-6/D256 graph on applegpu_g16s, one-pass/vector
|
|
4
|
-
// selection and two-pass block counts change after these inclusive KV lengths.
|
|
5
|
-
// A committed span must stay within one arithmetic regime to match M=1.
|
|
6
|
-
const ATTENTION_BOUNDARIES = [1023, 1024, 8192, 32768, 65536];
|
|
7
|
-
|
|
8
|
-
export function qwenAppendChunkSize(cacheTokens: number): number {
|
|
9
|
-
for (const end of ATTENTION_BOUNDARIES)
|
|
10
|
-
if (cacheTokens < end) return Math.min(4, end - cacheTokens);
|
|
11
|
-
return 4;
|
|
12
|
-
}
|
package/src/model/qwen-conv.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
// Experimental Qwen GDN convolution. Its two outputs are evaluated together:
|
|
2
|
-
// consuming the activation also materializes the small, independently owned
|
|
3
|
-
// state tail, without keeping a concatenated prefill buffer alive for it.
|
|
4
|
-
// Arithmetic follows MLX 0.31.2 depthwise_conv_1d and unary sigmoid (MIT,
|
|
5
|
-
// Copyright Apple Inc.), preserving the bf16 intermediate rounding.
|
|
6
|
-
import type { MlxArray } from "../mlx/array";
|
|
7
|
-
import { Dtype } from "../mlx/ffi";
|
|
8
|
-
import { MetalKernel } from "../mlx/metal-kernel";
|
|
9
|
-
|
|
10
|
-
/** Borrow all inputs; return owned activation and an independent state tail. */
|
|
11
|
-
export type QwenConvolution = (x: MlxArray, state: MlxArray, weight: MlxArray) => [MlxArray, MlxArray];
|
|
12
|
-
|
|
13
|
-
let kernel: MetalKernel | null = null;
|
|
14
|
-
export const fusedQwenConvolution: QwenConvolution = (x, state, weight) => {
|
|
15
|
-
const [B, M, D] = x.shape as [number, number, number];
|
|
16
|
-
const K = weight.shape[1]!;
|
|
17
|
-
if (x.shape.length !== 3 || weight.shape.length !== 3 || weight.shape[0] !== D ||
|
|
18
|
-
weight.shape[2] !== 1 || K !== 4 || state.shape.join() !== [B, K - 1, D].join() ||
|
|
19
|
-
![Dtype.bfloat16, Dtype.float32].includes(x.dtype) || state.dtype !== x.dtype || weight.dtype !== x.dtype)
|
|
20
|
-
throw new Error("fused Qwen convolution requires matching bf16/f32 inputs, [B,M,D], [B,3,D], [D,4,1]");
|
|
21
|
-
kernel ??= new MetalKernel({ name: "qwen_causal_conv_silu_tail",
|
|
22
|
-
inputNames: ["state", "x", "w"], outputNames: ["out", "tail"],
|
|
23
|
-
source: String.raw`
|
|
24
|
-
const uint c = thread_position_in_grid.x;
|
|
25
|
-
const uint t = thread_position_in_grid.y;
|
|
26
|
-
const uint b = thread_position_in_grid.z;
|
|
27
|
-
if (c >= D) return;
|
|
28
|
-
if (t < M) {
|
|
29
|
-
float acc = 0.0f;
|
|
30
|
-
for (uint i = 0; i < K; ++i) {
|
|
31
|
-
const uint row = t + i;
|
|
32
|
-
const T value = row < K-1 ? state[(b*(K-1)+row)*D+c] : x[(b*M+row-(K-1))*D+c];
|
|
33
|
-
acc += float(value) * float(w[c*K+i]);
|
|
34
|
-
}
|
|
35
|
-
const T conv = T(acc);
|
|
36
|
-
// Preserve the pinned MLX sigmoid's typed operations and bf16
|
|
37
|
-
// intermediate rounding. Promoting this expression to f32 differs.
|
|
38
|
-
const auto y = 1 / (1 + metal::exp(metal::abs(conv)));
|
|
39
|
-
const T sig = conv < 0 ? y : 1-y;
|
|
40
|
-
out[(b*M+t)*D+c] = conv * sig;
|
|
41
|
-
}
|
|
42
|
-
if (t < K-1) {
|
|
43
|
-
const uint row = M + t;
|
|
44
|
-
tail[(b*(K-1)+t)*D+c] = row < K-1 ? state[(b*(K-1)+row)*D+c] : x[(b*M+row-(K-1))*D+c];
|
|
45
|
-
}
|
|
46
|
-
` });
|
|
47
|
-
return kernel.apply([state, x, weight], {
|
|
48
|
-
outputs: [{ shape: [B, M, D], dtype: x.dtype }, { shape: [B, K - 1, D], dtype: x.dtype }],
|
|
49
|
-
grid: [D, Math.max(M, K - 1), B], threadGroup: [256, 1, 1],
|
|
50
|
-
templateDtypes: { T: x.dtype }, templateInts: { D, M, K },
|
|
51
|
-
}) as [MlxArray, MlxArray];
|
|
52
|
-
};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { MlxArray } from "../mlx/array";
|
|
2
|
-
import { Dtype } from "../mlx/ffi";
|
|
3
|
-
import { MetalKernel } from "../mlx/metal-kernel";
|
|
4
|
-
import * as ops from "../mlx/ops";
|
|
5
|
-
import { computeG } from "./qwen3-delta";
|
|
6
|
-
|
|
7
|
-
// The same recurrent arithmetic as gated_delta_step, with no query/output
|
|
8
|
-
// calculation. Each row replays only its retained prefix of the verify window.
|
|
9
|
-
const SOURCE = String.raw`
|
|
10
|
-
const int T = Tin[0];
|
|
11
|
-
auto n = thread_position_in_grid.z;
|
|
12
|
-
auto b_idx = n / Hv;
|
|
13
|
-
auto hv_idx = n % Hv;
|
|
14
|
-
auto hk_idx = hv_idx / (Hv / Hk);
|
|
15
|
-
constexpr int n_per_t = Dk / 32;
|
|
16
|
-
auto dk_idx = thread_position_in_threadgroup.x;
|
|
17
|
-
auto dv_idx = thread_position_in_grid.y;
|
|
18
|
-
auto k_ = k + b_idx * T * Hk * Dk + hk_idx * Dk;
|
|
19
|
-
auto v_ = v + b_idx * T * Hv * Dv + hv_idx * Dv;
|
|
20
|
-
auto g_ = g + b_idx * T * Hv;
|
|
21
|
-
auto beta_ = beta + b_idx * T * Hv;
|
|
22
|
-
auto i_state = state_in + (n * Dv + dv_idx) * Dk;
|
|
23
|
-
auto o_state = state_out + (n * Dv + dv_idx) * Dk;
|
|
24
|
-
float state[n_per_t];
|
|
25
|
-
for (int i = 0; i < n_per_t; ++i)
|
|
26
|
-
state[i] = static_cast<float>(i_state[n_per_t * dk_idx + i]);
|
|
27
|
-
const int keep = lengths[b_idx];
|
|
28
|
-
for (int t = 0; t < keep; ++t) {
|
|
29
|
-
float kv_mem = 0.0f;
|
|
30
|
-
for (int i = 0; i < n_per_t; ++i) {
|
|
31
|
-
auto s_idx = n_per_t * dk_idx + i;
|
|
32
|
-
state[i] = state[i] * g_[hv_idx];
|
|
33
|
-
kv_mem += state[i] * k_[s_idx];
|
|
34
|
-
}
|
|
35
|
-
kv_mem = simd_sum(kv_mem);
|
|
36
|
-
auto delta = (v_[dv_idx] - kv_mem) * beta_[hv_idx];
|
|
37
|
-
for (int i = 0; i < n_per_t; ++i) {
|
|
38
|
-
auto s_idx = n_per_t * dk_idx + i;
|
|
39
|
-
state[i] = state[i] + k_[s_idx] * delta;
|
|
40
|
-
}
|
|
41
|
-
k_ += Hk * Dk;
|
|
42
|
-
v_ += Hv * Dv;
|
|
43
|
-
g_ += Hv;
|
|
44
|
-
beta_ += Hv;
|
|
45
|
-
}
|
|
46
|
-
for (int i = 0; i < n_per_t; ++i)
|
|
47
|
-
o_state[n_per_t * dk_idx + i] = state[i];
|
|
48
|
-
`;
|
|
49
|
-
|
|
50
|
-
let kernel: MetalKernel | undefined;
|
|
51
|
-
|
|
52
|
-
/** State-only prefix replay. Inputs keep their original [B,T,...] strides;
|
|
53
|
-
* lengths are request-owned accepted counts, never scheduling decisions. */
|
|
54
|
-
export function gatedDeltaState(
|
|
55
|
-
k: MlxArray, v: MlxArray, a: MlxArray, b: MlxArray,
|
|
56
|
-
aLog: MlxArray, dtBias: MlxArray, state: MlxArray | null,
|
|
57
|
-
lengths: readonly number[],
|
|
58
|
-
): MlxArray {
|
|
59
|
-
const [B, T, Hk, Dk] = k.shape as [number, number, number, number];
|
|
60
|
-
const [, , Hv, Dv] = v.shape as [number, number, number, number];
|
|
61
|
-
using beta = ops.sigmoid(b);
|
|
62
|
-
using g = computeG(aLog, a, dtBias);
|
|
63
|
-
using zero = state ? null : ops.zeros([B, Hv, Dv, Dk], Dtype.float32);
|
|
64
|
-
using t = ops.fromInt32([T], [1]);
|
|
65
|
-
using kept = ops.fromInt32([...lengths], [B]);
|
|
66
|
-
kernel ??= new MetalKernel({ name: "gated_delta_prefix_state",
|
|
67
|
-
inputNames: ["k", "v", "g", "beta", "state_in", "Tin", "lengths"],
|
|
68
|
-
outputNames: ["state_out"], source: SOURCE, ensureRowContiguous: true });
|
|
69
|
-
return kernel.apply([k, v, g, beta, state ?? zero!, t, kept], {
|
|
70
|
-
outputs: [{ shape: [B, Hv, Dv, Dk], dtype: Dtype.float32 }],
|
|
71
|
-
grid: [32, Dv, B * Hv], threadGroup: [32, 4, 1],
|
|
72
|
-
templateInts: { Dk, Dv, Hk, Hv },
|
|
73
|
-
})[0]!;
|
|
74
|
-
}
|