mlx-bun 0.4.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1453 -88
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +10 -8
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +12 -10
- package/src/{serve → server}/chat-stage.ts +27 -22
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +42 -42
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +42 -83
- package/src/server/generated-token-history.ts +57 -0
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +8 -8
- package/src/{serve → server}/request-prep.ts +82 -68
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -94
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -1841
- package/docs/design/decode-speed-program.md +0 -2349
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -705
- package/docs/design/kv-cache.md +0 -824
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -1990
- package/docs/design/turboquant.md +0 -2212
- package/docs/design/unified-engine-frontier-plan.md +0 -1880
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -594
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/release-notes-v0.4.0.md +0 -45
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3613
- package/docs/reference/cli.md +0 -585
- package/docs/reference/distribution.md +0 -355
- package/docs/reference/environment.md +0 -398
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -674
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -334
- package/docs/reference/server-api.md +0 -1775
- package/docs/reference/server-config.md +0 -846
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/conformer.ts +0 -647
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/transcode.ts +0 -67
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -108
- package/src/backends/mlx/batch-group.ts +0 -1790
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -106
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -45
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -130
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -133
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/model-prompt.ts +0 -164
- package/src/backends/mlx/model-serving.ts +0 -79
- package/src/backends/mlx/prefill-cohort.ts +0 -89
- package/src/backends/mlx/prefill-rows.ts +0 -200
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -41
- package/src/backends/mlx/rollback.ts +0 -89
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -242
- package/src/backends/mlx/speculative-group.ts +0 -359
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -114
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3168
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -60
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -259
- package/src/contracts/prefix-cache.ts +0 -23
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -45
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -53
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -72
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -452
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1346
- package/src/grammar.ts +0 -591
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -39
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -257
- package/src/kv-store.ts +0 -1099
- package/src/lab/README.md +0 -18
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
- package/src/lab/paged-kv/paged-kv.ts +0 -270
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -49
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -388
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -512
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/ops.ts +0 -1021
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -93
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -55
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -189
- package/src/model/fingerprint.ts +0 -33
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2351
- package/src/model/gemma4.ts +0 -1315
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -67
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -443
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -252
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -819
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -102
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -83
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native-pack.ts +0 -162
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1932
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -460
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -81
- package/src/safetensors.ts +0 -158
- package/src/sampler.ts +0 -1011
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -496
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -43
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -147
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/server.ts +0 -1314
- package/src/spec/assistant-rows.ts +0 -92
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -317
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -204
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -219
- package/src/spec/qwen-mtp-source.ts +0 -383
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -585
- package/src/spec/source.ts +0 -215
- package/src/spec/two-model-rows.ts +0 -61
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -372
- package/src/ssd-durability.ts +0 -211
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -168
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -373
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -196
- package/src/vision/qwen3vl-tower.ts +0 -555
- package/src/vision/siglip.ts +0 -599
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2143
- package/src/web/app.js +0 -5703
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1057
- package/src/web/src/composer.ts +0 -959
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
|
@@ -1,383 +0,0 @@
|
|
|
1
|
-
// Native Qwen3.8 MTP draft source — the Qwen-TRAINED multi-step prediction
|
|
2
|
-
// head, split from the raw release's last shard and published as
|
|
3
|
-
// mlx-community/Qwen3.8-27B-MTP-* (model_type "qwen3_5_mtp", block_size 3).
|
|
4
|
-
//
|
|
5
|
-
// Reference implementation (locate + port + gate, don't design):
|
|
6
|
-
// mlx_vlm/speculative/drafters/qwen3_5_mtp/qwen3_5_mtp.py. Mechanism, per
|
|
7
|
-
// step: h = fc(concat(rms_emb(embed(token)), rms_hidden(hidden))) → ONE
|
|
8
|
-
// full-attention decoder layer (own KVCache, positions continue the target
|
|
9
|
-
// sequence) → norm → the TARGET's lm_head → next draft token; recursive for
|
|
10
|
-
// the block ("trained with multiple steps"). The drafter is NOT standalone:
|
|
11
|
-
// it binds the target's embed_tokens + lm_head (mtp_use_dedicated_embeddings
|
|
12
|
-
// false) and consumes the target's PRE-final-norm last-layer hidden (mlx-vlm
|
|
13
|
-
// captures it with skip_final_norm=True) — carried here by the tapLayers
|
|
14
|
-
// machinery, NOT the seam's post-norm anchorHidden.
|
|
15
|
-
//
|
|
16
|
-
// Row convention (predict-2-ahead): drafter KV row at position p is built
|
|
17
|
-
// from (embed(token at position p+1), hidden at position p). Invariant
|
|
18
|
-
// across rounds: after commit, the drafter offset equals the next pending
|
|
19
|
-
// token's position minus zero — i.e. draft() always opens by building the
|
|
20
|
-
// pending token's row from the TARGET's TRUE hidden at the emitted position
|
|
21
|
-
// (held over from the verify tap). Computationally identical to mlx-vlm's
|
|
22
|
-
// commit-time "seed" append, just performed at the top of the next round.
|
|
23
|
-
//
|
|
24
|
-
// Companion projections may be dense or quantized according to their metadata.
|
|
25
|
-
// Published drafter norms are already sanitized to runtime layout; no +1.0 shift.
|
|
26
|
-
|
|
27
|
-
import { MlxArray } from "../mlx/array";
|
|
28
|
-
import * as ops from "../mlx/ops";
|
|
29
|
-
import { materializeCopy } from "../mlx/materialize";
|
|
30
|
-
import { toLogprobs } from "../sampler";
|
|
31
|
-
import { loadModelConfig, type ModelConfig } from "../config";
|
|
32
|
-
import { Weights } from "../weights";
|
|
33
|
-
import { KVCache } from "../model/gemma4-base";
|
|
34
|
-
import { MtpModule } from "./qwen-mtp-module";
|
|
35
|
-
import type { DraftProvider, DraftSource, DraftRowCheckpoint, DraftRowGroup, DraftPrefillGroup, DraftRowSampling, GroupedDraftProvider, QwenMtpTarget, TargetView } from "./source";
|
|
36
|
-
import { QwenMtpRows, type MtpRowState } from "./qwen-mtp-rows";
|
|
37
|
-
import { captureQwenMtpState, restoreQwenMtpState } from "./qwen-mtp-state";
|
|
38
|
-
import type { Cache } from "../model/gemma4";
|
|
39
|
-
import { applyStateChanges, cleanupFailure, disposeResources } from "../engine/resources";
|
|
40
|
-
import { artifactIdentity } from "../model/artifact-identity";
|
|
41
|
-
import { configFingerprint } from "../model/fingerprint";
|
|
42
|
-
import type { PreparedStateChange } from "../contracts/resources";
|
|
43
|
-
|
|
44
|
-
type Sampler = (logprobs: MlxArray, step: number) => MlxArray;
|
|
45
|
-
|
|
46
|
-
const DRAFT_PREFILL_CHUNK = 2048;
|
|
47
|
-
|
|
48
|
-
export class QwenMtpProvider implements DraftProvider {
|
|
49
|
-
readonly grouped: GroupedDraftProvider = {
|
|
50
|
-
open: options => this.#openRows(options.target, options.sampling, options.checkpoints),
|
|
51
|
-
openPrefill: options => this.#openRows(options.target, null, options.checkpoints),
|
|
52
|
-
};
|
|
53
|
-
readonly id: string;
|
|
54
|
-
readonly weightsBytes: number;
|
|
55
|
-
readonly #module: MtpModule;
|
|
56
|
-
readonly #config: ModelConfig;
|
|
57
|
-
readonly #resources: DisposableStack;
|
|
58
|
-
readonly #checkpointNamespace: string;
|
|
59
|
-
|
|
60
|
-
private constructor(id: string, config: ModelConfig, weightsBytes: number, module: MtpModule, resources: DisposableStack, checkpointNamespace: string) {
|
|
61
|
-
this.id = id;
|
|
62
|
-
this.#config = config;
|
|
63
|
-
this.#module = module;
|
|
64
|
-
this.weightsBytes = weightsBytes;
|
|
65
|
-
this.#resources = resources;
|
|
66
|
-
this.#checkpointNamespace = checkpointNamespace;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
static async load(dir: string): Promise<QwenMtpProvider> {
|
|
70
|
-
const config = await loadModelConfig(dir);
|
|
71
|
-
if (config.modelType !== "qwen3_5_mtp")
|
|
72
|
-
throw new Error(`${dir}: not a qwen3_5_mtp drafter (model_type ${config.modelType})`);
|
|
73
|
-
const weights = await Weights.open(dir);
|
|
74
|
-
using resources = new DisposableStack();
|
|
75
|
-
resources.defer(() => weights.dispose());
|
|
76
|
-
const weightsBytes = [...weights.shards.files.values()]
|
|
77
|
-
.reduce((a, f) => a + f.mmap.size, 0);
|
|
78
|
-
const module = new MtpModule(weights, config, resources);
|
|
79
|
-
// Stable across restarts and distinct for differently folded/quantized
|
|
80
|
-
// companions. Hash once at provider load, outside inference execution.
|
|
81
|
-
const identity = await artifactIdentity(configFingerprint(config),
|
|
82
|
-
[...weights.shards.files].map(([name, shard]) => ({ name, path: shard.path })));
|
|
83
|
-
return new QwenMtpProvider(
|
|
84
|
-
dir.split("/").filter(Boolean).at(-1) ?? "qwen-mtp",
|
|
85
|
-
config, weightsBytes, module, resources.move(), `qwen-mtp-v1:${identity}`,
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
open(opts: Parameters<DraftProvider["open"]>[0]): DraftSource {
|
|
90
|
-
return new QwenMtpSource(this.#target(opts.target), this.#module, opts.sampler, this.#checkpointNamespace);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
#target(view: TargetView): QwenMtpTarget {
|
|
94
|
-
if (this.#resources.disposed)
|
|
95
|
-
throw new Error("qwen MTP provider is disposed");
|
|
96
|
-
const target = view.qwenMtp;
|
|
97
|
-
if (!target)
|
|
98
|
-
throw new Error("qwen MTP drafting requires a qwen3_5-family target");
|
|
99
|
-
if (target.hiddenSize !== this.#config.text.hiddenSize) {
|
|
100
|
-
throw new Error(
|
|
101
|
-
`qwen MTP drafter hidden ${this.#config.text.hiddenSize} != target ` +
|
|
102
|
-
`${target.hiddenSize} — split from a different checkpoint?`,
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
return target;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
#openRows(view: TargetView, sampling: DraftRowSampling | null,
|
|
109
|
-
checkpoints: readonly (DraftRowCheckpoint | null)[]): DraftRowGroup & DraftPrefillGroup {
|
|
110
|
-
const target = this.#target(view);
|
|
111
|
-
const rows = new QwenMtpRows(target, this.#module, sampling, []);
|
|
112
|
-
const prepareAppend = (checkpoints: readonly (DraftRowCheckpoint | null)[]) => {
|
|
113
|
-
const states: Array<MtpRowState | null> = [];
|
|
114
|
-
let change: PreparedStateChange | undefined;
|
|
115
|
-
try {
|
|
116
|
-
for (const checkpoint of checkpoints) states.push(checkpoint ? restoreQwenMtpState(checkpoint) : null);
|
|
117
|
-
change = rows.prepareAppend(states);
|
|
118
|
-
disposeResources(states.splice(0).flatMap(state => state ? [state.cache, state.hidden] : []));
|
|
119
|
-
return change;
|
|
120
|
-
} catch (error) {
|
|
121
|
-
return cleanupFailure(error, () => disposeResources([
|
|
122
|
-
...states.flatMap(state => state ? [state.cache, state.hidden] : []), ...(change ? [change] : []),
|
|
123
|
-
]));
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
const append = (checkpoints: readonly (DraftRowCheckpoint | null)[]) => applyStateChanges([() => prepareAppend(checkpoints)]);
|
|
127
|
-
try { append(checkpoints); }
|
|
128
|
-
catch (error) { return cleanupFailure(error, () => rows.dispose()); }
|
|
129
|
-
return {
|
|
130
|
-
namespace: this.#checkpointNamespace, prefillMode: "full", tapLayers: [target.layerCount - 1],
|
|
131
|
-
get rowCount() { return rows.rowCount; },
|
|
132
|
-
append, prepareAppend, prefill: (tokens, context) => rows.prefill(tokens, context!), materialize: rows.materialize.bind(rows),
|
|
133
|
-
filterRows: rows.filterRows.bind(rows),
|
|
134
|
-
draft: rows.draft.bind(rows), commit: rows.commit.bind(rows),
|
|
135
|
-
capture(row) {
|
|
136
|
-
const state = rows.extractRow(row);
|
|
137
|
-
try { return captureQwenMtpState(state); }
|
|
138
|
-
finally { disposeResources([state.cache, state.hidden]); }
|
|
139
|
-
},
|
|
140
|
-
dispose: rows.dispose.bind(rows),
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
dispose(): void {
|
|
146
|
-
// Release cached transpose views before their native weight maps. MLX
|
|
147
|
-
// retains buffers needed by outstanding GPU commands until completion.
|
|
148
|
-
this.#resources.dispose();
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export class QwenMtpSource implements DraftSource {
|
|
153
|
-
// Full-prompt target prefill (the bonus token exists before round 1, and
|
|
154
|
-
// the tap covers every prompt position — mlx-vlm's flow).
|
|
155
|
-
readonly prefillMode = "full" as const;
|
|
156
|
-
readonly weightsBytes = 0; // provider owns the drafter weights
|
|
157
|
-
/** Pre-final-norm tap: the LAST layer's output stream (index nLayers-1).
|
|
158
|
-
* The seam's anchorHidden is post-final-norm and is deliberately unused. */
|
|
159
|
-
readonly tapLayers: number[];
|
|
160
|
-
|
|
161
|
-
readonly #target: QwenMtpTarget;
|
|
162
|
-
readonly #module: MtpModule;
|
|
163
|
-
readonly #sampler: Sampler;
|
|
164
|
-
#cache = new KVCache();
|
|
165
|
-
readonly checkpoint: NonNullable<DraftSource["checkpoint"]>;
|
|
166
|
-
#prefilledTokens = 0;
|
|
167
|
-
#hasDrafted = false;
|
|
168
|
-
/** Target pre-norm hidden at the position preceding the next pending
|
|
169
|
-
* token: prefill's last tapped row, then each commit's vCtx row at the
|
|
170
|
-
* emitted position. draft() consumes it to build the pending row. [1,1,H] */
|
|
171
|
-
#pendingTrueHidden: MlxArray | null = null;
|
|
172
|
-
#roundAppended = 0;
|
|
173
|
-
#closed = false;
|
|
174
|
-
|
|
175
|
-
constructor(target: QwenMtpTarget, module: MtpModule, sampler: Sampler,
|
|
176
|
-
namespace = "qwen-mtp-v1") {
|
|
177
|
-
this.#target = target;
|
|
178
|
-
this.#module = module;
|
|
179
|
-
this.#sampler = sampler;
|
|
180
|
-
this.tapLayers = [target.layerCount - 1];
|
|
181
|
-
this.checkpoint = {
|
|
182
|
-
namespace,
|
|
183
|
-
restore: (tokens, attachment) => {
|
|
184
|
-
this.#checkOpen();
|
|
185
|
-
if (this.#prefilledTokens !== 0 || this.#hasDrafted)
|
|
186
|
-
throw new Error("Qwen MTP checkpoint restore requires a fresh source");
|
|
187
|
-
const state = restoreQwenMtpState({ processedTokens: tokens, attachment });
|
|
188
|
-
try { disposeResources([this.#cache, ...(this.#pendingTrueHidden ? [this.#pendingTrueHidden] : [])]); }
|
|
189
|
-
catch (error) { return cleanupFailure(error, () => disposeResources([state.cache, state.hidden])); }
|
|
190
|
-
this.#cache = state.cache;
|
|
191
|
-
this.#pendingTrueHidden = state.hidden;
|
|
192
|
-
this.#prefilledTokens = tokens;
|
|
193
|
-
},
|
|
194
|
-
capture: (tokens) => {
|
|
195
|
-
this.#checkOpen();
|
|
196
|
-
if (!this.#pendingTrueHidden || this.#cache.offset !== tokens - 1 || this.#roundAppended !== 0)
|
|
197
|
-
throw new Error("Qwen MTP snapshot requires an aligned committed boundary");
|
|
198
|
-
return captureQwenMtpState({ cache: this.#cache, hidden: this.#pendingTrueHidden }).attachment;
|
|
199
|
-
},
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/** Drafter prefill: rows for positions 0..L-2, keyed (token_{p+1}, h_p) —
|
|
204
|
-
* the (pending, h_{L-1}) row is NOT built here (the pending token is
|
|
205
|
-
* sampled after target prefill); its true hidden is kept for round 1. */
|
|
206
|
-
async prefill(promptIds: number[], ctxML?: MlxArray): Promise<void> {
|
|
207
|
-
this.#checkOpen();
|
|
208
|
-
if (!ctxML)
|
|
209
|
-
throw new Error("qwen MTP prefill requires the tapped pre-final-norm context");
|
|
210
|
-
try {
|
|
211
|
-
if (this.#hasDrafted)
|
|
212
|
-
throw new Error("qwen MTP prefill cannot follow drafting");
|
|
213
|
-
const L = promptIds.length;
|
|
214
|
-
const start = this.#prefilledTokens;
|
|
215
|
-
const H = ctxML.shape[2]!;
|
|
216
|
-
if (L <= start || ctxML.shape[1]! !== L - start)
|
|
217
|
-
throw new Error(`qwen MTP tap covered ${ctxML.shape[1]} of ${L - start} new prompt positions`);
|
|
218
|
-
if (start > 0) {
|
|
219
|
-
if (!this.#pendingTrueHidden || this.#cache.offset !== start - 1)
|
|
220
|
-
throw new Error("qwen MTP prefix state is not aligned");
|
|
221
|
-
this.#stepOne(promptIds[start]!, this.#pendingTrueHidden).dispose();
|
|
222
|
-
}
|
|
223
|
-
this.#pendingTrueHidden?.dispose();
|
|
224
|
-
// A slice would retain the complete prompt buffer in the saved prefix.
|
|
225
|
-
// Materialize this one row before handing off the prefill state.
|
|
226
|
-
using tail = ctxML.slice([0, L - start - 1, 0], [1, L - start, H]);
|
|
227
|
-
this.#pendingTrueHidden = materializeCopy(tail);
|
|
228
|
-
for (let pos = start; pos + 1 < L; pos += DRAFT_PREFILL_CHUNK) {
|
|
229
|
-
const n = Math.min(DRAFT_PREFILL_CHUNK, L - 1 - pos);
|
|
230
|
-
const shifted = promptIds.slice(pos + 1, pos + 1 + n);
|
|
231
|
-
const ids = ops.fromInt32(shifted, [1, n]);
|
|
232
|
-
const embeds = this.#target.embed(ids);
|
|
233
|
-
ids.dispose();
|
|
234
|
-
const hiddens = ctxML.slice([0, pos - start, 0], [1, pos + n - start, H]);
|
|
235
|
-
const out = this.#module.forward(embeds, hiddens, this.#cache);
|
|
236
|
-
embeds.dispose();
|
|
237
|
-
hiddens.dispose();
|
|
238
|
-
out.dispose(); // prefill outputs are not seeds; only KV matters here
|
|
239
|
-
// Bound the lazy KV graph at each chunk. Evaluating the unused output
|
|
240
|
-
// would also execute attention and the MLP, which prefill does not need.
|
|
241
|
-
ops.evalAll(this.#cache.state());
|
|
242
|
-
}
|
|
243
|
-
if (this.#cache.offset !== L - 1)
|
|
244
|
-
throw new Error(`qwen MTP prefill offset ${this.#cache.offset}, expected ${L - 1}`);
|
|
245
|
-
// Also covers a restored-prefix bridge with no subsequent full chunk.
|
|
246
|
-
ops.evalAll([this.#pendingTrueHidden, ...this.#cache.state()]);
|
|
247
|
-
this.#prefilledTokens = L;
|
|
248
|
-
} finally {
|
|
249
|
-
ctxML?.dispose(); // ownership per the seam contract
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
async draft(feed: number[], n: number, stepBase: number): Promise<number[]> {
|
|
254
|
-
this.#checkOpen();
|
|
255
|
-
this.#hasDrafted = true;
|
|
256
|
-
if (this.#roundAppended !== 0)
|
|
257
|
-
throw new Error("qwen MTP draft called before the prior round committed");
|
|
258
|
-
if (n <= 0) return [];
|
|
259
|
-
const pending = feed.at(-1);
|
|
260
|
-
if (!Number.isSafeInteger(pending) || pending! < 0)
|
|
261
|
-
throw new Error("qwen MTP requires a non-empty token feed");
|
|
262
|
-
|
|
263
|
-
const drafts: number[] = [];
|
|
264
|
-
let chained: MlxArray | null = null;
|
|
265
|
-
const startOffset = this.#cache.offset;
|
|
266
|
-
try {
|
|
267
|
-
// Build the pending token's row from the TRUE target hidden at the
|
|
268
|
-
// preceding position (prefill tail on round 1, verify tap afterwards).
|
|
269
|
-
if (!this.#pendingTrueHidden)
|
|
270
|
-
throw new Error("qwen MTP draft before prefill/commit");
|
|
271
|
-
const out = this.#stepOne(pending!, this.#pendingTrueHidden);
|
|
272
|
-
this.#pendingTrueHidden.dispose();
|
|
273
|
-
this.#pendingTrueHidden = null;
|
|
274
|
-
this.#roundAppended++;
|
|
275
|
-
chained = out;
|
|
276
|
-
drafts.push(this.#sample(out, stepBase));
|
|
277
|
-
while (drafts.length < n) {
|
|
278
|
-
const out = this.#stepOne(drafts.at(-1)!, chained!);
|
|
279
|
-
chained!.dispose();
|
|
280
|
-
chained = out;
|
|
281
|
-
this.#roundAppended++;
|
|
282
|
-
drafts.push(this.#sample(out, stepBase + drafts.length));
|
|
283
|
-
}
|
|
284
|
-
return drafts;
|
|
285
|
-
} catch (error) {
|
|
286
|
-
const appended = this.#cache.offset - startOffset;
|
|
287
|
-
if (appended > 0) this.#cache.trim(appended);
|
|
288
|
-
this.#roundAppended = 0;
|
|
289
|
-
throw error;
|
|
290
|
-
} finally {
|
|
291
|
-
chained?.dispose();
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/** mlx-vlm accept semantics: keep drafted rows for accepted positions,
|
|
296
|
-
* trim the rejected tail, then append the missing accepted row (all-accept
|
|
297
|
-
* case) and the correction/bonus row using the TARGET's verified pre-norm
|
|
298
|
-
* hiddens — harvesting the last output as the next round's seed. */
|
|
299
|
-
async commit(
|
|
300
|
-
d: number,
|
|
301
|
-
kAccept: number,
|
|
302
|
-
vCtxML?: MlxArray,
|
|
303
|
-
_verifiedHidden?: MlxArray,
|
|
304
|
-
acceptedTokens: readonly number[] = [],
|
|
305
|
-
): Promise<void> {
|
|
306
|
-
this.#checkOpen();
|
|
307
|
-
try {
|
|
308
|
-
if (!vCtxML)
|
|
309
|
-
throw new Error("qwen MTP commit requires the tapped verify context");
|
|
310
|
-
if (kAccept > 0 && acceptedTokens.length !== kAccept)
|
|
311
|
-
throw new Error(
|
|
312
|
-
`qwen MTP received ${acceptedTokens.length} accepted tokens for k=${kAccept}`,
|
|
313
|
-
);
|
|
314
|
-
// Rows appended this round cover window tokens 0..d-1 (pending +
|
|
315
|
-
// drafts[0..d-2]); rows keyed by ACCEPTED window tokens (0..kAccept)
|
|
316
|
-
// survive — trim the rejected tail.
|
|
317
|
-
const trim = Math.max(this.#roundAppended - 1 - kAccept, 0);
|
|
318
|
-
if (trim > 0) this.#cache.trim(trim);
|
|
319
|
-
|
|
320
|
-
// All-accept case: window token d (= drafts[d-1]) has no drafted row —
|
|
321
|
-
// append it from the TRUE verify hidden (vCtx row d-1, the hidden at
|
|
322
|
-
// its preceding position). The correction/bonus row is NOT built here:
|
|
323
|
-
// the serve loop re-feeds that token in the next draft()'s `feed`, and
|
|
324
|
-
// draft() opens by building its row from #pendingTrueHidden below.
|
|
325
|
-
const H = vCtxML.shape[2]!;
|
|
326
|
-
if (kAccept === d && d > 0) {
|
|
327
|
-
const ids = ops.fromInt32([acceptedTokens[kAccept - 1]!], [1, 1]);
|
|
328
|
-
const embeds = this.#target.embed(ids);
|
|
329
|
-
ids.dispose();
|
|
330
|
-
const hidden = vCtxML.slice([0, d - 1, 0], [1, d, H]);
|
|
331
|
-
const out = this.#module.forward(embeds, hidden, this.#cache);
|
|
332
|
-
embeds.dispose();
|
|
333
|
-
hidden.dispose();
|
|
334
|
-
out.dispose();
|
|
335
|
-
}
|
|
336
|
-
// Next round's pending row input: the target's verified pre-norm
|
|
337
|
-
// hidden at the emitted position.
|
|
338
|
-
this.#pendingTrueHidden?.dispose();
|
|
339
|
-
this.#pendingTrueHidden = vCtxML.slice([0, kAccept, 0], [1, kAccept + 1, H]);
|
|
340
|
-
} finally {
|
|
341
|
-
vCtxML?.dispose(); // seam: commit takes ownership
|
|
342
|
-
this.#roundAppended = 0;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
dispose(): void {
|
|
347
|
-
if (this.#closed) return;
|
|
348
|
-
this.#closed = true;
|
|
349
|
-
this.#cache.dispose();
|
|
350
|
-
this.#pendingTrueHidden?.dispose();
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
/** One module forward for (token, hidden) — appends one KV row. */
|
|
354
|
-
#stepOne(token: number, hidden: MlxArray): MlxArray {
|
|
355
|
-
using ids = ops.fromInt32([token], [1, 1]);
|
|
356
|
-
using embed = this.#target.embed(ids);
|
|
357
|
-
ids.dispose();
|
|
358
|
-
return this.#module.forward(embed, hidden, this.#cache);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/** Sample a draft token from the module output via the TARGET's lm head
|
|
362
|
-
* and the request sampler (per-step RNG stream discipline). */
|
|
363
|
-
#sample(moduleOut: MlxArray, step: number): number {
|
|
364
|
-
using logits = this.#target.logitsFromHidden(moduleOut);
|
|
365
|
-
// Sampler contract is [1, V] (the main decode loop's shape). moduleOut
|
|
366
|
-
// is [1, 1, H] → logits [1, 1, V]; without this reshape any sampler
|
|
367
|
-
// that slices 2-D (top-k) throws "[slice] Invalid number of indices…
|
|
368
|
-
// dimension 3" — the serve-lane MTP 500 (chat defaults carry the
|
|
369
|
-
// model's top_k=20; the greedy bench harness never hit it).
|
|
370
|
-
const V = logits.shape[logits.shape.length - 1]!;
|
|
371
|
-
using flat = ops.reshape(logits, [1, V]);
|
|
372
|
-
logits.dispose();
|
|
373
|
-
using logprobs = toLogprobs(flat);
|
|
374
|
-
flat.dispose();
|
|
375
|
-
using tok = this.#sampler(logprobs, step);
|
|
376
|
-
logprobs.dispose();
|
|
377
|
-
return ops.itemUint32(tok);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
#checkOpen(): void {
|
|
381
|
-
if (this.#closed) throw new Error("qwen MTP source is closed");
|
|
382
|
-
}
|
|
383
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../mlx/array";
|
|
2
|
-
import { KVCache } from "../model/gemma4-base";
|
|
3
|
-
import { cloneAttachments } from "../backends/mlx/checkpoint-state";
|
|
4
|
-
import { disposeResources } from "../engine/resources";
|
|
5
|
-
import type { MtpRowState } from "./qwen-mtp-rows";
|
|
6
|
-
import type { DraftRowCheckpoint } from "./source";
|
|
7
|
-
|
|
8
|
-
/** The existing Qwen companion attachment is also the state interchange
|
|
9
|
-
* between prepared requests and a group. Storage-tier policy stays outside. */
|
|
10
|
-
export function restoreQwenMtpState(checkpoint: DraftRowCheckpoint): MtpRowState {
|
|
11
|
-
const { processedTokens: tokens, attachment } = checkpoint;
|
|
12
|
-
if (attachment.schema !== "qwen-mtp-v1" || attachment.metadata.draftOffset !== tokens - 1)
|
|
13
|
-
throw new Error("invalid paired Qwen MTP checkpoint alignment");
|
|
14
|
-
const held = cloneAttachments([attachment])[0]!.tensors;
|
|
15
|
-
let cache: KVCache | null = new KVCache();
|
|
16
|
-
try {
|
|
17
|
-
if (tokens > 1) { cache.restoreState(held[0]!, held[1]!, tokens - 1); held.splice(0, 2); }
|
|
18
|
-
const state = { cache, hidden: held.pop()! }; cache = null; return state;
|
|
19
|
-
} finally { disposeResources([...held, ...(cache ? [cache] : [])]); }
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function captureQwenMtpState(state: MtpRowState): DraftRowCheckpoint {
|
|
23
|
-
const held: MlxArray[] = [];
|
|
24
|
-
try {
|
|
25
|
-
if (state.cache.offset > 0) held.push(...state.cache.temporalView());
|
|
26
|
-
held.push(state.hidden.slice([0, 0, 0], [...state.hidden.shape]));
|
|
27
|
-
return { processedTokens: state.cache.offset + 1,
|
|
28
|
-
attachment: { schema: "qwen-mtp-v1", metadata: { draftOffset: state.cache.offset }, tensors: held.splice(0) } };
|
|
29
|
-
} finally { disposeResources(held); }
|
|
30
|
-
}
|