@mlx-bun/inference 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +1475 -2
- package/THIRD_PARTY_NOTICES.md +3404 -0
- package/dist/native/libmlx_bun_ane.dylib +0 -0
- package/dist/native/libmlx_bun_expert_io.dylib +0 -0
- package/dist/native/mlx-bun-frame-extract +0 -0
- package/examples/fit-model.ts +25 -0
- package/examples/qwen3-forward.ts +42 -0
- package/examples/qwen3-generate.ts +28 -0
- package/examples/trellis-expand.ts +23 -0
- package/package.json +129 -4
- package/src/adapters/available.ts +110 -0
- package/src/adapters/index.ts +3 -0
- package/src/adapters/manager.ts +316 -0
- package/src/artifacts/auxiliary-files.ts +45 -0
- package/src/artifacts/config-dialects.ts +94 -0
- package/src/artifacts/config.ts +341 -0
- package/src/artifacts/draft-vocabulary.ts +30 -0
- package/src/artifacts/expert-offload-build.ts +75 -0
- package/src/artifacts/expert-offload.ts +89 -0
- package/src/artifacts/experts/index.ts +3 -0
- package/src/artifacts/experts/io.ts +386 -0
- package/src/artifacts/experts/residency.ts +1134 -0
- package/src/artifacts/experts/usage.ts +415 -0
- package/src/artifacts/fingerprint.ts +44 -0
- package/src/artifacts/glm52/container.ts +305 -0
- package/src/artifacts/glm52/expert-layout.ts +249 -0
- package/src/artifacts/glm52/index.ts +7 -0
- package/src/artifacts/glm52/kernel-layout.ts +124 -0
- package/src/artifacts/glm52/layout.ts +152 -0
- package/src/artifacts/glm52/memory.ts +500 -0
- package/src/artifacts/glm52/resident-weights.ts +135 -0
- package/src/artifacts/glm52/weights.ts +503 -0
- package/src/artifacts/glm52-config.ts +262 -0
- package/src/artifacts/identity.ts +94 -0
- package/src/artifacts/index.ts +15 -0
- package/src/artifacts/mmap.ts +90 -0
- package/src/artifacts/safetensors-writer.ts +249 -0
- package/src/artifacts/safetensors.ts +164 -0
- package/src/artifacts/turboquant-fold.ts +42 -0
- package/src/artifacts/weight-audit.ts +43 -0
- package/src/artifacts/weights.ts +255 -0
- package/src/contracts/index.ts +2 -0
- package/src/contracts/mlx/attention.ts +8 -0
- package/src/contracts/mlx/cache.ts +510 -0
- package/src/contracts/mlx/checkpoint.ts +10 -0
- package/src/contracts/mlx/draft-checkpoint.ts +14 -0
- package/src/contracts/mlx/draft-projection.ts +27 -0
- package/src/contracts/mlx/draft-target.ts +84 -0
- package/src/contracts/mlx/drafter.ts +176 -0
- package/src/contracts/mlx/forward-work.ts +23 -0
- package/src/contracts/mlx/glm52-weights.ts +25 -0
- package/src/contracts/mlx/graph.ts +309 -0
- package/src/contracts/mlx/head.ts +6 -0
- package/src/contracts/mlx/index.ts +15 -0
- package/src/contracts/mlx/kv-codec.ts +9 -0
- package/src/contracts/mlx/media.ts +113 -0
- package/src/contracts/mlx/positions.ts +16 -0
- package/src/contracts/mlx/row-table.ts +2 -0
- package/src/contracts/mlx/trainable.ts +103 -0
- package/src/contracts/mlx/whisper.ts +96 -0
- package/src/contracts/portable/composition.ts +106 -0
- package/src/contracts/portable/denoising.ts +17 -0
- package/src/contracts/portable/execution.ts +79 -0
- package/src/contracts/portable/generation.ts +103 -0
- package/src/contracts/portable/graph.ts +80 -0
- package/src/contracts/portable/index.ts +15 -0
- package/src/contracts/portable/memory-plan.ts +26 -0
- package/src/contracts/portable/object-cache.ts +8 -0
- package/src/contracts/portable/prefill.ts +63 -0
- package/src/contracts/portable/prefix-cache.ts +33 -0
- package/src/contracts/portable/prompt.ts +2 -0
- package/src/contracts/portable/resources.ts +25 -0
- package/src/contracts/portable/rollback.ts +7 -0
- package/src/contracts/portable/sampling.ts +44 -0
- package/src/contracts/portable/scheduling.ts +54 -0
- package/src/contracts/portable/token-delivery.ts +4 -0
- package/src/contracts/portable/tsconfig.json +14 -0
- package/src/embeddings/index.ts +1 -0
- package/src/embeddings/text.ts +85 -0
- package/src/execution/admission.ts +59 -0
- package/src/execution/batch-group.ts +1240 -0
- package/src/execution/batch-types.ts +225 -0
- package/src/execution/cancellation.ts +38 -0
- package/src/execution/continuation-request.ts +45 -0
- package/src/execution/continuation-types.ts +10 -0
- package/src/execution/coordinator.ts +70 -0
- package/src/execution/denoising-group.ts +180 -0
- package/src/execution/engine.ts +56 -0
- package/src/execution/fill-group.ts +505 -0
- package/src/execution/fit.ts +184 -0
- package/src/execution/gateway-binding.ts +178 -0
- package/src/execution/grammar-group.ts +224 -0
- package/src/execution/index.ts +18 -0
- package/src/execution/methods.ts +75 -0
- package/src/execution/mixed-iteration.ts +96 -0
- package/src/execution/plan.ts +65 -0
- package/src/execution/prefill-cohort.ts +100 -0
- package/src/execution/prefill-rows.ts +263 -0
- package/src/execution/request-policy.ts +19 -0
- package/src/execution/row-sampling.ts +49 -0
- package/src/execution/scheduler.ts +92 -0
- package/src/execution/session.ts +247 -0
- package/src/execution/speculative-group.ts +797 -0
- package/src/execution/tasks.ts +44 -0
- package/src/generation/autoregressive.ts +840 -0
- package/src/generation/bindings/autoregressive.ts +104 -0
- package/src/generation/bindings/denoising.ts +60 -0
- package/src/generation/bindings/prefill-policy.ts +36 -0
- package/src/generation/checkpoint-identity.ts +60 -0
- package/src/generation/denoising.ts +85 -0
- package/src/generation/diffusion.ts +583 -0
- package/src/generation/fill/echo-index.ts +188 -0
- package/src/generation/fill/index.ts +3 -0
- package/src/generation/fill/proposal.ts +69 -0
- package/src/generation/fill/schema-rows.ts +506 -0
- package/src/generation/fill/session.ts +464 -0
- package/src/generation/fill/tool-boundary.ts +103 -0
- package/src/generation/fill-append.ts +58 -0
- package/src/generation/generate.ts +44 -0
- package/src/generation/grammar-step.ts +39 -0
- package/src/generation/index.ts +14 -0
- package/src/generation/phase-dispatch.ts +115 -0
- package/src/generation/prefill.ts +33 -0
- package/src/generation/result.ts +49 -0
- package/src/generation/scopes.ts +157 -0
- package/src/generation/speculative/acceptance.ts +41 -0
- package/src/generation/speculative/adaptive-draft-gate.ts +166 -0
- package/src/generation/speculative/bindings/assistant-rows.ts +102 -0
- package/src/generation/speculative/bindings/autoregressive-rows.ts +124 -0
- package/src/generation/speculative/bindings/binding.ts +106 -0
- package/src/generation/speculative/bindings/deepspec-rows.ts +33 -0
- package/src/generation/speculative/bindings/draft-target.ts +10 -0
- package/src/generation/speculative/bindings/glm52-mtp-rows.ts +128 -0
- package/src/generation/speculative/bindings/projected-context-rows.ts +78 -0
- package/src/generation/speculative/bindings/projected-draft-rows.ts +95 -0
- package/src/generation/speculative/bindings/qwen-mtp-rows.ts +336 -0
- package/src/generation/speculative/bindings/two-model-rows.ts +63 -0
- package/src/generation/speculative/cache-identity.ts +16 -0
- package/src/generation/speculative/draft-kind.ts +149 -0
- package/src/generation/speculative/draft-policy.ts +41 -0
- package/src/generation/speculative/draft-registry.ts +118 -0
- package/src/generation/speculative/draft-vocab.ts +110 -0
- package/src/generation/speculative/index.ts +17 -0
- package/src/generation/speculative/output.ts +49 -0
- package/src/generation/speculative/round.ts +307 -0
- package/src/generation/speculative/source.ts +144 -0
- package/src/generation/speculative/sources/assistant-source.ts +64 -0
- package/src/generation/speculative/sources/deepspec-source.ts +70 -0
- package/src/generation/speculative/sources/dflash-source.ts +84 -0
- package/src/generation/speculative/sources/dflash2-source.ts +86 -0
- package/src/generation/speculative/sources/glm52-mtp-source.ts +66 -0
- package/src/generation/speculative/sources/ngram-source.ts +165 -0
- package/src/generation/speculative/sources/qwen-mtp-source.ts +154 -0
- package/src/generation/speculative/sources/two-model.ts +75 -0
- package/src/generation/types.ts +194 -0
- package/src/index.ts +20 -0
- package/src/input/audio/audiotoolbox.ts +112 -0
- package/src/input/audio/decode.ts +133 -0
- package/src/input/audio/features.ts +202 -0
- package/src/input/audio/index.ts +6 -0
- package/src/input/audio/transcode.ts +67 -0
- package/src/input/audio/whisper-mel.ts +185 -0
- package/src/input/audio/whisper-tokenizer.ts +238 -0
- package/src/input/chat-template.ts +389 -0
- package/src/input/index.ts +6 -0
- package/src/input/media-fetch.ts +439 -0
- package/src/input/packed-mixed.ts +43 -0
- package/src/input/special-tokens.ts +75 -0
- package/src/input/token-groups.ts +49 -0
- package/src/input/tokenizer.ts +336 -0
- package/src/input/tool-call.ts +689 -0
- package/src/input/vision/index.ts +3 -0
- package/src/input/vision/preprocess.ts +247 -0
- package/src/input/vision/prompt.ts +398 -0
- package/src/input/vision/qwen3vl-preprocess.ts +409 -0
- package/src/input/vision/qwen3vl-prompt.ts +237 -0
- package/src/input/vision/video-frames.ts +100 -0
- package/src/kernels/ane/fill.ts +101 -0
- package/src/kernels/ane/linear.ts +416 -0
- package/src/kernels/attention/flash.ts +694 -0
- package/src/kernels/attention/kvq4-decode.ts +155 -0
- package/src/kernels/attention/masks.ts +40 -0
- package/src/kernels/attention/multi-query.ts +193 -0
- package/src/kernels/attention/paged.ts +130 -0
- package/src/kernels/delta/gated.ts +306 -0
- package/src/kernels/delta/index.ts +3 -0
- package/src/kernels/delta/silu-rms-heads.ts +69 -0
- package/src/kernels/delta/state.ts +74 -0
- package/src/kernels/gated-rms-norm.ts +64 -0
- package/src/kernels/glm52/layout.ts +37 -0
- package/src/kernels/glm52/streamed-experts.ts +360 -0
- package/src/kernels/logits.ts +38 -0
- package/src/kernels/quantization/affine-row.ts +154 -0
- package/src/kernels/quantization/affine-rows.ts +36 -0
- package/src/kernels/quantization/affine-split-mma.ts +144 -0
- package/src/kernels/quantization/affine3-mma.ts +117 -0
- package/src/kernels/quantization/affine3-rows.ts +103 -0
- package/src/kernels/quantization/affine4-mma.ts +113 -0
- package/src/kernels/quantization/affine4-rows.ts +102 -0
- package/src/kernels/residual-rms-norm.ts +65 -0
- package/src/kernels/sampling/index.ts +2 -0
- package/src/kernels/sampling/normalized-argmax.ts +116 -0
- package/src/kernels/sampling/token-bitmask.ts +52 -0
- package/src/kernels/softcap.ts +35 -0
- package/src/kernels/trellis/codebook.ts +123 -0
- package/src/kernels/trellis/down-codebook.ts +184 -0
- package/src/kernels/trellis/down-factored.ts +180 -0
- package/src/kernels/trellis/down-k3-interleaved-factored.ts +146 -0
- package/src/kernels/trellis/down-mma-wide.ts +195 -0
- package/src/kernels/trellis/down-mma.ts +145 -0
- package/src/kernels/trellis/expand.ts +42 -0
- package/src/kernels/trellis/gate-up-codebook-mma.ts +141 -0
- package/src/kernels/trellis/gate-up-codebook.ts +137 -0
- package/src/kernels/trellis/gate-up-factored.ts +197 -0
- package/src/kernels/trellis/gate-up-mma-wide.ts +147 -0
- package/src/kernels/trellis/gate-up-mma.ts +148 -0
- package/src/kernels/trellis/gate-up.ts +248 -0
- package/src/kernels/trellis/geometry.ts +22 -0
- package/src/kernels/trellis/index.ts +103 -0
- package/src/kernels/trellis/launch.ts +12 -0
- package/src/kernels/trellis/mixed-gate-up-factored.ts +119 -0
- package/src/kernels/trellis/mixed-gate-up.ts +146 -0
- package/src/kernels/trellis/qualified.ts +34 -0
- package/src/kernels/trellis/reduce.ts +150 -0
- package/src/kernels/trellis/scatter.ts +407 -0
- package/src/kernels/trellis/splitk-prefill.ts +152 -0
- package/src/kernels/trellis/tiled-prefill.ts +131 -0
- package/src/kernels/trellis/vector-expand.ts +58 -0
- package/src/kernels/trellis/wide-prefill.ts +89 -0
- package/src/kernels/turboquant/decode.ts +82 -0
- package/src/kernels/turboquant/index.ts +5 -0
- package/src/kernels/turboquant/inverse.ts +122 -0
- package/src/kernels/turboquant/ops.ts +860 -0
- package/src/kernels/turboquant/signs.ts +130 -0
- package/src/kernels/turboquant/tables.ts +124 -0
- package/src/layers/affine-verify-linear.ts +75 -0
- package/src/layers/ane-prefill-split.ts +283 -0
- package/src/layers/compiled-normalization.ts +41 -0
- package/src/layers/delta-heads.ts +23 -0
- package/src/layers/dense-embedding.ts +29 -0
- package/src/layers/dense-linear.ts +32 -0
- package/src/layers/dequantized-linear.ts +72 -0
- package/src/layers/folded-attention.ts +42 -0
- package/src/layers/geglu.ts +130 -0
- package/src/layers/helpers.ts +7 -0
- package/src/layers/index.ts +36 -0
- package/src/layers/kv4-decode-attention.ts +15 -0
- package/src/layers/layer-norm.ts +24 -0
- package/src/layers/loading.ts +92 -0
- package/src/layers/lora.ts +150 -0
- package/src/layers/normalization.ts +9 -0
- package/src/layers/prefix-layout.ts +33 -0
- package/src/layers/quantized-append-attention.ts +32 -0
- package/src/layers/quantized-attention.ts +353 -0
- package/src/layers/quantized-embedding.ts +39 -0
- package/src/layers/quantized-linear.ts +137 -0
- package/src/layers/quantized-switch-linear.ts +37 -0
- package/src/layers/qwen-append.ts +12 -0
- package/src/layers/qwen-mrope.ts +238 -0
- package/src/layers/rope-2d.ts +110 -0
- package/src/layers/rope.ts +389 -0
- package/src/layers/swiglu.ts +23 -0
- package/src/layers/trellis-codebook-down.ts +52 -0
- package/src/layers/trellis-codebook-gate-up.ts +42 -0
- package/src/layers/trellis-down.ts +117 -0
- package/src/layers/trellis-gate-up.ts +71 -0
- package/src/layers/trellis-linear.ts +211 -0
- package/src/layers/trellis-prompt.ts +102 -0
- package/src/layers/trellis-reduce-gate-up.ts +73 -0
- package/src/layers/trellis-scatter-down.ts +98 -0
- package/src/models/ane-install.ts +74 -0
- package/src/models/audio/conformer.ts +656 -0
- package/src/models/cache-composition.ts +44 -0
- package/src/models/capabilities.ts +89 -0
- package/src/models/chat-template.ts +10 -0
- package/src/models/composition.ts +107 -0
- package/src/models/diffusion-gemma/experts.ts +59 -0
- package/src/models/diffusion-gemma/family.ts +21 -0
- package/src/models/diffusion-gemma/model.ts +900 -0
- package/src/models/diffusion-gemma/vision.ts +549 -0
- package/src/models/drafter-loaders.ts +49 -0
- package/src/models/drafters.ts +39 -0
- package/src/models/factory.ts +351 -0
- package/src/models/families.ts +70 -0
- package/src/models/family.ts +125 -0
- package/src/models/gemma4/assistant-target.ts +46 -0
- package/src/models/gemma4/assistant.ts +327 -0
- package/src/models/gemma4/blocks.ts +755 -0
- package/src/models/gemma4/compiled-decode.ts +452 -0
- package/src/models/gemma4/family.ts +39 -0
- package/src/models/gemma4/gemma4-12b.ts +677 -0
- package/src/models/gemma4/gemma4-26b.ts +544 -0
- package/src/models/gemma4/gemma4-e4b.ts +599 -0
- package/src/models/gemma4/graphs.ts +147 -0
- package/src/models/gemma4/media.ts +88 -0
- package/src/models/gemma4/model.ts +860 -0
- package/src/models/gemma4/serving-blocks.ts +72 -0
- package/src/models/gemma4/trainable.ts +186 -0
- package/src/models/gemma4/written-blocks.ts +232 -0
- package/src/models/gemma4/written-forward.ts +159 -0
- package/src/models/gemma4/written-input.ts +29 -0
- package/src/models/glm52/atlas.ts +507 -0
- package/src/models/glm52/coupling.ts +388 -0
- package/src/models/glm52/dsa.ts +601 -0
- package/src/models/glm52/family.ts +20 -0
- package/src/models/glm52/mla.ts +812 -0
- package/src/models/glm52/model.ts +1127 -0
- package/src/models/glm52/moe.ts +223 -0
- package/src/models/glm52/mtp.ts +60 -0
- package/src/models/glm52/pilot.ts +537 -0
- package/src/models/glm52/reference.ts +445 -0
- package/src/models/glm52/residency.ts +557 -0
- package/src/models/glm52/streamed-experts.ts +447 -0
- package/src/models/graph.ts +59 -0
- package/src/models/implementation.ts +230 -0
- package/src/models/index.ts +15 -0
- package/src/models/media-input.ts +15 -0
- package/src/models/memory-plan.ts +39 -0
- package/src/models/minicpm5/family.ts +29 -0
- package/src/models/minicpm5/model.ts +394 -0
- package/src/models/minicpm5/trainable.ts +90 -0
- package/src/models/profile.ts +337 -0
- package/src/models/qwen/blocks.ts +658 -0
- package/src/models/qwen/checkpoint.ts +190 -0
- package/src/models/qwen/families.ts +57 -0
- package/src/models/qwen/media-input.ts +161 -0
- package/src/models/qwen/mtp.ts +101 -0
- package/src/models/qwen/qwen3-moe.ts +355 -0
- package/src/models/qwen/qwen3.ts +323 -0
- package/src/models/qwen/qwen38-27b-trellis-m1max.ts +1532 -0
- package/src/models/qwen/qwen38-27b-trellis-m4pro.ts +1092 -0
- package/src/models/qwen/qwen3_5.ts +433 -0
- package/src/models/qwen/written-layers.ts +285 -0
- package/src/models/row-table.ts +1 -0
- package/src/models/runtime.ts +73 -0
- package/src/models/speculative/deepspec-artifact.ts +10 -0
- package/src/models/speculative/deepspec.ts +744 -0
- package/src/models/speculative/dflash.ts +553 -0
- package/src/models/speculative/dflash2-artifact.ts +9 -0
- package/src/models/speculative/dflash2-operations.ts +1 -0
- package/src/models/speculative/dflash2.ts +576 -0
- package/src/models/speculative/loader.ts +29 -0
- package/src/models/support.ts +79 -0
- package/src/models/universal/archs.ts +365 -0
- package/src/models/universal/blocks.ts +479 -0
- package/src/models/universal/dense.ts +255 -0
- package/src/models/universal/family.ts +17 -0
- package/src/models/vision/qwen3vl.ts +566 -0
- package/src/models/vision/siglip.ts +520 -0
- package/src/models/vision/unified.ts +176 -0
- package/src/models/whisper/family.ts +19 -0
- package/src/models/whisper/fast.ts +734 -0
- package/src/models/whisper/model.ts +430 -0
- package/src/runtime/compiled-trace.ts +16 -0
- package/src/runtime/config.ts +77 -0
- package/src/runtime/expert-trace.ts +71 -0
- package/src/runtime/graph-forward.ts +65 -0
- package/src/runtime/integers.ts +6 -0
- package/src/runtime/native.ts +16 -0
- package/src/runtime/resources.ts +53 -0
- package/src/runtime/row-operations.ts +42 -0
- package/src/runtime/trace.ts +161 -0
- package/src/sampling/curve.ts +122 -0
- package/src/sampling/draft.ts +55 -0
- package/src/sampling/extras.ts +45 -0
- package/src/sampling/filters.ts +134 -0
- package/src/sampling/grammar.ts +630 -0
- package/src/sampling/hlg.ts +290 -0
- package/src/sampling/index.ts +9 -0
- package/src/sampling/processors.ts +142 -0
- package/src/sampling/sampler.ts +120 -0
- package/src/sampling/step.ts +343 -0
- package/src/sampling/types.ts +161 -0
- package/src/sampling/window-filters.ts +46 -0
- package/src/scoring/decisions.ts +96 -0
- package/src/scoring/full-sequence.ts +103 -0
- package/src/scoring/index.ts +9 -0
- package/src/scoring/kl.ts +29 -0
- package/src/scoring/perplexity.ts +165 -0
- package/src/scoring/response-logps.ts +65 -0
- package/src/state/affine-attention.ts +180 -0
- package/src/state/attachment.ts +68 -0
- package/src/state/attention-read.ts +215 -0
- package/src/state/batched-kv.ts +294 -0
- package/src/state/batched-mask.ts +445 -0
- package/src/state/batched-quant.ts +389 -0
- package/src/state/batched-quantized-kv.ts +209 -0
- package/src/state/batched-rotating-quant.ts +457 -0
- package/src/state/batched-rotating-state.ts +149 -0
- package/src/state/batched-rotating.ts +430 -0
- package/src/state/batched-row-storage.ts +179 -0
- package/src/state/batched-ssm.ts +54 -0
- package/src/state/batched-turboquant-kv.ts +144 -0
- package/src/state/bf16-first-kv.ts +663 -0
- package/src/state/cache-service.ts +592 -0
- package/src/state/capabilities.ts +65 -0
- package/src/state/checkpoint.ts +46 -0
- package/src/state/continuation-persistence.ts +126 -0
- package/src/state/decode-step-inputs.ts +31 -0
- package/src/state/decoded-kv-donor.ts +12 -0
- package/src/state/delayed-quantized-kv.ts +141 -0
- package/src/state/delayed-rotating-quantized-kv.ts +178 -0
- package/src/state/delayed-turboquant-kv.ts +123 -0
- package/src/state/durability.ts +214 -0
- package/src/state/encoder-cache.ts +26 -0
- package/src/state/full-kv-row-append.ts +33 -0
- package/src/state/full-kv-row-donor.ts +54 -0
- package/src/state/full-prefill-padding.ts +56 -0
- package/src/state/full-prefill-row.ts +112 -0
- package/src/state/full-transitioning-kv-rows.ts +70 -0
- package/src/state/glm52-cache.ts +783 -0
- package/src/state/grouped-heads-kv4-cache.ts +26 -0
- package/src/state/index.ts +38 -0
- package/src/state/kv-attention-view.ts +77 -0
- package/src/state/kv-budget.ts +14 -0
- package/src/state/kv-scheme.ts +315 -0
- package/src/state/kv-storage.ts +57 -0
- package/src/state/kv-tensor-rows.ts +212 -0
- package/src/state/kv.ts +324 -0
- package/src/state/kv4-head256-cache.ts +46 -0
- package/src/state/latent-legos.ts +895 -0
- package/src/state/layout.ts +277 -0
- package/src/state/leases.ts +26 -0
- package/src/state/paged/cache.ts +689 -0
- package/src/state/paged/codec.ts +36 -0
- package/src/state/paged/rows.ts +223 -0
- package/src/state/persistence-types.ts +173 -0
- package/src/state/persistence-worker.ts +83 -0
- package/src/state/persistence.ts +1036 -0
- package/src/state/persistence.worker.d.ts +3 -0
- package/src/state/persistence.worker.js +264 -0
- package/src/state/prefix-cache.ts +685 -0
- package/src/state/quantized-kv.ts +369 -0
- package/src/state/quantized-tensor.ts +26 -0
- package/src/state/request-policy.ts +48 -0
- package/src/state/retention-policy.ts +37 -0
- package/src/state/rollback.ts +131 -0
- package/src/state/rotating-kv-donor.ts +35 -0
- package/src/state/rotating-kv-layout.ts +341 -0
- package/src/state/rotating-kv.ts +529 -0
- package/src/state/rotating-quantized-kv.ts +616 -0
- package/src/state/rotating-row-transaction.ts +35 -0
- package/src/state/rows.ts +104 -0
- package/src/state/softcap-attention.ts +118 -0
- package/src/state/speculative/glm52-mtp-state.ts +38 -0
- package/src/state/speculative/qwen-mtp-state.ts +34 -0
- package/src/state/speculative-rotating-kv.ts +113 -0
- package/src/state/ssd-cache.ts +434 -0
- package/src/state/ssm-prefill-padding.ts +39 -0
- package/src/state/ssm.ts +422 -0
- package/src/state/target-layout.ts +7 -0
- package/src/state/tiered-prefix-cache.ts +45 -0
- package/src/state/training-cache.ts +300 -0
- package/src/state/transitioning-kv-rows.ts +267 -0
- package/src/state/turboquant-attention.ts +97 -0
- package/src/state/turboquant-codec.ts +90 -0
- package/src/state/turboquant-kv.ts +442 -0
- package/src/state/views.ts +26 -0
- package/src/transcription/index.ts +3 -0
- package/src/transcription/silero-vad.ts +379 -0
- package/src/transcription/whisper/decode.ts +773 -0
- package/src/transcription/whisper/format.ts +74 -0
- package/src/transcription/whisper/index.ts +4 -0
- package/src/transcription/whisper/timing.ts +274 -0
- package/src/transcription/whisper/transcribe.ts +394 -0
- package/src/transcription/whisper/types.ts +22 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
// Weights: model directory → lazy mlx arrays.
|
|
2
|
+
//
|
|
3
|
+
// Tensor data goes through mlx's native safetensors loader
|
|
4
|
+
// (mlx_load_safetensors): opening is milliseconds, and each tensor's bytes
|
|
5
|
+
// are read into an mlx-owned (page-aligned, Metal-visible) buffer only
|
|
6
|
+
// when first evaluated — the same lazy semantics as Python's mx.load.
|
|
7
|
+
//
|
|
8
|
+
// Why not wrap our own mmap pointers? Verified: GPU ops on
|
|
9
|
+
// externally-wrapped buffers read garbage unless the pointer is
|
|
10
|
+
// page-aligned, and safetensors tensor offsets are arbitrary (not even
|
|
11
|
+
// element-aligned). CPU-stream ops on wrapped pointers are correct, but
|
|
12
|
+
// the weights' consumers are GPU kernels.
|
|
13
|
+
//
|
|
14
|
+
// The JS-side parser (ShardedSafetensors) stays as the metadata source:
|
|
15
|
+
// names, shapes, dtypes, byte sizes — for the registry, fit reports, and
|
|
16
|
+
// validation — without touching tensor bytes.
|
|
17
|
+
|
|
18
|
+
import { ptr, read } from "bun:ffi";
|
|
19
|
+
import { ShardedSafetensors, type TensorInfo } from "./safetensors";
|
|
20
|
+
import { MlxArray, cpuStream } from "@mlx-bun/mlx/array";
|
|
21
|
+
import { C } from "@mlx-bun/mlx/ffi";
|
|
22
|
+
|
|
23
|
+
const cstr = (s: string) => Buffer.from(s + "\0", "utf8");
|
|
24
|
+
|
|
25
|
+
export interface WeightsNativeBindings {
|
|
26
|
+
newArrayMap(): bigint;
|
|
27
|
+
freeArrayMap(handle: bigint): void;
|
|
28
|
+
newStringMap(): bigint;
|
|
29
|
+
freeStringMap(handle: bigint): void;
|
|
30
|
+
loadSafetensors(
|
|
31
|
+
arrayMapSlot: BigUint64Array,
|
|
32
|
+
metadataMapSlot: BigUint64Array,
|
|
33
|
+
path: string,
|
|
34
|
+
): number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface WeightsOpenOptions {
|
|
38
|
+
/** Failure-injection seam; production callers use the native MLX bindings. */
|
|
39
|
+
native?: WeightsNativeBindings;
|
|
40
|
+
/** Parser seam used by ownership tests to provide deterministic shard order. */
|
|
41
|
+
openShards?: (modelDir: string) => Promise<ShardedSafetensors>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const NATIVE_WEIGHTS: WeightsNativeBindings = {
|
|
45
|
+
newArrayMap: () => C.mlx_map_string_to_array_new(),
|
|
46
|
+
freeArrayMap: (handle) => {
|
|
47
|
+
C.mlx_map_string_to_array_free(handle);
|
|
48
|
+
},
|
|
49
|
+
newStringMap: () => C.mlx_map_string_to_string_new(),
|
|
50
|
+
freeStringMap: (handle) => {
|
|
51
|
+
C.mlx_map_string_to_string_free(handle);
|
|
52
|
+
},
|
|
53
|
+
loadSafetensors: (arrayMapSlot, metadataMapSlot, path) =>
|
|
54
|
+
C.mlx_load_safetensors(
|
|
55
|
+
ptr(arrayMapSlot),
|
|
56
|
+
ptr(metadataMapSlot),
|
|
57
|
+
ptr(cstr(path)),
|
|
58
|
+
cpuStream,
|
|
59
|
+
),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Checkpoint-generation normalization, installed once at load.
|
|
64
|
+
*
|
|
65
|
+
* `names` maps the GRAPH's canonical tensor name onto the name the artifact
|
|
66
|
+
* actually stores; a canonical name absent from the map does not exist (the
|
|
67
|
+
* same way a reference `sanitize()` drops a tensor). `fixup` is an optional
|
|
68
|
+
* lazy value repair applied to the loaded array — return null to keep it.
|
|
69
|
+
*
|
|
70
|
+
* Weights only APPLIES a view; the rules belong to the architecture that owns
|
|
71
|
+
* the naming (see `qwen35WeightsView` in packages/inference/src/models/qwen/checkpoint.ts).
|
|
72
|
+
*/
|
|
73
|
+
export interface WeightsView {
|
|
74
|
+
readonly names: ReadonlyMap<string, string>;
|
|
75
|
+
fixup?(canonical: string, arr: MlxArray): MlxArray | null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export class Weights {
|
|
79
|
+
readonly shards: ShardedSafetensors;
|
|
80
|
+
/** shard filename → native mlx map handle (string → lazy array). */
|
|
81
|
+
readonly #maps = new Map<string, bigint>();
|
|
82
|
+
/** Cached arrays, keyed by CANONICAL name (post-view). */
|
|
83
|
+
readonly #arrays = new Map<string, MlxArray>();
|
|
84
|
+
readonly #native: WeightsNativeBindings;
|
|
85
|
+
#view: WeightsView | null = null;
|
|
86
|
+
|
|
87
|
+
private constructor(
|
|
88
|
+
shards: ShardedSafetensors,
|
|
89
|
+
native: WeightsNativeBindings,
|
|
90
|
+
) {
|
|
91
|
+
this.shards = shards;
|
|
92
|
+
this.#native = native;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
static async open(
|
|
96
|
+
modelDir: string,
|
|
97
|
+
options: WeightsOpenOptions = {},
|
|
98
|
+
): Promise<Weights> {
|
|
99
|
+
const native = options.native ?? NATIVE_WEIGHTS;
|
|
100
|
+
const shards = await (options.openShards ?? ShardedSafetensors.open)(modelDir);
|
|
101
|
+
const self = new Weights(shards, native);
|
|
102
|
+
try {
|
|
103
|
+
for (const [file] of self.shards.files) self.#openShard(file);
|
|
104
|
+
return self;
|
|
105
|
+
} catch (error) {
|
|
106
|
+
// A failure on shard N must release every array map transferred by
|
|
107
|
+
// shards 1..N-1. The current shard remains owned by the inner guard.
|
|
108
|
+
self.dispose();
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Load one shard's native string→array map (lazy re-open path too). */
|
|
114
|
+
#openShard(file: string): void {
|
|
115
|
+
const sf = this.shards.files.get(file);
|
|
116
|
+
if (!sf) throw new Error(`no shard file ${file}`);
|
|
117
|
+
// out-param slots read back via read.u64, not [0] (DFG stale-read
|
|
118
|
+
// bug — see outArray in packages/mlx/src/ffi.ts). Cold path, but the rule is
|
|
119
|
+
// uniform: native wrote it, read.* reads it.
|
|
120
|
+
const arrMap = new BigUint64Array([this.#native.newArrayMap()]);
|
|
121
|
+
const arrMapPtr = ptr(arrMap);
|
|
122
|
+
let arrayMapTransferred = false;
|
|
123
|
+
try {
|
|
124
|
+
const metaMap = new BigUint64Array([this.#native.newStringMap()]);
|
|
125
|
+
const metaMapPtr = ptr(metaMap);
|
|
126
|
+
try {
|
|
127
|
+
const status = this.#native.loadSafetensors(arrMap, metaMap, sf.path);
|
|
128
|
+
if (status !== 0)
|
|
129
|
+
throw new Error(`mlx_load_safetensors(${sf.path}) failed`);
|
|
130
|
+
this.#maps.set(file, read.u64(arrMapPtr, 0));
|
|
131
|
+
arrayMapTransferred = true;
|
|
132
|
+
} finally {
|
|
133
|
+
this.#native.freeStringMap(read.u64(metaMapPtr, 0));
|
|
134
|
+
}
|
|
135
|
+
} finally {
|
|
136
|
+
if (!arrayMapTransferred)
|
|
137
|
+
this.#native.freeArrayMap(read.u64(arrMapPtr, 0));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Install the checkpoint normalization. Must precede the first tensor()
|
|
142
|
+
* call: the array cache and every shard lookup below are keyed through it. */
|
|
143
|
+
setView(view: WeightsView): void {
|
|
144
|
+
if (this.#arrays.size > 0)
|
|
145
|
+
throw new Error("Weights.setView after tensors were materialized");
|
|
146
|
+
this.#view = view;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Canonical name → the stored name (identity when no view is installed). */
|
|
150
|
+
#source(name: string): string {
|
|
151
|
+
return this.#view ? this.#view.names.get(name) ?? name : name;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** Free one shard's native map AND every cached tensor from it, releasing
|
|
155
|
+
* all bytes materialized while consuming that shard. The shard transparently
|
|
156
|
+
* re-opens on the next tensor() touching it (header parse only — lazy).
|
|
157
|
+
* Required by streaming whole-model transforms at 27B scale: the native map
|
|
158
|
+
* retains every evaluated source array, so per-tensor dispose alone frees
|
|
159
|
+
* nothing — the whole model accumulates in RAM (2026-08-18 fold OOM). */
|
|
160
|
+
releaseShard(file: string): void {
|
|
161
|
+
const sf = this.shards.files.get(file);
|
|
162
|
+
if (!sf) return;
|
|
163
|
+
for (const [name, arr] of this.#arrays) {
|
|
164
|
+
if (this.shards.tensorToFile.get(this.#source(name)) === sf) {
|
|
165
|
+
arr.dispose();
|
|
166
|
+
this.#arrays.delete(name);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const map = this.#maps.get(file);
|
|
170
|
+
if (map !== undefined) {
|
|
171
|
+
this.#native.freeArrayMap(map);
|
|
172
|
+
this.#maps.delete(file);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** The shard filename holding `name` (for releaseShard scheduling). */
|
|
177
|
+
fileOf(name: string): string | undefined {
|
|
178
|
+
const sf = this.shards.tensorToFile.get(this.#source(name));
|
|
179
|
+
if (!sf) return undefined;
|
|
180
|
+
for (const [file, cand] of this.shards.files) if (cand === sf) return file;
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Canonical names — with a view installed, exactly the tensors the graph
|
|
185
|
+
* can ask for (renamed, drops excluded). */
|
|
186
|
+
get tensorNames(): string[] {
|
|
187
|
+
return this.#view ? [...this.#view.names.keys()] : this.shards.tensorNames;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
info(name: string): TensorInfo {
|
|
191
|
+
return this.shards.info(this.#source(name));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
has(name: string): boolean {
|
|
195
|
+
return this.#view
|
|
196
|
+
? this.#view.names.has(name)
|
|
197
|
+
: this.shards.tensorToFile.has(name);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** Lazy mlx array for a tensor; cached per canonical name. */
|
|
201
|
+
tensor(name: string): MlxArray {
|
|
202
|
+
let arr = this.#arrays.get(name);
|
|
203
|
+
if (!arr) {
|
|
204
|
+
if (this.#view && !this.#view.names.has(name))
|
|
205
|
+
throw new Error(`no tensor named ${name}`);
|
|
206
|
+
const source = this.#source(name);
|
|
207
|
+
const sf = this.shards.tensorToFile.get(source);
|
|
208
|
+
if (!sf) throw new Error(`no tensor named ${name}`);
|
|
209
|
+
let entry = [...this.#maps.entries()]
|
|
210
|
+
.find(([file]) => this.shards.files.get(file) === sf);
|
|
211
|
+
if (!entry) {
|
|
212
|
+
// Shard was releaseShard()'d — transparently re-open it.
|
|
213
|
+
const file = this.fileOf(name)!;
|
|
214
|
+
this.#openShard(file);
|
|
215
|
+
entry = [file, this.#maps.get(file)!];
|
|
216
|
+
}
|
|
217
|
+
const mapHandle = entry[1];
|
|
218
|
+
const slot = new BigUint64Array([C.mlx_array_new()]);
|
|
219
|
+
const slotPtr = ptr(slot);
|
|
220
|
+
if (C.mlx_map_string_to_array_get(slotPtr, mapHandle, ptr(cstr(source))) !== 0)
|
|
221
|
+
throw new Error(`tensor ${source} missing from native map`);
|
|
222
|
+
arr = new MlxArray(read.u64(slotPtr, 0));
|
|
223
|
+
// Value repair (γ−1 → γ, conv layout): the fixed array is a lazy graph
|
|
224
|
+
// node over the source, so the raw handle is released immediately — the
|
|
225
|
+
// node keeps its own reference to the underlying data.
|
|
226
|
+
const fixed = this.#view?.fixup?.(name, arr) ?? null;
|
|
227
|
+
if (fixed) {
|
|
228
|
+
arr.dispose();
|
|
229
|
+
arr = fixed;
|
|
230
|
+
}
|
|
231
|
+
this.#arrays.set(name, arr);
|
|
232
|
+
}
|
|
233
|
+
return arr;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Dispose + evict one cached tensor so its materialized bytes are freed
|
|
237
|
+
* mid-walk. Streaming whole-model transforms (fold/quantize at 27B scale)
|
|
238
|
+
* MUST release each source tensor after its consumer evaluates, or the
|
|
239
|
+
* cache accumulates the entire model in RAM. Safe to call for names never
|
|
240
|
+
* accessed; the next tensor(name) call re-opens it from the map. */
|
|
241
|
+
release(name: string): void {
|
|
242
|
+
const arr = this.#arrays.get(name);
|
|
243
|
+
if (arr) {
|
|
244
|
+
arr.dispose();
|
|
245
|
+
this.#arrays.delete(name);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
dispose(): void {
|
|
250
|
+
for (const arr of this.#arrays.values()) arr.dispose();
|
|
251
|
+
this.#arrays.clear();
|
|
252
|
+
for (const map of this.#maps.values()) this.#native.freeArrayMap(map);
|
|
253
|
+
this.#maps.clear();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MlxArray } from "@mlx-bun/mlx/array";
|
|
2
|
+
|
|
3
|
+
/** The graph borrows donor attention; storage owns validity and encoding. */
|
|
4
|
+
export interface AssistantAttention {
|
|
5
|
+
attend(query: MlxArray, scale: number, window: number | null): MlxArray;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface AssistantDonors { sliding: AssistantAttention; full: AssistantAttention; }
|