mlx-bun 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
# IndexShare / IndexCache performance spike
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-08-16
|
|
4
|
-
**Status:** accepted research spike; paper/code audit complete; implementation and
|
|
5
|
-
full-model measurement not started
|
|
6
|
-
**Target:** GLM-5.2 DSA on the M1 Max 32 GB Colibri path
|
|
7
|
-
|
|
8
|
-
## Recommendation
|
|
9
|
-
|
|
10
|
-
Run the spike, but do not treat it as a new model feature. The GLM-5.2 path
|
|
11
|
-
already implements the checkpoint's cross-layer IndexShare schedule: retained
|
|
12
|
-
`full` layers run the DSA indexer and intervening `shared` layers reuse the most
|
|
13
|
-
recent selection. The useful work is to make that correctness path production
|
|
14
|
-
shaped, prove long-context parity, and measure whether the saved indexer work is
|
|
15
|
-
visible behind expert I/O on Apple Silicon.
|
|
16
|
-
|
|
17
|
-
The first prerequisite is the exact stock indexer overlay. The pinned public
|
|
18
|
-
Colibri artifact has no `out-idx-*` files, so every full-model result recorded
|
|
19
|
-
to date is DSA-off. The second prerequisite is a scalable indexer path: current
|
|
20
|
-
code materializes a large `[heads, context, head_dim]` product, copies every
|
|
21
|
-
score to the host, sorts the full score vector in JavaScript, and supports
|
|
22
|
-
sparse DSA only for single-token decode. Those choices are good correctness
|
|
23
|
-
scaffolding but cannot test the paper's long-prefill result.
|
|
24
|
-
|
|
25
|
-
This spike must not change the trained `full`/`shared` pattern or expose it as a
|
|
26
|
-
normal user knob. GLM-5.2 ships IndexShare as checkpoint architecture, not as an
|
|
27
|
-
optional quality/performance preset.
|
|
28
|
-
|
|
29
|
-
## Naming and source claims
|
|
30
|
-
|
|
31
|
-
The linked paper calls the method **IndexCache**. The GLM-5.2 model card calls
|
|
32
|
-
the deployed architecture **IndexShare**. They use the same core mechanism:
|
|
33
|
-
cache the top-k positions produced by a retained DSA indexer and reuse them in
|
|
34
|
-
subsequent shared layers.
|
|
35
|
-
|
|
36
|
-
Primary sources:
|
|
37
|
-
|
|
38
|
-
- [IndexCache paper, arXiv:2603.12201v1](https://arxiv.org/abs/2603.12201v1)
|
|
39
|
-
- [authors' SGLang/vLLM reference patches](https://github.com/THUDM/IndexCache)
|
|
40
|
-
- [pinned GLM-5.2 model card](https://huggingface.co/zai-org/GLM-5.2/blob/f6142f127a14b58dc602592e996cd7d8ff139351/README.md)
|
|
41
|
-
- [pinned GLM-5.2 configuration](https://huggingface.co/zai-org/GLM-5.2/blob/f6142f127a14b58dc602592e996cd7d8ff139351/config.json)
|
|
42
|
-
|
|
43
|
-
The sources establish three different claims that must not be blended:
|
|
44
|
-
|
|
45
|
-
| Claim | Published evidence | What mlx-bun may say before local measurement |
|
|
46
|
-
|---|---|---|
|
|
47
|
-
| Cross-layer reuse | F layers compute top-k; S layers reuse the nearest preceding F layer | Implemented semantics, once parity is gated |
|
|
48
|
-
| IndexCache speed | On a 30B DSA model on an 8x H100 node, 1/4 retention reached up to 1.82x prefill and 1.48x per-request decode at 200K context | Paper result only; not a Mac prediction |
|
|
49
|
-
| GLM-5.2 IndexShare | The model card says one retained indexer per four sparse-attention layers reduces per-token FLOPs by 2.9x at 1M context | Vendor FLOP claim only; not end-to-end speed |
|
|
50
|
-
|
|
51
|
-
The paper also reports that uniform 1/4 retention hurts a frozen 30B model's
|
|
52
|
-
long-context average (50.2 to 43.0), while a loss-searched pattern recovers it
|
|
53
|
-
to 49.9. Training-aware IndexCache makes uniform interleaving viable. Therefore
|
|
54
|
-
mlx-bun must preserve GLM-5.2's trained schedule rather than search a new one
|
|
55
|
-
during this spike.
|
|
56
|
-
|
|
57
|
-
## GLM-5.2 schedule
|
|
58
|
-
|
|
59
|
-
The pinned GLM-5.2 config has 78 layers, `index_topk=2048`,
|
|
60
|
-
`index_topk_freq=4`, and `index_skip_topk_offset=3`. Its explicit schedule has
|
|
61
|
-
21 full and 57 shared layers:
|
|
62
|
-
|
|
63
|
-
```text
|
|
64
|
-
FFFSSSFSSSFSSSF...FSSS
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
Relative to an all-full counterfactual, the checkpoint omits 57/78 = 73.1% of
|
|
68
|
-
layer indexer invocations. It does not ship the missing shared-layer indexer
|
|
69
|
-
weights, so a true same-checkpoint `IndexShare off` A/B is impossible. Any
|
|
70
|
-
estimated all-full number must be labeled a component counterfactual, not an
|
|
71
|
-
end-to-end model benchmark.
|
|
72
|
-
|
|
73
|
-
`index_share_for_mtp_iteration` is a second, orthogonal optimization: reuse
|
|
74
|
-
indices across speculative draft iterations. mlx-bun parses that field but does
|
|
75
|
-
not currently consume it in the MTP runtime. Keep its measurement separate so
|
|
76
|
-
cross-layer IndexShare and MTP-iteration sharing each receive an attributable
|
|
77
|
-
result.
|
|
78
|
-
|
|
79
|
-
## Current mlx-bun state
|
|
80
|
-
|
|
81
|
-
Already present:
|
|
82
|
-
|
|
83
|
-
- [`src/model/glm52-config.ts`](../../src/model/glm52-config.ts) parses explicit
|
|
84
|
-
`indexer_types` and the frequency/offset fallback.
|
|
85
|
-
- [`src/model/glm52.ts`](../../src/model/glm52.ts) constructs DSA indexers only
|
|
86
|
-
for full layers and passes one request-local selection state through the
|
|
87
|
-
decoder stack.
|
|
88
|
-
- [`src/model/glm52-dsa.ts`](../../src/model/glm52-dsa.ts) records a full
|
|
89
|
-
layer's exact dense/sparse selection and serves it to shared layers.
|
|
90
|
-
- [`tests/glm52-config-container.test.ts`](../../tests/glm52-config-container.test.ts)
|
|
91
|
-
and [`tests/glm52-dsa.test.ts`](../../tests/glm52-dsa.test.ts) cover schedule
|
|
92
|
-
parsing, missing-owner refusal, context consistency, and exact reuse.
|
|
93
|
-
|
|
94
|
-
Known blockers and likely bottlenecks:
|
|
95
|
-
|
|
96
|
-
1. **No production DSA overlay.** The public Colibri artifact deliberately
|
|
97
|
-
disables DSA because every full-layer indexer tensor is absent. Producing the
|
|
98
|
-
exact overlay requires selective reads from 20 pinned source shards (about
|
|
99
|
-
99.90 GiB input, about 197 MB output). This is a Josh-run acquisition step,
|
|
100
|
-
not an agent-session download.
|
|
101
|
-
2. **No sparse long prefill.** `Glm52DsaIndexer.projectAndSelect()` rejects a
|
|
102
|
-
multi-token prefill once context exceeds `index_topk`. The paper's prefill
|
|
103
|
-
headline is therefore out of scope until chunked/sparse DSA prefill exists.
|
|
104
|
-
3. **Quadratic transient shape.** `glm52DsaScoresMlx()` forms the broadcast
|
|
105
|
-
product before reduction. At production geometry this scales as
|
|
106
|
-
`32 * context * 128` float elements rather than streaming/tiled score
|
|
107
|
-
accumulation.
|
|
108
|
-
4. **GPU-to-host top-k.** The full score vector crosses to a `Float32Array`,
|
|
109
|
-
then `selectDsaThresholdTiesF32()` clones and sorts all positions. This is
|
|
110
|
-
`O(context log context)` host work in each full layer, unlike the production
|
|
111
|
-
GPU top-k assumed by the paper.
|
|
112
|
-
5. **Shared-index copies.** Shared layers clone the 2,048-element JavaScript
|
|
113
|
-
positions list, and absorbed MLA uploads it again before each gather. The
|
|
114
|
-
paper's temporary index tensor is reused in place. Measure this separately;
|
|
115
|
-
remove copies only after ownership and asynchronous lifetime are gated.
|
|
116
|
-
6. **The current short-context bottleneck is elsewhere.** At 128 tokens the
|
|
117
|
-
full model is limited by streamed expert delivery, and DSA cannot prune a
|
|
118
|
-
prefix smaller than 2,048. No short-context speedup should be expected.
|
|
119
|
-
|
|
120
|
-
## Hypotheses
|
|
121
|
-
|
|
122
|
-
- **H1 - component cost:** at the longest context that fits the 32 GB contract,
|
|
123
|
-
retained-indexer time is material and grows roughly linearly per decode token
|
|
124
|
-
with context length.
|
|
125
|
-
- **H2 - sharing value:** avoiding 57 of 78 indexer invocations removes a
|
|
126
|
-
measurable amount of counterfactual work even after a tiled score/top-k
|
|
127
|
-
kernel is used.
|
|
128
|
-
- **H3 - product value:** DSA plus the shipped IndexShare schedule improves
|
|
129
|
-
end-to-end long-context decode over DSA-off full attention, without token
|
|
130
|
-
drift from the official DSA runtime. This comparison measures the combined
|
|
131
|
-
sparse-attention product, not IndexShare in isolation.
|
|
132
|
-
- **H4 - MTP interaction:** any win remains a win with native MTP enabled. A
|
|
133
|
-
decode-only win that disappears under the product MTP path is not a default
|
|
134
|
-
performance claim.
|
|
135
|
-
|
|
136
|
-
## Bounded experiment
|
|
137
|
-
|
|
138
|
-
### Stage 0 - artifact and parity gate
|
|
139
|
-
|
|
140
|
-
1. Generate the immutable `out-idx-*` overlay from the pinned
|
|
141
|
-
`zai-org/GLM-5.2-FP8` revision. Record source revision, selected shard list,
|
|
142
|
-
tensor inventory, byte count, and SHA-256 values. Do not mutate the 357 GiB
|
|
143
|
-
serving snapshot.
|
|
144
|
-
2. Header-validate exactly the 21 full-layer indexers required by the shipped
|
|
145
|
-
schedule and prove that shared-layer indexers are neither required nor
|
|
146
|
-
silently loaded.
|
|
147
|
-
3. Add an official-runtime oracle at contexts above 2,048. Gate selected
|
|
148
|
-
positions, logits on tie-free rows, and greedy token IDs before taking any
|
|
149
|
-
performance number.
|
|
150
|
-
|
|
151
|
-
#### Stage 0 result — pass (2026-08-17)
|
|
152
|
-
|
|
153
|
-
The stock overlay was generated outside mlx-bun from
|
|
154
|
-
`zai-org/GLM-5.2-FP8@ba978f7d347eaf65d22f1a86833408afdb953541`
|
|
155
|
-
with `colibri@ecade075cfc2eae684097ea7de5570c3786ce199`. It contains 20
|
|
156
|
-
`out-idx-*` files totaling 197,202,400 bytes. The existing header validator
|
|
157
|
-
finds 118,646 tensors, 59,066 quantized tensors, 19,456 routed experts,
|
|
158
|
-
complete DSA and MTP families, all 21 required full-layer indexers, and no
|
|
159
|
-
shared-layer indexer requirement.
|
|
160
|
-
|
|
161
|
-
The first-sparse gate prefills exactly 2,048 deterministic tokens, then sends
|
|
162
|
-
one greedy token at context 2,049 with MTP off. The mlx-bun probe observes the
|
|
163
|
-
21 configured full layers and exactly 2,048 selected positions per layer. A
|
|
164
|
-
detached pinned Colibri build captures each official score row, selection,
|
|
165
|
-
float32 logit vector, and token trajectory. Replaying the captured scores with
|
|
166
|
-
`Glm52DsaSelectionState` gives:
|
|
167
|
-
|
|
168
|
-
- 21/21 exact ordered position vectors;
|
|
169
|
-
- 21/21 exact float32 thresholds;
|
|
170
|
-
- 21/21 tie-free boundaries, minimum boundary gap 0.025123596;
|
|
171
|
-
- exact greedy trajectory `[264, 264]` and the same sparse-step top-1 token;
|
|
172
|
-
- 154,880-logit cosine 0.997645, RMSE 0.200109, maximum absolute drift
|
|
173
|
-
0.947218, with wide top-1 margins in both runtimes (9.571914 / 9.567580).
|
|
174
|
-
|
|
175
|
-
The direct full-runtime selections are 10/21 ordered-exact and 14/21
|
|
176
|
-
set-exact. Each of the seven set differences swaps only the single excluded
|
|
177
|
-
position at this top-2,048-of-2,049 boundary. This is upstream numerical drift
|
|
178
|
-
from the runtimes' different quantized-matmul accumulation before DSA, not a
|
|
179
|
-
selector mismatch; replaying identical official scores proves the isolated
|
|
180
|
-
DSA threshold/tie contract exactly. No performance claim is made from either
|
|
181
|
-
correctness run.
|
|
182
|
-
|
|
183
|
-
Reproduction is split between
|
|
184
|
-
`scripts/probe-colibri-glm52-dsa-long.ts` and
|
|
185
|
-
`scripts/check-colibri-glm52-dsa-long.ts`. The raw capture, external Colibri
|
|
186
|
-
instrumentation patch, and SHA-256 inventory are machine-local at
|
|
187
|
-
`~/.cache/mlx-bun/evidence/glm52-dsa-stage0-2026-08-17/`; manifest SHA-256 is
|
|
188
|
-
`6ecb88d944b055146dd700a1714af97b61845d4218527282fcbea009663fe3b4`.
|
|
189
|
-
|
|
190
|
-
### Stage 1 - production-shaped indexer kernel
|
|
191
|
-
|
|
192
|
-
Build a model-free benchmark at exact geometry (`32` heads, head dimension
|
|
193
|
-
`128`, top-k `2048`) for contexts `2,048`, `8,192`, and `32,768`:
|
|
194
|
-
|
|
195
|
-
- tiled score accumulation that never materializes `[H,L,D]`;
|
|
196
|
-
- on-device/native deterministic top-k with the current threshold and
|
|
197
|
-
lower-position tie contract;
|
|
198
|
-
- one compact index buffer retained across F -> S layers;
|
|
199
|
-
- direct gather consumption without a score-vector host copy or per-shared-
|
|
200
|
-
layer index re-upload.
|
|
201
|
-
|
|
202
|
-
Compare the candidate against the existing reference composition for exact
|
|
203
|
-
selected positions on random, tied, all-equal, and production-captured rows.
|
|
204
|
-
Record kernel time, synchronization time, peak MLX allocation, process
|
|
205
|
-
footprint, and bytes copied to/from the host. Negative results count.
|
|
206
|
-
|
|
207
|
-
#### Stage 1 result — pass (2026-08-17)
|
|
208
|
-
|
|
209
|
-
The production path now computes `[H,D] @ [D,L] -> [H,L]` and never forms the
|
|
210
|
-
old `[H,L,D]` broadcast product. Deterministic device selection encodes the
|
|
211
|
-
lexicographic `(score descending, position ascending)` rank into `uint64`, uses
|
|
212
|
-
MLX `argpartition`, and then restores Colibri's observable two-scan ordering
|
|
213
|
-
(strictly above threshold first, threshold ties second). A FULL layer retains
|
|
214
|
-
only the resulting 2,048-entry, 8 KiB index buffer; SHARED layers borrow that
|
|
215
|
-
same device array and MLA gathers from it directly. Normal inference performs
|
|
216
|
-
no score/index host readback or per-SHARED-layer upload. The probe observer is
|
|
217
|
-
the explicit diagnostic exception.
|
|
218
|
-
|
|
219
|
-
Correctness gates pass for deterministic random rows, threshold ties,
|
|
220
|
-
all-equal rows, the exact 2,049/2,048 boundary, borrowed MLA consumption, and
|
|
221
|
-
all 21 production-captured Colibri score rows. The latter reproduce exact
|
|
222
|
-
ordered positions and float32 thresholds on device. A fresh full-model run
|
|
223
|
-
also reproduced all 21 prior mlx-bun position vectors and both greedy tokens;
|
|
224
|
-
its complete 154,880-float decode-logit payload is byte-identical (SHA-256
|
|
225
|
-
`d1f62be2de4877d2fc8ae8feab88e522958210252b50ef96eb786cb22581ba18`).
|
|
226
|
-
Tiled accumulation moved nine diagnostic thresholds by at most
|
|
227
|
-
`3.0517578125e-5`, but no selection boundary moved.
|
|
228
|
-
|
|
229
|
-
The exact-geometry, warm synchronized component benchmark (seven repeats) is:
|
|
230
|
-
|
|
231
|
-
| Context | Production behavior | Score median | Score + top-k median | Timed host copies | MLX peak |
|
|
232
|
-
|---:|---|---:|---:|---:|---:|
|
|
233
|
-
| 2,048 | dense boundary; production skips score/top-k | 0.448 ms (diagnostic only) | — | 0 B | 1.27 MiB |
|
|
234
|
-
| 8,192 | sparse | 0.473 ms | 0.929 ms | 0 B | 5.41 MiB |
|
|
235
|
-
| 32,768 | sparse | 0.748 ms | 1.269 ms | 0 B | 21.35 MiB |
|
|
236
|
-
|
|
237
|
-
At those contexts the removed broadcast product would have been 32, 128, and
|
|
238
|
-
512 MiB respectively; the tiled dot output is 0.25, 1, and 4 MiB. These are
|
|
239
|
-
model-free component measurements, not end-to-end inference claims. The
|
|
240
|
-
benchmark is `scripts/bench-glm52-dsa-indexer.ts`. Machine-local evidence is
|
|
241
|
-
under `~/.cache/mlx-bun/evidence/glm52-dsa-stage1-2026-08-17/`; manifest
|
|
242
|
-
SHA-256 is
|
|
243
|
-
`600ec92c41d4c66735e1834a678a09f2ae55ecdddfab31c3dd1bf31ee9709fef`.
|
|
244
|
-
|
|
245
|
-
### Stage 2 - decode matrix
|
|
246
|
-
|
|
247
|
-
Use direct library inference, not a server. Run separate fresh processes and
|
|
248
|
-
the standard quiet-machine preflight.
|
|
249
|
-
|
|
250
|
-
| Axis | Cells |
|
|
251
|
-
|---|---|
|
|
252
|
-
| Context | 2,048; 8,192; 32,768; 64K only if the exact planner remains inside the 25 GiB process ceiling |
|
|
253
|
-
| DSA | off/full attention; on with the checkpoint's 21F/57S schedule |
|
|
254
|
-
| MTP | off to isolate DSA; on for the product decision |
|
|
255
|
-
| Residency | the same fixed expert policy and seed profile in every paired arm |
|
|
256
|
-
| Repeats | three fresh processes per default-eligible cell; cold and warm turn in each process |
|
|
257
|
-
|
|
258
|
-
For each turn record TTFT, prefill wall time, decode tok/s, total wall time,
|
|
259
|
-
DSA projection/score/top-k/gather time, MLA time, expert disk service/wait,
|
|
260
|
-
target forwards, MTP acceptance, physical footprint, compression, swap, and
|
|
261
|
-
exact token IDs.
|
|
262
|
-
|
|
263
|
-
The DSA-off versus DSA-on result combines sparse core attention with
|
|
264
|
-
IndexShare. To estimate IndexShare's isolated contribution, report the measured
|
|
265
|
-
retained-indexer total and a clearly labeled all-full component counterfactual
|
|
266
|
-
derived from the same per-layer exact-geometry benchmark. Do not present that
|
|
267
|
-
counterfactual as a runnable checkpoint.
|
|
268
|
-
|
|
269
|
-
#### Stage 2 result — pass, negative product-performance decision (2026-08-17)
|
|
270
|
-
|
|
271
|
-
The fresh-process runner planned 36 cells. Twenty-four were eligible under the
|
|
272
|
-
G5 25 GiB process ceiling and completed: contexts 2,048 and 8,192, four DSA/MTP
|
|
273
|
-
arms, and three repeats. Every process ran cold and warm turns. Cold/warm,
|
|
274
|
-
cross-repeat, and MTP-off/on greedy token vectors were exact; all emitted
|
|
275
|
-
sixteen token IDs equal to `264`. The twelve 32K combinations were not run:
|
|
276
|
-
the exact planner reports 29,334,150,784 bytes (27.320 GiB) MTP-off and
|
|
277
|
-
30,644,281,216 bytes (28.540 GiB) MTP-on, both above the unchanged 25 GiB
|
|
278
|
-
process limit. The initial refusal is retained in the evidence as an attempt
|
|
279
|
-
record. This is contract ineligibility, not an allocation crash.
|
|
280
|
-
|
|
281
|
-
Long prompts use an explicitly bounded benchmark seam: dense batched prompt
|
|
282
|
-
construction ends at the exact prompt boundary, and every subsequent decode or
|
|
283
|
-
MTP verification row uses exact DSA. These numbers characterize decode and
|
|
284
|
-
whole-turn wall time only. They are not sparse-prefill measurements.
|
|
285
|
-
|
|
286
|
-
Warm medians across three fresh processes are:
|
|
287
|
-
|
|
288
|
-
| Context | DSA | MTP | Decode tok/s | Total wall |
|
|
289
|
-
|---:|---|---|---:|---:|
|
|
290
|
-
| 2,048 | off | off | 0.1363 | 260.9 s |
|
|
291
|
-
| 2,048 | on | off | 0.1318 | 271.5 s |
|
|
292
|
-
| 2,048 | off | on | 0.1312 | 281.7 s |
|
|
293
|
-
| 2,048 | on | on | 0.0880 | 338.7 s |
|
|
294
|
-
| 8,192 | off | off | 0.1292 | 722.1 s |
|
|
295
|
-
| 8,192 | on | off | 0.1420 | 711.8 s |
|
|
296
|
-
| 8,192 | off | on | 0.1587 | 711.8 s |
|
|
297
|
-
| 8,192 | on | on | 0.1042 | 770.1 s |
|
|
298
|
-
|
|
299
|
-
At 8K without MTP, the paired median DSA delta is +12.38% decode throughput
|
|
300
|
-
and -1.89% total wall time. Expert I/O and prompt work hide most of the decode
|
|
301
|
-
gain, leaving the whole-turn result below the required 5%. With MTP enabled,
|
|
302
|
-
the paired median delta reverses to -34.33% decode throughput and +8.19% total
|
|
303
|
-
wall time. The exact MTP trace explains part of the product result: DSA-off
|
|
304
|
-
accepted ten drafts in five rounds (3.2 tokens/target forward, six target
|
|
305
|
-
calls), whereas DSA-on accepted eight drafts in seven rounds (2.286
|
|
306
|
-
tokens/target forward, eight target calls). Small verify batches now keep
|
|
307
|
-
residual/MLP/expert work batched, but exact causal sparse attention still runs
|
|
308
|
-
per verification row. Two of the three 8K DSA+MTP cells observed net swap
|
|
309
|
-
growth, so the memory side of the win gate also does not close.
|
|
310
|
-
|
|
311
|
-
The immutable external overlay retains 197,202,400 bytes of indexers. As a
|
|
312
|
-
clearly labeled non-runnable component counterfactual, Stage 1's 8K
|
|
313
|
-
score+top-k median implies 19.51 ms for the shipped 21 FULL layers versus
|
|
314
|
-
72.48 ms for hypothetical 78 FULL layers, so IndexShare avoids about 52.97 ms
|
|
315
|
-
of selection work per target row. At 32K the corresponding component-only
|
|
316
|
-
figures are 26.64 ms, 98.95 ms, and 72.31 ms avoided. The checkpoint lacks the
|
|
317
|
-
57 missing indexers, and these sums exclude the rest of model execution.
|
|
318
|
-
|
|
319
|
-
The product decision is negative: retain the exact 21F/57S implementation as
|
|
320
|
-
model semantics and land its correctness/scalability work, but make no local
|
|
321
|
-
end-to-end speed claim. Decode is conclusive, so Stage 3 remains a separate
|
|
322
|
-
deferred prefill experiment rather than a G6R exit requirement. Evidence is
|
|
323
|
-
under `~/.cache/mlx-bun/evidence/glm52-dsa-stage2-2026-08-17/`; manifest
|
|
324
|
-
SHA-256 is
|
|
325
|
-
`90b3fe4ed53714604b7a747991b3bb1b87aedbf57a139915065f5b4be42cda38`.
|
|
326
|
-
|
|
327
|
-
### Stage 3 - deferred prefill follow-up
|
|
328
|
-
|
|
329
|
-
Only after decode is characterized, implement chunked sparse prefill with exact
|
|
330
|
-
causal selection semantics and run the same context ladder. This is the stage
|
|
331
|
-
that can test whether the paper's growing prefill benefit translates to MLX;
|
|
332
|
-
the existing single-token path cannot support that claim.
|
|
333
|
-
|
|
334
|
-
## Decision rules
|
|
335
|
-
|
|
336
|
-
- Preserve the shipped 21F/57S schedule regardless of outcome; it is model
|
|
337
|
-
semantics.
|
|
338
|
-
- Call the work a local performance win only when three fresh MTP-on processes
|
|
339
|
-
are token-identical and the paired median end-to-end wall time improves by at
|
|
340
|
-
least 5% at a context that fits the 32 GB contract, without new swap or a
|
|
341
|
-
footprint regression outside the existing G5 bounds.
|
|
342
|
-
- If the kernel saves DSA time but expert I/O hides the wall win, land only the
|
|
343
|
-
correctness/scalability work and record the negative end-to-end result.
|
|
344
|
-
- Do not quote the paper's H100 speedups or GLM-5.2's 1M-token FLOP reduction as
|
|
345
|
-
mlx-bun speed. Curated claims require this machine's `benchmark.sh`-quality
|
|
346
|
-
evidence and belong in `benchmarks/RESULTS.md` only after the gate passes.
|
|
347
|
-
- Evaluate MTP-iteration index sharing as a separate follow-up with its own
|
|
348
|
-
on/off control and acceptance trace.
|
|
349
|
-
|
|
350
|
-
## Exit
|
|
351
|
-
|
|
352
|
-
The spike closes when the DSA overlay is provenance-pinned, long-context
|
|
353
|
-
IndexShare matches an official runtime, the production-shaped score/top-k path
|
|
354
|
-
has exact model-free gates, and the paired MTP-off/on decode matrix has a
|
|
355
|
-
written decision. Prefill may remain a separately tracked follow-up only if the
|
|
356
|
-
decode result is already conclusive; otherwise sparse long prefill is required
|
|
357
|
-
before closure.
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# Kernel/perf deep review — 2026-07-01 (condensed, tracked record)
|
|
2
|
-
|
|
3
|
-
A 25-agent adversarially-verified review of every Metal/fused kernel and
|
|
4
|
-
training memory path (7 areas; every suspected bug survived an independent
|
|
5
|
-
refutation pass before making this list). Raw structured output (all seven
|
|
6
|
-
area reviews + full mechanisms): `reports/kernel-perf-review-2026-07-01.json`
|
|
7
|
-
(gitignored, local). This file is the durable record.
|
|
8
|
-
|
|
9
|
-
## Area verdicts (one line each)
|
|
10
|
-
|
|
11
|
-
- **flash-CCE head** (steel fwd + H-tiled bwd): done unusually well — verbatim
|
|
12
|
-
vendored MLX steel machinery, exact-by-default backward with autograd + FD
|
|
13
|
-
parity — marred by decision drift: the PLAN-decided 1.35× filter win was
|
|
14
|
-
never landed and the in-code comments argued three contradictory positions
|
|
15
|
-
(comments fixed 2026-07-01; the FLIP LANDED 2026-07-02 — see backlog #1).
|
|
16
|
-
- **Training flash-attention kernel**: faithful port with exemplary post-bug
|
|
17
|
-
discipline, correctly opt-in — but it copies a naive oracle (~30× slower)
|
|
18
|
-
and its tests covered none of the production configs (extended 2026-07-01:
|
|
19
|
-
D=256, sliding-window, non-tile T; ≥2K e4b revalidation still Josh-gated).
|
|
20
|
-
- **Inference fused paths**: disciplined and honest (everything measured,
|
|
21
|
-
gated, losses documented) — one real latent bug (fixed) + the open 26B
|
|
22
|
-
perf-kernel checkbox.
|
|
23
|
-
- **Quantized-KV attention**: line-faithful ports, tol=0 oracle gates, no
|
|
24
|
-
materialized dequant on the serving path — optiq's streaming per-layer
|
|
25
|
-
conversion was only half-ported (fixed 2026-07-01) and FUSED_DECODE×
|
|
26
|
-
compiled-decode composes unsafely (OPEN — see below).
|
|
27
|
-
- **Training memory machinery (segmented backward)**: the strongest subsystem
|
|
28
|
-
reviewed — the mlx_vjp-per-segment design is the correct primitive, disposal
|
|
29
|
-
exception-safe in all five classes.
|
|
30
|
-
- **Metal infra + megakernel learnings**: apply() is careful post-incident
|
|
31
|
-
design; the megakernel was shelved on decisive numbers, but the banked
|
|
32
|
-
"could win at M=K" learning is recorded misleadingly (decode look-again
|
|
33
|
-
agrees: re-word it — mlx amortizes at M=K too).
|
|
34
|
-
- **Cross-cutting flags**: unusually disciplined for a 65-flag surface — but
|
|
35
|
-
the --l2 tier promise was violated by its own default (FIXED 2026-07-01:
|
|
36
|
-
perf kernel demoted to --l3) and the v1 batch scheduler lacked the serial
|
|
37
|
-
loop's optimizations (batching-v2 wave, in flight).
|
|
38
|
-
|
|
39
|
-
## Confirmed bugs — status ledger
|
|
40
|
-
|
|
41
|
-
FIXED in commit 381382c (2026-07-01): same-ms batch seed collision ·
|
|
42
|
-
streaming per-layer KV-quant conversion · segmented compiled-decode mid-step
|
|
43
|
-
double-write · --l2 tier violation (perf kernel → l3; evidence: the frozen
|
|
44
|
-
"optiq" goldens were mlx-bun's own compat engine, gate was ≥56/64 argmax) ·
|
|
45
|
-
generate --l2/--l3 silent L1 degrade · unguarded TRAIN_ATTN=flash on Gemma ·
|
|
46
|
-
evalSftLoss error swallowing · tokens_per_sec metric · inverted comments
|
|
47
|
-
(gemma4.ts:298, flash-cce filter trio) · silent steel fallback (now warns;
|
|
48
|
-
H%128 throw narrowed) · flash-attn test blindness.
|
|
49
|
-
|
|
50
|
-
FIXED 2026-07-02: **FUSED_DECODE=1 inside whole-graph compiled decode** baked
|
|
51
|
-
the tile loop at trace-time N — q-cat adapters grow N per step under shapeless
|
|
52
|
-
replay, so the newest KV rows were silently never attended. REPRODUCED on e4b
|
|
53
|
-
(42 layers traced tile=true at N=17; diverges within 3 tokens then
|
|
54
|
-
repetition-loops). The 12B was never affected — its segmented form runs concat
|
|
55
|
-
layers as uncompiled js layers. Fix: generate() refuses to compile under
|
|
56
|
-
MLX_BUN_FUSED_DECODE=1 (explicit opt-in wins, like LoRA/MoE) + quantizedSdpa
|
|
57
|
-
throws if the tiled path is ever selected inside a trace (lands in the
|
|
58
|
-
transactional fallback, never silent). Regression in
|
|
59
|
-
tests/compiled-decode.test.ts, whose e4b block also now uses the dynamic
|
|
60
|
-
snapshot resolver — the old hard-coded hash silently skipped it on this
|
|
61
|
-
machine, which is how the combo went unexercised.
|
|
62
|
-
|
|
63
|
-
NEW BUG (found 2026-07-02 by the backlog-#8 gate test; FIXED in mlx-bun,
|
|
64
|
-
UPSTREAM in mlx): **mx.quantized_matmul(transpose=false) returns wrong values
|
|
65
|
-
at row count 2 or 3** — relnorm ~0.33-0.39 on our dylib, ~0.98-1.14 on stock
|
|
66
|
-
mlx 0.31.2 (oracle venv repro); M=1 and M>=4 exact, transpose=true exact at
|
|
67
|
-
every M. mlx's autograd computes dh for a transpose=true head qmm via an
|
|
68
|
-
internal transpose=false call at the cotangent's row count, so EVERY training
|
|
69
|
-
head silently produced wrong dh for 2-3-token responses, 2-3-token tail
|
|
70
|
-
chunks, and tiny prompt spans (f32 ground truth: dh relnorm up to 0.99 at the
|
|
71
|
-
affected positions, cos ~0.2). Serving/decode unaffected (transpose=true).
|
|
72
|
-
Fix: (a) loss.ts `logitsFromHiddenPadM` pads differentiated head spans to 4
|
|
73
|
-
rows (pad cotangents are exactly zero) — applied at all seven head sites;
|
|
74
|
-
(b) ops.quantizedMatmul pads direct transpose=false calls (the fused head's
|
|
75
|
-
analytic backward). Verified vs f32-dequant ground truth (chunk-4 dh
|
|
76
|
-
0.47→0.006) + M-sweeps. Worth filing upstream with the 10-line python repro.
|
|
77
|
-
|
|
78
|
-
## The ranked optimization backlog (task #12)
|
|
79
|
-
|
|
80
|
-
1. ~~**[S] Land the coeff filter at eps~1e-5**~~ **LANDED 2026-07-02** — BOTH
|
|
81
|
-
skips default 1e-5 (coeff filter + blockMax block skip; env=0 restores exact).
|
|
82
|
-
All gates run on the M1 Max with real chunk-ORPO data
|
|
83
|
-
(flash-cce-filter-realdata.ts, extended: E4B=1 + blockEps sweep + Vjp
|
|
84
|
-
full-logits fidelity): filter CPM5 0.343%/1.41×, e4b 0.158%/1.70×; blockMax
|
|
85
|
-
skip ~lossless (≤0.004%) and real text DOES go cold (the synthetic probe was
|
|
86
|
-
the artifact) — **combined 1.71× (CPM5) / 3.16× (e4b)**; teacher-forced
|
|
87
|
-
fidelity cosine ≥0.99993, filter adds ≤0.07% over the eps=0 reassociation
|
|
88
|
-
floor (standing test in tests/train-orpo-fused-ce.test.ts). The "eps=0
|
|
89
|
-
byte-identical" gate resolved structurally: eps=0 compiles the identical
|
|
90
|
-
pre-flip kernel, but run-to-run dh is never byte-stable (atomic-add
|
|
91
|
-
reassociation) — byte-replay was the wrong spelling of that gate.
|
|
92
|
-
2. ~~**[M] planSegments full-attention isolation**~~ **REFUTED BY MEASUREMENT
|
|
93
|
-
2026-07-02** — built, A/B'd @8K on real chunk rows: ZERO peak win (18.09 vs
|
|
94
|
-
18.02 GB; scripts/experiments/seg-isolation-smoke.ts + MLX_BUN_SEG_MEM_LOG
|
|
95
|
-
phase probes). The §5 cost-model premise is false: mlx's sdpa BACKWARD
|
|
96
|
-
materializes O(L²) scores for EVERY layer (~3.5 GB/layer @8K e4b — the
|
|
97
|
-
sliding window is just an additive mask; sliding pair +7.1 GB ≈ full+sliding
|
|
98
|
-
+7.15). Worst segment = layer count alone, so **segment_size is the whole
|
|
99
|
-
knob: seg1 measures 14.59 GB @8K (+3% step time, loss identical) — which
|
|
100
|
-
DOES fit the 24 GB M4 Pro today, no code needed.** Inter-segment clearCache
|
|
101
|
-
also measured no-effect (watermark is live memory). Real next levers: the
|
|
102
|
-
head vjp's ~3 GB [M,V] spike (backlog #8) and an O(L)-memory attention
|
|
103
|
-
backward (the flash-attention track).
|
|
104
|
-
3. ~~**[S] Auto-dispatch the training head by M**~~ **LANDED 2026-07-02** —
|
|
105
|
-
fusedRespLogpMean routes requested-flash batches with M <
|
|
106
|
-
MLX_BUN_FLASH_MIN_M (default 1024) to the exact fused head. Fresh crossover
|
|
107
|
-
sweep (head-dispatch-sweep.ts, M1 Max — the review's 1.9× @M=512 was
|
|
108
|
-
pre-filter-flip): fused wins e4b M=64 1.6× / M=512 1.13×, tie @1024; the
|
|
109
|
-
#1-flip made flash FASTER at long M too (e4b ≥2048; 8K 10.7 vs 13.2 s) on
|
|
110
|
-
top of its memory win. CPM5: fused faster at every M — flash stays a pure
|
|
111
|
-
memory lever there (≥1024 honors the caller's intent). Dispatch proven by
|
|
112
|
-
bit-identical-to-fused loss in tests/train-orpo-fused-ce.test.ts.
|
|
113
|
-
4. ~~**[S] Fused decode full-capacity KV buffers + activeN**~~ **REFUTED BY
|
|
114
|
-
MEASUREMENT 2026-07-02** — the variant was built (an int32 activeN input,
|
|
115
|
-
capacity-strided rows, fetch attaches full buffers), gated BYTE-IDENTICAL
|
|
116
|
-
on all three recorded dispatch shapes and perf-oracle-green — and then
|
|
117
|
-
measured SLOWER end-to-end: interleaved in-process A/B on the 12B uniform
|
|
118
|
-
kv4 (tokens identical across arms, M1 Max) gave 24.64 vs 26.18 tok/s @8k
|
|
119
|
-
(0.94) and 23.07 vs 23.83 @22k (0.97) — the "~4× at 32k" scaling is
|
|
120
|
-
refuted too. Two holes in the estimate: the 12B's full-attention dispatch
|
|
121
|
-
shape is KV=1 (H16 D512), where the fetch view is a CONTIGUOUS PREFIX and
|
|
122
|
-
the six-copies model never applied; and kernel-only micro-A/Bs proved
|
|
123
|
-
unstable (±50% run-to-run) — the numbers behind "1-3%" were never
|
|
124
|
-
end-to-end. REVERTED; evidence + re-application recipe:
|
|
125
|
-
scripts/experiments/fused-decode-activen-ab.ts.
|
|
126
|
-
5. **[M] Collapse per-token host syncs in the spec/DSpark loop** — ~2γ+1
|
|
127
|
-
round-trips → ~2 per verify cycle; directly attacks DSpark's fixed draft
|
|
128
|
-
overhead.
|
|
129
|
-
6. **[M] Pipeline the batched decode loop + clearCache cadence** — folded into
|
|
130
|
-
the batching-v2 wave (docs/design/batching-v2-plan.md).
|
|
131
|
-
7. **[S] Enable the 26B perf kernel** (open PLAN Phase E box; oracle frozen).
|
|
132
|
-
8. ~~**[S] Bound the SFT segmented head**~~ **LANDED 2026-07-02** — both SFT
|
|
133
|
-
segmented classes now use boundedSftCe (token-chunked Checkpoint head, the
|
|
134
|
-
proven ORPO plumbing; MLX_BUN_SEG_HEAD/MLX_BUN_SEG_HEAD_CHUNK knobs).
|
|
135
|
-
Head-only A/B at e4b M=6000: whole-vocab head 16.60 GB peak vs bounded
|
|
136
|
-
6.60 GB (**~10 GB head-vjp transient eliminated**), loss identical, dh
|
|
137
|
-
relnorm 0.00000; head time +45% (Checkpoint recompute, small share of a
|
|
138
|
-
step). The @8K smoke's short responses were never head-bound (peak set by
|
|
139
|
-
the per-layer sdpa backward — see #2), so its wall peak moved little; the
|
|
140
|
-
win is exactly the long-response regime the review named. Gate test:
|
|
141
|
-
tests/train-orpo-fused-ce.test.ts "bounded SFT head".
|
|
142
|
-
**Landing this exposed a NEW upstream mlx bug (see ledger below).**
|
|
143
|
-
9. ~~**[S] Segmented-step overhead pass**~~ **LANDED 2026-07-02** — all three
|
|
144
|
-
fixes: MlxArray.detachCopy (ONE mlx→mlx copy; the old rawBytes+
|
|
145
|
-
fromBytesCopy route was two copies via the JS heap), detachLeaves (ONE
|
|
146
|
-
evalAll barrier per segment's whole vjp set, applied in all six segmented
|
|
147
|
-
backward loops), and a step-shared block-sparse-mask memo for the CPM5
|
|
148
|
-
prefix classes (prefixSharedCaches — makeMask hands out slice views).
|
|
149
|
-
Gate: loss + grads BYTE-IDENTICAL on CPM5-SFT / CPM5-ORPO-prefix / e4b-SFT
|
|
150
|
-
fixed steps. Step time (short-seq fixtures, M1 Max): CPM5 ORPO-prefix
|
|
151
|
-
238→158 ms (−34%), e4b SFT 2065→1272 ms (−38%); e4b @8K flat (GPU-bound,
|
|
152
|
-
as predicted) with peak unchanged (14.49 GB).
|
|
153
|
-
10. **[M] e4b prefill gap** — profile-first; NOTE: the decode look-again could
|
|
154
|
-
NOT reproduce RESULTS.md's 304-vs-373 row on the M1 Max (no eval-DB
|
|
155
|
-
backing) — re-bench on the M4 Pro before building anything.
|
|
156
|
-
|
|
157
|
-
## Superseding context: the decode roofline look-again
|
|
158
|
-
|
|
159
|
-
The review's framing assumed the megakernel post-mortem's "M=1 decode is at
|
|
160
|
-
the floor". The follow-up investigation (docs/investigations/
|
|
161
|
-
decode-roofline-lookagain.md) OVERTURNED that: only the 12B is at the wall
|
|
162
|
-
(~92-93% of measured roofline); CPM5 58-64%, e4b 64-70%, 26B 60-62%.
|
|
163
|
-
**2026-07-02 second correction (lookagain §7):** the "host JS graph build =
|
|
164
|
-
#1 recoverable term" part of that verdict was itself wrong — the overlap
|
|
165
|
-
spike (decode-overlap-probe.ts, spin-injection + serial anchor) proved the
|
|
166
|
-
pipelined loop ALREADY hides the build; wall = GPU step time. The lookagain's
|
|
167
|
-
host-side fixes (1a–1d: CPM5 compiled-decode port, build-ahead spike, SharedKv
|
|
168
|
-
segmented-compile, 12B concat-phase compile) are refuted or de-prioritized;
|
|
169
|
-
its GPU-side fixes (26B gather-qmm bandwidth, e4b dispatch batching, CPM5
|
|
170
|
-
KV-path, backlog #4 contiguity, spec decode) are now the ENTIRE recoverable
|
|
171
|
-
gap and still compose with the backlog above.
|