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,94 +0,0 @@
|
|
|
1
|
-
// Packed Trellis prefill with MLX 0.32.2 GemvWide arithmetic.
|
|
2
|
-
// Ported from ml-explore/mlx v0.32.2, mlx/backend/metal/kernels/gemv.h
|
|
3
|
-
// (MIT). Decode weights to bf16 inside the native dot/unroll/shuffle order;
|
|
4
|
-
// share each decoded row across every input vector in this narrow regime.
|
|
5
|
-
import { MetalKernel } from "../mlx/metal-kernel";
|
|
6
|
-
import { type MlxArray } from "../mlx/array";
|
|
7
|
-
import { Dtype, deviceArchitecture } from "../mlx/ffi";
|
|
8
|
-
import { type TrellisGeometry } from "./trellis-linear";
|
|
9
|
-
|
|
10
|
-
/** Matches the bundled runtime's native reduction on M3 and newer GPUs. */
|
|
11
|
-
export function nativeTrellisWidePrefill(m: number): boolean {
|
|
12
|
-
return m >= 5 && m <= 15 &&
|
|
13
|
-
Number(/^applegpu_[a-z](\d{2})/.exec(deviceArchitecture())?.[1] ?? 0) >= 15;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function wideTrellisPrefillEligible(g: TrellisGeometry, m: number, dtype: Dtype): boolean {
|
|
17
|
-
return dtype === Dtype.bfloat16 && nativeTrellisWidePrefill(m) &&
|
|
18
|
-
g.axis === 1 && g.T === 256 && g.L === 12 && [2, 3, 4].includes(g.k) &&
|
|
19
|
-
g.inFeatures === 5120 && g.outFeatures === 17408 && !g.blockInterleave;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
let kernel: MetalKernel | undefined;
|
|
23
|
-
function wideKernel() {
|
|
24
|
-
return kernel ??= new MetalKernel({ name: 'mlx_bun_trellis_wide_prefill',
|
|
25
|
-
inputNames: ['x', 'codes', 'scales'], outputNames: ['out'], source: String.raw`
|
|
26
|
-
constexpr uint unroll=8, rows_per_simd=32/KL, simdgroups=KL/8;
|
|
27
|
-
const uint lane=thread_index_in_simdgroup, sg=simdgroup_index_in_threadgroup;
|
|
28
|
-
const uint kl=lane%KL, row=threadgroup_position_in_grid.y*4+sg*rows_per_simd+lane/KL;
|
|
29
|
-
const uint vec0=threadgroup_position_in_grid.x*SM;
|
|
30
|
-
constexpr uint wpb=BT*BITS/32, row_words=KC*BITS/32;
|
|
31
|
-
const float scale=float(scales[row]);
|
|
32
|
-
constexpr uint n_v4=KC/4, n_main=n_v4-n_v4%(KL*unroll);
|
|
33
|
-
float result[SM]={0};
|
|
34
|
-
for(uint base=0;base<n_main;base+=KL*unroll) {
|
|
35
|
-
float4 wf[unroll];
|
|
36
|
-
#pragma clang loop unroll(full)
|
|
37
|
-
for(uint i=0;i<unroll;i++) {
|
|
38
|
-
#pragma clang loop unroll(full)
|
|
39
|
-
for(uint c=0;c<4;c++) {
|
|
40
|
-
const uint k=(base+i*KL+kl)*4+c, block=k/BT, t=k%BT;
|
|
41
|
-
const device uint* bw=codes+(ulong)row*row_words+block*wpb;
|
|
42
|
-
const uint pos=(BT-1-t)*BITS, wi=pos>>5, off=pos&31u;
|
|
43
|
-
uint win=bw[wi]>>off;
|
|
44
|
-
if(off+L>32)win|=bw[wi+1==wpb?0:wi+1]<<(32-off);
|
|
45
|
-
win&=(1u<<L)-1;
|
|
46
|
-
const uint z=win*34038481u+76625530u;
|
|
47
|
-
const uint p=(z&0x00FF00FFu)+((z>>8)&0x00FF00FFu);
|
|
48
|
-
const int code=int((p&0xFFFFu)+(p>>16))-510;
|
|
49
|
-
const float reciprocal=1.0f/147.800537109375f;
|
|
50
|
-
const float approx=float(code)*reciprocal;
|
|
51
|
-
const float residual=metal::fma(-approx,147.800537109375f,float(code));
|
|
52
|
-
const float value=metal::fma(residual,reciprocal,approx);
|
|
53
|
-
wf[i][c]=float(T(value*scale));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
#pragma clang loop unroll(full)
|
|
57
|
-
for(uint v=0;v<SM;v++) {
|
|
58
|
-
const uint m=min(vec0+v,uint(M-1));
|
|
59
|
-
float acc=0;
|
|
60
|
-
#pragma clang loop unroll(full)
|
|
61
|
-
for(uint i=0;i<unroll;i++) {
|
|
62
|
-
const ulong offset=(ulong)m*KC+(base+i*KL+kl)*4;
|
|
63
|
-
const float4 xv=float4(float(x[offset]),float(x[offset+1]),float(x[offset+2]),float(x[offset+3]));
|
|
64
|
-
acc+=metal::dot(wf[i],xv);
|
|
65
|
-
}
|
|
66
|
-
result[v]+=acc;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
#pragma clang loop unroll(full)
|
|
70
|
-
for(uint v=0;v<SM;v++) {
|
|
71
|
-
#pragma clang loop unroll(full)
|
|
72
|
-
for(ushort off=KL/2;off>=1;off>>=1) result[v]+=simd_shuffle_down(result[v],off);
|
|
73
|
-
if(kl==0 && vec0+v<M) out[(ulong)(vec0+v)*N+row]=T(result[v]);
|
|
74
|
-
}
|
|
75
|
-
` });
|
|
76
|
-
}
|
|
77
|
-
/** Requires the caller to prove aligned, row-contiguous x, as Qwen does
|
|
78
|
-
* with its RMSNorm output. Preserve native fallback when that proof is absent. */
|
|
79
|
-
export function wideTrellisPrefill(x: MlxArray, codes: MlxArray, scales: MlxArray, g: TrellisGeometry): MlxArray {
|
|
80
|
-
const [m, k] = x.shape;
|
|
81
|
-
if (x.ndim !== 2 || x.dtype !== Dtype.bfloat16 || !m || m < 5 || m > 15 ||
|
|
82
|
-
k !== 5120 || g.inFeatures !== k || g.axis !== 1 || g.T !== 256 || g.L !== 12 ||
|
|
83
|
-
![2, 3, 4].includes(g.k) || g.blockInterleave || g.rows < 4 || g.rows % 4 ||
|
|
84
|
-
g.outFeatures !== g.rows || g.cols !== k || codes.dtype !== Dtype.uint32 ||
|
|
85
|
-
codes.ndim !== 2 || codes.shape[0] !== g.rows || codes.shape[1] !== k * g.k / 32 || scales.size !== g.rows)
|
|
86
|
-
throw new Error("unsupported wide trellis prefill geometry, dtype or layout");
|
|
87
|
-
const kl = m <= 5 ? 32 : 16;
|
|
88
|
-
return wideKernel().apply([x, codes, scales], {
|
|
89
|
-
outputs: [{ shape: [m, g.outFeatures], dtype: x.dtype }],
|
|
90
|
-
grid: [32, g.outFeatures / 4 * (kl / 8), 1], threadGroup: [32, kl / 8, 1],
|
|
91
|
-
templateDtypes: { T: x.dtype },
|
|
92
|
-
templateInts: { M: m, SM: m, KL: kl, KC: k, N: g.outFeatures, BT: g.T, L: g.L, BITS: g.k },
|
|
93
|
-
})[0]!;
|
|
94
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { runtimeConfig, type RuntimeConfig } from "../runtime-config";
|
|
2
|
-
import type { MlxArray } from "../mlx/array";
|
|
3
|
-
import * as tq from "../mlx/turboquant-ops";
|
|
4
|
-
import type { KvCodec } from "../backends/mlx/kv-codec";
|
|
5
|
-
|
|
6
|
-
/** Resolve once when a cache is created; storage copies retain this policy. */
|
|
7
|
-
export function turboQuantFusedDecode(config: RuntimeConfig = runtimeConfig()): boolean {
|
|
8
|
-
return config.flag("MLX_BUN_TURBOQUANT_FUSED_DECODE", true);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/** One TurboQuant-encoded (K, V) storage tuple — the 5 arrays kv-store.ts
|
|
12
|
-
* and toQuantized/fromKVCache pass around. Not `ops.QuantizedTensor`
|
|
13
|
-
* (mlx's affine int4/int8 scheme): this is the rotation + Lloyd-Max
|
|
14
|
-
* layout (docs/design/turboquant.md), asymmetric-affine for keys,
|
|
15
|
-
* FWHT+Lloyd-Max for values. Field order is the kv-store.ts tensor-slot
|
|
16
|
-
* contract — do not reorder without updating snapshotCache/loadKvCache. */
|
|
17
|
-
export interface TurboQuantTensor {
|
|
18
|
-
kIdx: MlxArray;
|
|
19
|
-
kScales: MlxArray;
|
|
20
|
-
kZeros: MlxArray;
|
|
21
|
-
vPacked: MlxArray;
|
|
22
|
-
vScales: MlxArray;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const disposeTurboQuant = (t: TurboQuantTensor): void => {
|
|
26
|
-
t.kIdx.dispose();
|
|
27
|
-
t.kScales.dispose();
|
|
28
|
-
t.kZeros.dispose();
|
|
29
|
-
t.vPacked.dispose();
|
|
30
|
-
t.vScales.dispose();
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
/** Numerical representation only. Storage owns capacity, positions, row
|
|
34
|
-
* membership and persistence; this codec retains the existing kernel choices. */
|
|
35
|
-
export class TurboQuantCodec implements KvCodec<TurboQuantTensor> {
|
|
36
|
-
constructor(readonly kBits: number, readonly vBits: number, readonly fusedDecode: boolean) {}
|
|
37
|
-
|
|
38
|
-
/** Encode k/v [B,H,L,D] into a fresh TurboQuantTensor (packed at rest). */
|
|
39
|
-
encode(k: MlxArray, v: MlxArray): TurboQuantTensor {
|
|
40
|
-
const signed = this.kBits === 8;
|
|
41
|
-
const kEnc = tq.encodeKeys(k, this.kBits, signed);
|
|
42
|
-
const kIdxPacked = this.kBits < 8 ? tq.packBits(kEnc.indices, this.kBits) : kEnc.indices;
|
|
43
|
-
if (kIdxPacked !== kEnc.indices) kEnc.indices.dispose();
|
|
44
|
-
const vEnc = tq.encodeValues(v, this.vBits);
|
|
45
|
-
const vIdxPacked = this.vBits < 8 ? tq.packBits(vEnc.indices, this.vBits) : vEnc.indices;
|
|
46
|
-
if (vIdxPacked !== vEnc.indices) vEnc.indices.dispose();
|
|
47
|
-
return {
|
|
48
|
-
kIdx: kIdxPacked, kScales: kEnc.scales, kZeros: kEnc.zeros,
|
|
49
|
-
vPacked: vIdxPacked, vScales: vEnc.scales,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Decode a TurboQuantTensor's active [B,H,upTo,*] window back to
|
|
54
|
-
* bf16 [B,H,upTo,headDim] (k, v). Caller owns the returned arrays.
|
|
55
|
-
* deferV leaves V in the rotated domain (decodeValuesRotated) — the
|
|
56
|
-
* caller un-rotates its attention output instead (tq.unrotateValues). */
|
|
57
|
-
decode(t: TurboQuantTensor, upTo: number, headDim: number, deferV = false): [MlxArray, MlxArray] {
|
|
58
|
-
const cut = (a: MlxArray): MlxArray => {
|
|
59
|
-
const [B, H, , D] = a.shape as [number, number, number, number];
|
|
60
|
-
return a.slice([0, 0, 0, 0], [B, H, upTo, D]);
|
|
61
|
-
};
|
|
62
|
-
if (this.fusedDecode) {
|
|
63
|
-
const inputs = [cut(t.kIdx), cut(t.kScales), cut(t.kZeros), cut(t.vPacked), cut(t.vScales)] as const;
|
|
64
|
-
try {
|
|
65
|
-
const decoded = tq.tryDecodePackedKv(inputs, this.kBits, this.vBits, headDim, deferV);
|
|
66
|
-
if (decoded) return decoded;
|
|
67
|
-
} finally { for (const input of inputs) input.dispose(); }
|
|
68
|
-
}
|
|
69
|
-
const kIdxCut = cut(t.kIdx);
|
|
70
|
-
const kIdxUnpacked = this.kBits < 8 ? tq.unpackBits(kIdxCut, this.kBits, headDim) : kIdxCut;
|
|
71
|
-
if (kIdxUnpacked !== kIdxCut) kIdxCut.dispose();
|
|
72
|
-
const kScalesCut = cut(t.kScales);
|
|
73
|
-
const kZerosCut = cut(t.kZeros);
|
|
74
|
-
const k = tq.decodeKeys(kIdxUnpacked, kScalesCut, kZerosCut);
|
|
75
|
-
for (const a of [kIdxUnpacked, kScalesCut, kZerosCut]) a.dispose();
|
|
76
|
-
|
|
77
|
-
const vPackedCut = cut(t.vPacked);
|
|
78
|
-
const vIdxUnpacked = this.vBits < 8 ? tq.unpackBits(vPackedCut, this.vBits, headDim) : vPackedCut;
|
|
79
|
-
if (vIdxUnpacked !== vPackedCut) vPackedCut.dispose();
|
|
80
|
-
const vScalesCut = cut(t.vScales);
|
|
81
|
-
const v = deferV
|
|
82
|
-
? tq.decodeValuesRotated(vIdxUnpacked, vScalesCut, this.vBits)
|
|
83
|
-
: tq.decodeValues(vIdxUnpacked, vScalesCut, this.vBits);
|
|
84
|
-
for (const a of [vIdxUnpacked, vScalesCut]) a.dispose();
|
|
85
|
-
|
|
86
|
-
return [k, v];
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
}
|
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
// Arch descriptor table for the Tier-0 universal dense module
|
|
2
|
-
// (docs/design/generic-model-support.md §3.1). One entry per mlx-lm
|
|
3
|
-
// model_type; each parse function is the ~15–25-line transcription of that
|
|
4
|
-
// arch's ModelArgs (defaults included) + structural deltas, read from the
|
|
5
|
-
// RAW config.json exactly like the oracle's dataclass does.
|
|
6
|
-
//
|
|
7
|
-
// Support is this table's keys (+ MODEL_REMAPPING aliases) — an explicit,
|
|
8
|
-
// declared surface. No config sniffing. A model_type absent here is
|
|
9
|
-
// unsupported until a descriptor + green parity manifest entry exist.
|
|
10
|
-
|
|
11
|
-
import type { ModelConfig } from "../../config";
|
|
12
|
-
import type { RopeScalingConfig } from "./rope";
|
|
13
|
-
|
|
14
|
-
/** mlx_lm/utils.py MODEL_REMAPPING, vendored (free aliases). Only entries
|
|
15
|
-
* whose TARGET has a descriptor below actually load; the rest are kept so
|
|
16
|
-
* the reject message can name the real arch. */
|
|
17
|
-
export const MODEL_REMAPPING: Record<string, string> = {
|
|
18
|
-
mistral: "llama",
|
|
19
|
-
llava: "mistral3",
|
|
20
|
-
"phi-msft": "phixtral",
|
|
21
|
-
falcon_mamba: "mamba",
|
|
22
|
-
joyai_llm_flash: "deepseek_v3",
|
|
23
|
-
kimi_k2: "deepseek_v3",
|
|
24
|
-
qwen2_5_vl: "qwen2_vl",
|
|
25
|
-
minimax_m2: "minimax",
|
|
26
|
-
iquestcoder: "llama",
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export function remapModelType(modelType: string): string {
|
|
30
|
-
return MODEL_REMAPPING[modelType] ?? modelType;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** Normalized args for the universal dense forward — the union of the
|
|
34
|
-
* launch archs' ModelArgs, one value per knob (no optionals left). */
|
|
35
|
-
export interface UniversalArgs {
|
|
36
|
-
modelType: string;
|
|
37
|
-
hiddenSize: number;
|
|
38
|
-
numHiddenLayers: number;
|
|
39
|
-
intermediateSize: number;
|
|
40
|
-
numHeads: number;
|
|
41
|
-
numKvHeads: number;
|
|
42
|
-
headDim: number;
|
|
43
|
-
normEps: number;
|
|
44
|
-
vocabSize: number;
|
|
45
|
-
ropeTheta: number;
|
|
46
|
-
ropeTraditional: boolean;
|
|
47
|
-
ropeScaling: RopeScalingConfig | null;
|
|
48
|
-
maxPositionEmbeddings: number | null;
|
|
49
|
-
/** q/k/v projection bias; o and mlp separately (qwen2: qkv only). */
|
|
50
|
-
qkvBias: boolean;
|
|
51
|
-
oBias: boolean;
|
|
52
|
-
mlpBias: boolean;
|
|
53
|
-
tieWordEmbeddings: boolean;
|
|
54
|
-
/** null ⇒ every layer full attention. */
|
|
55
|
-
layerTypes: string[] | null;
|
|
56
|
-
slidingWindow: number | null;
|
|
57
|
-
// ---- block structure ----
|
|
58
|
-
/** pre = llama (norm → sublayer → residual)
|
|
59
|
-
* post = olmo2 (sublayer → norm → residual)
|
|
60
|
-
* gemma2 = sandwich (input/post-attn + pre/post-ffn norms)
|
|
61
|
-
* glm4 = post-sublayer norms with pre-norms too */
|
|
62
|
-
block: "pre" | "post" | "gemma2" | "glm4";
|
|
63
|
-
norm: "rmsnorm" | "rmsnorm_plus_one" | "layernorm";
|
|
64
|
-
/** qwen3 = per-head RMSNorm over head_dim (before transpose);
|
|
65
|
-
* olmo2 = full-width RMSNorm on the flat projection (before reshape). */
|
|
66
|
-
qkNorm: "none" | "head" | "full";
|
|
67
|
-
mlp: "swiglu" | "geglu" | "geglu_approx" | "fused_swiglu" | "gelu_mlp";
|
|
68
|
-
/** phi3: one fused qkv_proj, split as activations (mx.split — exactly
|
|
69
|
-
* what mlx-lm does; the quantized matrix stays fused). */
|
|
70
|
-
fusedQkv: boolean;
|
|
71
|
-
attnScale: number;
|
|
72
|
-
/** gemma2 attention-score softcap ⇒ manual q·kᵀ→tanh→softmax path. */
|
|
73
|
-
attnLogitSoftcap: number | null;
|
|
74
|
-
finalLogitSoftcap: number | null;
|
|
75
|
-
/** granite: logits / logits_scaling. */
|
|
76
|
-
logitsDivisor: number | null;
|
|
77
|
-
/** gemma: hidden**0.5; granite: embedding_multiplier. */
|
|
78
|
-
embedMultiplier: number | null;
|
|
79
|
-
/** granite residual_multiplier. */
|
|
80
|
-
residualMultiplier: number | null;
|
|
81
|
-
rope: "initialize" | "plain" | "phi3";
|
|
82
|
-
/** rope dims = floor(headDim * partialRotaryFactor) (glm4, phi3). */
|
|
83
|
-
partialRotaryFactor: number;
|
|
84
|
-
/** phi3 SuScaledRoPE original context (TOP-LEVEL config key). */
|
|
85
|
-
originalMaxPositionEmbeddings: number;
|
|
86
|
-
/** smollm3: per-layer 1 = rope, 0 = NoPE. null ⇒ rope everywhere. */
|
|
87
|
-
noRopeLayers: number[] | null;
|
|
88
|
-
/** gemma2: create_attention_mask(..., return_array=True). */
|
|
89
|
-
maskArray: boolean;
|
|
90
|
-
/** sanitize: tensors mlx-lm drops on load (audit allowances). */
|
|
91
|
-
dropWeightPatterns: RegExp[];
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
type Raw = Record<string, any>;
|
|
95
|
-
|
|
96
|
-
const INV_FREQ = /self_attn\.rotary_emb\.inv_freq/;
|
|
97
|
-
|
|
98
|
-
/** Common fields most archs share; per-arch parsers override the deltas. */
|
|
99
|
-
function common(raw: Raw, modelType: string): UniversalArgs {
|
|
100
|
-
const heads = raw.num_attention_heads as number;
|
|
101
|
-
return {
|
|
102
|
-
modelType,
|
|
103
|
-
hiddenSize: raw.hidden_size,
|
|
104
|
-
numHiddenLayers: raw.num_hidden_layers,
|
|
105
|
-
intermediateSize: raw.intermediate_size,
|
|
106
|
-
numHeads: heads,
|
|
107
|
-
numKvHeads: raw.num_key_value_heads ?? heads,
|
|
108
|
-
headDim: Math.floor(raw.hidden_size / heads),
|
|
109
|
-
normEps: raw.rms_norm_eps,
|
|
110
|
-
vocabSize: raw.vocab_size,
|
|
111
|
-
ropeTheta: raw.rope_theta ?? 10000,
|
|
112
|
-
ropeTraditional: raw.rope_traditional ?? false,
|
|
113
|
-
ropeScaling: (raw.rope_scaling as RopeScalingConfig | undefined) ?? null,
|
|
114
|
-
maxPositionEmbeddings: raw.max_position_embeddings ?? null,
|
|
115
|
-
qkvBias: false,
|
|
116
|
-
oBias: false,
|
|
117
|
-
mlpBias: false,
|
|
118
|
-
tieWordEmbeddings: raw.tie_word_embeddings ?? true,
|
|
119
|
-
layerTypes: null,
|
|
120
|
-
slidingWindow: null,
|
|
121
|
-
block: "pre",
|
|
122
|
-
norm: "rmsnorm",
|
|
123
|
-
qkNorm: "none",
|
|
124
|
-
mlp: "swiglu",
|
|
125
|
-
fusedQkv: false,
|
|
126
|
-
attnScale: Math.pow(Math.floor(raw.hidden_size / heads), -0.5),
|
|
127
|
-
attnLogitSoftcap: null,
|
|
128
|
-
finalLogitSoftcap: null,
|
|
129
|
-
logitsDivisor: null,
|
|
130
|
-
embedMultiplier: null,
|
|
131
|
-
residualMultiplier: null,
|
|
132
|
-
rope: "initialize",
|
|
133
|
-
partialRotaryFactor: 1.0,
|
|
134
|
-
originalMaxPositionEmbeddings: 4096,
|
|
135
|
-
noRopeLayers: null,
|
|
136
|
-
maskArray: false,
|
|
137
|
-
dropWeightPatterns: [],
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function parseLlama(raw: Raw, modelType = "llama"): UniversalArgs {
|
|
142
|
-
const a = common(raw, modelType);
|
|
143
|
-
a.headDim = raw.head_dim ?? a.headDim;
|
|
144
|
-
a.attnScale = Math.pow(a.headDim, -0.5);
|
|
145
|
-
a.qkvBias = raw.attention_bias ?? false;
|
|
146
|
-
a.oBias = raw.attention_bias ?? false; // llama.py wires o_proj bias to the same flag
|
|
147
|
-
a.mlpBias = raw.mlp_bias ?? false;
|
|
148
|
-
a.layerTypes = (raw.layer_types as string[] | undefined) ?? null;
|
|
149
|
-
a.slidingWindow = raw.sliding_window ?? null;
|
|
150
|
-
a.dropWeightPatterns = [INV_FREQ];
|
|
151
|
-
if (a.tieWordEmbeddings) a.dropWeightPatterns.push(/^lm_head\.weight$/);
|
|
152
|
-
return a;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export const ARCHS: Record<string, (raw: Raw) => UniversalArgs> = {
|
|
156
|
-
/** llama (+ mistral / iquestcoder via remap): the reference dense block. */
|
|
157
|
-
llama: (raw) => parseLlama(raw),
|
|
158
|
-
|
|
159
|
-
/** smollm3: llama with NoPE layers (every no_rope_layer_interval-th). */
|
|
160
|
-
smollm3: (raw) => {
|
|
161
|
-
const a = parseLlama(raw, "smollm3");
|
|
162
|
-
const interval = raw.no_rope_layer_interval ?? 4;
|
|
163
|
-
const list = raw.no_rope_layers as number[] | undefined;
|
|
164
|
-
if (list && list.length !== a.numHiddenLayers)
|
|
165
|
-
throw new Error("`no_rope_layers` length mismatch");
|
|
166
|
-
a.noRopeLayers = list ??
|
|
167
|
-
Array.from({ length: a.numHiddenLayers }, (_, i) => ((i + 1) % interval !== 0 ? 1 : 0));
|
|
168
|
-
return a;
|
|
169
|
-
},
|
|
170
|
-
|
|
171
|
-
/** qwen2: llama block + hardcoded q/k/v bias (o unbiased), theta 1e6. */
|
|
172
|
-
qwen2: (raw) => {
|
|
173
|
-
const a = common(raw, "qwen2");
|
|
174
|
-
a.ropeTheta = raw.rope_theta ?? 1000000;
|
|
175
|
-
a.maxPositionEmbeddings = raw.max_position_embeddings ?? 32768;
|
|
176
|
-
a.qkvBias = true;
|
|
177
|
-
a.dropWeightPatterns = [INV_FREQ];
|
|
178
|
-
if (a.tieWordEmbeddings) a.dropWeightPatterns.push(/^lm_head\.weight$/);
|
|
179
|
-
return a;
|
|
180
|
-
},
|
|
181
|
-
|
|
182
|
-
/** qwen3: per-head q/k RMSNorm over head_dim BEFORE transpose+rope. */
|
|
183
|
-
qwen3: (raw) => {
|
|
184
|
-
const a = common(raw, "qwen3");
|
|
185
|
-
a.headDim = raw.head_dim; // required in qwen3 ModelArgs
|
|
186
|
-
a.attnScale = Math.pow(a.headDim, -0.5);
|
|
187
|
-
a.qkNorm = "head";
|
|
188
|
-
a.tieWordEmbeddings = raw.tie_word_embeddings ?? false;
|
|
189
|
-
if (a.tieWordEmbeddings) a.dropWeightPatterns = [/^lm_head\.weight$/];
|
|
190
|
-
return a;
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
/** gemma (v1): (1+w) RMSNorm, √hidden embed scale, PRECISE-gelu gated
|
|
194
|
-
* MLP, always-tied head, plain rope (rope_scaling ignored). */
|
|
195
|
-
gemma: (raw) => {
|
|
196
|
-
const a = common(raw, "gemma");
|
|
197
|
-
a.headDim = raw.head_dim; // required
|
|
198
|
-
a.attnScale = Math.pow(a.headDim, -0.5);
|
|
199
|
-
a.norm = "rmsnorm_plus_one";
|
|
200
|
-
a.mlp = "geglu";
|
|
201
|
-
a.embedMultiplier = Math.pow(raw.hidden_size, 0.5);
|
|
202
|
-
a.tieWordEmbeddings = true; // as_linear unconditionally
|
|
203
|
-
a.rope = "plain";
|
|
204
|
-
a.ropeScaling = null;
|
|
205
|
-
return a;
|
|
206
|
-
},
|
|
207
|
-
|
|
208
|
-
/** gemma2: gemma + sandwich norms, attention-score softcap (manual
|
|
209
|
-
* attention), query_pre_attn_scalar scale, final logit softcap,
|
|
210
|
-
* gelu_approx MLP, always-array mask. mlx-lm runs every layer full
|
|
211
|
-
* attention (no sliding window in its gemma2) — we match the oracle. */
|
|
212
|
-
gemma2: (raw) => {
|
|
213
|
-
const a = common(raw, "gemma2");
|
|
214
|
-
a.headDim = raw.head_dim; // required
|
|
215
|
-
a.norm = "rmsnorm_plus_one";
|
|
216
|
-
a.block = "gemma2";
|
|
217
|
-
a.mlp = "geglu_approx";
|
|
218
|
-
a.embedMultiplier = Math.pow(raw.hidden_size, 0.5);
|
|
219
|
-
a.tieWordEmbeddings = true;
|
|
220
|
-
a.rope = "plain";
|
|
221
|
-
a.ropeScaling = null;
|
|
222
|
-
a.attnScale = 1.0 / Math.pow(raw.query_pre_attn_scalar ?? 144.0, 0.5);
|
|
223
|
-
a.attnLogitSoftcap = raw.attn_logit_softcapping ?? 50.0;
|
|
224
|
-
a.finalLogitSoftcap = raw.final_logit_softcapping ?? 30.0;
|
|
225
|
-
a.maskArray = true;
|
|
226
|
-
return a;
|
|
227
|
-
},
|
|
228
|
-
|
|
229
|
-
/** phi3: fused qkv + fused gate_up (split as ACTIVATIONS, like mlx-lm),
|
|
230
|
-
* longrope/su (or linear) rope on partial dims, untied head. */
|
|
231
|
-
phi3: (raw) => {
|
|
232
|
-
const a = common(raw, "phi3");
|
|
233
|
-
a.tieWordEmbeddings = raw.tie_word_embeddings ?? false;
|
|
234
|
-
a.fusedQkv = true;
|
|
235
|
-
a.mlp = "fused_swiglu";
|
|
236
|
-
a.rope = "phi3";
|
|
237
|
-
a.partialRotaryFactor = raw.partial_rotary_factor ?? 1.0;
|
|
238
|
-
a.maxPositionEmbeddings = raw.max_position_embeddings ?? 131072;
|
|
239
|
-
a.originalMaxPositionEmbeddings = raw.original_max_position_embeddings ?? 4096;
|
|
240
|
-
// phi3.py __post_init__: rope_scaling must carry {long_factor, type};
|
|
241
|
-
// only longrope/su/linear supported, anything else → scaling off.
|
|
242
|
-
if (a.ropeScaling) {
|
|
243
|
-
for (const key of ["long_factor", "type"])
|
|
244
|
-
if (!(key in a.ropeScaling))
|
|
245
|
-
throw new Error(`rope_scaling must contain keys {'long_factor', 'type'}`);
|
|
246
|
-
const t = String(a.ropeScaling.type);
|
|
247
|
-
if (!["longrope", "su", "linear"].includes(t)) a.ropeScaling = null;
|
|
248
|
-
}
|
|
249
|
-
return a;
|
|
250
|
-
},
|
|
251
|
-
|
|
252
|
-
/** olmo2: POST-norm block (norm on sublayer output), full-width q/k
|
|
253
|
-
* RMSNorm on the flat projections. */
|
|
254
|
-
olmo2: (raw) => {
|
|
255
|
-
const a = common(raw, "olmo2");
|
|
256
|
-
a.headDim = raw.head_dim ?? a.headDim;
|
|
257
|
-
a.attnScale = Math.pow(a.headDim, -0.5);
|
|
258
|
-
a.block = "post";
|
|
259
|
-
a.qkNorm = "full";
|
|
260
|
-
a.qkvBias = raw.attention_bias ?? false;
|
|
261
|
-
a.oBias = raw.attention_bias ?? false;
|
|
262
|
-
a.mlpBias = raw.mlp_bias ?? false;
|
|
263
|
-
a.dropWeightPatterns = [INV_FREQ];
|
|
264
|
-
return a;
|
|
265
|
-
},
|
|
266
|
-
|
|
267
|
-
/** glm4: pre+post sublayer norms (post_self_attn / post_mlp), fused
|
|
268
|
-
* gate_up MLP, PARTIAL rope with traditional=True default, always a
|
|
269
|
-
* separate lm_head. */
|
|
270
|
-
glm4: (raw) => {
|
|
271
|
-
const a = common(raw, "glm4");
|
|
272
|
-
a.headDim = raw.head_dim ?? a.headDim;
|
|
273
|
-
a.attnScale = Math.pow(a.headDim, -0.5);
|
|
274
|
-
a.block = "glm4";
|
|
275
|
-
a.mlp = "fused_swiglu";
|
|
276
|
-
a.qkvBias = raw.attention_bias;
|
|
277
|
-
a.rope = "plain";
|
|
278
|
-
a.ropeScaling = null;
|
|
279
|
-
a.ropeTraditional = raw.rope_traditional ?? true;
|
|
280
|
-
a.partialRotaryFactor = raw.partial_rotary_factor;
|
|
281
|
-
a.maxPositionEmbeddings = raw.max_position_embeddings ?? 32768;
|
|
282
|
-
a.tieWordEmbeddings = false; // glm4.py constructs lm_head unconditionally
|
|
283
|
-
return a;
|
|
284
|
-
},
|
|
285
|
-
|
|
286
|
-
/** granite: llama block scaled everywhere — attention_multiplier as the
|
|
287
|
-
* SDPA scale, embedding/residual multipliers, logits / logits_scaling. */
|
|
288
|
-
granite: (raw) => {
|
|
289
|
-
const a = common(raw, "granite");
|
|
290
|
-
a.attnScale = raw.attention_multiplier;
|
|
291
|
-
a.embedMultiplier = raw.embedding_multiplier;
|
|
292
|
-
a.residualMultiplier = raw.residual_multiplier;
|
|
293
|
-
a.logitsDivisor = raw.logits_scaling;
|
|
294
|
-
a.qkvBias = raw.attention_bias;
|
|
295
|
-
a.oBias = raw.attention_bias;
|
|
296
|
-
a.mlpBias = raw.mlp_bias;
|
|
297
|
-
a.ropeTraditional = false; // granite.py hardcodes False
|
|
298
|
-
return a;
|
|
299
|
-
},
|
|
300
|
-
|
|
301
|
-
/** starcoder2: LayerNorm (bias affine), bias on ALL projections, plain
|
|
302
|
-
* c_fc→gelu(precise)→c_proj MLP, theta 1e5. */
|
|
303
|
-
starcoder2: (raw) => {
|
|
304
|
-
const a = common(raw, "starcoder2");
|
|
305
|
-
a.normEps = raw.norm_epsilon ?? 1e-5;
|
|
306
|
-
a.vocabSize = raw.vocab_size ?? 49152;
|
|
307
|
-
a.ropeTheta = raw.rope_theta ?? 100000;
|
|
308
|
-
a.norm = "layernorm";
|
|
309
|
-
a.mlp = "gelu_mlp";
|
|
310
|
-
a.qkvBias = true;
|
|
311
|
-
a.oBias = true;
|
|
312
|
-
a.mlpBias = true;
|
|
313
|
-
a.rope = "plain";
|
|
314
|
-
a.ropeScaling = null;
|
|
315
|
-
return a;
|
|
316
|
-
},
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
/** The declared generic support surface (post-remap model_types). */
|
|
320
|
-
export const GENERIC_MODEL_TYPES: ReadonlySet<string> = new Set(Object.keys(ARCHS));
|
|
321
|
-
|
|
322
|
-
/** Descriptor lookup for a loaded config; null ⇒ not generically supported. */
|
|
323
|
-
export function genericArgsFor(config: ModelConfig): UniversalArgs | null {
|
|
324
|
-
const arch = remapModelType(config.modelType);
|
|
325
|
-
const parse = ARCHS[arch];
|
|
326
|
-
if (!parse) return null;
|
|
327
|
-
const raw = (config.raw.text_config ?? config.raw) as Raw;
|
|
328
|
-
const args = parse(raw);
|
|
329
|
-
// keep the ORIGINAL model_type visible in errors/labels
|
|
330
|
-
args.modelType = config.modelType;
|
|
331
|
-
return args;
|
|
332
|
-
}
|