@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,44 @@
|
|
|
1
|
+
import type { Cache } from "../contracts/mlx/cache";
|
|
2
|
+
import type { MlxCacheLayer } from "../contracts/mlx/graph";
|
|
3
|
+
import type { Composition } from "../contracts/portable/composition";
|
|
4
|
+
import { AttentionMasks, foldedWindowRead, sdpaRead } from "../state/attention-read";
|
|
5
|
+
import { Bf16FirstKv4Head256Cache, composedFullAttentionCache, composedSlidingAttentionCache } from "../state/bf16-first-kv";
|
|
6
|
+
import { composedAffineKernels } from "../state/affine-attention";
|
|
7
|
+
import { SSMCache } from "../state/ssm";
|
|
8
|
+
import { composedLatentCache, latentLegoCodecs } from "../state/latent-legos";
|
|
9
|
+
import { maybePageKv } from "../state/request-policy";
|
|
10
|
+
import { disposeResources } from "../runtime/resources";
|
|
11
|
+
import { denseTurboQuantKernels, deferredTurboQuantKernels } from "../state/turboquant-attention";
|
|
12
|
+
|
|
13
|
+
/** The loader composes a request's cache legos from the file's declaration. */
|
|
14
|
+
export function composeGraphCaches(graph: { readonly cacheLayers: readonly MlxCacheLayer[]; readonly cachePaging?: boolean },
|
|
15
|
+
composition: {readonly kv: Composition["kv"]; readonly pagedKv: {readonly blockSize: number; readonly direct?: boolean} | null}): Cache[] {
|
|
16
|
+
const masks = new AttentionMasks();
|
|
17
|
+
const { kv, pagedKv } = composition;
|
|
18
|
+
const caches = graph.cacheLayers.map((layer, index) => {
|
|
19
|
+
switch (layer.kind) {
|
|
20
|
+
case "recurrent": return new SSMCache();
|
|
21
|
+
case "sliding": return composedSlidingAttentionCache(kv, index, layer.window, masks);
|
|
22
|
+
case "latent": return composedLatentCache(kv, pagedKv, index, layer.geometry);
|
|
23
|
+
case "full":
|
|
24
|
+
if (layer.kv4Head256 && kv.kind === "affine" && kv.bits === 4 && kv.groupSize === 64)
|
|
25
|
+
return new Bf16FirstKv4Head256Cache(kv.quantizedKvStart ?? 0, composedAffineKernels(kv.kernels), masks, layer.kv4DecodeBlock);
|
|
26
|
+
return composedFullAttentionCache(kv, index, masks,
|
|
27
|
+
layer.turboQuant === "deferred" ? deferredTurboQuantKernels : denseTurboQuantKernels,
|
|
28
|
+
layer.windowRead === "folded" ? foldedWindowRead : sdpaRead);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
if (graph.cachePaging) {
|
|
32
|
+
try { maybePageKv(caches, kv, pagedKv ? {...pagedKv,direct:pagedKv.direct??false} : null, pagedKv?.blockSize ?? 0); }
|
|
33
|
+
catch (error) { disposeResources(caches); throw error; }
|
|
34
|
+
}
|
|
35
|
+
return caches;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Bind request-state construction at load; the graph only declares layout. */
|
|
39
|
+
export function bindGraphCaches<Graph extends { readonly cacheLayers: readonly MlxCacheLayer[]; readonly cachePaging?: boolean }>(graph: Graph,
|
|
40
|
+
composition: {readonly kv: Composition["kv"]; readonly pagedKv: {readonly blockSize: number; readonly direct?: boolean} | null}): Graph & { makeCache(): Cache[]; readonly stateCodecs?: import("../state/persistence-types").CacheCodecProvider } {
|
|
41
|
+
return Object.assign(graph, { makeCache: () => composeGraphCaches(graph, composition),
|
|
42
|
+
...(graph.cacheLayers.some(layer => layer.kind === "latent") && (composition.kv.kind !== "bf16" || composition.pagedKv)
|
|
43
|
+
? { stateCodecs: latentLegoCodecs } : {}) });
|
|
44
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { GraphCapabilities, GraphDeclaration } from "../contracts/portable/graph";
|
|
2
|
+
import type { MlxCompiledDecodeStep, MlxDeclaredGraph, MlxTokenPhases } from "../contracts/mlx/graph";
|
|
3
|
+
import type { Composition } from "../contracts/portable/composition";
|
|
4
|
+
import type { CacheCodecProvider } from "../state/persistence-types";
|
|
5
|
+
|
|
6
|
+
type Declaration = Partial<Omit<GraphDeclaration, "prefill" | "speculation">> & {
|
|
7
|
+
readonly prefill?: Partial<GraphCapabilities["prefill"]>;
|
|
8
|
+
readonly speculation?: Partial<GraphCapabilities["speculation"]>;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/** Build a graph's declaration from the defaults an ordinary autoregressive
|
|
12
|
+
* graph has (batched and mountable adapters, verification qualified for every
|
|
13
|
+
* request shape, no media, no compiled step, unbounded prefill chunks)
|
|
14
|
+
* and what the graph does differently. */
|
|
15
|
+
export function declareGraph(declared: Declaration = {}): GraphDeclaration {
|
|
16
|
+
if ("embeddings" in declared)
|
|
17
|
+
throw new TypeError("pooled embedding support is declared by embedPooled, not an embeddings flag");
|
|
18
|
+
return Object.freeze({
|
|
19
|
+
method: "autoregressive", media: null, compiledDecode: false,
|
|
20
|
+
sparseAttention: false, hiddenLayerTaps: false, nativeDraft: null,
|
|
21
|
+
...declared,
|
|
22
|
+
prefill: Object.freeze({ boundedWorkspace: false, ...declared.prefill }),
|
|
23
|
+
speculation: Object.freeze({ adapters: true, logprobs: true, externalTokens: true, grammarProposals: true,
|
|
24
|
+
...declared.speculation }),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Verification qualified for ordinary rounds only: no adapters, logprobs,
|
|
29
|
+
* supplied external tokens or verified grammar proposals (a graph whose
|
|
30
|
+
* attention softcaps its scores). */
|
|
31
|
+
export const ORDINARY_VERIFICATION = Object.freeze({
|
|
32
|
+
adapters: false, logprobs: false, externalTokens: false, grammarProposals: false,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
/** A graph's declaration with the operations it promises, checked once where
|
|
36
|
+
* composition binds it. A graph that declares nothing is refused, never read as
|
|
37
|
+
* "no capabilities". */
|
|
38
|
+
export function declaredGraph(model: object): MlxDeclaredGraph {
|
|
39
|
+
const graph = model as Partial<MlxDeclaredGraph>;
|
|
40
|
+
const capabilities = graph.graphCapabilities;
|
|
41
|
+
if (!capabilities) throw new TypeError("the graph must declare its capabilities (graphCapabilities)");
|
|
42
|
+
if ("embeddings" in capabilities)
|
|
43
|
+
throw new TypeError("pooled embedding support is declared by embedPooled, not an embeddings flag");
|
|
44
|
+
if (graph.embedPooled !== undefined && typeof graph.embedPooled !== "function")
|
|
45
|
+
throw new TypeError("the graph's embedPooled operation must be a function");
|
|
46
|
+
const media = capabilities.media;
|
|
47
|
+
if (media && media.input !== "pixels" && typeof graph.bindMediaInput !== "function")
|
|
48
|
+
throw new TypeError(`the graph declares ${media.input} media input but provides no bindMediaInput`);
|
|
49
|
+
if (media?.input === "pixels" && typeof graph.pixelInput !== "function")
|
|
50
|
+
throw new TypeError("the graph declares pixel media input but provides no pixelInput");
|
|
51
|
+
return graph as MlxDeclaredGraph;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Describe a validated graph for portable consumers. Operation presence is
|
|
55
|
+
* the single source of pooled embedding support; retain the operation on the
|
|
56
|
+
* graph so invocation preserves its receiver and resource ownership. */
|
|
57
|
+
export function graphCapabilitiesOf(graph: MlxDeclaredGraph): GraphCapabilities {
|
|
58
|
+
return Object.freeze({ ...graph.graphCapabilities, embeddings: typeof graph.embedPooled === "function" });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The named token phases of a graph whose method is autoregressive, checked
|
|
62
|
+
* once where composition binds it; null for a denoising graph, whose canvas
|
|
63
|
+
* method runs none. An autoregressive graph without them is refused. */
|
|
64
|
+
export function tokenPhasesOf(model: object): MlxTokenPhases & { readonly composition?: Composition } | null {
|
|
65
|
+
const graph = declaredGraph(model);
|
|
66
|
+
if (graph.graphCapabilities.method !== "autoregressive") return null;
|
|
67
|
+
const phases = model as Partial<MlxTokenPhases>;
|
|
68
|
+
for (const name of ["prompt", "multiSequencePrompt", "decode", "verify", "appendKnown", "logits"] as const)
|
|
69
|
+
if (!phases[name]) throw new TypeError(`the graph declares the autoregressive method but provides no ${name} phase`);
|
|
70
|
+
return model as MlxTokenPhases & { readonly composition?: Composition };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** The compiled decode step of a graph that declares one, created on first use
|
|
74
|
+
* and kept by the graph; null for every other graph. A graph that promises a
|
|
75
|
+
* step and provides none is refused where composition binds it. */
|
|
76
|
+
export function compiledDecodeStepOf(model: object): MlxCompiledDecodeStep | null {
|
|
77
|
+
const graph = declaredGraph(model);
|
|
78
|
+
if (!graph.graphCapabilities.compiledDecode) return null;
|
|
79
|
+
if (typeof graph.compiledDecodeStep !== "function")
|
|
80
|
+
throw new TypeError("the graph declares a compiled decode step but provides no compiledDecodeStep");
|
|
81
|
+
return graph.compiledDecodeStep();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** The persistence codecs a graph's caches need beyond the default set (the
|
|
85
|
+
* graph's `stateCodecs`: GLM-5.2's under a quantized KV scheme or paging, whose
|
|
86
|
+
* latent legos the default codecs do not save); undefined: the default set. */
|
|
87
|
+
export function stateCodecsOf(model: object): CacheCodecProvider | undefined {
|
|
88
|
+
return (model as { readonly stateCodecs?: CacheCodecProvider }).stateCodecs;
|
|
89
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ChatTemplate } from "../input/chat-template";
|
|
2
|
+
import { chatTemplateFallbackFor, type ResolvedModelProfile } from "./profile";
|
|
3
|
+
|
|
4
|
+
/** Load the chat template of a resolved model: the artifact's own, else the
|
|
5
|
+
* renderer its profile declares for artifacts that ship none. */
|
|
6
|
+
export function loadModelChatTemplate(
|
|
7
|
+
modelDir: string, resolved: ResolvedModelProfile, options: { disableThinking?: boolean } = {},
|
|
8
|
+
): Promise<ChatTemplate> {
|
|
9
|
+
return ChatTemplate.load(modelDir, { ...options, fallback: chatTemplateFallbackFor(resolved) ?? undefined });
|
|
10
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// The one resolver of a composition record. The application calls it once per
|
|
2
|
+
// load, before the graph is built; the convenience load API calls it for
|
|
3
|
+
// callers that supply no record.
|
|
4
|
+
import { deviceArchitecture } from "@mlx-bun/mlx/ffi";
|
|
5
|
+
import type { ModelConfig, TurboQuantScheme } from "../artifacts/config";
|
|
6
|
+
import { COMPOSITION_DEFAULTS, type Composition } from "../contracts/portable/composition";
|
|
7
|
+
import { runtimeConfig, type RuntimeConfig } from "../runtime/config";
|
|
8
|
+
import { resolveKvScheme, type KvQuantOverride } from "../state/kv-scheme";
|
|
9
|
+
import { PagedKVCache } from "../state/paged/cache";
|
|
10
|
+
|
|
11
|
+
/** Rows per forward when the caller states no cap (the app's `--batch` default). */
|
|
12
|
+
export const DEFAULT_MAX_ROWS = 8;
|
|
13
|
+
/** The prefill chunk when `MLX_BUN_RD_PREFILL_CHUNK` is unset, the prefill
|
|
14
|
+
* policy's ceiling (`generation/bindings/prefill-policy.ts`). */
|
|
15
|
+
export const PREFILL_CHUNK_TOKENS = 2048;
|
|
16
|
+
|
|
17
|
+
/** The chunk the prefill policy starts from: its `MLX_BUN_RD_PREFILL_CHUNK`
|
|
18
|
+
* override, read through the runtime configuration exactly as it reads it
|
|
19
|
+
* (a set, non-numeric value counts as 2048), else {@link PREFILL_CHUNK_TOKENS}. */
|
|
20
|
+
function resolveChunkTokens(runtime: RuntimeConfig): number {
|
|
21
|
+
const explicit = runtime.value("MLX_BUN_RD_PREFILL_CHUNK") === undefined
|
|
22
|
+
? undefined : runtime.number("MLX_BUN_RD_PREFILL_CHUNK", 2048);
|
|
23
|
+
return explicit === undefined ? PREFILL_CHUNK_TOKENS : Math.max(1, Math.floor(explicit));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** What the caller decided; each absent value takes the default named on it. */
|
|
27
|
+
export interface CompositionRequest {
|
|
28
|
+
/** The KV flags: `--kv-quant` (`override`), its TurboQuant spelling,
|
|
29
|
+
* `--quantized-kv-start` and `--fused-sdpa` (the affine read kernels: on,
|
|
30
|
+
* tiled-causal; off, unfused; absent, by the scheme's kind). Absent: bf16.
|
|
31
|
+
* A `config` override reads the artifact's `kv_config.json` from the model
|
|
32
|
+
* config. */
|
|
33
|
+
readonly kv?: {
|
|
34
|
+
readonly override?: KvQuantOverride;
|
|
35
|
+
readonly turboQuant?: TurboQuantScheme;
|
|
36
|
+
readonly quantizedKvStart?: number;
|
|
37
|
+
readonly fusedSdpa?: boolean;
|
|
38
|
+
};
|
|
39
|
+
/** Paged KV (`--paged-kv`): full-attention storage in pages of `blockSize`
|
|
40
|
+
* positions (default 256), read by the direct kernel where `direct` (default
|
|
41
|
+
* false; see `PagedKvComposition`). Absent or null: unpaged. Pages store what
|
|
42
|
+
* the KV scheme names for each layer. */
|
|
43
|
+
readonly pagedKv?: { readonly blockSize?: number; readonly direct?: boolean } | null;
|
|
44
|
+
/** The loaded drafter's tokens per round, and whether the scheduler adapts
|
|
45
|
+
* each round's count up to it. Absent or null: no drafter. */
|
|
46
|
+
readonly draft?: { readonly numDraftTokens: number; readonly adaptive?: boolean } | null;
|
|
47
|
+
/** The most rows one forward carries. Default {@link DEFAULT_MAX_ROWS}. */
|
|
48
|
+
readonly maxRows?: number;
|
|
49
|
+
/** One argmax over a decode step whose live rows are all plain greedy. Default true. */
|
|
50
|
+
readonly vectorGreedySampling?: boolean;
|
|
51
|
+
/** One forward carries a decode group and a prefill group. Default false. */
|
|
52
|
+
readonly mixedPrefill?: boolean;
|
|
53
|
+
/** Prompt tokens a mixed forward carries beside its decode rows. Default 256. */
|
|
54
|
+
readonly mixedTokenBudget?: number;
|
|
55
|
+
/** A prompt's last token prefills alone, as the first one-position step. Default true. */
|
|
56
|
+
readonly prefillTailSplit?: boolean;
|
|
57
|
+
/** Grammar-forced continuations enter the KV without one forward per token. Default false. */
|
|
58
|
+
readonly grammarJump?: boolean;
|
|
59
|
+
/** Speculative rows draft by argmax. Default false. */
|
|
60
|
+
readonly greedyDraft?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Resolve the record for `config` on this machine. Reads the GPU architecture
|
|
64
|
+
* and the prefill chunk override from the current runtime configuration. The
|
|
65
|
+
* result is frozen. */
|
|
66
|
+
export function resolveComposition(config: ModelConfig, request: CompositionRequest = {}): Composition {
|
|
67
|
+
return compose(request, resolveKvScheme({ ...request.kv, config: config.kvQuant }).storage);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The record a load resolves on this machine without an artifact's config:
|
|
71
|
+
* `resolveComposition` with bf16 KV, which is what a load with no KV flag
|
|
72
|
+
* resolves. The install step compiles the Neural Engine programs of this record
|
|
73
|
+
* (`compileAnePrograms`), so it needs no downloaded model. Frozen. */
|
|
74
|
+
export function machineComposition(request: Omit<CompositionRequest, "kv"> = {}): Composition {
|
|
75
|
+
return compose(request, resolveKvScheme({}).storage);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function compose(request: Omit<CompositionRequest, "kv">, kv: Composition["kv"]): Composition {
|
|
79
|
+
const maxRows = request.maxRows ?? DEFAULT_MAX_ROWS;
|
|
80
|
+
if (!Number.isSafeInteger(maxRows) || maxRows < 1) throw new Error("composition maxRows must be a positive integer");
|
|
81
|
+
const draft = request.draft;
|
|
82
|
+
if (draft && (!Number.isSafeInteger(draft.numDraftTokens) || draft.numDraftTokens < 1))
|
|
83
|
+
throw new Error("composition draft tokens must be a positive integer");
|
|
84
|
+
const mixedTokenBudget = request.mixedTokenBudget ?? COMPOSITION_DEFAULTS.mixedTokenBudget;
|
|
85
|
+
if (!Number.isSafeInteger(mixedTokenBudget) || mixedTokenBudget < 1)
|
|
86
|
+
throw new Error("composition mixedTokenBudget must be a positive integer");
|
|
87
|
+
const pagedKv = request.pagedKv ? Object.freeze({ blockSize: request.pagedKv.blockSize ?? PagedKVCache.DEFAULT_BLOCK_SIZE,
|
|
88
|
+
direct: request.pagedKv.direct ?? false }) : null;
|
|
89
|
+
if (pagedKv && (!Number.isSafeInteger(pagedKv.blockSize) || pagedKv.blockSize < 1))
|
|
90
|
+
throw new Error("composition paged KV block size must be a positive integer");
|
|
91
|
+
const runtime = runtimeConfig();
|
|
92
|
+
return Object.freeze({
|
|
93
|
+
device: deviceArchitecture(),
|
|
94
|
+
kv,
|
|
95
|
+
pagedKv,
|
|
96
|
+
draftDepth: !draft ? 0 : draft.adaptive ? Object.freeze({ adaptive: true as const, max: draft.numDraftTokens }) : draft.numDraftTokens,
|
|
97
|
+
prefillChunkTokens: resolveChunkTokens(runtime),
|
|
98
|
+
maxRows,
|
|
99
|
+
vectorGreedySampling: request.vectorGreedySampling ?? COMPOSITION_DEFAULTS.vectorGreedySampling,
|
|
100
|
+
// The caches' declaration: direct pages have no compiled form.
|
|
101
|
+
mixedPrefill: request.mixedPrefill ?? COMPOSITION_DEFAULTS.mixedPrefill,
|
|
102
|
+
mixedTokenBudget,
|
|
103
|
+
prefillTailSplit: request.prefillTailSplit ?? COMPOSITION_DEFAULTS.prefillTailSplit,
|
|
104
|
+
grammarJump: request.grammarJump ?? COMPOSITION_DEFAULTS.grammarJump,
|
|
105
|
+
greedyDraft: request.greedyDraft ?? COMPOSITION_DEFAULTS.greedyDraft,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { MlxArray } from "@mlx-bun/mlx/array";
|
|
2
|
+
import * as ops from "@mlx-bun/mlx/ops";
|
|
3
|
+
import { CompiledGeglu } from "../../layers/geglu";
|
|
4
|
+
import type { QuantizedSwitchLinear } from "../../layers/quantized-switch-linear";
|
|
5
|
+
|
|
6
|
+
export interface DiffExpertWeights {
|
|
7
|
+
readonly gateUp: QuantizedSwitchLinear;
|
|
8
|
+
readonly down: QuantizedSwitchLinear;
|
|
9
|
+
readonly hiddenDims: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Fused gate/up experts in their original token order. */
|
|
13
|
+
export class UnsortedDiffExperts {
|
|
14
|
+
readonly activation = new CompiledGeglu();
|
|
15
|
+
constructor(readonly base: DiffExpertWeights) {}
|
|
16
|
+
forward(x: MlxArray, indices: MlxArray, weights: MlxArray): MlxArray {
|
|
17
|
+
using expanded = ops.expandDims(x,-2);
|
|
18
|
+
using h = ops.expandDims(expanded,-3);
|
|
19
|
+
using gateUp = this.base.gateUp.forward(h,indices,false);
|
|
20
|
+
const [gate,up] = ops.split(gateUp,[this.base.hiddenDims],-1);
|
|
21
|
+
using mid = this.activation.forward(gate!,up!);
|
|
22
|
+
using projected = this.base.down.forward(mid,indices,false);
|
|
23
|
+
const shape = projected.shape; shape.splice(shape.length-2,1);
|
|
24
|
+
using y = ops.reshape(projected,shape);
|
|
25
|
+
using w = ops.expandDims(weights,-1);
|
|
26
|
+
using weighted = ops.mul(y,w);
|
|
27
|
+
return ops.sumAxis(weighted,-2,false);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Expert-sorted rows and inverse permutation, bound by the graph. */
|
|
32
|
+
export class SortedDiffExperts {
|
|
33
|
+
readonly activation = new CompiledGeglu();
|
|
34
|
+
constructor(readonly base: DiffExpertWeights) {}
|
|
35
|
+
forward(x: MlxArray, indices: MlxArray, weights: MlxArray): MlxArray {
|
|
36
|
+
using expanded = ops.expandDims(x,-2);
|
|
37
|
+
using h = ops.expandDims(expanded,-3);
|
|
38
|
+
const k = indices.shape.at(-1)!;
|
|
39
|
+
using idxFlat = ops.reshape(indices,[indices.size]);
|
|
40
|
+
using order = ops.argsortAxis(idxFlat,0);
|
|
41
|
+
using inverse = ops.argsortAxis(order,0);
|
|
42
|
+
using kScalar = ops.scalarLike(k,order);
|
|
43
|
+
using rows = ops.floorDivide(order,kScalar);
|
|
44
|
+
using flat = ops.reshape(h,[-1,1,h.shape.at(-1)!]);
|
|
45
|
+
using sorted = ops.takeAxis(flat,rows,0);
|
|
46
|
+
using idx = ops.takeAxis(idxFlat,order,0);
|
|
47
|
+
using gateUp = this.base.gateUp.forward(sorted,idx,true);
|
|
48
|
+
const [gate,up] = ops.split(gateUp,[this.base.hiddenDims],-1);
|
|
49
|
+
using mid = this.activation.forward(gate!,up!);
|
|
50
|
+
using projected = this.base.down.forward(mid,idx,true);
|
|
51
|
+
using restored = ops.takeAxis(projected,inverse,0);
|
|
52
|
+
using unsorted = ops.reshape(restored,[...indices.shape,1,restored.shape.at(-1)!]);
|
|
53
|
+
const shape = unsorted.shape; shape.splice(shape.length-2,1);
|
|
54
|
+
using y = ops.reshape(unsorted,shape);
|
|
55
|
+
using w = ops.expandDims(weights,-1);
|
|
56
|
+
using weighted = ops.mul(y,w);
|
|
57
|
+
return ops.sumAxis(weighted,-2,false);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { L2, configuredMoe, defineFamily } from "../family";
|
|
2
|
+
import { GEMMA_MEDIA_TOKENS, GEMMA_TRAINING_DEFAULTS } from "../gemma4/family";
|
|
3
|
+
|
|
4
|
+
/** DiffusionGemma (model_type `diffusion_gemma`): block/masked-diffusion canvas
|
|
5
|
+
* model. Non-autoregressive, routed through the diffusion engine, not the AR loop. */
|
|
6
|
+
export const DIFFUSION_GEMMA_FAMILY = defineFamily({
|
|
7
|
+
graph: "diffusion-gemma",
|
|
8
|
+
accepts: config => config.modelType === "diffusion_gemma",
|
|
9
|
+
hasModelType: modelType => modelType === "diffusion_gemma",
|
|
10
|
+
tier: "targeted",
|
|
11
|
+
label: "diffusion_gemma",
|
|
12
|
+
loader: "safetensors",
|
|
13
|
+
loop: "diffusion",
|
|
14
|
+
fidelity: L2,
|
|
15
|
+
specialization: "dedicated",
|
|
16
|
+
profileId: "diffusion-gemma-dedicated",
|
|
17
|
+
capabilities: ["diffusion-gemma-graph"],
|
|
18
|
+
moe: configuredMoe,
|
|
19
|
+
trainingDefaults: GEMMA_TRAINING_DEFAULTS,
|
|
20
|
+
mediaTokens: GEMMA_MEDIA_TOKENS,
|
|
21
|
+
});
|