@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,104 @@
|
|
|
1
|
+
import { pagedDecodeCompiles } from "../../state/paged/cache";
|
|
2
|
+
import type { GraphDescriptor } from "../../contracts/portable/graph";
|
|
3
|
+
import type { MlxArray } from "@mlx-bun/mlx/array";
|
|
4
|
+
import type { Cache } from "../../contracts/mlx/cache";
|
|
5
|
+
import type { MlxCompiledDecodeStep, MlxKnownSpans, MlxModelMemory } from "../../contracts/mlx/graph";
|
|
6
|
+
import { compiledDecodeStepOf, tokenPhasesOf } from "../../models/capabilities";
|
|
7
|
+
import { runtimeConfig, type RuntimeConfig } from "../../runtime/config";
|
|
8
|
+
import type { MlxTokenGraph } from "../../models/graph";
|
|
9
|
+
import type { PrefillPolicy } from "../../contracts/portable/prefill";
|
|
10
|
+
import { resolveMlxPrefillPolicy } from "./prefill-policy";
|
|
11
|
+
import { COMPOSITION_DEFAULTS, type KvStorageScheme, type PagedKvComposition } from "../../contracts/portable/composition";
|
|
12
|
+
import { MlxPhaseDispatch } from "../phase-dispatch";
|
|
13
|
+
|
|
14
|
+
export type { MlxModelMemory };
|
|
15
|
+
|
|
16
|
+
export interface MlxDecodeStep {
|
|
17
|
+
/** Consume one pending token and advance state once. Returned arrays belong
|
|
18
|
+
* to the caller. A step that throws fails the generation. */
|
|
19
|
+
step(token: MlxArray, state: Cache[]): { logits: MlxArray; evalWith: MlxArray[] };
|
|
20
|
+
/** Release per-run workspaces after pending outputs are dropped and before
|
|
21
|
+
* cache disposal. Wait for native work if releasing requires completion. */
|
|
22
|
+
close(): void | Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** One replaceable binding owns all graph-specific operations used by the AR
|
|
26
|
+
* loop: the graph's named phases and the facts the loop reads once. The
|
|
27
|
+
* current method requires MLX tensors and the legacy Cache[] ABI. Weights are
|
|
28
|
+
* borrowed for the binding's lifetime; generated caches are owned by the run.
|
|
29
|
+
* Caller-provided caches and media remain borrowed. */
|
|
30
|
+
export interface MlxAutoregressiveBinding {
|
|
31
|
+
readonly runtime?: RuntimeConfig;
|
|
32
|
+
readonly prefillPolicy?: PrefillPolicy;
|
|
33
|
+
readonly descriptor: GraphDescriptor;
|
|
34
|
+
/** The graph's phase operations. */
|
|
35
|
+
readonly phases: MlxPhaseDispatch;
|
|
36
|
+
readonly eosTokenIds: readonly number[];
|
|
37
|
+
readonly memory: MlxModelMemory;
|
|
38
|
+
readonly adapters?: { active: string[] };
|
|
39
|
+
/** The composition's KV scheme, which `makeCache` composes; absent: bf16. */
|
|
40
|
+
readonly kv?: KvStorageScheme;
|
|
41
|
+
/** The composition's paging (`pagedKv`); absent: none. */
|
|
42
|
+
readonly pagedKv?: PagedKvComposition | null;
|
|
43
|
+
/** The composition's `prefillTailSplit`; absent: the default. */
|
|
44
|
+
readonly prefillTailSplit?: boolean;
|
|
45
|
+
/** The composition's `grammarJump`; absent: the default. */
|
|
46
|
+
readonly grammarJump?: boolean;
|
|
47
|
+
/** The graph's committed known-token spans, when it declares them. */
|
|
48
|
+
readonly knownSpans?: MlxKnownSpans;
|
|
49
|
+
makeCache(): Cache[];
|
|
50
|
+
/** The vision prefill phase over prepared embeddings (borrowed). */
|
|
51
|
+
prefillEmbeddings?(
|
|
52
|
+
embeddings: MlxArray, state: Cache[], imageMask: MlxArray | null,
|
|
53
|
+
ids: MlxArray, multimodalMask: MlxArray | null, width: number,
|
|
54
|
+
): MlxArray;
|
|
55
|
+
/** The graph's compiled decode step for this run, chosen once after
|
|
56
|
+
* prefill: present when the graph declares one, the run allows replay and
|
|
57
|
+
* its composition kept compiled decode on. A compiled/fused decoder belongs to
|
|
58
|
+
* THIS graph, never to a model inferred from a name or inherited by a
|
|
59
|
+
* replacement. */
|
|
60
|
+
createDecode?(policy: { hasAdapters: boolean }): MlxDecodeStep | null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Bind a resident graph to the autoregressive method: its phases, caches and
|
|
64
|
+
* memory, and the compiled decode step it declares. Nothing here reads which
|
|
65
|
+
* model the graph is. */
|
|
66
|
+
export function bindMlxAutoregressiveGraph(model: MlxTokenGraph): MlxAutoregressiveBinding {
|
|
67
|
+
const runtime = runtimeConfig();
|
|
68
|
+
const facts = model.composition ?? COMPOSITION_DEFAULTS;
|
|
69
|
+
const compiledOn = (!model.composition?.pagedKv || pagedDecodeCompiles(model.composition.pagedKv, model.composition.kv));
|
|
70
|
+
return {
|
|
71
|
+
runtime,
|
|
72
|
+
prefillPolicy: resolveMlxPrefillPolicy(model, runtime),
|
|
73
|
+
descriptor: Object.freeze({ id: `legacy:${model.config.modelType}`, artifact: "legacy-resident-model",
|
|
74
|
+
stateAbi: "legacy-cache-array-v1", backend: "mlx", graphAbi: "mlx-hidden-bsh-v1" }),
|
|
75
|
+
phases: new MlxPhaseDispatch(tokenPhasesOf(model)),
|
|
76
|
+
eosTokenIds: model.config.eosTokenIds,
|
|
77
|
+
memory: model,
|
|
78
|
+
adapters: model.loraState,
|
|
79
|
+
...(model.composition ? { kv: model.composition.kv } : {}),
|
|
80
|
+
pagedKv: facts.pagedKv ?? null, prefillTailSplit: facts.prefillTailSplit, grammarJump: facts.grammarJump,
|
|
81
|
+
...(model.knownSpans ? { knownSpans: model.knownSpans } : {}),
|
|
82
|
+
makeCache: model.makeCache.bind(model),
|
|
83
|
+
prefillEmbeddings: model.embeddingPrompt ? (embeddings, caches, imageMask, ids, multimodalMask, rows) =>
|
|
84
|
+
model.embeddingPrompt!.find(range => rows >= range.from && rows <= range.to)!.operation(embeddings, caches, imageMask, ids, multimodalMask)
|
|
85
|
+
: model.prefillEmbeddings?.bind(model),
|
|
86
|
+
createDecode(policy) {
|
|
87
|
+
// Only a graph that declares a compiled step has one, and only a
|
|
88
|
+
// composition whose storage the step drives keeps it on. Adapters would
|
|
89
|
+
// bake residuals into the tape.
|
|
90
|
+
if (!compiledOn || policy.hasAdapters) return null;
|
|
91
|
+
const compiled: MlxCompiledDecodeStep | null = compiledDecodeStepOf(model);
|
|
92
|
+
if (!compiled) return null;
|
|
93
|
+
// The graph owns the compiled closures; its unload releases them.
|
|
94
|
+
return { step: (token, caches) => compiled.step(token, caches), close() {} };
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function assertMlxAutoregressiveBinding(binding: MlxAutoregressiveBinding): void {
|
|
100
|
+
const descriptor = binding.descriptor;
|
|
101
|
+
if (descriptor.backend !== "mlx" || descriptor.graphAbi !== "mlx-hidden-bsh-v1" ||
|
|
102
|
+
descriptor.stateAbi !== "legacy-cache-array-v1")
|
|
103
|
+
throw new Error(`AR binding ${descriptor.id} has an incompatible backend, graph, or state ABI`);
|
|
104
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { DenoisingGraph } from "../../contracts/portable/denoising";
|
|
2
|
+
import type { MlxArray } from "@mlx-bun/mlx/array";
|
|
3
|
+
import type { Cache } from "../../contracts/mlx/cache";
|
|
4
|
+
import type { MlxModelMemory } from "./autoregressive";
|
|
5
|
+
import type { MlxDeclaredGraph, MlxDenoisingOperations } from "../../contracts/mlx/graph";
|
|
6
|
+
import { declaredGraph } from "../../models/capabilities";
|
|
7
|
+
import { disposeResources } from "../../runtime/resources";
|
|
8
|
+
import { runtimeConfig, type RuntimeConfig } from "../../runtime/config";
|
|
9
|
+
|
|
10
|
+
export interface MlxDenoisingBinding<State = Cache[]> {
|
|
11
|
+
readonly runtime?: RuntimeConfig;
|
|
12
|
+
readonly graph: DenoisingGraph<MlxArray, State>;
|
|
13
|
+
readonly memory: MlxModelMemory;
|
|
14
|
+
readonly adapters?: { active: string[] };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** A resident graph as the denoising binding takes it: its declaration, the denoising operations the
|
|
18
|
+
* declared method promises, its weights for the wired-limit scope and its mounted adapters. */
|
|
19
|
+
export type MlxDenoisingModel = MlxDeclaredGraph & MlxModelMemory & Partial<MlxDenoisingOperations> &
|
|
20
|
+
{ readonly loraState?: { active: string[] } };
|
|
21
|
+
|
|
22
|
+
/** Only a graph that declares the denoising method binds here, and it must provide the operations. */
|
|
23
|
+
export function bindLegacyDenoisingModel(resident: MlxDenoisingModel): MlxDenoisingBinding {
|
|
24
|
+
if (declaredGraph(resident).graphCapabilities.method !== "denoising")
|
|
25
|
+
throw new TypeError("the graph does not declare the denoising method");
|
|
26
|
+
const model = resident as MlxDenoisingOperations;
|
|
27
|
+
for (const operation of ["extendPrefill", "decoderLogits", "dequantEmbedWeight", "softEmbeddings"] as const)
|
|
28
|
+
if (typeof model[operation] !== "function")
|
|
29
|
+
throw new TypeError(`the graph declares the denoising method but provides no ${operation}`);
|
|
30
|
+
if (!model.denoisingPrefill && typeof model.prefill !== "function")
|
|
31
|
+
throw new TypeError("the graph declares the denoising method but provides no prefill");
|
|
32
|
+
return {
|
|
33
|
+
runtime: runtimeConfig(),
|
|
34
|
+
memory: resident, adapters: resident.loraState,
|
|
35
|
+
graph: {
|
|
36
|
+
descriptor: Object.freeze({ id: "legacy-diffusion-gemma", backend: "mlx",
|
|
37
|
+
graphAbi: "mlx-denoising-v1", stateAbi: "legacy-cache-array-v1", artifact: "legacy-resident-model" }),
|
|
38
|
+
vocabSize: model.config.text.vocabSize, canvasLength: model.canvasLength, embedScale: model.embedScale,
|
|
39
|
+
prefill: (ids, vision) => model.denoisingPrefill
|
|
40
|
+
? model.denoisingPrefill.find(range => ids.length >= range.from && ids.length <= range.to)!.operation(ids, vision ?? null)
|
|
41
|
+
: vision ? model.prefillVision!(ids, vision) : model.prefill!(ids),
|
|
42
|
+
extendPrefill: (tokens,state) => model.denoisingAppend
|
|
43
|
+
? model.denoisingAppend.find(range=>tokens.size>=range.from && tokens.size<=range.to)!.operation(tokens,state)
|
|
44
|
+
: model.extendPrefill(tokens,state),
|
|
45
|
+
decoderLogits: (canvas,state,feedback) => model.denoisingDecode
|
|
46
|
+
? model.denoisingDecode.find(range=>canvas.size>=range.from && canvas.size<=range.to)!.operation(canvas,state,feedback)
|
|
47
|
+
: model.decoderLogits(canvas,state,feedback),
|
|
48
|
+
dequantEmbedWeight: model.dequantEmbedWeight.bind(model),
|
|
49
|
+
softEmbeddings: model.softEmbeddings.bind(model),
|
|
50
|
+
closeState: disposeResources,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function assertMlxDenoisingGraph<State>(graph: DenoisingGraph<MlxArray, State>): void {
|
|
56
|
+
const descriptor = graph.descriptor;
|
|
57
|
+
if (descriptor.backend !== "mlx" || descriptor.graphAbi !== "mlx-denoising-v1" ||
|
|
58
|
+
!descriptor.stateAbi)
|
|
59
|
+
throw new Error(`denoising graph ${descriptor.id} has an incompatible backend, graph, or state ABI`);
|
|
60
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ModelConfig } from "../../artifacts/config";
|
|
2
|
+
import type { GraphDeclaration } from "../../contracts/portable/graph";
|
|
3
|
+
import { declaredGraph } from "../../models/capabilities";
|
|
4
|
+
import type { PrefillPolicy } from "../../contracts/portable/prefill";
|
|
5
|
+
import { sdpaFallbackBytes } from "../../state/kv-scheme";
|
|
6
|
+
import type { RuntimeConfig } from "../../runtime/config";
|
|
7
|
+
|
|
8
|
+
/** The graph facts prefill sizing reads: its geometry and its declaration. */
|
|
9
|
+
export interface PrefillSizedGraph {
|
|
10
|
+
readonly config: ModelConfig;
|
|
11
|
+
readonly graphCapabilities: GraphDeclaration;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Retain large chunks for short prompts, but where the graph declares a
|
|
15
|
+
* bounded prefill workspace, bound the materialized attention score workspace
|
|
16
|
+
* at long context. This changes work size, never request admission. Explicit
|
|
17
|
+
* chunk settings remain exact. */
|
|
18
|
+
export function resolveMlxPrefillPolicy(graph: PrefillSizedGraph, runtime: RuntimeConfig,
|
|
19
|
+
override?: number): PrefillPolicy {
|
|
20
|
+
const explicit = override ?? (runtime.value("MLX_BUN_RD_PREFILL_CHUNK") === undefined
|
|
21
|
+
? undefined : runtime.number("MLX_BUN_RD_PREFILL_CHUNK", 2048));
|
|
22
|
+
if (explicit !== undefined) {
|
|
23
|
+
const chunk = Math.max(1, Math.floor(explicit));
|
|
24
|
+
return { chunkSize: () => chunk };
|
|
25
|
+
}
|
|
26
|
+
if (!declaredGraph(graph).graphCapabilities.prefill.boundedWorkspace) return { chunkSize: () => 2048 };
|
|
27
|
+
const config = graph.config;
|
|
28
|
+
// Capture geometry now, independently of later configuration mutation.
|
|
29
|
+
const geometry = { ...config, text: { ...config.text, layerTypes: [...(config.text.layerTypes ?? [])] } };
|
|
30
|
+
const workspaceBytes = 1024 ** 3;
|
|
31
|
+
return { chunkSize(promptTokens) {
|
|
32
|
+
let chunk = 2048;
|
|
33
|
+
while (chunk > 8 && sdpaFallbackBytes(geometry, chunk, promptTokens) > workspaceBytes) chunk /= 2;
|
|
34
|
+
return chunk;
|
|
35
|
+
} };
|
|
36
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { GenerateOptions } from "./types";
|
|
2
|
+
import type { ResolvedExecution } from "../contracts/portable/execution";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
|
|
5
|
+
/** Sort object fields only; array order is meaningful for adapter composition,
|
|
6
|
+
* stop handling and quantization recipes. */
|
|
7
|
+
function canonical(value: unknown): unknown {
|
|
8
|
+
if (Array.isArray(value)) return value.map(canonical);
|
|
9
|
+
if (value && typeof value === "object")
|
|
10
|
+
return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))
|
|
11
|
+
.map(([key, item]) => [key, canonical(item)]));
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Stable identity for an exactly resumable generation. The prompt already
|
|
16
|
+
* includes rendered messages and tool schemas; the remaining fields cover
|
|
17
|
+
* every sampling policy that can change the continuation. The KV scheme is
|
|
18
|
+
* the composition's: the store holding the checkpoint is keyed by it. */
|
|
19
|
+
export function generationCheckpointKey(
|
|
20
|
+
promptIds: number[], options: GenerateOptions & { stopSequences?: readonly string[] }, cacheNs = "",
|
|
21
|
+
execution?: ResolvedExecution, bindingIdentity?: unknown,
|
|
22
|
+
): string {
|
|
23
|
+
const policy = {
|
|
24
|
+
version: 5,
|
|
25
|
+
execution: execution && { method: execution.method, mechanism: execution.mechanism,
|
|
26
|
+
fill: execution.fill,
|
|
27
|
+
compiledDecode: execution.compiledDecode, grammarJump: execution.grammarJump },
|
|
28
|
+
bindingIdentity,
|
|
29
|
+
stopSequences: options.stopSequences ?? [],
|
|
30
|
+
cacheNs,
|
|
31
|
+
promptIds,
|
|
32
|
+
maxTokens: options.maxTokens,
|
|
33
|
+
eosTokenIds: options.eosTokenIds,
|
|
34
|
+
temperature: options.temperature,
|
|
35
|
+
topP: options.topP,
|
|
36
|
+
topK: options.topK,
|
|
37
|
+
minP: options.minP,
|
|
38
|
+
minTokensToKeep: options.minTokensToKeep,
|
|
39
|
+
xtcProbability: options.xtcProbability,
|
|
40
|
+
xtcThreshold: options.xtcThreshold,
|
|
41
|
+
xtcSpecialTokens: options.xtcSpecialTokens,
|
|
42
|
+
// A missing client seed means "fresh randomness" for a new request, but
|
|
43
|
+
// an identical RETRY must find the durable checkpoint and restore the
|
|
44
|
+
// original random stream. Keep the generated seed out of request identity;
|
|
45
|
+
// it travels in checkpoint metadata instead. Explicit seeds remain part of
|
|
46
|
+
// the policy, so changing one cannot select an incompatible checkpoint.
|
|
47
|
+
seedMode: options.seedWasExplicit ? "explicit" : "server-default",
|
|
48
|
+
seed: options.seedWasExplicit ? options.seed : undefined,
|
|
49
|
+
hlg: options.hlg,
|
|
50
|
+
curve: options.curve,
|
|
51
|
+
logitBias: options.logitBias,
|
|
52
|
+
repetitionPenalty: options.repetitionPenalty,
|
|
53
|
+
repetitionContextSize: options.repetitionContextSize,
|
|
54
|
+
presencePenalty: options.presencePenalty,
|
|
55
|
+
presenceContextSize: options.presenceContextSize,
|
|
56
|
+
frequencyPenalty: options.frequencyPenalty,
|
|
57
|
+
frequencyContextSize: options.frequencyContextSize,
|
|
58
|
+
};
|
|
59
|
+
return createHash("sha256").update(JSON.stringify(canonical(policy))).digest("hex");
|
|
60
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Denoising generation: adapts a non-autoregressive denoising graph to the
|
|
2
|
+
// Generation contract. The denoising engine runs its own prefill and canvas
|
|
3
|
+
// loop to completion (`denoiseAsync`); only then are the finished canvas's
|
|
4
|
+
// tokens yielded one by one, so nothing streams while it runs. There is no
|
|
5
|
+
// chunked prefill, decode pipelining or early token-zero yield here (those are
|
|
6
|
+
// the autoregressive path), and prefill/cache stats are zero.
|
|
7
|
+
|
|
8
|
+
import { runtimeConfig } from "../runtime/config";
|
|
9
|
+
import { type MlxDenoisingBinding } from "./bindings/denoising";
|
|
10
|
+
import { adapterScoped,modelNeedsWiredLimit,usageScoped,wiredScoped } from "./scopes";
|
|
11
|
+
import { denoiseAsync, type DiffusionGenOptions } from "./diffusion";
|
|
12
|
+
import { Generation } from "./result";
|
|
13
|
+
import { GenerateOptions,GenerateStats,GeneratedToken } from "./types";
|
|
14
|
+
|
|
15
|
+
/** Denoising bindings use their own state and feedback graph. Each request
|
|
16
|
+
* draws from its own key sequence; callers still serialize model access. */
|
|
17
|
+
export function generateDenoising<State>(
|
|
18
|
+
binding: MlxDenoisingBinding<State>, promptTokens: number[], options: GenerateOptions = {},
|
|
19
|
+
): Generation {
|
|
20
|
+
let inner = generateDiffusionInner(binding, promptTokens, options);
|
|
21
|
+
if (options.adapters?.length && binding.adapters)
|
|
22
|
+
inner = adapterScoped({ loraState: binding.adapters }, options.adapters, inner);
|
|
23
|
+
if (binding.memory.expertRuntime?.finishUsage || binding.memory.expertRuntime?.flushUsage)
|
|
24
|
+
inner = usageScoped(binding.memory, inner);
|
|
25
|
+
const runtime = binding.runtime ?? runtimeConfig();
|
|
26
|
+
return new Generation(modelNeedsWiredLimit(binding.memory, undefined,
|
|
27
|
+
runtime.value("MLX_BUN_FORCE_WIRE") === "1") ? wiredScoped(inner) : inner, runtime);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** The served denoising request: greedy confidence-threshold, a fresh canvas
|
|
31
|
+
* seed unless the caller pins one, the checkpoint's stopping set {1, 106}
|
|
32
|
+
* united with any caller EOS, and 256 tokens unless the caller sets a limit. */
|
|
33
|
+
export function denoisingRequestOptions(options: GenerateOptions): DiffusionGenOptions {
|
|
34
|
+
const seed =
|
|
35
|
+
options.seed !== undefined
|
|
36
|
+
? BigInt(options.seed)
|
|
37
|
+
: BigInt(Math.floor(Math.random() * 0x7fffffff));
|
|
38
|
+
return {
|
|
39
|
+
maxTokens: options.maxTokens ?? 256,
|
|
40
|
+
sampler: "confidence-threshold",
|
|
41
|
+
temperature: 0,
|
|
42
|
+
eosTokenIds: [...new Set([1, 106, ...(options.eosTokenIds ?? [])])],
|
|
43
|
+
seed,
|
|
44
|
+
visionPixels: options.visionPixels,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Non-autoregressive diffusion generation, adapted to the AR Generation
|
|
49
|
+
* contract. Runs the denoising engine (its own prefill + canvas loop) and
|
|
50
|
+
* streams the emitted tokens. v1: greedy (temperature 0, confidence-threshold
|
|
51
|
+
* sampler — the OptiQ default); per-block intra-stream + temperature>0
|
|
52
|
+
* (categorical) are follow-ups. */
|
|
53
|
+
async function* generateDiffusionInner<State>(
|
|
54
|
+
binding: MlxDenoisingBinding<State>,
|
|
55
|
+
promptTokens: number[],
|
|
56
|
+
options: GenerateOptions,
|
|
57
|
+
): AsyncGenerator<GeneratedToken, GenerateStats> {
|
|
58
|
+
options.signal?.throwIfAborted();
|
|
59
|
+
const t0 = performance.now();
|
|
60
|
+
const result = await denoiseAsync(binding.graph, promptTokens, denoisingRequestOptions(options), options.signal);
|
|
61
|
+
const decodeMs = performance.now() - t0;
|
|
62
|
+
let index = 0;
|
|
63
|
+
let failure: { error: unknown } | undefined;
|
|
64
|
+
try {
|
|
65
|
+
for (const token of result.tokens) {
|
|
66
|
+
options.signal?.throwIfAborted();
|
|
67
|
+
yield { token, index: index++ };
|
|
68
|
+
}
|
|
69
|
+
} catch (error) { failure = { error }; }
|
|
70
|
+
finally {
|
|
71
|
+
// A stop parser may close delivery before the finished canvas is exhausted.
|
|
72
|
+
// Settle the emitted count on return(), without suppressing cancellation/errors.
|
|
73
|
+
if (failure) throw failure.error;
|
|
74
|
+
return {
|
|
75
|
+
promptTokens: promptTokens.length,
|
|
76
|
+
cachedTokens: 0,
|
|
77
|
+
generatedTokens: index,
|
|
78
|
+
prefillTps: 0,
|
|
79
|
+
decodeTps: index / Math.max(decodeMs / 1000, 1e-9),
|
|
80
|
+
prefillMs: 0,
|
|
81
|
+
decodeMs,
|
|
82
|
+
cacheTokens: [],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|