@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,146 @@
|
|
|
1
|
+
import { MlxArray } from "@mlx-bun/mlx/array";
|
|
2
|
+
import * as ops from "@mlx-bun/mlx/ops";
|
|
3
|
+
import { MetalKernel } from "@mlx-bun/mlx/metal-kernel";
|
|
4
|
+
import { Dtype } from "@mlx-bun/mlx/ffi";
|
|
5
|
+
import type { TrellisWeights } from "./geometry";
|
|
6
|
+
import { HEADER, lutFor, decoderVariant } from "./codebook";
|
|
7
|
+
import { TRELLIS_THREADS, TRELLIS_SG_PER_TG } from "./launch";
|
|
8
|
+
|
|
9
|
+
import { TRELLIS_MATVEC_MAX_M as MATVEC_MAX_M } from "./reduce";
|
|
10
|
+
|
|
11
|
+
const MIXED_GATEUP_SOURCE = String.raw`
|
|
12
|
+
threadgroup float lutTG[4096];
|
|
13
|
+
if ((VARIANT) == 2) {
|
|
14
|
+
for (uint i = thread_position_in_threadgroup.x; i < 4096u; i += ${TRELLIS_THREADS}u) lutTG[i] = lut[i];
|
|
15
|
+
threadgroup_barrier(metal::mem_flags::mem_threadgroup);
|
|
16
|
+
}
|
|
17
|
+
const uint lane = thread_index_in_simdgroup;
|
|
18
|
+
const uint sg = simdgroup_index_in_threadgroup;
|
|
19
|
+
const uint row = thread_position_in_grid.y * (uint)ROWS_TG + sg;
|
|
20
|
+
if (row >= (uint)R) return;
|
|
21
|
+
const uint gWpb = (uint)(BT * KG / 32);
|
|
22
|
+
const uint uWpb = (uint)(BT * KU / 32);
|
|
23
|
+
const uint runsPerBlock = (uint)BT / 32u;
|
|
24
|
+
const uint nRuns = (uint)C / 32u;
|
|
25
|
+
const device uint32_t* gRow = gcodes + (ulong)row * (ulong)((C / BT) * gWpb);
|
|
26
|
+
const device uint32_t* uRow = ucodes + (ulong)row * (ulong)((C / BT) * uWpb);
|
|
27
|
+
const float gScale = float(gscales[row]);
|
|
28
|
+
const float uScale = float(uscales[row]);
|
|
29
|
+
float gAcc[M], gAcc2[M], uAcc[M], uAcc2[M];
|
|
30
|
+
#pragma clang loop unroll(full)
|
|
31
|
+
for (uint m = 0; m < (uint)M; ++m) {
|
|
32
|
+
gAcc[m] = 0.0f; gAcc2[m] = 0.0f; uAcc[m] = 0.0f; uAcc2[m] = 0.0f;
|
|
33
|
+
}
|
|
34
|
+
for (uint run = lane; run < nRuns; run += 32u) {
|
|
35
|
+
const uint blk = run / runsPerBlock;
|
|
36
|
+
const uint t0 = (run - blk * runsPerBlock) * 32u;
|
|
37
|
+
const device uint32_t* gw = gRow + blk * gWpb;
|
|
38
|
+
const device uint32_t* uw = uRow + blk * uWpb;
|
|
39
|
+
const uint gW0 = ((uint)BT - 32u - t0) * (uint)KG / 32u;
|
|
40
|
+
const uint uW0 = ((uint)BT - 32u - t0) * (uint)KU / 32u;
|
|
41
|
+
uint g[KG + 1];
|
|
42
|
+
uint u[KU + 1];
|
|
43
|
+
#pragma clang loop unroll(full)
|
|
44
|
+
for (uint i = 0; i <= (uint)KG; ++i) {
|
|
45
|
+
const uint wi = gW0 + i;
|
|
46
|
+
g[i] = gw[wi >= gWpb ? wi - gWpb : wi];
|
|
47
|
+
}
|
|
48
|
+
#pragma clang loop unroll(full)
|
|
49
|
+
for (uint i = 0; i <= (uint)KU; ++i) {
|
|
50
|
+
const uint wi = uW0 + i;
|
|
51
|
+
u[i] = uw[wi >= uWpb ? wi - uWpb : wi];
|
|
52
|
+
}
|
|
53
|
+
const uint c0 = blk * (uint)BT + t0;
|
|
54
|
+
#pragma clang loop unroll(full)
|
|
55
|
+
for (uint j4 = 0; j4 < 8u; ++j4) {
|
|
56
|
+
float4 xv4[M];
|
|
57
|
+
#pragma clang loop unroll(full)
|
|
58
|
+
for (uint m = 0; m < (uint)M; ++m)
|
|
59
|
+
xv4[m] = float4(((const device metal::vec<T, 4>*)(x + (ulong)m * (ulong)C + c0))[j4]);
|
|
60
|
+
#pragma clang loop unroll(full)
|
|
61
|
+
for (uint q = 0; q < 4u; ++q) {
|
|
62
|
+
const uint j = j4 * 4u + q;
|
|
63
|
+
const uint gb = (31u - j) * (uint)KG;
|
|
64
|
+
const uint ub = (31u - j) * (uint)KU;
|
|
65
|
+
const uint gwi = gb >> 5, goff = gb & 31u;
|
|
66
|
+
const uint uwi = ub >> 5, uoff = ub & 31u;
|
|
67
|
+
uint gwin = g[gwi] >> goff;
|
|
68
|
+
uint uwin = u[uwi] >> uoff;
|
|
69
|
+
if (goff + (uint)L > 32u) gwin |= g[gwi + 1] << (32u - goff);
|
|
70
|
+
if (uoff + (uint)L > 32u) uwin |= u[uwi + 1] << (32u - uoff);
|
|
71
|
+
gwin &= (1u << (uint)L) - 1u;
|
|
72
|
+
uwin &= (1u << (uint)L) - 1u;
|
|
73
|
+
const float gv = TRELLIS_ROUND((BITS_Y ? trellis_unrefined_bits_y(trellis_y(gwin)) : TRELLIS_DECODE(gwin, lutTG, lut)) * gScale);
|
|
74
|
+
const float uv = TRELLIS_ROUND((BITS_Y ? trellis_unrefined_bits_y(trellis_y(uwin)) : TRELLIS_DECODE(uwin, lutTG, lut)) * uScale);
|
|
75
|
+
#pragma clang loop unroll(full)
|
|
76
|
+
for (uint m = 0; m < (uint)M; ++m) {
|
|
77
|
+
const float xv = xv4[m][q];
|
|
78
|
+
if (q & 1u) { gAcc2[m] = metal::fma(gv, xv, gAcc2[m]); uAcc2[m] = metal::fma(uv, xv, uAcc2[m]); }
|
|
79
|
+
else { gAcc[m] = metal::fma(gv, xv, gAcc[m]); uAcc[m] = metal::fma(uv, xv, uAcc[m]); }
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
#pragma clang loop unroll(full)
|
|
85
|
+
for (uint m = 0; m < (uint)M; ++m) {
|
|
86
|
+
const float gate = metal::simd_sum(gAcc[m] + gAcc2[m]);
|
|
87
|
+
const float up = metal::simd_sum(uAcc[m] + uAcc2[m]);
|
|
88
|
+
if (lane == 0u) {
|
|
89
|
+
const T gateT = T(gate);
|
|
90
|
+
const T upT = T(up);
|
|
91
|
+
if ((TAIL) == 1) {
|
|
92
|
+
const T sigY = 1 / (1 + metal::exp(metal::abs(gateT)));
|
|
93
|
+
const T sigmoidT = (gateT < 0) ? sigY : 1 - sigY;
|
|
94
|
+
const T siluT = gateT * sigmoidT;
|
|
95
|
+
mid[(ulong)m * (ulong)R + row] = siluT * upT;
|
|
96
|
+
} else {
|
|
97
|
+
const T sigmoidT = T(1.0f / (1.0f + metal::precise::exp(-float(gateT))));
|
|
98
|
+
const T siluT = T(float(gateT) * float(sigmoidT));
|
|
99
|
+
mid[(ulong)m * (ulong)R + row] = T(float(siluT) * float(upT));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
`;
|
|
104
|
+
|
|
105
|
+
let mixedGateUp: MetalKernel | null = null;
|
|
106
|
+
function mixedGateUpKernel(): MetalKernel {
|
|
107
|
+
return mixedGateUp ??= new MetalKernel({
|
|
108
|
+
name: "mlx_bun_trellis_gateup_mixed_k",
|
|
109
|
+
inputNames: ["x", "gcodes", "gscales", "ucodes", "uscales", "lut"],
|
|
110
|
+
outputNames: ["mid"], source: MIXED_GATEUP_SOURCE, header: HEADER, ensureRowContiguous: true,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/** Which SwiGLU arithmetic the mixed kernel reproduces: `"split"` is MLX's compiled
|
|
114
|
+
* swiglu over the two bf16 projections (bit-identical to gate.forward + up.forward +
|
|
115
|
+
* compiledSwiglu); `"fused"` is fusedGateUpSwiglu's float32 sigmoid. */
|
|
116
|
+
export type MixedGateUpTail = "split" | "fused";
|
|
117
|
+
|
|
118
|
+
/** silu(gate(x)) * up(x) for M <= 4 rows in one kernel when gate and up are coded
|
|
119
|
+
* at different k. Same lanes, accumulation order and bf16 SwiGLU boundaries as
|
|
120
|
+
* fusedGateUpSwiglu; each projection keeps its own word layout. `exactBits`
|
|
121
|
+
* applies at the qualified single-row bf16 geometry, where the decoder builds
|
|
122
|
+
* its value from exact float32 bits: layers pass the choice they resolved at
|
|
123
|
+
* construction (`qualifiedRepresentations`), benches and tests the one they compare. */
|
|
124
|
+
export function fusedGateUpSwigluMixed(x: MlxArray, gate: TrellisWeights, up: TrellisWeights, selected: number,
|
|
125
|
+
tail: MixedGateUpTail, exactBits: boolean): MlxArray {
|
|
126
|
+
const g = gate.geometry, u = up.geometry;
|
|
127
|
+
const lead = x.shape.slice(0, -1);
|
|
128
|
+
const M = lead.reduce((a, b) => a * b, 1);
|
|
129
|
+
if (M > MATVEC_MAX_M) throw new Error(`fusedGateUpSwigluMixed: M=${M} > ${MATVEC_MAX_M}`);
|
|
130
|
+
const bitsY = selected === 13 && M === 1 && x.dtype === Dtype.bfloat16 &&
|
|
131
|
+
g.T === 256 && g.L === 12 && g.rows === 17408 && g.cols === 5120 &&
|
|
132
|
+
[2, 3, 4].includes(g.k) && [2, 3, 4].includes(u.k) && exactBits;
|
|
133
|
+
const x2 = ops.reshape(x, [M, g.inFeatures]);
|
|
134
|
+
const [mid] = mixedGateUpKernel().apply([x2, gate.codes, gate.scales, up.codes, up.scales, lutFor(g.L)], {
|
|
135
|
+
outputs: [{ shape: [M, g.rows], dtype: x.dtype }],
|
|
136
|
+
grid: [TRELLIS_THREADS, Math.ceil(g.rows / TRELLIS_SG_PER_TG), 1],
|
|
137
|
+
threadGroup: [TRELLIS_THREADS, 1, 1],
|
|
138
|
+
templateDtypes: { T: x.dtype },
|
|
139
|
+
templateInts: { M, R: g.rows, C: g.cols, BT: g.T, KG: g.k, KU: u.k, L: g.L, ROWS_TG: TRELLIS_SG_PER_TG,
|
|
140
|
+
VARIANT: decoderVariant(selected), TAIL: tail === "split" ? 1 : 0, BITS_Y: Number(bitsY) },
|
|
141
|
+
});
|
|
142
|
+
x2.dispose();
|
|
143
|
+
const out = ops.reshape(mid!, [...lead, g.rows]);
|
|
144
|
+
mid!.dispose();
|
|
145
|
+
return out;
|
|
146
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Single-row down representations at the qualified geometry (`scatterBitsEligible`). */
|
|
2
|
+
export interface ScatterRepresentation {
|
|
3
|
+
/** Balanced 3-bit decoder value from exact float32 bits. */
|
|
4
|
+
bits: boolean;
|
|
5
|
+
/** The same for 2/4-bit codes. */
|
|
6
|
+
genericBits: boolean;
|
|
7
|
+
/** Generated float32 threadgroup codebook. */
|
|
8
|
+
floatCodebook: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** What the Trellis kernels take from the GPU family, as explicit arguments.
|
|
12
|
+
* The single-row representations were measured on the Qwen MLP geometry
|
|
13
|
+
* (bf16, variant 13); each keeps output bits and is a speed choice. */
|
|
14
|
+
export interface TrellisRepresentations {
|
|
15
|
+
/** Threadgroup codebook in the same-width gate/up decode. */
|
|
16
|
+
gateUpCodebook: boolean;
|
|
17
|
+
/** Exact float32 bits in the mixed-width gate/up decoder. */
|
|
18
|
+
mixedExactBits: boolean;
|
|
19
|
+
scatter: ScatterRepresentation;
|
|
20
|
+
/** The bundled runtime reduces M=5..15 matmuls with GemvWide on this GPU, so
|
|
21
|
+
* wide prefill matches it there and tiled prefill steps aside. */
|
|
22
|
+
widePrefill: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** The choices qualified on `architecture`: the single-row representations on
|
|
26
|
+
* `applegpu_g13s` only, wide prefill on GPU family 15 (M3) and newer. A layer
|
|
27
|
+
* resolves this once, when it is constructed, and passes the stored result to
|
|
28
|
+
* the kernels on every call. */
|
|
29
|
+
export function qualifiedRepresentations(architecture: string): TrellisRepresentations {
|
|
30
|
+
const qualified = architecture === "applegpu_g13s";
|
|
31
|
+
return { gateUpCodebook: qualified, mixedExactBits: qualified,
|
|
32
|
+
scatter: { bits: qualified, genericBits: qualified, floatCodebook: qualified },
|
|
33
|
+
widePrefill: Number(/^applegpu_[a-z](\d{2})/.exec(architecture)?.[1] ?? 0) >= 15 };
|
|
34
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { MlxArray } from "@mlx-bun/mlx/array";
|
|
2
|
+
import { MetalKernel } from "@mlx-bun/mlx/metal-kernel";
|
|
3
|
+
import type { TrellisGeometry } from "./geometry";
|
|
4
|
+
import { HEADER, lutFor, decoderVariant } from "./codebook";
|
|
5
|
+
import { TRELLIS_THREADS, TRELLIS_SG_PER_TG } from "./launch";
|
|
6
|
+
|
|
7
|
+
export const TRELLIS_MATVEC_MAX_M = 4;
|
|
8
|
+
|
|
9
|
+
const REDUCE_SOURCE = String.raw`
|
|
10
|
+
threadgroup float lutTG[4096];
|
|
11
|
+
if ((VARIANT) == 2) {
|
|
12
|
+
for (uint i = thread_position_in_threadgroup.x; i < 4096u; i += ${TRELLIS_THREADS}u) lutTG[i] = lut[i];
|
|
13
|
+
threadgroup_barrier(metal::mem_flags::mem_threadgroup);
|
|
14
|
+
}
|
|
15
|
+
const uint lane = thread_index_in_simdgroup;
|
|
16
|
+
const uint sg = simdgroup_index_in_threadgroup;
|
|
17
|
+
const uint row = thread_position_in_grid.y * (uint)ROWS_TG + sg;
|
|
18
|
+
const uint sample = thread_position_in_grid.z;
|
|
19
|
+
if (row >= (uint)R || sample >= (uint)M) return;
|
|
20
|
+
const uint wpb = (uint)(BT * K / 32);
|
|
21
|
+
const uint runsPerBlock = (uint)BT / 32u;
|
|
22
|
+
const uint nRuns = (uint)C / 32u;
|
|
23
|
+
const device uint32_t* codeRow = codes + (ulong)row * (ulong)((C / BT) * wpb);
|
|
24
|
+
const device T* xs = x + (ulong)sample * (ulong)C;
|
|
25
|
+
const float scale = float(scales[row]);
|
|
26
|
+
float acc = 0.0f, acc2 = 0.0f;
|
|
27
|
+
for (uint run = lane; run < nRuns; run += 32u) {
|
|
28
|
+
const uint blk = run / runsPerBlock;
|
|
29
|
+
const uint t0 = (run - blk * runsPerBlock) * 32u;
|
|
30
|
+
const device uint32_t* bw = codeRow + blk * wpb;
|
|
31
|
+
const uint w0 = ((uint)BT - 32u - t0) * (uint)K / 32u;
|
|
32
|
+
uint w[K + 1];
|
|
33
|
+
#pragma clang loop unroll(full)
|
|
34
|
+
for (uint i = 0; i <= (uint)K; ++i) {
|
|
35
|
+
const uint wi = w0 + i;
|
|
36
|
+
w[i] = bw[wi >= wpb ? wi - wpb : wi];
|
|
37
|
+
}
|
|
38
|
+
const uint c0 = blk * (uint)BT + t0;
|
|
39
|
+
const device metal::vec<T, 4>* x4 = (const device metal::vec<T, 4>*)(xs + c0);
|
|
40
|
+
#pragma clang loop unroll(full)
|
|
41
|
+
for (uint j4 = 0; j4 < 8u; ++j4) {
|
|
42
|
+
const float4 xv = float4(x4[j4]);
|
|
43
|
+
#pragma clang loop unroll(full)
|
|
44
|
+
for (uint q = 0; q < 4u; ++q) {
|
|
45
|
+
const uint j = j4 * 4u + q;
|
|
46
|
+
const uint b = (31u - j) * (uint)K;
|
|
47
|
+
const uint wi = b >> 5;
|
|
48
|
+
const uint off = b & 31u;
|
|
49
|
+
uint win = w[wi] >> off;
|
|
50
|
+
if (off + (uint)L > 32u) win |= w[wi + 1] << (32u - off);
|
|
51
|
+
win &= (1u << (uint)L) - 1u;
|
|
52
|
+
const float wv = TRELLIS_ROUND(TRELLIS_DECODE(win, lutTG, lut) * scale);
|
|
53
|
+
if (q & 1u) acc2 = metal::fma(wv, xv[q], acc2);
|
|
54
|
+
else acc = metal::fma(wv, xv[q], acc);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const float v = metal::simd_sum(acc + acc2);
|
|
59
|
+
if (lane == 0u) out[(ulong)sample * (ulong)R + row] = T(v);
|
|
60
|
+
`;
|
|
61
|
+
|
|
62
|
+
const REDUCE_SHARED_M_SOURCE = String.raw`
|
|
63
|
+
threadgroup float lutTG[4096];
|
|
64
|
+
if ((VARIANT) == 2) {
|
|
65
|
+
for (uint i = thread_position_in_threadgroup.x; i < 4096u; i += ${TRELLIS_THREADS}u) lutTG[i] = lut[i];
|
|
66
|
+
threadgroup_barrier(metal::mem_flags::mem_threadgroup);
|
|
67
|
+
}
|
|
68
|
+
const uint lane = thread_index_in_simdgroup;
|
|
69
|
+
const uint sg = simdgroup_index_in_threadgroup;
|
|
70
|
+
const uint row = thread_position_in_grid.y * (uint)ROWS_TG + sg;
|
|
71
|
+
const uint sample = 0u;
|
|
72
|
+
if (row >= (uint)R || sample >= (uint)M) return;
|
|
73
|
+
const uint wpb = (uint)(BT * K / 32);
|
|
74
|
+
const uint runsPerBlock = (uint)BT / 32u;
|
|
75
|
+
const uint nRuns = (uint)C / 32u;
|
|
76
|
+
const device uint32_t* codeRow = codes + (ulong)row * (ulong)((C / BT) * wpb);
|
|
77
|
+
const float scale = float(scales[row]);
|
|
78
|
+
float acc[M], acc2[M];
|
|
79
|
+
#pragma clang loop unroll(full)
|
|
80
|
+
for (uint m = 0; m < (uint)M; ++m) { acc[m] = 0.0f; acc2[m] = 0.0f; }
|
|
81
|
+
for (uint run = lane; run < nRuns; run += 32u) {
|
|
82
|
+
const uint blk = run / runsPerBlock;
|
|
83
|
+
const uint t0 = (run - blk * runsPerBlock) * 32u;
|
|
84
|
+
const device uint32_t* bw = codeRow + blk * wpb;
|
|
85
|
+
const uint w0 = ((uint)BT - 32u - t0) * (uint)K / 32u;
|
|
86
|
+
uint w[K + 1];
|
|
87
|
+
#pragma clang loop unroll(full)
|
|
88
|
+
for (uint i = 0; i <= (uint)K; ++i) {
|
|
89
|
+
const uint wi = w0 + i;
|
|
90
|
+
w[i] = bw[wi >= wpb ? wi - wpb : wi];
|
|
91
|
+
}
|
|
92
|
+
const uint c0 = blk * (uint)BT + t0;
|
|
93
|
+
#pragma clang loop unroll(full)
|
|
94
|
+
for (uint j4 = 0; j4 < 8u; ++j4) {
|
|
95
|
+
float4 xv[M];
|
|
96
|
+
#pragma clang loop unroll(full)
|
|
97
|
+
for (uint m = 0; m < (uint)M; ++m)
|
|
98
|
+
xv[m] = float4(((const device metal::vec<T, 4>*)(x + (ulong)m * (ulong)C + c0))[j4]);
|
|
99
|
+
#pragma clang loop unroll(full)
|
|
100
|
+
for (uint q = 0; q < 4u; ++q) {
|
|
101
|
+
const uint j = j4 * 4u + q;
|
|
102
|
+
const uint b = (31u - j) * (uint)K;
|
|
103
|
+
const uint wi = b >> 5;
|
|
104
|
+
const uint off = b & 31u;
|
|
105
|
+
uint win = w[wi] >> off;
|
|
106
|
+
if (off + (uint)L > 32u) win |= w[wi + 1] << (32u - off);
|
|
107
|
+
win &= (1u << (uint)L) - 1u;
|
|
108
|
+
const float wv = TRELLIS_ROUND(TRELLIS_DECODE(win, lutTG, lut) * scale);
|
|
109
|
+
#pragma clang loop unroll(full)
|
|
110
|
+
for (uint m = 0; m < (uint)M; ++m) {
|
|
111
|
+
if (q & 1u) acc2[m] = metal::fma(wv, xv[m][q], acc2[m]);
|
|
112
|
+
else acc[m] = metal::fma(wv, xv[m][q], acc[m]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
#pragma clang loop unroll(full)
|
|
118
|
+
for (uint m = 0; m < (uint)M; ++m) {
|
|
119
|
+
const float v = metal::simd_sum(acc[m] + acc2[m]);
|
|
120
|
+
if (lane == 0u) out[(ulong)m * (ulong)R + row] = T(v);
|
|
121
|
+
}
|
|
122
|
+
`;
|
|
123
|
+
|
|
124
|
+
let base: MetalKernel | undefined, shared: MetalKernel | undefined;
|
|
125
|
+
function reduceKernel(): MetalKernel {
|
|
126
|
+
return base ??= new MetalKernel({ name: "mlx_bun_trellis_reduce",
|
|
127
|
+
inputNames: ["x", "codes", "scales", "lut"], outputNames: ["out"],
|
|
128
|
+
source: REDUCE_SOURCE, header: HEADER, ensureRowContiguous: true });
|
|
129
|
+
}
|
|
130
|
+
function sharedKernel(): MetalKernel {
|
|
131
|
+
return shared ??= new MetalKernel({ name: "mlx_bun_trellis_reduce_shared_m",
|
|
132
|
+
inputNames: ["x", "codes", "scales", "lut"], outputNames: ["out"],
|
|
133
|
+
source: REDUCE_SHARED_M_SOURCE, header: HEADER, ensureRowContiguous: true });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Borrow [M, inFeatures] and axis-1 weights; return owned lazy [M, outFeatures].
|
|
137
|
+
* The caller selects a supported variant and limits M to 1..4. */
|
|
138
|
+
export function trellisReduce(x2: MlxArray, codes: MlxArray, scales: MlxArray, g: TrellisGeometry, selected: number): MlxArray {
|
|
139
|
+
const M = x2.shape[0]!;
|
|
140
|
+
const shared = selected >= 7 && selected <= 13 && M > 1;
|
|
141
|
+
const kernel = shared ? sharedKernel() : reduceKernel();
|
|
142
|
+
const [out] = kernel.apply([x2, codes, scales, lutFor(g.L)], {
|
|
143
|
+
outputs: [{ shape: [M, g.rows], dtype: x2.dtype }],
|
|
144
|
+
grid: [TRELLIS_THREADS, Math.ceil(g.rows / TRELLIS_SG_PER_TG), shared ? 1 : M],
|
|
145
|
+
threadGroup: [TRELLIS_THREADS, 1, 1],
|
|
146
|
+
templateDtypes: { T: x2.dtype },
|
|
147
|
+
templateInts: { M, R: g.rows, C: g.cols, BT: g.T, K: g.k, L: g.L, ROWS_TG: TRELLIS_SG_PER_TG, VARIANT: decoderVariant(selected) },
|
|
148
|
+
});
|
|
149
|
+
return out!;
|
|
150
|
+
}
|