mlx-bun 0.2.0 → 0.4.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 +71 -588
- package/docs/README.md +94 -0
- package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
- package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
- package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
- package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
- package/docs/archive/investigations/openjarvis-fit.md +198 -0
- package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
- package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +1092 -0
- package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
- package/docs/archive/planning/release-notes-v0.3.0.md +35 -0
- package/docs/design/batching.md +1841 -0
- package/docs/design/decode-speed-program.md +2346 -169
- package/docs/design/dreaming-nightly-pipeline.md +675 -282
- package/docs/design/generic-model-support.md +655 -334
- package/docs/design/kv-cache.md +824 -0
- package/docs/design/orpo-training.md +673 -1239
- package/docs/design/speculative-decoding.md +1990 -0
- package/docs/design/turboquant.md +2212 -0
- package/docs/design/unified-engine-frontier-plan.md +1833 -727
- package/docs/design/web-chat-redesign.md +666 -1083
- package/docs/planning/PRODUCT_ROADMAP.md +50 -1
- package/docs/planning/release-notes-v0.4.0.md +45 -0
- package/docs/planning/video-series.md +2 -2
- package/docs/reference/benchmarks.md +3613 -0
- package/docs/reference/cli.md +434 -160
- package/docs/reference/distribution.md +328 -182
- package/docs/reference/environment.md +398 -0
- package/docs/reference/glossary.md +39 -0
- package/docs/reference/library-api.md +566 -168
- package/docs/reference/memory.md +227 -64
- package/docs/reference/models.md +113 -6
- package/docs/reference/server-api.md +944 -429
- package/docs/reference/server-config.md +740 -338
- package/docs/reference/training.md +393 -254
- package/docs/reference/troubleshooting.md +158 -0
- package/package.json +9 -4
- package/src/audio/decode.ts +2 -2
- package/src/audio/features.ts +2 -2
- package/src/backends/mlx/assistant-target.ts +46 -0
- package/src/backends/mlx/autoregressive-draft-rows.ts +120 -0
- package/src/backends/mlx/autoregressive.ts +108 -0
- package/src/backends/mlx/batch-group.ts +1790 -0
- package/src/backends/mlx/cache-attachment.ts +67 -0
- package/src/backends/mlx/cache-layout.ts +31 -0
- package/src/backends/mlx/checkpoint-state.ts +53 -0
- package/src/backends/mlx/continuation-persistence.ts +106 -0
- package/src/backends/mlx/continuation-request.ts +43 -0
- package/src/backends/mlx/continuation.ts +77 -0
- package/src/backends/mlx/diffusion.ts +39 -0
- package/src/backends/mlx/draft-target.ts +32 -0
- package/src/backends/mlx/evaluation.ts +105 -0
- package/src/backends/mlx/fill-append.ts +45 -0
- package/src/backends/mlx/full-kv-row-append.ts +32 -0
- package/src/backends/mlx/full-kv-row-donor.ts +54 -0
- package/src/backends/mlx/full-transitioning-kv-rows.ts +65 -0
- package/src/backends/mlx/gateway-binding.ts +130 -0
- package/src/backends/mlx/graph.ts +38 -0
- package/src/backends/mlx/kv-codec.ts +9 -0
- package/src/backends/mlx/kv-maintenance.ts +133 -0
- package/src/backends/mlx/kv-tensor-rows.ts +212 -0
- package/src/backends/mlx/memory-client.ts +189 -0
- package/src/backends/mlx/methods.ts +90 -0
- package/src/backends/mlx/model-prompt.ts +164 -0
- package/src/backends/mlx/model-serving.ts +79 -0
- package/src/backends/mlx/prefill-cohort.ts +89 -0
- package/src/backends/mlx/prefill-rows.ts +200 -0
- package/src/backends/mlx/prefill.ts +33 -0
- package/src/backends/mlx/projected-context-rows.ts +72 -0
- package/src/backends/mlx/request-policy.ts +20 -0
- package/src/backends/mlx/request-state-policy.ts +41 -0
- package/src/backends/mlx/rollback.ts +89 -0
- package/src/backends/mlx/row-sampling.ts +49 -0
- package/src/backends/mlx/serial-executor.ts +242 -0
- package/src/backends/mlx/speculative-group.ts +359 -0
- package/src/backends/mlx/speculative-round.ts +161 -0
- package/src/backends/mlx/speculative.ts +114 -0
- package/src/backends/mlx/state-rows.ts +104 -0
- package/src/backends/mlx/state-views.ts +46 -0
- package/src/backends/mlx/target-layout-capability.ts +35 -0
- package/src/backends/mlx/text-engine.ts +73 -0
- package/src/backends/mlx/transitioning-kv-rows.ts +165 -0
- package/src/cli.ts +66 -58
- package/src/client.ts +66 -0
- package/src/config.ts +21 -4
- package/src/contracts/completion.ts +16 -0
- package/src/contracts/execution.ts +60 -0
- package/src/contracts/generation.ts +103 -0
- package/src/contracts/host.ts +7 -0
- package/src/contracts/jobs.ts +66 -0
- package/src/contracts/pi-provider.ts +30 -0
- package/src/contracts/pi.ts +259 -0
- package/src/contracts/prefix-cache.ts +23 -0
- package/src/contracts/resources.ts +25 -0
- package/src/contracts/sampling.ts +23 -0
- package/src/contracts/scheduling.ts +45 -0
- package/src/contracts/tsconfig.json +14 -0
- package/src/diffusion/diffusion-generate.ts +218 -153
- package/src/embed.ts +1 -1
- package/src/engine/admission.ts +59 -0
- package/src/engine/cancellation.ts +38 -0
- package/src/engine/engine.ts +56 -0
- package/src/engine/execution-coordinator.ts +70 -0
- package/src/engine/execution-plan.ts +53 -0
- package/src/engine/resources.ts +53 -0
- package/src/engine/scheduler.ts +72 -0
- package/src/engine/session.ts +247 -0
- package/src/eval/README.md +44 -1
- package/src/eval/kl.ts +236 -3
- package/src/eval/reference-logits.ts +207 -0
- package/src/eval/runner.ts +8 -96
- package/src/fill/echo-index.ts +188 -0
- package/src/fill/fill-session.ts +452 -0
- package/src/fill/proposal.ts +68 -0
- package/src/fill/schema-rows.ts +506 -0
- package/src/fill/tool-boundary.ts +103 -0
- package/src/fit.ts +30 -16
- package/src/generate.ts +709 -417
- package/src/grammar.ts +12 -7
- package/src/harness-pi.ts +14 -33
- package/src/hub-rest.ts +4 -4
- package/src/index.ts +7 -0
- package/src/inference/denoising.ts +17 -0
- package/src/inference/draft-acceptance.ts +41 -0
- package/src/inference/draft-output.ts +49 -0
- package/src/inference/graph.ts +33 -0
- package/src/inference/prefill.ts +39 -0
- package/src/inference/rollback.ts +7 -0
- package/src/jobs/db.ts +4 -0
- package/src/jobs/index.ts +2 -0
- package/src/jobs/job-entry.ts +12 -12
- package/src/jobs/runner.ts +98 -13
- package/src/jobs/task-client.ts +19 -0
- package/src/jobs/types.ts +2 -58
- package/src/kv-scheme.ts +70 -12
- package/src/kv-store.ts +177 -63
- package/src/lab/README.md +18 -0
- package/src/{assets → lab/curve}/curve-designer.html +2 -2
- package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
- package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +5 -5
- package/src/lab/paged-kv/paged-kv-rows.ts +83 -0
- package/src/{model → lab/paged-kv}/paged-kv.ts +32 -15
- package/src/library.ts +40 -0
- package/src/lora.ts +18 -0
- package/src/media-fetch.ts +1 -1
- package/src/memory/article.ts +1 -1
- package/src/memory/chunk.ts +1 -1
- package/src/memory/model.ts +30 -169
- package/src/memory/prompts.ts +1 -1
- package/src/memory/rest.ts +1 -1
- package/src/memory/schedule.ts +1 -1
- package/src/memory/stages.ts +4 -1
- package/src/memory/vault.ts +1 -3
- package/src/mlx/array.ts +11 -11
- package/src/mlx/compile.ts +12 -2
- package/src/mlx/ffi.ts +58 -11
- package/src/mlx/materialize.ts +23 -0
- package/src/mlx/metal-kernel.ts +10 -11
- package/src/mlx/ops.ts +33 -13
- package/src/mlx/quantized-rows.ts +36 -0
- package/src/mlx/token-bitmask.ts +52 -0
- package/src/mlx/turboquant-kv-decode.ts +82 -0
- package/src/mlx/turboquant-kv-inverse.ts +122 -0
- package/src/mlx/turboquant-ops.ts +33 -3
- package/src/mlx/turboquant-tables.ts +2 -2
- package/src/model/artifact-identity.ts +73 -0
- package/src/model/batched-kv.ts +235 -0
- package/src/model/batched-mask.ts +20 -6
- package/src/model/batched-quant.ts +9 -3
- package/src/model/batched-quantized-kv.ts +144 -0
- package/src/model/batched-rotating-quant.ts +78 -17
- package/src/model/batched-rotating-state.ts +76 -0
- package/src/model/batched-rotating.ts +65 -23
- package/src/model/batched-row-storage.ts +52 -0
- package/src/model/batched-ssm.ts +52 -0
- package/src/model/batched-turboquant-kv.ts +93 -0
- package/src/model/compiled-decode.ts +8 -2
- package/src/model/decoded-kv-donor.ts +12 -0
- package/src/model/delayed-quantized-kv.ts +72 -0
- package/src/model/delayed-rotating-quantized-kv.ts +93 -0
- package/src/model/delayed-turboquant-kv.ts +55 -0
- package/src/model/diffusion-gemma.ts +8 -8
- package/src/model/factory.ts +76 -33
- package/src/model/fingerprint.ts +1 -1
- package/src/model/flash-attention.ts +3 -3
- package/src/model/full-prefill-padding.ts +56 -0
- package/src/model/full-prefill-row.ts +105 -0
- package/src/model/gemma4-base.ts +179 -80
- package/src/model/gemma4.ts +40 -32
- package/src/model/generated/gemma4-12b.ts +6 -3
- package/src/model/generated/gemma4-26b.ts +6 -3
- package/src/model/generated/gemma4-e4b.ts +6 -3
- package/src/model/glm52-cache.ts +80 -4
- package/src/model/glm52-dsa.ts +13 -9
- package/src/model/glm52-memory.ts +1 -1
- package/src/model/glm52-mla.ts +12 -6
- package/src/model/glm52.ts +19 -40
- package/src/model/implementation.ts +69 -0
- package/src/model/kv-attention-view.ts +67 -0
- package/src/model/minicpm5.ts +17 -15
- package/src/model/profile.ts +12 -2
- package/src/model/qwen-append.ts +12 -0
- package/src/model/qwen-conv.ts +52 -0
- package/src/model/qwen3-delta-state.ts +74 -0
- package/src/model/qwen3-delta.ts +59 -36
- package/src/model/qwen3_5-checkpoint.ts +164 -0
- package/src/model/qwen3_5.ts +202 -78
- package/src/model/rotating-kv-donor.ts +35 -0
- package/src/model/rotating-kv-layout.ts +262 -0
- package/src/model/rotating-row-transaction.ts +35 -0
- package/src/model/speculative-rotating-kv.ts +101 -0
- package/src/model/ssm-prefill-padding.ts +39 -0
- package/src/model/support.ts +1 -1
- package/src/model/trellis-balanced-scatter.ts +51 -0
- package/src/model/trellis-linear.ts +672 -0
- package/src/model/trellis-shared-m.ts +151 -0
- package/src/model/trellis-shared-scatter.ts +144 -0
- package/src/model/trellis-splitk-prefill.ts +158 -0
- package/src/model/trellis-tiled-prefill.ts +136 -0
- package/src/model/trellis-vector-expand.ts +62 -0
- package/src/model/trellis-wide-prefill.ts +94 -0
- package/src/model/turboquant-codec.ts +83 -0
- package/src/model/universal/dense.ts +15 -14
- package/src/model/universal/modules.ts +8 -1
- package/src/native-pack.ts +6 -5
- package/src/pi-provider.ts +6 -64
- package/src/pi-web.ts +8 -315
- package/src/preflight.ts +31 -15
- package/src/prompt-cache.ts +110 -69
- package/src/quantize/allocator.ts +1 -1
- package/src/quantize/config-writer.ts +10 -3
- package/src/quantize/rotate.ts +4 -4
- package/src/quantize/trellis.ts +586 -0
- package/src/responses.ts +28 -1
- package/src/runtime-config.ts +18 -4
- package/src/sampler.ts +40 -29
- package/src/serve/batch-scheduler.ts +8 -1671
- package/src/serve/chat-request.ts +391 -0
- package/src/serve/chat-stage.ts +195 -0
- package/src/serve/checkpoint-identity.ts +64 -0
- package/src/serve/completion-executor.ts +15 -7
- package/src/serve/discovery-routes.ts +12 -13
- package/src/serve/generation-gateway.ts +183 -213
- package/src/serve/http.ts +159 -0
- package/src/serve/inference-request.ts +79 -0
- package/src/serve/isolate.ts +297 -105
- package/src/serve/lab-routes.ts +3 -0
- package/src/serve/lane-registry.ts +2 -1
- package/src/serve/model-admin-routes.ts +7 -5
- package/src/serve/model-binding.ts +43 -0
- package/src/serve/model-host.ts +511 -0
- package/src/serve/openai-wire.ts +103 -0
- package/src/serve/parent-application.ts +56 -0
- package/src/serve/pipeline.ts +33 -0
- package/src/serve/preparation.ts +33 -0
- package/src/serve/request-plan.ts +23 -18
- package/src/serve/request-prep.ts +344 -0
- package/src/serve/response-lease.ts +24 -0
- package/src/serve/responses-client.ts +69 -0
- package/src/serve/session-completion-engine.ts +110 -0
- package/src/serve/session-search.ts +1 -1
- package/src/serve/static-routes.ts +5 -5
- package/src/serve/text-completion-stage.ts +104 -0
- package/src/serve/token-streams.ts +519 -0
- package/src/server.ts +335 -2711
- package/src/spec/assistant-rows.ts +92 -0
- package/src/spec/assistant-source.ts +31 -55
- package/src/spec/cache-identity.ts +22 -0
- package/src/spec/deepspec-rows.ts +29 -0
- package/src/spec/deepspec-source.ts +16 -14
- package/src/spec/dflash-source.ts +36 -12
- package/src/spec/drafter.ts +153 -142
- package/src/spec/dspark/ab-stats.ts +3 -3
- package/src/spec/dspark/calibration.ts +2 -2
- package/src/spec/dspark/deepspec-module.ts +97 -122
- package/src/spec/dspark/generate-dflash.ts +2 -2
- package/src/spec/dspark/generate.ts +2 -2
- package/src/spec/dspark/loader.ts +1 -1
- package/src/spec/dspark/module-dflash.ts +129 -172
- package/src/spec/dspark/module.ts +3 -3
- package/src/spec/dspark/quantize-drafter.ts +1 -1
- package/src/spec/generate.ts +1 -1
- package/src/spec/glm52-mtp-graph.ts +29 -0
- package/src/spec/glm52-mtp-rows.ts +132 -0
- package/src/spec/glm52-mtp-source.ts +54 -137
- package/src/spec/glm52-mtp-state.ts +33 -0
- package/src/spec/ngram-source.ts +93 -21
- package/src/spec/projected-draft-rows.ts +73 -0
- package/src/spec/qwen-mtp-module.ts +171 -0
- package/src/spec/qwen-mtp-rows.ts +219 -0
- package/src/spec/qwen-mtp-source.ts +147 -195
- package/src/spec/qwen-mtp-state.ts +30 -0
- package/src/spec/serve-loop.ts +201 -201
- package/src/spec/source.ts +110 -13
- package/src/spec/two-model-rows.ts +61 -0
- package/src/spec/two-model.ts +44 -102
- package/src/ssd-cache.ts +99 -19
- package/src/ssd-durability.ts +36 -20
- package/src/tool-call.ts +51 -14
- package/src/train/flash-cce.ts +2 -2
- package/src/train/forward.ts +6 -0
- package/src/train/loss.ts +1 -1
- package/src/train/prefix-shared.ts +5 -1
- package/src/train/segmented.ts +5 -3
- package/src/train/trainer.ts +6 -6
- package/src/vision/prompt.ts +1 -1
- package/src/vision/qwen3vl-tower.ts +52 -10
- package/src/web/app.html +1 -1
- package/src/web/app.js +62 -60
- package/src/web/src/adapters-panel.ts +3 -3
- package/src/web/src/assistant.ts +2 -36
- package/src/web/src/chat.ts +4 -4
- package/src/web/src/composer.ts +4 -4
- package/src/web/src/hub.ts +1 -1
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +1 -1
- package/src/web/src/model-picker.ts +1 -1
- package/src/web/src/palette.ts +1 -1
- package/src/web/src/protocol.ts +3 -39
- package/src/web/src/sessions.ts +1 -1
- package/src/web/src/ui-catalog.ts +4 -18
- package/src/web-assets.ts +47 -0
- package/src/weights.ts +55 -9
- package/docs/archive/investigations/curve-runs/bisector-route.json +0 -98
- package/docs/archive/investigations/curve-runs/bisector-trace.json +0 -1393
- package/docs/archive/investigations/curve-runs/curve-terrain.json +0 -1179
- package/docs/archive/investigations/curve-runs/curve-terrain.svg +0 -42
- package/docs/archive/investigations/hlg-ab.html +0 -34
- package/docs/archive/investigations/hlg-explorer.html +0 -238
- package/docs/archive/investigations/hlg-figs/cliff.svg +0 -1
- package/docs/archive/investigations/hlg-figs/cross.svg +0 -1
- package/docs/archive/investigations/hlg-figs/edges.svg +0 -1
- package/docs/archive/investigations/hlg-figs/k20-grids.svg +0 -1
- package/docs/archive/investigations/hlg-figs/k20-peaks.svg +0 -1
- package/docs/archive/investigations/hlg-figs/lw-curve.svg +0 -1
- package/docs/archive/investigations/hlg-figs/terrain.svg +0 -1
- package/docs/archive/investigations/hlg-report.html +0 -262
- package/docs/archive/investigations/hlg-runs/hlg-ab.json +0 -149
- package/docs/archive/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
- package/docs/archive/investigations/hlg-runs/hlg-blind.json +0 -107
- package/docs/archive/investigations/hlg-runs/hlg-cliff.json +0 -197
- package/docs/archive/investigations/hlg-runs/hlg-cross.json +0 -505
- package/docs/archive/investigations/hlg-runs/hlg-edge.json +0 -388
- package/docs/archive/investigations/hlg-runs/hlg-eval1.json +0 -25
- package/docs/archive/investigations/hlg-runs/hlg-frontier.json +0 -86
- package/docs/archive/investigations/hlg-runs/hlg-grid.json +0 -242
- package/docs/archive/investigations/hlg-runs/hlg-grid2.json +0 -343
- package/docs/archive/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
- package/docs/archive/investigations/hlg-runs/hlg-map.json +0 -383
- package/docs/archive/investigations/hlg-runs/run0-original.log +0 -159
- package/docs/archive/investigations/hlg-runs/runA-recommended.log +0 -131
- package/docs/archive/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
- package/docs/archive/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
- package/docs/archive/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
- package/docs/archive/investigations/hlg-runs/runAD-ab-samples.log +0 -8
- package/docs/archive/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
- package/docs/archive/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
- package/docs/archive/investigations/hlg-runs/runAG-eval-config2.log +0 -16
- package/docs/archive/investigations/hlg-runs/runB-gain-variants.log +0 -192
- package/docs/archive/investigations/hlg-runs/runC-pivots.log +0 -162
- package/docs/archive/investigations/hlg-runs/runD-oetf.log +0 -132
- package/docs/archive/investigations/hlg-runs/runE-eotf.log +0 -162
- package/docs/archive/investigations/hlg-runs/runF-shaper-working.log +0 -86
- package/docs/archive/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
- package/docs/archive/investigations/hlg-runs/runH-wsweep.log +0 -176
- package/docs/archive/investigations/hlg-runs/runI-asweep.log +0 -176
- package/docs/archive/investigations/hlg-runs/runJ-knobmap.log +0 -49
- package/docs/archive/investigations/hlg-runs/runK-frontier.log +0 -19
- package/docs/archive/investigations/hlg-runs/runL-widemap.log +0 -65
- package/docs/archive/investigations/hlg-runs/runM-frontier-emb.log +0 -15
- package/docs/archive/investigations/hlg-runs/runN-verify.log +0 -116
- package/docs/archive/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
- package/docs/archive/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
- package/docs/archive/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
- package/docs/archive/investigations/hlg-runs/runR-blind-transcript.log +0 -79
- package/docs/archive/investigations/hlg-runs/runS-cross-coherence.log +0 -33
- package/docs/archive/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
- package/docs/archive/investigations/hlg-runs/runU-cross-12b.log +0 -33
- package/docs/archive/investigations/hlg-runs/runV-lw-e4b.log +0 -22
- package/docs/archive/investigations/hlg-runs/runW-lw-12b.log +0 -22
- package/docs/archive/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
- package/docs/archive/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
- package/docs/archive/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
- package/docs/archive/mlx-bun-lab-report.html +0 -275
- package/docs/archive/wwdc-mlx-bun.html +0 -848
- package/docs/design/adapters-end-to-end.md +0 -205
- package/docs/design/batching-perf-path.md +0 -255
- package/docs/design/batching-v2-plan.md +0 -529
- package/docs/design/bucketing-stage.md +0 -197
- package/docs/design/compat-cli-surface-design.md +0 -230
- package/docs/design/docs-reorg-plan.md +0 -165
- package/docs/design/dspark-serving-program.md +0 -371
- package/docs/design/dspark-speculative-decoding.md +0 -318
- package/docs/design/grammar-spec-batching-integration.md +0 -301
- package/docs/design/memory-inference-path.md +0 -422
- package/docs/design/memory-synthesis.md +0 -287
- package/docs/design/memory-system.md +0 -237
- package/docs/design/mlx-lm-serving-execution-seam.md +0 -81
- package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
- package/docs/design/omlx-adoption-map.md +0 -98
- package/docs/design/orpo-dynamic-lambda.md +0 -220
- package/docs/design/orpo-future-enhancements.md +0 -340
- package/docs/design/paged-kv-cache.md +0 -214
- package/docs/design/parallel-slots.md +0 -567
- package/docs/design/parity-tier-dag.md +0 -161
- package/docs/design/repo-cleanup-plan.md +0 -231
- package/docs/design/runtime-isolation.md +0 -263
- package/docs/design/segmented-backward-training.md +0 -543
- package/docs/design/spec-decode-larger-targets.md +0 -229
- package/docs/design/ssd-kv-cold-tier.md +0 -415
- package/docs/design/structured-output.md +0 -484
- package/docs/design/tauri-desktop-app.md +0 -127
- package/docs/design/the-dreaming-master-plan.md +0 -445
- package/docs/design/turboquant-kv.md +0 -235
- package/docs/design/turboquant-weights.md +0 -467
- package/docs/design/w4a16-compute-precision-spike.md +0 -232
- package/docs/design/web-chat-beat-matrix.md +0 -315
- package/docs/design/write-pipeline-entity.md +0 -468
- package/docs/planning/IDEAS.md +0 -69
- package/docs/reference/embedding.md +0 -197
- package/docs/reference/features-matrix.md +0 -101
- package/docs/reference/orpo-quickstart.md +0 -135
- package/src/flags.ts +0 -11
- /package/docs/{design → archive/investigations}/colibri-glm52-port.md +0 -0
- /package/docs/{planning → archive/planning}/chunk-task-roadmap.md +0 -0
- /package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +0 -0
- /package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +0 -0
- /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.2.0.md +0 -0
- /package/src/{memory-plan.ts → admission-plan.ts} +0 -0
- /package/{docs/archive/investigations → src/serve/assets}/curve-terrain.html +0 -0
- /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
|
@@ -38,7 +38,7 @@ function disposing(old: MlxArray, next: MlxArray): MlxArray {
|
|
|
38
38
|
// ---------------------------------------------------------------------------
|
|
39
39
|
// Weight representation: every matmul weight and gather table loads as either
|
|
40
40
|
// bf16 (the released checkpoint) or affine-quantized (a
|
|
41
|
-
// scripts/dspark
|
|
41
|
+
// scripts/dspark.ts quantize sibling). Detection is the house
|
|
42
42
|
// pattern — a `.scales` sibling key marks a quantized module; bits/group_size
|
|
43
43
|
// come from the config's `quantization` block (per-module overrides + the
|
|
44
44
|
// mlx `false` = kept-full-precision convention). Both formats flow through
|
|
@@ -215,6 +215,23 @@ export interface ContextKV {
|
|
|
215
215
|
v: MlxArray; // [1, nKvHeads, ctxLen, headDim] (v ≡ k when attention_k_eq_v)
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
+
/** Storage owns context validity; the graph supplies only Q and new block KV. */
|
|
219
|
+
export interface DeepspecContextAttention {
|
|
220
|
+
attend(layer: number, query: MlxArray, blockKeys: MlxArray, blockValues: MlxArray): MlxArray;
|
|
221
|
+
}
|
|
222
|
+
export function plainDeepspecContext(context: readonly ContextKV[]): DeepspecContextAttention {
|
|
223
|
+
return { attend(layer, query, blockKeys, blockValues) {
|
|
224
|
+
using keys = ops.concatAxis([context[layer]!.k, blockKeys], 2);
|
|
225
|
+
using values = ops.concatAxis([context[layer]!.v, blockValues], 2);
|
|
226
|
+
return ops.sdpa(query, keys, values, 1, "", null);
|
|
227
|
+
} };
|
|
228
|
+
}
|
|
229
|
+
export interface DraftRowsResult {
|
|
230
|
+
tokens: number[][];
|
|
231
|
+
conf: number[][];
|
|
232
|
+
baseLogits?: MlxArray;
|
|
233
|
+
}
|
|
234
|
+
|
|
218
235
|
export interface DraftBlockResult {
|
|
219
236
|
/** Sequentially-sampled draft tokens, length 0..gamma (0 iff confidence
|
|
220
237
|
* truncation fires at the very first position — EMPTY proposal). */
|
|
@@ -273,8 +290,8 @@ export class DeepspecDrafter {
|
|
|
273
290
|
this.embedScale = Math.sqrt(cfg.hidden_size);
|
|
274
291
|
|
|
275
292
|
const T = (name: string) => w.tensor(name);
|
|
276
|
-
// Lazy transpose VIEW — no contiguous copy.
|
|
277
|
-
//
|
|
293
|
+
// Lazy transpose VIEW — no contiguous copy. Materializing would store
|
|
294
|
+
// every matmul weight a
|
|
278
295
|
// second time: on the real 6.86 GB checkpoint that's ~+4.8 GB resident
|
|
279
296
|
// (lm_head alone ~2 GB), decisive on a 24 GB box. mlx's steel GEMM
|
|
280
297
|
// dispatches a transposed-B operand natively, so the view costs nothing
|
|
@@ -366,7 +383,7 @@ export class DeepspecDrafter {
|
|
|
366
383
|
static async load(dir: string): Promise<DeepspecDrafter> {
|
|
367
384
|
const raw = (await Bun.file(`${dir}/config.json`).json()) as Record<string, any>;
|
|
368
385
|
const cfg = readConfig(raw);
|
|
369
|
-
// Quantized siblings (scripts/dspark
|
|
386
|
+
// Quantized siblings (scripts/dspark.ts quantize) carry the house
|
|
370
387
|
// quantization block; the released bf16 checkpoint has none → null.
|
|
371
388
|
const quant = parseQuantization(raw.quantization ?? raw.quantization_config);
|
|
372
389
|
const w = await Weights.open(dir);
|
|
@@ -450,13 +467,18 @@ export class DeepspecDrafter {
|
|
|
450
467
|
* concat-then-scale-less-norm, over k_proj's output — v gets NO rope).
|
|
451
468
|
*/
|
|
452
469
|
projectContextKV(contextHidden: MlxArray, positions: number[]): ContextKV[] {
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
470
|
+
if (positions.length !== contextHidden.shape[1])
|
|
471
|
+
throw new Error(`projectContextKV: ${positions.length} positions for ${contextHidden.shape[1]} context rows`);
|
|
472
|
+
assertContiguous(positions);
|
|
473
|
+
return this.projectContextKVRows(contextHidden, positions[0]!);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
projectContextKVRows(contextHidden: MlxArray, position: number | MlxArray): ContextKV[] {
|
|
477
|
+
const B = contextHidden.shape[0]!, L = contextHidden.shape[1]!;
|
|
456
478
|
const out: ContextKV[] = [];
|
|
457
479
|
for (const layer of this.#layers) {
|
|
458
480
|
const kFlat = matmulW(contextHidden, layer.kProj); // [1,L,nKvHeads*headDim]
|
|
459
|
-
const k4 = ops.reshape(kFlat, [
|
|
481
|
+
const k4 = ops.reshape(kFlat, [B, L, this.nKvHeads, this.headDim]);
|
|
460
482
|
kFlat.dispose();
|
|
461
483
|
// v ≡ k pre-norm (attention_k_eq_v: v_ctx = k_ctx, same tensor before
|
|
462
484
|
// the two norms diverge — v_norm has no weight).
|
|
@@ -469,14 +491,9 @@ export class DeepspecDrafter {
|
|
|
469
491
|
const vT = ops.transposeAxes(vNormed, [0, 2, 1, 3]);
|
|
470
492
|
vNormed.dispose();
|
|
471
493
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
// read at the same prompt/verified positions every round), so a single
|
|
476
|
-
// rope(offset=positions[0]) call matches apply_gemma4_rotary_pos_emb
|
|
477
|
-
// row-for-row. Guard the assumption explicitly.
|
|
478
|
-
assertContiguous(positions);
|
|
479
|
-
const kRoped = ops.rope(kT, this.headDim, null, positions[0]!, this.ropeFreqs);
|
|
494
|
+
const kRoped = typeof position === "number"
|
|
495
|
+
? ops.rope(kT, this.headDim, null, position, this.ropeFreqs)
|
|
496
|
+
: ops.ropeDynamic(kT, this.headDim, null, position, this.ropeFreqs);
|
|
480
497
|
kT.dispose();
|
|
481
498
|
out.push({ k: kRoped, v: vT });
|
|
482
499
|
}
|
|
@@ -489,22 +506,19 @@ export class DeepspecDrafter {
|
|
|
489
506
|
* transcribed inline per-layer below. Non-causal SDPA (scale=1.0) over
|
|
490
507
|
* [ctx rows ++ block rows]; q uses only the block's own positions.
|
|
491
508
|
*
|
|
492
|
-
* blockIds: token ids for
|
|
509
|
+
* blockIds: token ids for each noise block, shape [B, gamma] — [anchor, MASK,
|
|
493
510
|
* MASK, ..., MASK] (create_noise_embed: only position 0 gets the real
|
|
494
511
|
* anchor token when block_keep_mask; MASK elsewhere — at inference every
|
|
495
512
|
* anchor is "kept" so this is always [anchor, mask_token_id × (γ-1)]).
|
|
496
|
-
*
|
|
497
|
-
*
|
|
513
|
+
* position: each row's initial absolute position. RoPE advances contiguous
|
|
514
|
+
* positions within the block.
|
|
498
515
|
*/
|
|
499
|
-
#forwardBackbone(
|
|
500
|
-
const G = blockIds.
|
|
501
|
-
|
|
502
|
-
const idsArr = ops.fromInt32(blockIds, [1, G]);
|
|
503
|
-
const idsU32 = idsArr.astype(Dtype.uint32);
|
|
504
|
-
idsArr.dispose();
|
|
516
|
+
#forwardBackbone(context: DeepspecContextAttention, blockIds: MlxArray, position: number | MlxArray): MlxArray {
|
|
517
|
+
const B = blockIds.shape[0]!, G = blockIds.shape[1]!;
|
|
518
|
+
const idsU32 = blockIds.astype(Dtype.uint32);
|
|
505
519
|
const embRaw = gatherW(this.#embed, idsU32); // [1,G,hidden] (gather over vocab axis)
|
|
506
520
|
idsU32.dispose();
|
|
507
|
-
const embFlat = ops.reshape(embRaw, [
|
|
521
|
+
const embFlat = ops.reshape(embRaw, [B, G, this.hidden]);
|
|
508
522
|
embRaw.dispose();
|
|
509
523
|
// Gemma4TextScaledWordEmbedding.forward: embed(ids) * embed_scale
|
|
510
524
|
let h = ops.mulScalar(embFlat, this.embedScale);
|
|
@@ -512,31 +526,30 @@ export class DeepspecDrafter {
|
|
|
512
526
|
|
|
513
527
|
for (let li = 0; li < this.#layers.length; li++) {
|
|
514
528
|
const layer = this.#layers[li]!;
|
|
515
|
-
const { k: kCtx, v: vCtx } = ctxKV[li]!;
|
|
516
|
-
const ctxLen = kCtx.shape[2]!;
|
|
517
529
|
|
|
518
530
|
const residual = h;
|
|
519
531
|
const x = this.#rms(h, layer.inputNorm);
|
|
520
532
|
|
|
521
533
|
// q = q_norm(q_proj(x).view(B,q_len,nHeads,headDim)).transpose(1,2)
|
|
522
534
|
const qFlat = matmulW(x, layer.qProj); // [1,G,nHeads*headDim]
|
|
523
|
-
const q4 = ops.reshape(qFlat, [
|
|
535
|
+
const q4 = ops.reshape(qFlat, [B, G, this.nHeads, this.headDim]);
|
|
524
536
|
qFlat.dispose();
|
|
525
537
|
const qNormed = this.#rms(q4, layer.qNorm);
|
|
526
538
|
q4.dispose();
|
|
527
539
|
const qT = ops.transposeAxes(qNormed, [0, 2, 1, 3]); // [1,nHeads,G,headDim]
|
|
528
540
|
qNormed.dispose();
|
|
529
541
|
// rope on q uses the LAST q_len positions (cos[:, -q_len:, :]) — here
|
|
530
|
-
// q_len == G == the whole block,
|
|
531
|
-
|
|
532
|
-
|
|
542
|
+
// q_len == G == the whole block, starting at each row's position.
|
|
543
|
+
const qRoped = typeof position === "number"
|
|
544
|
+
? ops.rope(qT, this.headDim, null, position, this.ropeFreqs)
|
|
545
|
+
: ops.ropeDynamic(qT, this.headDim, null, position, this.ropeFreqs);
|
|
533
546
|
qT.dispose();
|
|
534
547
|
|
|
535
548
|
// k_noise = k_proj(x); norm+rope IDENTICALLY to the cached context
|
|
536
549
|
// rows (concat-then-norm == norm-then-concat per the RMSNorm argument
|
|
537
550
|
// in projectContextKV's doc comment).
|
|
538
551
|
const kNoiseFlat = matmulW(x, layer.kProj);
|
|
539
|
-
const kNoise4 = ops.reshape(kNoiseFlat, [
|
|
552
|
+
const kNoise4 = ops.reshape(kNoiseFlat, [B, G, this.nKvHeads, this.headDim]);
|
|
540
553
|
kNoiseFlat.dispose();
|
|
541
554
|
const vNoiseNormed = this.#rms(kNoise4, null);
|
|
542
555
|
const kNoiseNormed = this.#rms(kNoise4, layer.kNorm);
|
|
@@ -545,26 +558,18 @@ export class DeepspecDrafter {
|
|
|
545
558
|
kNoiseNormed.dispose();
|
|
546
559
|
const vNoiseT = ops.transposeAxes(vNoiseNormed, [0, 2, 1, 3]);
|
|
547
560
|
vNoiseNormed.dispose();
|
|
548
|
-
const kNoiseRoped =
|
|
561
|
+
const kNoiseRoped = typeof position === "number"
|
|
562
|
+
? ops.rope(kNoiseT, this.headDim, null, position, this.ropeFreqs)
|
|
563
|
+
: ops.ropeDynamic(kNoiseT, this.headDim, null, position, this.ropeFreqs);
|
|
549
564
|
kNoiseT.dispose();
|
|
550
565
|
x.dispose();
|
|
551
566
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
kNoiseRoped.dispose();
|
|
555
|
-
const vFull = ops.concatAxis([vCtx, vNoiseT], 2);
|
|
556
|
-
vNoiseT.dispose();
|
|
557
|
-
|
|
558
|
-
// non-causal SDPA, scale=1.0 (QK-norm replaces the usual 1/sqrt(d))
|
|
559
|
-
const attnOut = ops.sdpa(qRoped, kFull, vFull, 1.0, "", null);
|
|
560
|
-
qRoped.dispose();
|
|
561
|
-
kFull.dispose();
|
|
562
|
-
vFull.dispose();
|
|
563
|
-
void ctxLen;
|
|
567
|
+
const attnOut = context.attend(li, qRoped, kNoiseRoped, vNoiseT);
|
|
568
|
+
qRoped.dispose(); kNoiseRoped.dispose(); vNoiseT.dispose();
|
|
564
569
|
|
|
565
570
|
const attnT = ops.transposeAxes(attnOut, [0, 2, 1, 3]); // [1,G,nHeads,headDim]
|
|
566
571
|
attnOut.dispose();
|
|
567
|
-
const attnFlat = ops.reshape(attnT, [
|
|
572
|
+
const attnFlat = ops.reshape(attnT, [B, G, this.nHeads * this.headDim]);
|
|
568
573
|
attnT.dispose();
|
|
569
574
|
let attn = matmulW(attnFlat, layer.oProj);
|
|
570
575
|
attnFlat.dispose();
|
|
@@ -613,12 +618,10 @@ export class DeepspecDrafter {
|
|
|
613
618
|
* bf16 `logits + bias` sum, and softcapped logits in [-30,30] have bf16
|
|
614
619
|
* steps ~0.125-0.25, so an f32 sum here reorders near-ties vs torch and
|
|
615
620
|
* derails the sequential block (2026-07-06 port review, fidelity fix). */
|
|
616
|
-
#markovStepBias(
|
|
621
|
+
#markovStepBias(previous: MlxArray): MlxArray {
|
|
617
622
|
if (!this.#markovW1 || !this.#markovW2)
|
|
618
623
|
throw new Error("markovStepBias: markov_rank == 0 (no markov head)");
|
|
619
|
-
const
|
|
620
|
-
const idxU32 = idxArr.astype(Dtype.uint32);
|
|
621
|
-
idxArr.dispose();
|
|
624
|
+
const idxU32 = previous.astype(Dtype.uint32);
|
|
622
625
|
const e1 = gatherW(this.#markovW1, idxU32); // [1,rank]
|
|
623
626
|
idxU32.dispose();
|
|
624
627
|
const bias = matmulW(e1, this.#markovW2); // [1,vocab], model dtype
|
|
@@ -631,16 +634,14 @@ export class DeepspecDrafter {
|
|
|
631
634
|
* is nn.Linear(confDim,1) — proj.weight is [1,confDim]; we compute
|
|
632
635
|
* features @ proj.weight^T + bias without transposing storage (row-vector
|
|
633
636
|
* dot via matmul against a [confDim,1] view). */
|
|
634
|
-
#confidence(h1: MlxArray,
|
|
637
|
+
#confidence(h1: MlxArray, previous: MlxArray): MlxArray {
|
|
635
638
|
if (!this.#confProj || !this.#confB)
|
|
636
639
|
throw new Error("confidence: confidence head disabled");
|
|
637
640
|
let feat = h1;
|
|
638
641
|
let ownFeat = false;
|
|
639
642
|
if (this.cfg.confidence_head_with_markov) {
|
|
640
643
|
if (!this.#markovW1) throw new Error("confidence_head_with_markov requires markov_rank > 0");
|
|
641
|
-
const
|
|
642
|
-
const idxU32 = idxArr.astype(Dtype.uint32);
|
|
643
|
-
idxArr.dispose();
|
|
644
|
+
const idxU32 = previous.astype(Dtype.uint32);
|
|
644
645
|
const e1 = gatherW(this.#markovW1, idxU32); // [1,rank]
|
|
645
646
|
idxU32.dispose();
|
|
646
647
|
const e1f = e1.dtype === h1.dtype ? e1 : disposing(e1, e1.astype(h1.dtype));
|
|
@@ -659,9 +660,7 @@ export class DeepspecDrafter {
|
|
|
659
660
|
z = disposing(z, ops.add(z, this.#confB));
|
|
660
661
|
if (z.dtype !== Dtype.float32) z = disposing(z, z.astype(Dtype.float32));
|
|
661
662
|
z = disposing(z, ops.sigmoid(z));
|
|
662
|
-
|
|
663
|
-
z.dispose();
|
|
664
|
-
return v;
|
|
663
|
+
return z;
|
|
665
664
|
}
|
|
666
665
|
|
|
667
666
|
/**
|
|
@@ -701,73 +700,49 @@ export class DeepspecDrafter {
|
|
|
701
700
|
* anchorPos: its absolute sequence position (blockPositions[0]).
|
|
702
701
|
*/
|
|
703
702
|
draftBlock(ctxKV: ContextKV[], anchorTok: number, anchorPos: number): DraftBlockResult {
|
|
704
|
-
const
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
const blockPositions = Array.from({ length: G }, (_, i) => anchorPos + i);
|
|
708
|
-
|
|
709
|
-
const h = this.#forwardBackbone(ctxKV, blockIds, blockPositions); // [1,G,hidden]
|
|
710
|
-
const baseLogitsRaw = this.#computeLogits(h); // [1,G,vocab], softcapped, model dtype
|
|
711
|
-
|
|
712
|
-
// Pass 1: sequential Markov-biased argmax sampling over the FULL block —
|
|
713
|
-
// in MODEL dtype end to end (reference precision: modeling.py
|
|
714
|
-
// compute_logits → apply_step_logits → sample_tokens all run bf16; the
|
|
715
|
-
// argmax is over the bf16 sum. f32 here reordered near-ties vs torch —
|
|
716
|
-
// 2026-07-06 port review, fidelity fix).
|
|
717
|
-
const sampledTokens: number[] = [];
|
|
718
|
-
let prevTok = anchorTok;
|
|
719
|
-
for (let k = 0; k < G; k++) {
|
|
720
|
-
const base1 = baseLogitsRaw.slice([0, k, 0], [1, k + 1, V]);
|
|
721
|
-
const baseFlat = ops.reshape(base1, [1, V]);
|
|
722
|
-
base1.dispose();
|
|
723
|
-
let stepLogits = baseFlat;
|
|
724
|
-
if (this.#markovW1) {
|
|
725
|
-
const bias = this.#markovStepBias(prevTok); // [1,V], model dtype
|
|
726
|
-
stepLogits = ops.add(baseFlat, bias);
|
|
727
|
-
baseFlat.dispose();
|
|
728
|
-
bias.dispose();
|
|
729
|
-
}
|
|
730
|
-
const am = ops.argmaxAxis(stepLogits, -1);
|
|
731
|
-
const tok = ops.itemUint32(am);
|
|
732
|
-
am.dispose();
|
|
733
|
-
stepLogits.dispose();
|
|
734
|
-
sampledTokens.push(tok);
|
|
735
|
-
prevTok = tok;
|
|
736
|
-
}
|
|
703
|
+
const result = this.draftRows(plainDeepspecContext(ctxKV), [anchorTok], anchorPos, true);
|
|
704
|
+
return { tokens: result.tokens[0]!, conf: result.conf[0]!, baseLogits: result.baseLogits! };
|
|
705
|
+
}
|
|
737
706
|
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
for (let
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
confPrev = sampledTokens[k]!;
|
|
707
|
+
/** The graph and sequential proposal head run at the active row count.
|
|
708
|
+
* Confidence selects each row's length after the full device chain. */
|
|
709
|
+
draftRows(context: DeepspecContextAttention, anchors: readonly number[], position: number | MlxArray,
|
|
710
|
+
collectLogits = false): DraftRowsResult {
|
|
711
|
+
const B = anchors.length, G = this.gamma, V = this.cfg.vocab_size;
|
|
712
|
+
using ids = ops.fromInt32(anchors.flatMap(anchor => [anchor, ...Array(G - 1).fill(this.cfg.mask_token_id)]), [B, G]);
|
|
713
|
+
using hidden = this.#forwardBackbone(context, ids, position);
|
|
714
|
+
using base = this.#computeLogits(hidden);
|
|
715
|
+
using anchorIds = ops.fromInt32([...anchors], [B]);
|
|
716
|
+
const sampled: MlxArray[] = [], confidence: MlxArray[] = [];
|
|
717
|
+
let previous = anchorIds;
|
|
718
|
+
try {
|
|
719
|
+
for (let step = 0; step < G; step++) {
|
|
720
|
+
using row = base.slice([0, step, 0], [B, step + 1, V]);
|
|
721
|
+
using logits = ops.reshape(row, [B, V]);
|
|
722
|
+
using bias = this.#markovW1 ? this.#markovStepBias(previous) : null;
|
|
723
|
+
using corrected = bias ? ops.add(logits, bias) : null;
|
|
724
|
+
const token = ops.argmaxAxis(corrected ?? logits, -1);
|
|
725
|
+
sampled.push(token); previous = token;
|
|
758
726
|
}
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
727
|
+
// Serving does not consume confidence when truncation is disabled.
|
|
728
|
+
if (this.#confProj && (collectLogits || this.cfg.confidence_threshold > 0)) for (let step = 0; step < G; step++) {
|
|
729
|
+
using row = hidden.slice([0, step, 0], [B, step + 1, this.hidden]);
|
|
730
|
+
using flat = ops.reshape(row, [B, this.hidden]);
|
|
731
|
+
confidence.push(this.#confidence(flat, step ? sampled[step - 1]! : anchorIds));
|
|
762
732
|
}
|
|
763
|
-
|
|
764
|
-
const
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
733
|
+
using packed = ops.concatAxis(sampled, 0);
|
|
734
|
+
const tokens = packed.toIntTokens();
|
|
735
|
+
using packedConfidence = confidence.length ? ops.concatAxis(confidence, 0) : null;
|
|
736
|
+
const conf = packedConfidence?.toFloat32();
|
|
737
|
+
const rows = anchors.map((_, row) => {
|
|
738
|
+
const values = conf ? Array.from({ length: G }, (_, step) => conf[step * B + row]!) : [];
|
|
739
|
+
const below = this.cfg.confidence_threshold > 0 ? values.findIndex(value => value < this.cfg.confidence_threshold) : -1;
|
|
740
|
+
const length = below < 0 ? G : below;
|
|
741
|
+
return { tokens: Array.from({ length }, (_, step) => tokens[step * B + row]!), conf: values.slice(0, length) };
|
|
742
|
+
});
|
|
743
|
+
return { tokens: rows.map(row => row.tokens), conf: rows.map(row => row.conf),
|
|
744
|
+
...(collectLogits ? { baseLogits: base.astype(Dtype.float32) } : {}) };
|
|
745
|
+
} finally { for (const array of [...sampled, ...confidence]) array.dispose(); }
|
|
771
746
|
}
|
|
772
747
|
|
|
773
748
|
dispose(): void {
|
|
@@ -27,7 +27,7 @@ export interface DflashGenOptions {
|
|
|
27
27
|
* minConf for a uniform manual override; pass thresholds:[] to disable. */
|
|
28
28
|
thresholds?: number[];
|
|
29
29
|
minConf?: number;
|
|
30
|
-
/** Calibration hook (scripts/dspark
|
|
30
|
+
/** Calibration hook (scripts/dspark.ts calibrate): called once per draft
|
|
31
31
|
* round with that round's per-position (confidence, accepted) samples,
|
|
32
32
|
* AFTER kAccept is known. Not used by ordinary decode. */
|
|
33
33
|
onRound?: (samples: ConfSample[]) => void;
|
|
@@ -192,7 +192,7 @@ export function dflashGenerate(model: Gemma4Model, drafter: DflashDrafter, promp
|
|
|
192
192
|
blockLogits = null;
|
|
193
193
|
stats.accepted += kAccept; rounds++; acceptLenSum += kAccept + 1;
|
|
194
194
|
|
|
195
|
-
// Calibration hook (scripts/dspark
|
|
195
|
+
// Calibration hook (scripts/dspark.ts calibrate): report this round's
|
|
196
196
|
// per-position (confidence, accepted) outcomes now that kAccept is known.
|
|
197
197
|
if (options.onRound) {
|
|
198
198
|
const roundSamples: ConfSample[] = [];
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
// (sample.ts), so the emitted stream is distributed exactly as if e4b
|
|
18
18
|
// sampled token-by-token at that temperature — independent of draft quality.
|
|
19
19
|
//
|
|
20
|
-
// Verify the corresponding gate before chasing τ (
|
|
20
|
+
// Verify the corresponding gate before chasing τ (dspark-ab.ts (deleted 2026-08-23; git history)): greedy
|
|
21
21
|
// output must match model.generate; the sampling rule's correctness is the
|
|
22
|
-
// statistical "emit distribution == target" check in
|
|
22
|
+
// statistical "emit distribution == target" check in dspark-smoke.ts (deleted 2026-08-23; git history).
|
|
23
23
|
// If a gate fails, the accept/reject or KV rollback is wrong — fix that first.
|
|
24
24
|
|
|
25
25
|
import { MlxArray } from "../../mlx/array";
|
|
@@ -18,6 +18,6 @@ export function loadDsparkDrafter(dir: string): DflashDrafter {
|
|
|
18
18
|
if (meta.variant === "dspark" || meta.variant === "dflash") return DflashDrafter.load(dir);
|
|
19
19
|
throw new Error(
|
|
20
20
|
`${dir} is a v1 single-vector DSpark checkpoint (variant=${meta.variant ?? "none"}) — ` +
|
|
21
|
-
`superseded, not serveable; retrain with scripts/dspark
|
|
21
|
+
`superseded, not serveable; retrain with scripts/dspark.ts train`,
|
|
22
22
|
);
|
|
23
23
|
}
|