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,224 +0,0 @@
|
|
|
1
|
-
# DSpark — handoff
|
|
2
|
-
|
|
3
|
-
**State (2026-07-06): the DSpark paper is CODE-COMPLETE and serve-integrated.**
|
|
4
|
-
Architecture proven correct (overfit τ=3.24, paper-range); serve-integrated
|
|
5
|
-
behind `--draft-model` (Phase 1 — the `DraftSource` seam is KV-borrowing-ready;
|
|
6
|
-
sibling AssistantSource verified bit-lossless on real weights,
|
|
7
|
-
`tests/spec-serve-assistant.test.ts`); and every remaining paper component
|
|
8
|
-
landed in Phase 2 the same day: Alg-1 confidence-scheduled draft-length pruning
|
|
9
|
-
(checkpoint-driven, zero change for uncalibrated checkpoints), STS calibration
|
|
10
|
-
(§3.2.1, `calibration.ts` + `scripts/dspark-calibrate.ts`), the RNN sequential
|
|
11
|
-
head (Eq 6, `--seq-head rnn`, init-equivalent to Markov), the tightened draft
|
|
12
|
-
loop (on-device token chaining + deferred conf reads + `collectLogits:false`
|
|
13
|
-
on serve — bit-identity pinned), and the `dspark` variant rename + central
|
|
14
|
-
loader. Suites: smoke 21/21 · dspark tests 17/17 · adjacent server suites
|
|
15
|
-
green. **What remains is exactly the GPU work below** — data scale + 12B
|
|
16
|
-
retarget + train + calibrate + measure; e4b not netting a speedup is a
|
|
17
|
-
data/target-speed problem, not architecture. Full design:
|
|
18
|
-
[docs/design/dspark-speculative-decoding.md](../design/dspark-speculative-decoding.md).
|
|
19
|
-
|
|
20
|
-
## PATH A (preferred, no training) — DeepSeek's published 12B drafter
|
|
21
|
-
|
|
22
|
-
DeepSeek released a TRAINED drafter for our exact target:
|
|
23
|
-
`deepseek-ai/dspark_gemma4_12b_block7` (6.86 GB bf16, γ=7; DeepSpec repo is
|
|
24
|
-
the MIT reference impl + the oracle — see the "DeepSpec ground truth" section
|
|
25
|
-
of the design doc). Once the deepspec-variant port lands:
|
|
26
|
-
|
|
27
|
-
```sh
|
|
28
|
-
# 1. download the trained drafter (~6.9 GB)
|
|
29
|
-
mlx-bun get deepseek-ai/dspark_gemma4_12b_block7
|
|
30
|
-
# 2. oracle gate: dump their reference trace (temp 0 = RNG-free deterministic)
|
|
31
|
-
# in a torch venv, then compare ours round-for-round (scripts staged)
|
|
32
|
-
# 3. measure + serve (auto-detected via config.json architectures field)
|
|
33
|
-
mlx-bun serve --model gemma-4-12B-it-OptiQ-4bit --draft-model <snapshot-of-dspark_gemma4_12b_block7>
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Oracle protocol (step 2, expanded)
|
|
37
|
-
|
|
38
|
-
Two staged scripts implement the temp-0 deterministic trace protocol against
|
|
39
|
-
DeepSpec's own reference implementation (github.com/deepseek-ai/DeepSpec, MIT).
|
|
40
|
-
At temperature 0 their leaky-rejection verify degenerates to exact argmax
|
|
41
|
-
token-match — the whole round trace is RNG-free and reproducible, so a
|
|
42
|
-
plain round-for-round diff is a real bit-exact gate (same discipline as the
|
|
43
|
-
D2 diffusion oracle, minus RNG parity entirely — see the design doc's
|
|
44
|
-
"DeepSpec ground truth" section).
|
|
45
|
-
|
|
46
|
-
```sh
|
|
47
|
-
# a. dump the reference trace — needs its OWN torch venv (NOT the mlx-lm
|
|
48
|
-
# oracle venv at /Users/joshrossi/Code/mlx-lm/.venv, which has no
|
|
49
|
-
# torch/deepspec and shouldn't); see the script header for the exact
|
|
50
|
-
# venv-setup + pip install steps.
|
|
51
|
-
.venv-deepspec/bin/python scripts/oracle-dspark-deepspec.py \
|
|
52
|
-
--target <snapshot-dir-of-google/gemma-4-12B-it> \
|
|
53
|
-
--drafter <snapshot-of-dspark_gemma4_12b_block7> \
|
|
54
|
-
--data prompts.jsonl --n 8 --max-new-tokens 128 \
|
|
55
|
-
--temperature 0 --confidence-threshold 0 \
|
|
56
|
-
--out goldens/dspark-deepspec/trace-thr0.jsonl
|
|
57
|
-
|
|
58
|
-
# b. compare our port round-for-round
|
|
59
|
-
bun scripts/dspark-deepspec-compare.ts \
|
|
60
|
-
--fixture goldens/dspark-deepspec/trace-thr0.jsonl \
|
|
61
|
-
--target gemma-4-12B-it-bf16 --drafter <snapshot-of-dspark_gemma4_12b_block7>
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Run the pair twice — once at `--confidence-threshold 0` (no pruning), once at
|
|
65
|
-
`0.5` — to gate both the base draft loop and the confidence-truncation path.
|
|
66
|
-
|
|
67
|
-
Fixture location: `goldens/dspark-deepspec/*.jsonl` follows the house
|
|
68
|
-
manifest convention (goldens/README.md) — these are machine-independent
|
|
69
|
-
**JSON manifests** (prompts + token-id traces, no tensor blobs), so they are
|
|
70
|
-
the **tracked** kind, not the `.bin` machine-specific kind. Regenerate by
|
|
71
|
-
rerunning step (a); there is no `scripts/regen-*` wrapper for this family yet
|
|
72
|
-
since the oracle run needs its own GPU-hosting torch venv, not the mlx-lm
|
|
73
|
-
oracle venv this repo otherwise standardizes on.
|
|
74
|
-
|
|
75
|
-
**The OptiQ-4bit caveat is load-bearing, not a footnote**: the fixture above
|
|
76
|
-
is generated against the bf16 HF target. A `dspark-deepspec-compare.ts` run
|
|
77
|
-
with `--target` pointing at our bf16 12B is the TRUE bit-exact gate. A run
|
|
78
|
-
with `--target` pointing at the OptiQ-4bit-quantized 12B we actually serve is
|
|
79
|
-
a **separate acceptance-rate measurement** — tapped hiddens differ
|
|
80
|
-
numerically at 4-bit, so round-for-round divergence there is expected, not a
|
|
81
|
-
bug; pass `--acceptance-only` on that arm so the script reports an aggregate
|
|
82
|
-
accept-length reading instead of a PASS/FAIL assert.
|
|
83
|
-
|
|
84
|
-
Caveat: trained against the bf16 HF target; our serving 12B is OptiQ-4bit —
|
|
85
|
-
tapped hiddens differ numerically, so measure acceptance rather than assuming
|
|
86
|
-
their 60–85%.
|
|
87
|
-
|
|
88
|
-
**FIRST LIVE RUN (2026-07-07, loaded machine — directional only):** τ ≈ 2.8
|
|
89
|
-
committed/target-forward (200 tok / 72 verify rounds; per-token acceptance
|
|
90
|
-
26–33% — the predicted OptiQ-4bit degradation), output coherent, losslessness
|
|
91
|
-
holding. **But wall-clock LOST ~3.4×** (spec 14.6 vs serial 49.8 agg tok/s;
|
|
92
|
-
the 20 s bench TTFT is conc-4 queueing on the serial-forced spec lane, not
|
|
93
|
-
prefill). The tax is the drafter itself. **The full step-by-step program for
|
|
94
|
-
the next pass is
|
|
95
|
-
[docs/design/dspark-serving-program.md](../design/dspark-serving-program.md)**
|
|
96
|
-
(phases, gates, dependency graph; pickup at TurboQuant merge, only its
|
|
97
|
-
Phase 5 waits for it). Lever summary:
|
|
98
|
-
1. **Quantize the drafter** — the big one, and the ideal quantization target
|
|
99
|
-
PERIOD: drafter numerics only move ACCEPTANCE, never correctness
|
|
100
|
-
(losslessness is structural), so aggressive bpw is safe and the gate is a
|
|
101
|
-
single acceptance A/B. 6.9 GB bf16 → ~1.8 GB @4-bit kills both the
|
|
102
|
-
~3 GB/round bandwidth tax (2 GB lm_head + 7×134 MB markov_w2 reads) and
|
|
103
|
-
the 14 GB two-model memory pressure on 24 GB. Uniform 4-bit (mlx-native)
|
|
104
|
-
first as the baseline; **TurboQuant (Phase 13), when it lands, competes
|
|
105
|
-
on acceptance-per-byte against that baseline** — the drafter is its
|
|
106
|
-
lowest-risk first customer. Enabler either way: quantized-weight support
|
|
107
|
-
in deepspec-module's forward (quantized_matmul, the house pattern).
|
|
108
|
-
2. **Tighten deepspec draftBlock** — ~14 host syncs/round (7 argmax + 7
|
|
109
|
-
confidence reads); replay the on-device chaining + deferred-conf
|
|
110
|
-
tightening already done for our own module (threshold=0 needs NO conf
|
|
111
|
-
reads).
|
|
112
|
-
3. **captureLayer in the GENERATED gemma forwards** — tapped verifies
|
|
113
|
-
currently fall back to the monolith (correct-but-unspecialized); teach
|
|
114
|
-
scripts/gen-model.ts to emit the tap so spec verifies keep the fast path.
|
|
115
|
-
4. **γ sweep** — γ=7 at ~30% acceptance wastes drafts;
|
|
116
|
-
`--num-draft-tokens 2..3` may net better wall-clock free of any code.
|
|
117
|
-
|
|
118
|
-
## PATH B — train our own module (custom targets / research)
|
|
119
|
-
|
|
120
|
-
The payoff target is **12B** (27B is memory-infeasible to train on 24 GB; the
|
|
121
|
-
pipeline stays dim-generic so 27B remains a future recipe). All three scripts
|
|
122
|
-
take `--model` and (new, 2026-07-06) `--tap-layers` — the retarget is now a
|
|
123
|
-
pure parameterization, no code edits. **`--tap-layers` MUST be identical across
|
|
124
|
-
regen and train** (the shard feature dim is `m*H`, `m = tapLayers.length`).
|
|
125
|
-
|
|
126
|
-
12B tap set: use **`5,17,29,41,46`** — DeepSeek's actual trained
|
|
127
|
-
`target_layer_ids` for this model (their layer-output convention matches our
|
|
128
|
-
tapLayers indexing; audited 2026-07-06). Our earlier `24,37,47,48` guess is
|
|
129
|
-
superseded.
|
|
130
|
-
|
|
131
|
-
```sh
|
|
132
|
-
# 0. one-time: cache the 12B target + a prompt/topic corpus (thousands of
|
|
133
|
-
# on-distribution topics — the data-scale lever; 160 only reached per-pos ~0.17).
|
|
134
|
-
mlx-bun get mlx-community/gemma-4-12B-it-OptiQ-4bit
|
|
135
|
-
# (12B target may need the serve process stopped to free memory for regen.)
|
|
136
|
-
|
|
137
|
-
# 1. regen multi-layer training shards from the 12B target's own generations
|
|
138
|
-
bun scripts/dspark-regen-dflash.ts \
|
|
139
|
-
--model gemma-4-12B-it-OptiQ-4bit --tap-layers 5,17,29,41,46 \
|
|
140
|
-
--topics <thousands-of-topics.txt> --out data/dspark-12b --max-resp 320
|
|
141
|
-
|
|
142
|
-
# 2. train the drafter against the 12B (warm-start survivable via --resume;
|
|
143
|
-
# GPU runs kept getting killed ~step 5000 pre-resume). Optional A/B:
|
|
144
|
-
# --seq-head rnn trains the Eq-6 RNN head instead of Markov (Eq 5).
|
|
145
|
-
bun scripts/dspark-train-dflash.ts \
|
|
146
|
-
--model gemma-4-12B-it-OptiQ-4bit --tap-layers 5,17,29,41,46 \
|
|
147
|
-
--data data/dspark-12b --out ckpt/dspark-12b \
|
|
148
|
-
--iters 8000 --batch 8 [--seq-head rnn] [--ddraft 2560] [--resume ckpt/dspark-12b]
|
|
149
|
-
|
|
150
|
-
# 3. STS-calibrate (§3.2.1): fit per-position confidence thresholds on real
|
|
151
|
-
# verify outcomes and stamp them into dspark.json — this ACTIVATES the
|
|
152
|
-
# Alg-1 confidence scheduler at decode (uncalibrated = fixed-γ, no change).
|
|
153
|
-
bun scripts/dspark-calibrate.ts \
|
|
154
|
-
--model gemma-4-12B-it-OptiQ-4bit \
|
|
155
|
-
--drafter ckpt/dspark-12b --data <prompts.jsonl> [--target 0.5]
|
|
156
|
-
|
|
157
|
-
# 4. measure live τ + tok/s vs vanilla 12B decode (clean machine — dirty
|
|
158
|
-
# numbers are garbage). Run BOTH pre- and post-calibration for the
|
|
159
|
-
# scheduler's own A/B (MLX_BUN_DSPARK_MINCONF=<c> = manual uniform knob).
|
|
160
|
-
bun scripts/dspark-measure-dflash.ts \
|
|
161
|
-
--model gemma-4-12B-it-OptiQ-4bit \
|
|
162
|
-
--drafter ckpt/dspark-12b --data <prompts.jsonl>
|
|
163
|
-
|
|
164
|
-
# 5. serve it (auto-detected as kind=dspark via dspark.json; γ pinned to cfg.gamma)
|
|
165
|
-
mlx-bun serve --model gemma-4-12B-it-OptiQ-4bit --draft-model ckpt/dspark-12b
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
Decision gate (write it down, RESULTS.md only if clean-machine): does 12B live
|
|
169
|
-
τ net a wall-clock win? If the draft loop dominates, do the loop-tightening
|
|
170
|
-
(per-position host syncs + double 262K LM-head) first — see the open items in
|
|
171
|
-
the design doc. Memory guard (`server.ts`) caps context to fit; a client
|
|
172
|
-
sending huge `max_tokens` trips admission — lower it.
|
|
173
|
-
|
|
174
|
-
## What happened (short version)
|
|
175
|
-
- Built v1 first as a single-vector shortcut — it dropped the paper's core KV
|
|
176
|
-
injection and was never really DSpark. Chunk (τ≈1.26) and article (τ≈1.16)
|
|
177
|
-
runs on it were misleading.
|
|
178
|
-
- Rebuilt the **faithful** DFlash (multi-layer H_ctx injected into every draft
|
|
179
|
-
layer, 5 layers) in parallel `*-dflash.ts` files (v1 kept as baseline; repo
|
|
180
|
-
stays green).
|
|
181
|
-
- Found + fixed an **off-by-one in the p^t target** (TV loss trained against a
|
|
182
|
-
distribution shifted one token — present in v1 too, so all prior τ were bogus).
|
|
183
|
-
- **Overfit test settled it:** 3 articles, eval on same → per-pos ~0.75, τ=3.24.
|
|
184
|
-
The architecture reaches the paper's numbers; the plateau at ~0.17 on 160
|
|
185
|
-
articles is data-starvation, not capacity (confirmed: width 1024 vs 2560 both
|
|
186
|
-
plateau ~0.17).
|
|
187
|
-
- **Target-speed is the other half.** Measured decode: e4b 45.9, 12b 27.5, 27B
|
|
188
|
-
~15 tok/s. The fixed draft overhead only amortizes on a slow target — so e4b
|
|
189
|
-
is ~worst-case for spec decode; the **27B agentic workload is the real target**
|
|
190
|
-
(τ≈3 there could plausibly net ~2–3× → 15 → ~35–45 tok/s).
|
|
191
|
-
|
|
192
|
-
## Verified / working
|
|
193
|
-
- Parity-safe `hiddenTap` multi-layer extraction (`gemma4.ts`), no-op when off.
|
|
194
|
-
- `trim(n, bypass=true)` physical-slice rollback past the sliding window (`gemma4-base.ts`) — lossless gate held on 6K context.
|
|
195
|
-
- CPU smoke 16/16 (`dspark-dflash-smoke.ts`): KV-injection forward, autograd, inference, multi-layer variable-context data round-trip.
|
|
196
|
-
- Training `--resume` (warm-start from checkpoint) — the GPU runs kept getting killed ~step 5000; resume survives that.
|
|
197
|
-
|
|
198
|
-
## Next (in priority order)
|
|
199
|
-
1. **Retarget to 12B + scale data + train + calibrate + measure** — the GPU
|
|
200
|
-
recipe above is the complete remaining work. (27B stays a future recipe:
|
|
201
|
-
memory-infeasible to train on the 24 GB M4 Pro.)
|
|
202
|
-
2. ~~Tighten the draft inference loop~~ **DONE 2026-07-06** (on-device token
|
|
203
|
-
chaining, deferred conf reads, `collectLogits:false`; bit-identity pinned).
|
|
204
|
-
3. ~~Finish the paper~~ **DONE 2026-07-06**: RNN head (Eq 6, `--seq-head rnn`),
|
|
205
|
-
STS calibration (§3.2.1), Alg-1 confidence-scheduled draft-length pruning
|
|
206
|
-
(single-user form). ⚠ Eq 6 + §3.2.1 shapes are design-doc-faithful readings
|
|
207
|
-
(paper PDF absent) — verify against the paper when available.
|
|
208
|
-
4. ~~Rename `dflash`→`dspark`~~ **DONE 2026-07-06** (canonical variant +
|
|
209
|
-
central loader `src/spec/dspark/loader.ts`; legacy stamps still load).
|
|
210
|
-
|
|
211
|
-
## Key files
|
|
212
|
-
`src/spec/dspark/{module,data,generate}-dflash.ts`, `{loss,sample,calibration,loader}.ts`;
|
|
213
|
-
`src/spec/{source,serve-loop,dflash-source,assistant-source}.ts` (the serve seam);
|
|
214
|
-
`src/model/gemma4.ts` (hiddenTap), `gemma4-base.ts` (trim bypass);
|
|
215
|
-
`scripts/dspark-{regen,train,measure}-dflash.ts`, `dspark-dflash-smoke.ts`.
|
|
216
|
-
|
|
217
|
-
## Memory / gotchas
|
|
218
|
-
- `dspark-drafter-built-v1`, `dont-inflate-scope-build-the-paper` (the lesson:
|
|
219
|
-
build the paper's mechanism first — the faithful build was ~1hr; the wrong
|
|
220
|
-
builds cost the session).
|
|
221
|
-
- e4b hidden_size = **2560** (not 2816 — a different config block). Module reads dims live.
|
|
222
|
-
- Memory admission guard (`server.ts:1538`) rejects `prompt+max_tokens > maxSafeContext`
|
|
223
|
-
because a mid-gen GPU OOM SIGKILLs the server. 27B/32GB caps ~22.5k; a client
|
|
224
|
-
sending `max_tokens=64k` trips it — lower max_tokens (or make it a runtime stop).
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
# Expert offload for single-user local MoE — findings + design sketch
|
|
2
|
-
|
|
3
|
-
*2026-06-14. Research spike. Question: can Apple's AFM-3 "flash-resident
|
|
4
|
-
experts" idea (Instruction-Following Pruning) be applied to the MoE models
|
|
5
|
-
we already run, to stop the inactive experts from squatting in RAM? Sources:
|
|
6
|
-
Apple AFM-3 blog + IFP (arXiv 2501.02086) + LLM-in-a-flash (2312.11514);
|
|
7
|
-
MoE-offload prior art (Mixtral-offloading 2312.17238, Fiddler 2402.07033,
|
|
8
|
-
KTransformers SOSP'25, llama.cpp `--n-cpu-moe`). Grounded against PLAN
|
|
9
|
-
Phase 6 (MoE bring-up, measured), Phase 8 (LoRA hot-swap, shipped),
|
|
10
|
-
Phase 14 (Qwen 35B-A3B fit-table line), Phase 18 (slots).*
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## 0. TL;DR
|
|
15
|
-
|
|
16
|
-
A trained MoE already activates a tiny fraction of its weights per token, but
|
|
17
|
-
we currently hold **all** experts resident — measured at 14.09 GB of expert
|
|
18
|
-
pool to use ~0.9 GB/token on `gemma-4-26B-A4B` (PLAN Phase 6). Those cold
|
|
19
|
-
experts are read-only and rarely touched; the KV cache is hot, dirty, and
|
|
20
|
-
un-offloadable. The hardware is telling us which one goes to disk.
|
|
21
|
-
|
|
22
|
-
The catch with Apple's approach — it needs **task locality** (you can't swap
|
|
23
|
-
experts per token across the flash bus, only per prompt/period) — is the exact
|
|
24
|
-
property **single-user local AI gives us for free**: one human works on one
|
|
25
|
-
kind of thing for minutes-to-hours at a time. A multi-tenant server can't
|
|
26
|
-
promise that; a personal appliance can. So this is a feature that fits *our*
|
|
27
|
-
product identity specifically.
|
|
28
|
-
|
|
29
|
-
Two payoffs from one residency manager:
|
|
30
|
-
1. **Shrink a model that already fits**: 26B-A4B from ~16.4 GB resident →
|
|
31
|
-
~4–6 GB, returning ~10 GB to KV-context-length and to the user's other
|
|
32
|
-
apps. (Today the 26B leaves ~0 GB for anything else — see §2.)
|
|
33
|
-
2. **Admit a model that doesn't fit**: e.g. a 35B-A3B class model on 24 GB,
|
|
34
|
-
flipping PLAN Phase 14's "larger hardware only" line into "fits, with a
|
|
35
|
-
domain-switch warm-up cost."
|
|
36
|
-
|
|
37
|
-
**What's already done (de-risks this a lot):** the MoE forward is bit-exact
|
|
38
|
-
today (Phase 6, `gather_qmm`, `tests/moe-ops.test.ts`). The missing piece is
|
|
39
|
-
*only* the memory-tiering layer — not a new architecture.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## 0.5 Empirical findings — the mechanism is de-risked (2026-06-14)
|
|
44
|
-
|
|
45
|
-
Two probes on the M4 Pro (`scripts/probe-expert-residency.ts`,
|
|
46
|
-
`scripts/probe-mmap-gather.ts`) turned the design from a sketch into a verified
|
|
47
|
-
mechanism. Three results:
|
|
48
|
-
|
|
49
|
-
1. **Disposing MLX *device* buffers does NOT reliably return RAM to the OS.**
|
|
50
|
-
In the controlled case, allocating a 512 MB array and then calling
|
|
51
|
-
`dispose()` *and* `clearCache()` moved `rss` not one byte; `cache_memory`
|
|
52
|
-
read 0 throughout. So a **fixed device-buffer slot pool is the wrong
|
|
53
|
-
mechanism** — it can hold *less*, but it can't give RAM *back* when idle,
|
|
54
|
-
which is the whole point.
|
|
55
|
-
2. **The mmap clean-page path returns RAM to the OS deterministically.**
|
|
56
|
-
`munmap` of a mapped region dropped `rss` by exactly the mapped size
|
|
57
|
-
(−1 GB, and −2 GB at scale). This is the elastic-eviction substrate, and
|
|
58
|
-
it's exactly what expert weights are: read-only files.
|
|
59
|
-
3. **The GPU gathers straight from a page-aligned mmap, bit-exact.** GPU
|
|
60
|
-
`gather_qmm` reading a quantized expert directly from a 16 KB-page-aligned
|
|
61
|
-
mmap (at a realistic non-zero offset) was **bit-exact** vs the same weights
|
|
62
|
-
resident (`max|diff| = 0`, no NaN). The Phase-1 "GPU reads garbage from
|
|
63
|
-
unaligned wrapped pointers" hazard is avoided purely by page alignment — so
|
|
64
|
-
we need **no copy into (sticky) device buffers** at all.
|
|
65
|
-
|
|
66
|
-
**Revised design (supersedes the "materialize into resident MLX buffers / slot
|
|
67
|
-
pool" framing in §5):** bit-exact transparent offload where expert weights live
|
|
68
|
-
as **page-aligned, mmap-backed clean file pages** — a miss *maps* the region
|
|
69
|
-
(GPU gathers from it directly), eviction *unmaps* it (`munmap`/
|
|
70
|
-
`madvise(DONTNEED)`). Idle footprint collapses toward the core; a cold expert
|
|
71
|
-
is just an unmapped clean region re-faulted from SSD when routing asks. The one
|
|
72
|
-
requirement this forces: a one-time conversion to an **offload-ready expert
|
|
73
|
-
file** with each expert's weight/scales/biases starting on a page boundary
|
|
74
|
-
(safetensors packs them contiguously; the registry already scans the per-expert
|
|
75
|
-
byte offsets).
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## 1. What Apple actually does — and what's portable
|
|
80
|
-
|
|
81
|
-
Apple's AFM-3 "Core Advanced" is **two separable things**, and only one is
|
|
82
|
-
bolt-on:
|
|
83
|
-
|
|
84
|
-
- **Portable (inference-time runtime):** store the model in flash, stream only
|
|
85
|
-
the needed experts into DRAM, manage a resident working set. This is a
|
|
86
|
-
memory-management strategy — adoptable.
|
|
87
|
-
- **NOT portable (trained architecture):** the *per-prompt routing* that makes
|
|
88
|
-
it work is **Instruction-Following Pruning** — a predictor co-trained
|
|
89
|
-
end-to-end with the base weights so the model is *prunable by prompt*. The
|
|
90
|
-
base weights are updated during training. You cannot bolt IFP onto a
|
|
91
|
-
finished model, and trained-MoE experts are **not** human-interpretable by
|
|
92
|
-
task ("expert 7 = Python" is a myth). LLM-in-a-flash additionally needs a
|
|
93
|
-
ReLU-sparse FFN (a relufication fine-tune for SiLU/GeGLU models).
|
|
94
|
-
|
|
95
|
-
**Why per-prompt, not per-token:** flash→DRAM is ~1 GB/s on a phone vs ~100
|
|
96
|
-
GB/s DRAM — a standard token-routed MoE would thrash the bus, so Apple decides
|
|
97
|
-
the expert set once per prompt and freezes it. We don't need to copy the
|
|
98
|
-
*mechanism* (we have unified memory + a fast SSD, not a 1 GB/s phone bus); we
|
|
99
|
-
need the *insight* — amortize expert movement over a span where the working
|
|
100
|
-
set is stable.
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## 2. The memory problem, measured
|
|
105
|
-
|
|
106
|
-
On the M4 Pro (24 GB), a real desktop commits memory before the model loads:
|
|
107
|
-
macOS baseline ~4–6 GB, plus a working set of Chrome + IDE + Slack + Claude
|
|
108
|
-
Desktop + Mail + WhatsApp + Calendar ≈ 6–10 GB. That is ~10–16 GB gone before
|
|
109
|
-
inference.
|
|
110
|
-
|
|
111
|
-
`gemma-4-26B-A4B-OptiQ-4bit`, measured (PLAN Phase 6):
|
|
112
|
-
- **16.4 GB resident**, of which **14.09 GB is the expert pool**.
|
|
113
|
-
- **~0.9 GB of experts read per token** (top_k/num_experts of the pool). The
|
|
114
|
-
other ~13 GB is resident-but-idle on any given token — the squat.
|
|
115
|
-
- KV is *not* the hog for this model: 5/30 global layers, 2 global KV heads,
|
|
116
|
-
Gemma sliding window ⇒ max safe context ~17.6k at bf16 KV, gated by the
|
|
117
|
-
weight footprint, not the cache. (KV bites harder on longer contexts or
|
|
118
|
-
models with fatter global attention; the tiering principle below still
|
|
119
|
-
holds, but for *this* model the experts are unambiguously the target.)
|
|
120
|
-
|
|
121
|
-
So today the 26B leaves ~0 GB for apps and limits context to ~17.6k — and that
|
|
122
|
-
is the *good* case (a model that fits at all).
|
|
123
|
-
|
|
124
|
-
**The tiering principle.** Rank everything that wants RAM by access-frequency ×
|
|
125
|
-
mutability:
|
|
126
|
-
|
|
127
|
-
| What | Touched | Mutable | Belongs |
|
|
128
|
-
|---|---|---|---|
|
|
129
|
-
| KV cache | every token | read **+ write**, per-session dirty | resident — cannot offload (only quantize) |
|
|
130
|
-
| Attention / embeddings / shared experts | every token | read-only | resident |
|
|
131
|
-
| Active routed experts | ~top_k/N per token | read-only | resident working set + LRU |
|
|
132
|
-
| Cold routed experts | rarely, this token | read-only, **clean file pages** | **SSD** — the natural victim |
|
|
133
|
-
|
|
134
|
-
The current layout is backwards: it spends the fast tier on the coldest data.
|
|
135
|
-
Cold experts are read-only and clean (cheap to evict / re-read); KV is dirty
|
|
136
|
-
and hot (must stay). Two orthogonal levers compose along this split — quantized
|
|
137
|
-
KV shrinks the hot tier (Phase 9, shipped), expert offload shrinks the cold
|
|
138
|
-
tier (this note).
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## 3. The personal-AI insight: task locality is the unlock
|
|
143
|
-
|
|
144
|
-
Per-prompt/period expert selection only avoids thrash if the working set is
|
|
145
|
-
stable across that span. That is false for a topic-hopping chat and false for a
|
|
146
|
-
multi-tenant server — but **true for one human doing one job**: two hours of
|
|
147
|
-
coding, then a session reorganizing a 5,000-doc wiki. Within a task the hot
|
|
148
|
-
expert set is stable; you pay a re-warm only at task boundaries.
|
|
149
|
-
|
|
150
|
-
This is structurally the **same shape as the LoRA adapter system we already
|
|
151
|
-
ship** (Phase 8): one resident base model, the calling app declares intent
|
|
152
|
-
("use the coding fine-tune") via `/v1/adapters` + `adapterScoped()` in
|
|
153
|
-
`src/lora.ts` / `src/generate.ts`. Expert offload reuses that surface: the app
|
|
154
|
-
declares a *domain*, and the residency manager warms the experts that domain
|
|
155
|
-
has historically hit. The difference from LoRA: a hint, not a hard mount —
|
|
156
|
-
misses fall through to SSD (see §4), so correctness never depends on the hint.
|
|
157
|
-
|
|
158
|
-
**Scope boundary (important):** this is a single-user / single-active-task
|
|
159
|
-
feature. Under Phase 18 concurrent slots with diverse requests the locality
|
|
160
|
-
guarantee disappears — in that mode experts should stay resident (or accept
|
|
161
|
-
thrash). Don't combine the two naively; keep offload files separate from the
|
|
162
|
-
batch/slots work, per the slots discipline.
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## 4. The correctness fork
|
|
167
|
-
|
|
168
|
-
Two designs, very different parity implications:
|
|
169
|
-
|
|
170
|
-
- **A — Transparent offload (BIT-EXACT).** Cold experts on SSD; materialize
|
|
171
|
-
whichever experts routing picks into a resident buffer before `gather_qmm`;
|
|
172
|
-
hot LRU cache. Output is identical to today's all-resident path — same
|
|
173
|
-
`gather_qmm`, same tokens — only latency varies on a miss. Stays L1/L2. This
|
|
174
|
-
is the foundation.
|
|
175
|
-
- **B — Task-pinned routing (LOSSY).** Restrict routing to a pinned set and
|
|
176
|
-
skip cold experts → zero misses, lower latency, but the computation changed →
|
|
177
|
-
L3, KL-gated, default-off. This is the closest off-the-shelf analog to IFP's
|
|
178
|
-
select-and-freeze, and it's quality-risky on weights trained for per-token
|
|
179
|
-
routing.
|
|
180
|
-
|
|
181
|
-
**Recommendation:** ship A as the always-correct floor; layer the §3 domain
|
|
182
|
-
hint as a *prefetch* on top of A (warms the likely set, still bit-exact because
|
|
183
|
-
misses fall to SSD). Offer B only as an opt-in mode for users who'll trade a
|
|
184
|
-
little quality to eliminate switch latency — and keep it as a documented
|
|
185
|
-
default-off flag, never the only path (per the "don't delete optionality"
|
|
186
|
-
principle).
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## 5. Proposed architecture
|
|
191
|
-
|
|
192
|
-
Layered, each layer independently useful and independently gated:
|
|
193
|
-
|
|
194
|
-
1. **Offload-ready expert file (page-aligned).** A one-time conversion stores
|
|
195
|
-
each expert's packed weight/scales/biases starting on a 16 KB page boundary
|
|
196
|
-
(safetensors packs them contiguously; the registry already scans the per-
|
|
197
|
-
expert byte offsets). This is what lets the GPU gather straight from the
|
|
198
|
-
mmap — confirmed bit-exact in §0.5.
|
|
199
|
-
2. **Residency manager (mmap-backed).** Per (layer, expert) state: `unmapped`
|
|
200
|
-
(clean on SSD) / `mapped`. A miss maps the expert's page-aligned region
|
|
201
|
-
(`MlxArray.fromView` over the mmap) and the GPU gathers from it directly —
|
|
202
|
-
**no copy into device buffers** (§0.5 showed those don't reliably return to
|
|
203
|
-
the OS). Eviction = `munmap`/`madvise(DONTNEED)`, which returns RAM to the
|
|
204
|
-
OS deterministically. Attention + embeddings + shared experts stay pinned;
|
|
205
|
-
LRU over the mapped expert set under a byte budget. Default = everything
|
|
206
|
-
mapped (inert, like the slots flag), opt-in via `--expert-offload`.
|
|
207
|
-
3. **Domain prefetch (the LoRA-shaped surface).** Per-session/request `domain`
|
|
208
|
-
hint → prefetch that domain's profiled hot-set. Profiles are per-user,
|
|
209
|
-
persisted, updated online from observed routing (ties into the memory
|
|
210
|
-
flywheel). No hint ⇒ pure adaptive cache (still works, just pays re-warm at
|
|
211
|
-
task boundaries).
|
|
212
|
-
4. **(Optional) Pinned mode (B).** Hard-restrict routing to the warm set; L3
|
|
213
|
-
gated; default-off.
|
|
214
|
-
|
|
215
|
-
Correctness is preserved at layers 1–3 by construction: we always compute with
|
|
216
|
-
the experts routing actually selected; offload changes *where weights live and
|
|
217
|
-
when they arrive*, not *what is computed*.
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## 6. The two payoffs, quantified where we can
|
|
222
|
-
|
|
223
|
-
- **Shrink the 26B (already fits):** resident floor after offload ≈ non-expert
|
|
224
|
-
(16.4 − 14.09 ≈ 2.3 GB) + active working set + a hot cache. With a ~2–3 GB
|
|
225
|
-
hot cache that's ~5–6 GB resident vs 16.4 GB today → ~10 GB returned to KV
|
|
226
|
-
context length and to the user's apps. Decode cost is the unknown to measure
|
|
227
|
-
(§7).
|
|
228
|
-
- **Admit a 35B-A3B (doesn't fit):** characterize as a fit-table row today
|
|
229
|
-
(Phase 14), then show it runs usable with offload; the domain-switch warm-up
|
|
230
|
-
is the price. This *changes* the Phase 14 line.
|
|
231
|
-
|
|
232
|
-
All tok/s figures here are **unmeasured** until §7 runs on a cleared machine —
|
|
233
|
-
treat as hypotheses, not promises.
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
|
|
237
|
-
## 7. Tradeoffs and the load-bearing unknown
|
|
238
|
-
|
|
239
|
-
- **The #1 thing to measure: per-task expert skew.** Does a coding session
|
|
240
|
-
actually concentrate its routing on a stable subset, and how big is it? If
|
|
241
|
-
the hot ~50% of experts covers ≥90% of activations and is stable within a
|
|
242
|
-
task, the whole idea works; if routing is near-uniform per task, it doesn't.
|
|
243
|
-
This is empirical and unknown — measure before building anything else.
|
|
244
|
-
|
|
245
|
-
**E0 result (scripted, 2026-06-14 — `scripts/run-expert-trace.ts`, 8 prompts
|
|
246
|
-
× coding/writing/chat on the 26B): gate PASSES all three.** 90% of
|
|
247
|
-
activations land on ~40–47% of experts (51/53/60 of 128; uniform ≈ 90%) —
|
|
248
|
-
concentrated but moderate. Within-task stability (hot-set Jaccard over 4
|
|
249
|
-
windows) 0.63–0.70. Unique experts touched over ~1.2k tokens: 81–85% of the
|
|
250
|
-
3840 instances → the *touched* working set is large (~12 GB) even though
|
|
251
|
-
*activations* concentrate. Cross-task: coding vs prose 0.42–0.44
|
|
252
|
-
(specialised — domain prefetch pays), writing vs chat 0.68 (similar). Net:
|
|
253
|
-
bit-exact offload realistically frees ~6–7 GB (resident ~9–10 GB vs 16.4),
|
|
254
|
-
keeping the 90% hot set resident and re-faulting the rare tail — the exact
|
|
255
|
-
footprint-vs-miss-rate curve is E1's measurement, not an E0 promise. Caveat:
|
|
256
|
-
scripted short sessions; a real long focused session may tighten or broaden
|
|
257
|
-
the curve — worth a confirming real-session trace before locking a budget.
|
|
258
|
-
- **Switch cost.** = (bytes that must become newly resident) / SSD bandwidth
|
|
259
|
-
(~5–7 GB/s) + dequant + buffer setup. Pure I/O floor for a few-GB working set
|
|
260
|
-
is single-digit seconds; the conservative "30–60 s" budget leaves room for
|
|
261
|
-
dequant/repack and a near-total set change. Measure the real number; it
|
|
262
|
-
depends on how much the hot set overlaps between domains.
|
|
263
|
-
- **Miss latency on the bit-exact path.** A cold expert miss is a synchronous
|
|
264
|
-
SSD read on the decode critical path; bounded by ~7 GB/s × miss-rate. Hot
|
|
265
|
-
cache + domain prefetch are what keep miss-rate low.
|
|
266
|
-
- **Not for multi-tenant serving** (§3 scope boundary).
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## 8. Phased plan (proposed — for promotion into PLAN.md)
|
|
271
|
-
|
|
272
|
-
- **E0 — Measurement spike (no runtime risk).** Instrument the existing MoE
|
|
273
|
-
forward to log per-(layer,expert) selection over real coding / writing / chat
|
|
274
|
-
sessions. Produce the coverage curve (% experts covering 90/95/99% of
|
|
275
|
-
activations), within-task stability, and cross-task set shift. **Gate to
|
|
276
|
-
proceed:** hot-set coverage + stability good enough that offload pays. This
|
|
277
|
-
is the make-or-break, and it's pure observation.
|
|
278
|
-
- **E1 — Transparent offload (bit-exact).** Expert store + residency manager +
|
|
279
|
-
on-demand materialization + hot LRU, behind `--expert-offload` (default off /
|
|
280
|
-
inert). **Parity gate:** bit-exact vs current all-resident (L1/L2 unchanged).
|
|
281
|
-
Measure resident footprint + decode tok/s vs miss-rate on a cleared machine.
|
|
282
|
-
- **E2 — Domain prefetch (LoRA-shaped).** Per-session `domain` hint reusing the
|
|
283
|
-
adapter surface; per-user profile, learned online. Still bit-exact. Measure
|
|
284
|
-
cold-start vs warm latency and task-boundary switch cost.
|
|
285
|
-
- **E3 — Admit a non-fitting model.** Bring a 35B-A3B-class model up under
|
|
286
|
-
offload; show usable serving on 24 GB; flip the Phase 14 fit-table line.
|
|
287
|
-
- **E4 — (Optional) Pinned mode.** L3 KL-gated, default-off flag; only where the
|
|
288
|
-
quality delta is acceptable.
|
|
289
|
-
|
|
290
|
-
**Exit criterion (overall):** 26B-A4B served at bit-exact parity with resident
|
|
291
|
-
footprint cut to a measured target, leaving a usable machine, with a quantified
|
|
292
|
-
domain-switch cost — promoted into `benchmarks/RESULTS.md`.
|