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,69 +0,0 @@
|
|
|
1
|
-
import type { ModelConfig } from "../config";
|
|
2
|
-
import {
|
|
3
|
-
assertResolvedModelProfile,
|
|
4
|
-
type GenerationLoop,
|
|
5
|
-
type ModelGraph,
|
|
6
|
-
type ModelLoader,
|
|
7
|
-
type ResolvedModelProfile,
|
|
8
|
-
} from "./profile";
|
|
9
|
-
|
|
10
|
-
/** Engine code implements this port. Source and Model remain backend-specific;
|
|
11
|
-
* selection introduces no tensor conversion or dispatch in the token loop.
|
|
12
|
-
* create borrows source; a failed construction must release its own resources. */
|
|
13
|
-
export interface ModelImplementation<Source, Model> {
|
|
14
|
-
readonly id: string;
|
|
15
|
-
readonly graph: ModelGraph;
|
|
16
|
-
readonly loader: ModelLoader;
|
|
17
|
-
readonly loop: GenerationLoop;
|
|
18
|
-
create(source: Source, config: ModelConfig, profile: ResolvedModelProfile): Model;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface ModelImplementationProvider<Source, Model> {
|
|
22
|
-
/** Validate identity and composition, then return one compatible binding.
|
|
23
|
-
* A declared implementation must never silently fall back to another. */
|
|
24
|
-
select(config: ModelConfig, profile: ResolvedModelProfile): ModelImplementation<Source, Model>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Immutable composition, with identity matching delegated to model profiles.
|
|
28
|
-
* Exact declarations are requirements: absent/incompatible code is an error,
|
|
29
|
-
* never an invitation to retry with a different numerical implementation. */
|
|
30
|
-
export class ModelImplementationRegistry<Source, Model> implements ModelImplementationProvider<Source, Model> {
|
|
31
|
-
private readonly entries: ReadonlyMap<string, ModelImplementation<Source, Model>>;
|
|
32
|
-
|
|
33
|
-
constructor(implementations: readonly ModelImplementation<Source, Model>[]) {
|
|
34
|
-
const entries = new Map<string, ModelImplementation<Source, Model>>();
|
|
35
|
-
for (const implementation of implementations) {
|
|
36
|
-
if (!implementation.id.trim()) throw new Error("model implementation id must not be empty");
|
|
37
|
-
if (entries.has(implementation.id))
|
|
38
|
-
throw new Error(`duplicate model implementation ${implementation.id}`);
|
|
39
|
-
entries.set(implementation.id, Object.freeze({
|
|
40
|
-
id: implementation.id,
|
|
41
|
-
graph: implementation.graph,
|
|
42
|
-
loader: implementation.loader,
|
|
43
|
-
loop: implementation.loop,
|
|
44
|
-
create: implementation.create.bind(implementation),
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
this.entries = entries;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** Return a new composition; active models retain their existing binding. */
|
|
51
|
-
with(...implementations: readonly ModelImplementation<Source, Model>[]): ModelImplementationRegistry<Source, Model> {
|
|
52
|
-
return new ModelImplementationRegistry([...this.entries.values(), ...implementations]);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
select(config: ModelConfig, profile: ResolvedModelProfile): ModelImplementation<Source, Model> {
|
|
56
|
-
assertResolvedModelProfile(config, profile);
|
|
57
|
-
const execution = profile.profile.execution;
|
|
58
|
-
// These default IDs preserve the existing dedicated/generated/family choice.
|
|
59
|
-
const id = execution.implementation ?? (execution.specialization === "generated"
|
|
60
|
-
? `${execution.graph}-generated` : execution.graph);
|
|
61
|
-
const implementation = this.entries.get(id);
|
|
62
|
-
if (!implementation)
|
|
63
|
-
throw new Error(`model profile ${profile.profile.id} requires unavailable implementation ${id}; refusing to fall back`);
|
|
64
|
-
if (implementation.graph !== execution.graph || implementation.loader !== execution.loader ||
|
|
65
|
-
implementation.loop !== execution.loop)
|
|
66
|
-
throw new Error(`model implementation ${id} is incompatible with profile ${profile.profile.id}; refusing to fall back`);
|
|
67
|
-
return implementation;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../mlx/array";
|
|
2
|
-
import * as ops from "../mlx/ops";
|
|
3
|
-
import type { Cache, KvAttentionView, KvDonorAttention } from "./gemma4-base";
|
|
4
|
-
import { quantizedSdpa, disposeTriple } from "./gemma4-base";
|
|
5
|
-
import { quantizedAppendAttention } from "./quantized-append-attention";
|
|
6
|
-
|
|
7
|
-
export function captureKvDonorAttention(cache: Cache): KvDonorAttention {
|
|
8
|
-
if (cache.captureDonorAttention) return cache.captureDonorAttention();
|
|
9
|
-
const view = cache.captureDonorRows!();
|
|
10
|
-
return {
|
|
11
|
-
width: view.keys.shape[2]!, dtype: view.keys.dtype,
|
|
12
|
-
offsets: view.offsets, starts: view.starts, ends: view.ends,
|
|
13
|
-
attend: (q, scale, mask) => ops.sdpa(q, view.keys, view.values, scale, mask.mode, mask.arr),
|
|
14
|
-
dispose() { view.keys.dispose(); view.values.dispose(); },
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function quantizedDonorAttention(keys: ops.QuantizedTensor, values: ops.QuantizedTensor,
|
|
19
|
-
validity: Pick<KvDonorAttention, "offsets" | "starts" | "ends">,
|
|
20
|
-
groupSize: number, bits: number): KvDonorAttention {
|
|
21
|
-
return {
|
|
22
|
-
width: keys.packed.shape[2]!, dtype: keys.scales.dtype, ...validity,
|
|
23
|
-
attend: (q, scale, mask) => quantizedSdpa(q, keys, values, scale, mask, groupSize, bits),
|
|
24
|
-
dispose() { disposeTriple(keys); disposeTriple(values); },
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function captureKvAttention(cache: Cache, k: MlxArray, v: MlxArray): KvAttentionView {
|
|
29
|
-
if (cache.attentionState) return cache.attentionState.appendAndFetch(k, v);
|
|
30
|
-
const quantized = cache.quantizedAttention;
|
|
31
|
-
if (quantized) {
|
|
32
|
-
const { groupSize, bits } = quantized;
|
|
33
|
-
const [keys, values] = quantized.updateAndFetchQuantized(k, v);
|
|
34
|
-
return {
|
|
35
|
-
attend: (q, scale, mask, independentPositions) => independentPositions && q.shape[2]! > 1
|
|
36
|
-
? quantizedAppendAttention(q, keys, values, scale, groupSize, bits)
|
|
37
|
-
: quantizedSdpa(q, keys, values, scale, mask, groupSize, bits),
|
|
38
|
-
dispose() { disposeTriple(keys); disposeTriple(values); },
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
const [keys, values] = cache.updateAndFetch(k, v);
|
|
42
|
-
return {
|
|
43
|
-
attend: (q, scale, mask) => ops.sdpa(q, keys, values, scale, mask.mode, mask.arr),
|
|
44
|
-
dispose() { keys.dispose(); values.dispose(); },
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
/** Takes ownership of already aligned per-row donor views. Each storage codec
|
|
50
|
-
* keeps its own attention arithmetic while the caller supplies one query batch. */
|
|
51
|
-
export function combineKvDonorAttention(rows: readonly KvDonorAttention[]): KvDonorAttention {
|
|
52
|
-
return { width: rows[0]!.width, dtype: rows[0]!.dtype,
|
|
53
|
-
offsets: rows.flatMap(row => [...row.offsets]), starts: rows.flatMap(row => [...row.starts]),
|
|
54
|
-
ends: rows.flatMap(row => [...row.ends]),
|
|
55
|
-
attend(q, scale, mask) {
|
|
56
|
-
const outputs: MlxArray[] = [];
|
|
57
|
-
try {
|
|
58
|
-
for (const [index, row] of rows.entries()) {
|
|
59
|
-
using query = q.slice([index, 0, 0, 0], [index + 1, q.shape[1]!, q.shape[2]!, q.shape[3]!]);
|
|
60
|
-
const from = mask.arr?.shape.map(() => 0), to = mask.arr ? [...mask.arr.shape] : undefined;
|
|
61
|
-
if (from && to && to.length === 4 && to[0]! > 1) { from[0] = index; to[0] = index + 1; }
|
|
62
|
-
using arr = mask.arr ? mask.arr.slice(from!, to!) : null;
|
|
63
|
-
outputs.push(row.attend(query, scale, { mode: mask.mode, arr }));
|
|
64
|
-
}
|
|
65
|
-
return outputs.length === 1 ? ops.contiguous(outputs[0]!) : ops.concatAxis(outputs, 0);
|
|
66
|
-
} finally { for (const output of outputs) output.dispose(); }
|
|
67
|
-
},
|
|
68
|
-
dispose() { for (const row of rows) row.dispose(); },
|
|
69
|
-
};
|
|
70
|
-
}
|
package/src/model/minicpm5.ts
DELETED
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
// Concrete model graph for MiniCPM5-1B-OptiQ-4bit.
|
|
2
|
-
// Port target: mlx_lm.models.llama from the oracle venv.
|
|
3
|
-
|
|
4
|
-
import type { ModelConfig } from "../config";
|
|
5
|
-
import type { Weights } from "../weights";
|
|
6
|
-
import { MlxArray } from "../mlx/array";
|
|
7
|
-
import { Dtype } from "../mlx/ffi";
|
|
8
|
-
import * as ops from "../mlx/ops";
|
|
9
|
-
import { unrotateValues as tqUnrotateValues } from "../mlx/turboquant-ops";
|
|
10
|
-
import {
|
|
11
|
-
argmaxLastPosition,
|
|
12
|
-
disposeTriple,
|
|
13
|
-
disposing,
|
|
14
|
-
KVCache,
|
|
15
|
-
LoraState,
|
|
16
|
-
QuantizedKVCache,
|
|
17
|
-
QuantizedEmbedding,
|
|
18
|
-
QuantizedLinear,
|
|
19
|
-
quantizedSdpa,
|
|
20
|
-
RMSNorm,
|
|
21
|
-
isCompiledTrace,
|
|
22
|
-
type Cache,
|
|
23
|
-
type Mask,
|
|
24
|
-
} from "./gemma4-base";
|
|
25
|
-
import { CompiledFunction } from "../mlx/compile";
|
|
26
|
-
import { runtimeValue } from "../runtime-config";
|
|
27
|
-
|
|
28
|
-
/** Verbatim port of mlx_lm/models/activations.py:
|
|
29
|
-
* `@partial(mx.compile, shapeless=True) def swiglu(gate, x): return nn.silu(gate) * x`
|
|
30
|
-
* mx.compile fuses sigmoid + mul + mul into ONE kernel (mlx-lm's decode
|
|
31
|
-
* `CV2ISigmoid…Multiply`) instead of our three separate dispatches. Traced
|
|
32
|
-
* once, replayed thereafter for decode and prefill. */
|
|
33
|
-
let _swigluClosure: CompiledFunction | null = null;
|
|
34
|
-
export function compiledSwiglu(gate: MlxArray, up: MlxArray): MlxArray {
|
|
35
|
-
if (!_swigluClosure) {
|
|
36
|
-
_swigluClosure = new CompiledFunction((inputs) => {
|
|
37
|
-
const g = inputs[0]!, u = inputs[1]!; // nn.silu(gate) * x
|
|
38
|
-
const sig = ops.sigmoid(g);
|
|
39
|
-
const silu = ops.mul(g, sig); sig.dispose();
|
|
40
|
-
const out = ops.mul(silu, u); silu.dispose();
|
|
41
|
-
return [out];
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
return _swigluClosure.apply([gate, up])[0]!;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
import { flashAttention, getTrainingAttn, flashSupported } from "./flash-attention";
|
|
48
|
-
|
|
49
|
-
// Shared prompt-prefix plan (lever 7). When set, the attention ropes the
|
|
50
|
-
// concatenated [prompt(P); chosenResp(Rc); rejectedResp(Rr)] sequence
|
|
51
|
-
// BLOCK-WISE — prompt at offset 0, EACH response reset to offset P — instead of
|
|
52
|
-
// the uniform cache.offset. This is what lets one forward over the concat be
|
|
53
|
-
// bit-exact with the two separate [prompt;resp] forwards (each response sees the
|
|
54
|
-
// prompt's RoPE positions, not shifted-by-the-other-response). Set by
|
|
55
|
-
// orpoLossPrefixShared around the forward (single-threaded), cleared after; null
|
|
56
|
-
// → the normal uniform-offset rope (every other forward is untouched). The
|
|
57
|
-
// matching block-sparse attention mask rides in via PrefixSharedCache.makeMask.
|
|
58
|
-
export interface PrefixPlan { P: number; Rc: number; Rr: number }
|
|
59
|
-
let _prefixPlan: PrefixPlan | null = null;
|
|
60
|
-
export function setMiniCpmPrefixPlan(p: PrefixPlan | null): void {
|
|
61
|
-
_prefixPlan = p;
|
|
62
|
-
}
|
|
63
|
-
/** True while a block-wise prefix-shared RoPE plan is active (ORPO forward).
|
|
64
|
-
* The generated debranched fast path must fall back to the monolith then. */
|
|
65
|
-
export function miniCpmPrefixPlanActive(): boolean {
|
|
66
|
-
return _prefixPlan != null;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** Block-wise RoPE for the prefix-shared concat [prompt; chosen; rejected] along
|
|
70
|
-
* the sequence axis (axis 2 of [B,H,T,D]): prompt rotated at offset 0, each
|
|
71
|
-
* response at offset P (reset). RoPE is per-token, so roping each contiguous
|
|
72
|
-
* block at its scalar offset and concatenating == roping with per-token
|
|
73
|
-
* position-ids [0..P-1, P..P+Rc-1, P..P+Rr-1]. Caller disposes the input. */
|
|
74
|
-
function ropeBlocks(x: MlxArray, dims: number, base: number, plan: PrefixPlan): MlxArray {
|
|
75
|
-
const { P, Rc, Rr } = plan;
|
|
76
|
-
const [B, H, , D] = x.shape as [number, number, number, number];
|
|
77
|
-
const blocks: { start: number; len: number; off: number }[] = [
|
|
78
|
-
{ start: 0, len: P, off: 0 },
|
|
79
|
-
{ start: P, len: Rc, off: P },
|
|
80
|
-
{ start: P + Rc, len: Rr, off: P },
|
|
81
|
-
].filter((b) => b.len > 0);
|
|
82
|
-
const parts = blocks.map((b) => {
|
|
83
|
-
const sl = x.slice([0, 0, b.start, 0], [B, H, b.start + b.len, D]);
|
|
84
|
-
const r = ops.rope(sl, dims, base, b.off, null);
|
|
85
|
-
sl.dispose();
|
|
86
|
-
return r;
|
|
87
|
-
});
|
|
88
|
-
const out = ops.concatAxis(parts, 2);
|
|
89
|
-
for (const p of parts) p.dispose();
|
|
90
|
-
return out;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export class LlamaAttention {
|
|
94
|
-
readonly qProj: QuantizedLinear;
|
|
95
|
-
readonly kProj: QuantizedLinear;
|
|
96
|
-
readonly vProj: QuantizedLinear;
|
|
97
|
-
readonly oProj: QuantizedLinear;
|
|
98
|
-
readonly nHeads: number;
|
|
99
|
-
readonly nKvHeads: number;
|
|
100
|
-
readonly headDim: number;
|
|
101
|
-
readonly scale: number;
|
|
102
|
-
readonly ropeBase: number;
|
|
103
|
-
|
|
104
|
-
constructor(weights: Weights, config: ModelConfig, prefix: string) {
|
|
105
|
-
const t = config.text;
|
|
106
|
-
this.nHeads = t.numAttentionHeads;
|
|
107
|
-
this.nKvHeads = t.numKeyValueHeads;
|
|
108
|
-
this.headDim = t.headDim;
|
|
109
|
-
this.scale = Math.pow(this.headDim, -0.5);
|
|
110
|
-
this.ropeBase = t.ropeParameters.full_attention?.ropeTheta ?? 10000;
|
|
111
|
-
this.qProj = QuantizedLinear.load(weights, `${prefix}.q_proj`, config);
|
|
112
|
-
this.kProj = QuantizedLinear.load(weights, `${prefix}.k_proj`, config);
|
|
113
|
-
this.vProj = QuantizedLinear.load(weights, `${prefix}.v_proj`, config);
|
|
114
|
-
this.oProj = QuantizedLinear.load(weights, `${prefix}.o_proj`, config);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
forward(x: MlxArray, mask: Mask, cache: Cache): MlxArray {
|
|
118
|
-
const [B, L] = x.shape as [number, number, number];
|
|
119
|
-
let q = this.qProj.forward(x);
|
|
120
|
-
let k = this.kProj.forward(x);
|
|
121
|
-
let v = this.vProj.forward(x);
|
|
122
|
-
|
|
123
|
-
q = disposing(q, ops.reshape(q, [B, L, this.nHeads, this.headDim]));
|
|
124
|
-
k = disposing(k, ops.reshape(k, [B, L, this.nKvHeads, this.headDim]));
|
|
125
|
-
v = disposing(v, ops.reshape(v, [B, L, this.nKvHeads, this.headDim]));
|
|
126
|
-
|
|
127
|
-
q = disposing(q, ops.transposeAxes(q, [0, 2, 1, 3]));
|
|
128
|
-
k = disposing(k, ops.transposeAxes(k, [0, 2, 1, 3]));
|
|
129
|
-
v = disposing(v, ops.transposeAxes(v, [0, 2, 1, 3]));
|
|
130
|
-
|
|
131
|
-
// RoPE: a number offset takes the static fast::rope; an array offset
|
|
132
|
-
// (per-row positions for left-padded batched decode) takes the dynamic
|
|
133
|
-
// variant — same kernel, offset read from the array. Captured once: rope
|
|
134
|
-
// runs before updateAndFetch, so K and Q share the pre-write offset.
|
|
135
|
-
const offsetArr = cache.ropeOffsetArr;
|
|
136
|
-
const ropeStep = (x: MlxArray): MlxArray =>
|
|
137
|
-
_prefixPlan
|
|
138
|
-
? ropeBlocks(x, this.headDim, this.ropeBase, _prefixPlan)
|
|
139
|
-
: offsetArr
|
|
140
|
-
? ops.ropeDynamic(x, this.headDim, this.ropeBase, offsetArr, null)
|
|
141
|
-
: ops.rope(x, this.headDim, this.ropeBase, cache.offset, null);
|
|
142
|
-
q = disposing(q, ropeStep(q));
|
|
143
|
-
k = disposing(k, ropeStep(k));
|
|
144
|
-
let attn: MlxArray;
|
|
145
|
-
if (cache.attentionState) {
|
|
146
|
-
const view = cache.attentionState.appendAndFetch(k, v);
|
|
147
|
-
k.dispose(); v.dispose();
|
|
148
|
-
try { attn = view.attend(q, this.scale, mask); } finally { view.dispose(); }
|
|
149
|
-
} else if (cache.quantizedAttention) {
|
|
150
|
-
const quantized = cache.quantizedAttention;
|
|
151
|
-
const [keys, values] = quantized.updateAndFetchQuantized(k, v);
|
|
152
|
-
k.dispose();
|
|
153
|
-
v.dispose();
|
|
154
|
-
attn = quantizedSdpa(q, keys, values, this.scale, mask, quantized.groupSize, quantized.bits);
|
|
155
|
-
disposeTriple(keys);
|
|
156
|
-
disposeTriple(values);
|
|
157
|
-
} else if (cache.rotatedValueAttention) {
|
|
158
|
-
// Deferred-V: sdpa runs on rotated values, then one InvFWHT on the
|
|
159
|
-
// output (linear in V) — see TurboQuantKVCache.updateAndFetchDeferredV.
|
|
160
|
-
const [keys, values] = cache.rotatedValueAttention.updateAndFetchDeferredV(k, v);
|
|
161
|
-
k.dispose();
|
|
162
|
-
v.dispose();
|
|
163
|
-
const rotated = ops.sdpa(q, keys, values, this.scale, mask.mode, mask.arr);
|
|
164
|
-
keys.dispose();
|
|
165
|
-
values.dispose();
|
|
166
|
-
attn = cache.rotatedValueAttention.captureValueTransform?.()(rotated) ?? tqUnrotateValues(rotated);
|
|
167
|
-
rotated.dispose();
|
|
168
|
-
} else {
|
|
169
|
-
const [keys, values] = cache.updateAndFetch(k, v);
|
|
170
|
-
k.dispose();
|
|
171
|
-
v.dispose();
|
|
172
|
-
// Training: ops.sdpa's dK vjp is wrong, so route the backward through
|
|
173
|
-
// the validated flash kernel. MiniCPM5 is full-attention → window 0.
|
|
174
|
-
const ta = getTrainingAttn();
|
|
175
|
-
if (ta === "flash" && flashSupported(q) && (mask.mode === "causal" || mask.mode === "array")) {
|
|
176
|
-
attn = flashAttention(q, keys, values, this.scale, true, 0);
|
|
177
|
-
} else {
|
|
178
|
-
attn = ops.sdpa(q, keys, values, this.scale, mask.mode, mask.arr);
|
|
179
|
-
}
|
|
180
|
-
keys.dispose();
|
|
181
|
-
values.dispose();
|
|
182
|
-
}
|
|
183
|
-
q.dispose();
|
|
184
|
-
const attnT = ops.transposeAxes(attn, [0, 2, 1, 3]);
|
|
185
|
-
attn.dispose();
|
|
186
|
-
const merged = ops.reshape(attnT, [B, L, -1]);
|
|
187
|
-
attnT.dispose();
|
|
188
|
-
const out = this.oProj.forward(merged);
|
|
189
|
-
merged.dispose();
|
|
190
|
-
return out;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export class LlamaMLP {
|
|
195
|
-
readonly gate: QuantizedLinear;
|
|
196
|
-
readonly up: QuantizedLinear;
|
|
197
|
-
readonly down: QuantizedLinear;
|
|
198
|
-
|
|
199
|
-
constructor(weights: Weights, config: ModelConfig, prefix: string) {
|
|
200
|
-
this.gate = QuantizedLinear.load(weights, `${prefix}.gate_proj`, config);
|
|
201
|
-
this.up = QuantizedLinear.load(weights, `${prefix}.up_proj`, config);
|
|
202
|
-
this.down = QuantizedLinear.load(weights, `${prefix}.down_proj`, config);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/** MLP: returns mlp(x); the caller adds the residual when given. */
|
|
206
|
-
forward(x: MlxArray, residual?: MlxArray): MlxArray {
|
|
207
|
-
const gate = this.gate.forward(x);
|
|
208
|
-
const up = this.up.forward(x);
|
|
209
|
-
// Match mlx_lm activations.py at every sequence length. Separate kernels
|
|
210
|
-
// differ numerically on MLX 0.32.2 at larger prefill shapes. An enclosing
|
|
211
|
-
// compiled trace owns fusion itself; the explicit opt-out stays available.
|
|
212
|
-
let hidden: MlxArray;
|
|
213
|
-
if (!isCompiledTrace() && runtimeValue("MLX_BUN_COMPILED_SWIGLU") !== "0") {
|
|
214
|
-
hidden = compiledSwiglu(gate, up);
|
|
215
|
-
gate.dispose();
|
|
216
|
-
up.dispose();
|
|
217
|
-
} else {
|
|
218
|
-
const sig = ops.sigmoid(gate);
|
|
219
|
-
const silu = ops.mul(gate, sig);
|
|
220
|
-
gate.dispose();
|
|
221
|
-
sig.dispose();
|
|
222
|
-
hidden = ops.mul(silu, up);
|
|
223
|
-
silu.dispose();
|
|
224
|
-
up.dispose();
|
|
225
|
-
}
|
|
226
|
-
const m = this.down.forward(hidden);
|
|
227
|
-
hidden.dispose();
|
|
228
|
-
if (residual == null) return m;
|
|
229
|
-
return disposing(m, ops.add(residual, m));
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export class LlamaLayer {
|
|
234
|
-
readonly attn: LlamaAttention;
|
|
235
|
-
readonly mlp: LlamaMLP;
|
|
236
|
-
readonly inputNorm: RMSNorm;
|
|
237
|
-
readonly postAttnNorm: RMSNorm;
|
|
238
|
-
|
|
239
|
-
constructor(weights: Weights, config: ModelConfig, prefix: string) {
|
|
240
|
-
this.attn = new LlamaAttention(weights, config, `${prefix}.self_attn`);
|
|
241
|
-
this.mlp = new LlamaMLP(weights, config, `${prefix}.mlp`);
|
|
242
|
-
this.inputNorm = new RMSNorm(weights.tensor(`${prefix}.input_layernorm.weight`), config.text.rmsNormEps);
|
|
243
|
-
this.postAttnNorm = new RMSNorm(weights.tensor(`${prefix}.post_attention_layernorm.weight`), config.text.rmsNormEps);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
forward(x: MlxArray, mask: Mask, cache: Cache): MlxArray {
|
|
247
|
-
const xn = this.inputNorm.forward(x);
|
|
248
|
-
const a = this.attn.forward(xn, mask, cache);
|
|
249
|
-
xn.dispose();
|
|
250
|
-
const h = ops.add(x, a);
|
|
251
|
-
a.dispose();
|
|
252
|
-
const hn = this.postAttnNorm.forward(h);
|
|
253
|
-
// Pass the residual h INTO the MLP so the fused kernel absorbs it (out = h + mlp).
|
|
254
|
-
const out = this.mlp.forward(hn, h);
|
|
255
|
-
hn.dispose();
|
|
256
|
-
h.dispose();
|
|
257
|
-
return out;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
export class MiniCPM5Model {
|
|
262
|
-
readonly config: ModelConfig;
|
|
263
|
-
readonly weightsBytes: number;
|
|
264
|
-
readonly prefixBase = "model";
|
|
265
|
-
readonly loraState = new LoraState();
|
|
266
|
-
readonly embed: QuantizedEmbedding;
|
|
267
|
-
readonly layers: LlamaLayer[];
|
|
268
|
-
readonly finalNorm: RMSNorm;
|
|
269
|
-
readonly lmHead: QuantizedLinear;
|
|
270
|
-
|
|
271
|
-
constructor(weights: Weights, config: ModelConfig) {
|
|
272
|
-
if (config.text.tieWordEmbeddings)
|
|
273
|
-
throw new Error("llama tied embeddings are not supported yet");
|
|
274
|
-
this.config = config;
|
|
275
|
-
this.weightsBytes = [...weights.shards.files.values()]
|
|
276
|
-
.reduce((a, f) => a + f.mmap.size, 0);
|
|
277
|
-
this.embed = QuantizedEmbedding.load(weights, "model.embed_tokens", config);
|
|
278
|
-
this.layers = Array.from(
|
|
279
|
-
{ length: config.text.numHiddenLayers },
|
|
280
|
-
(_, i) => new LlamaLayer(weights, config, `model.layers.${i}`),
|
|
281
|
-
);
|
|
282
|
-
this.finalNorm = new RMSNorm(weights.tensor("model.norm.weight"), config.text.rmsNormEps);
|
|
283
|
-
this.lmHead = QuantizedLinear.load(weights, "lm_head", config);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
loraTargets(): Map<string, QuantizedLinear> {
|
|
287
|
-
const out = new Map<string, QuantizedLinear>();
|
|
288
|
-
for (let i = 0; i < this.layers.length; i++) {
|
|
289
|
-
const l = this.layers[i]!;
|
|
290
|
-
const p = `model.layers.${i}`;
|
|
291
|
-
out.set(`${p}.self_attn.q_proj`, l.attn.qProj);
|
|
292
|
-
out.set(`${p}.self_attn.k_proj`, l.attn.kProj);
|
|
293
|
-
out.set(`${p}.self_attn.v_proj`, l.attn.vProj);
|
|
294
|
-
out.set(`${p}.self_attn.o_proj`, l.attn.oProj);
|
|
295
|
-
out.set(`${p}.mlp.gate_proj`, l.mlp.gate);
|
|
296
|
-
out.set(`${p}.mlp.up_proj`, l.mlp.up);
|
|
297
|
-
out.set(`${p}.mlp.down_proj`, l.mlp.down);
|
|
298
|
-
}
|
|
299
|
-
return out;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
makeCache(): Cache[] {
|
|
303
|
-
return this.layers.map(() => new KVCache());
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
forwardHidden(ids: MlxArray, cache: Cache[]): MlxArray {
|
|
307
|
-
const h = this.embed.encode(ids);
|
|
308
|
-
return this.forwardLayers(h, cache);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
forwardEmbeddings(_embeds: MlxArray, _cache: Cache[], _bidir: MlxArray | null): MlxArray {
|
|
312
|
-
throw new Error("llama vision/input-embedding path is not supported");
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
protected forwardLayers(h0: MlxArray, cache: Cache[]): MlxArray {
|
|
316
|
-
const h = this.runLayerRange(h0, 0, this.layers.length, cache);
|
|
317
|
-
h0.dispose(); // runLayerRange keeps its input alive; we own h0 here
|
|
318
|
-
return disposing(h, this.finalNorm.forward(h));
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/** Run decoder layers `[aIdx, bIdx)` on hidden `h`, returning the residual
|
|
322
|
-
* stream after the last layer in the range (NO finalNorm). The input `h` is
|
|
323
|
-
* NEVER disposed — the caller owns it (for segmented backward `h` is a leaf
|
|
324
|
-
* whose lifetime is managed by the autograd closure); intra-range
|
|
325
|
-
* intermediates ARE disposed. Building block for `forwardLayers` and the
|
|
326
|
-
* segmented-backward training path (docs/design/orpo-training.md).
|
|
327
|
-
* MiniCPM5 is plain full-attention with no KV-sharing, so each layer reads
|
|
328
|
-
* its own stateless `cache[i]` and a single causal mask. */
|
|
329
|
-
runLayerRange(h: MlxArray, aIdx: number, bIdx: number, cache: Cache[]): MlxArray {
|
|
330
|
-
if (aIdx >= bIdx) return h;
|
|
331
|
-
const L = h.shape[1]!;
|
|
332
|
-
const mask = cache[aIdx]!.makeMask(L, null);
|
|
333
|
-
let cur = h;
|
|
334
|
-
for (let i = aIdx; i < bIdx; i++) {
|
|
335
|
-
const next = this.layers[i]!.forward(cur, mask, cache[i]!);
|
|
336
|
-
if (i > aIdx) cur.dispose(); // keep the input boundary leaf; drop interiors
|
|
337
|
-
cur = next;
|
|
338
|
-
}
|
|
339
|
-
mask.arr?.dispose();
|
|
340
|
-
return cur;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
logitsFromHidden(h: MlxArray): MlxArray {
|
|
344
|
-
return this.lmHead.forward(h);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
forward(tokens: number[] | MlxArray, cache: Cache[]): MlxArray {
|
|
348
|
-
const ids = Array.isArray(tokens)
|
|
349
|
-
? ops.fromInt32(tokens, [1, tokens.length])
|
|
350
|
-
: tokens;
|
|
351
|
-
const h = this.forwardHidden(ids, cache);
|
|
352
|
-
if (Array.isArray(tokens)) ids.dispose();
|
|
353
|
-
const logits = this.logitsFromHidden(h);
|
|
354
|
-
h.dispose();
|
|
355
|
-
return logits;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
generate(promptTokens: number[], maxTokens: number, eosIds: number[] = []): number[] {
|
|
359
|
-
const cache = this.makeCache();
|
|
360
|
-
const out: number[] = [];
|
|
361
|
-
try {
|
|
362
|
-
let tokens = promptTokens;
|
|
363
|
-
for (let step = 0; step < maxTokens; step++) {
|
|
364
|
-
const logits = this.forward(tokens, cache);
|
|
365
|
-
const next = argmaxLastPosition(logits);
|
|
366
|
-
logits.dispose();
|
|
367
|
-
if (eosIds.includes(next)) break;
|
|
368
|
-
out.push(next);
|
|
369
|
-
tokens = [next];
|
|
370
|
-
}
|
|
371
|
-
} finally {
|
|
372
|
-
for (const c of cache) c.dispose();
|
|
373
|
-
}
|
|
374
|
-
return out;
|
|
375
|
-
}
|
|
376
|
-
}
|