mlx-bun 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -21
- package/THIRD_PARTY_LICENSES.md +1 -0
- package/docs/archive/mlx-bun-lab-report.html +275 -0
- package/docs/archive/wwdc-mlx-bun.html +848 -0
- package/docs/design/audio-input-plan.md +356 -0
- package/docs/design/batching-perf-path.md +58 -35
- package/docs/design/batching-v2-plan.md +23 -9
- package/docs/design/bucketing-stage.md +2 -1
- package/docs/design/compat-cli-surface-design.md +4 -3
- package/docs/design/decode-speed-program.md +172 -0
- package/docs/design/docs-reorg-plan.md +1 -1
- package/docs/design/dspark-serving-program.md +371 -0
- package/docs/design/dspark-speculative-decoding.md +167 -5
- package/docs/design/faithful-l1-consolidation.md +310 -0
- package/docs/design/generic-model-support.md +8 -5
- package/docs/design/grammar-spec-batching-integration.md +301 -0
- package/docs/design/minicpm5-decode-megakernel.md +16 -11
- package/docs/design/mlx-lm-tool-parity-plan.md +11 -1
- package/docs/design/omlx-adoption-map.md +14 -6
- package/docs/design/orpo-training.md +34 -30
- package/docs/design/paged-kv-cache.md +214 -0
- package/docs/design/parallel-slots.md +82 -49
- package/docs/design/parity-tier-dag.md +43 -33
- package/docs/design/repo-cleanup-plan.md +189 -0
- package/docs/design/runtime-isolation.md +19 -3
- package/docs/design/segmented-backward-training.md +3 -2
- package/docs/design/ssd-kv-cold-tier.md +130 -0
- package/docs/design/structured-output.md +484 -0
- package/docs/design/the-dreaming-master-plan.md +2 -3
- package/docs/design/turboquant-kv.md +235 -0
- package/docs/design/unified-engine-frontier-plan.md +774 -0
- package/docs/design/web-chat-beat-matrix.md +315 -0
- package/docs/design/web-chat-redesign.md +1112 -0
- package/docs/investigations/dspark-handoff.md +182 -16
- package/docs/investigations/lab-build-journal.md +2 -2
- package/docs/investigations/openwiki-evaluation.md +249 -0
- package/docs/planning/IDEAS.md +14 -0
- package/docs/planning/PRODUCT_ROADMAP.md +2 -3
- package/docs/planning/chat-ui-vision-memory-first.md +199 -0
- package/docs/planning/chat-ui-vision.md +50 -0
- package/docs/planning/memory-docs-and-dag-plan.md +15 -6
- package/docs/planning/release-notes-v0.0.11.md +239 -0
- package/docs/reference/cli.md +35 -16
- package/docs/reference/distribution.md +13 -6
- package/docs/reference/embedding.md +35 -14
- package/docs/reference/features-matrix.md +97 -0
- package/docs/reference/library-api.md +30 -9
- package/docs/reference/memory.md +26 -6
- package/docs/reference/models.md +11 -1
- package/docs/reference/orpo-quickstart.md +3 -4
- package/docs/reference/server-api.md +634 -22
- package/docs/reference/server-config.md +250 -121
- package/docs/reference/training.md +14 -15
- package/package.json +5 -3
- package/src/anthropic.ts +13 -0
- package/src/audio/conformer.ts +647 -0
- package/src/audio/decode.ts +133 -0
- package/src/audio/features.ts +202 -0
- package/src/audio/transcode.ts +67 -0
- package/src/cli.ts +356 -105
- package/src/config.ts +49 -2
- package/src/download.ts +40 -0
- package/src/eval/README.md +7 -6
- package/src/eval/kl.ts +59 -3
- package/src/eval/quality-db.ts +2 -2
- package/src/eval/runner.ts +3 -3
- package/src/expert-offload.ts +15 -2
- package/src/flags.ts +13 -0
- package/src/generate.ts +330 -24
- package/src/grammar.ts +585 -0
- package/src/hub-rest.ts +242 -0
- package/src/kv-store.ts +442 -88
- package/src/lora.ts +8 -0
- package/src/md-modules.d.ts +42 -0
- package/src/media-fetch.ts +284 -0
- package/src/memory/rest.ts +245 -0
- package/src/memory/vault.ts +74 -0
- package/src/mlx/array.ts +106 -19
- package/src/mlx/autograd.ts +2 -2
- package/src/mlx/ffi.ts +27 -3
- package/src/mlx/metal-kernel.ts +7 -4
- package/src/mlx/ops.ts +153 -23
- package/src/mlx/turboquant-ops.ts +831 -0
- package/src/mlx/turboquant-tables.ts +237 -0
- package/src/model/batched-mask.ts +62 -1
- package/src/model/batched-quant.ts +206 -0
- package/src/model/batched-rotating-quant.ts +346 -0
- package/src/model/batched-rotating.ts +46 -1
- package/src/model/compiled-decode.ts +4 -15
- package/src/model/factory.ts +10 -4
- package/src/model/gemma4-base.ts +363 -39
- package/src/model/gemma4.ts +122 -33
- package/src/model/generated/gemma4-12b.ts +9 -13
- package/src/model/generated/gemma4-26b.ts +10 -5
- package/src/model/generated/gemma4-e4b.ts +14 -9
- package/src/model/minicpm5.ts +58 -102
- package/src/model/paged-kv.ts +253 -0
- package/src/model/qwen3-delta.ts +76 -15
- package/src/model/qwen3-moe.ts +404 -0
- package/src/model/qwen3.ts +9 -8
- package/src/model/qwen3_5.ts +88 -23
- package/src/model/support.ts +12 -1
- package/src/model/universal/dense.ts +40 -5
- package/src/model/universal/rope.ts +36 -21
- package/src/pi-web.ts +1299 -82
- package/src/preflight.ts +27 -8
- package/src/prompt-cache.ts +293 -33
- package/src/quantize/quantizer.ts +16 -1
- package/src/registry.ts +57 -2
- package/src/serve/batch-scheduler.ts +965 -72
- package/src/serve/generation-gateway.ts +214 -11
- package/src/serve/isolate.ts +417 -0
- package/src/serve/lane-registry.ts +44 -0
- package/src/serve/session-search.ts +326 -0
- package/src/server.ts +1380 -135
- package/src/spec/assistant-source.ts +150 -0
- package/src/spec/deepspec-source.ts +143 -0
- package/src/spec/dflash-source.ts +124 -0
- package/src/spec/dspark/ab-stats.ts +136 -0
- package/src/spec/dspark/calibration.ts +112 -0
- package/src/spec/dspark/deepspec-module.ts +801 -0
- package/src/spec/dspark/generate-dflash.ts +72 -20
- package/src/spec/dspark/loader.ts +23 -0
- package/src/spec/dspark/module-dflash.ts +278 -36
- package/src/spec/dspark/quantize-drafter.ts +91 -0
- package/src/spec/generate.ts +59 -25
- package/src/spec/ngram-source.ts +132 -0
- package/src/spec/serve-loop.ts +536 -0
- package/src/spec/source.ts +93 -0
- package/src/spec/two-model.ts +171 -0
- package/src/ssd-cache.ts +107 -35
- package/src/tokenizer.ts +288 -2
- package/src/tool-approvals.ts +131 -0
- package/src/tool-call.ts +408 -20
- package/src/train/flash-cce.ts +2 -2
- package/src/train/job.ts +0 -2
- package/src/train/trainer.ts +1 -4
- package/src/vision/prompt.ts +217 -48
- package/src/web/app.html +1184 -1789
- package/src/web/app.js +5667 -0
- package/src/web/icon.svg +13 -0
- package/src/web/manifest.webmanifest +24 -0
- package/src/web/src/adapters-panel.ts +288 -0
- package/src/web/src/api.ts +57 -0
- package/src/web/src/assistant.ts +485 -0
- package/src/web/src/chat.ts +1050 -0
- package/src/web/src/composer.ts +959 -0
- package/src/web/src/dataset.ts +132 -0
- package/src/web/src/finetune.ts +267 -0
- package/src/web/src/hub.ts +428 -0
- package/src/web/src/main.ts +98 -0
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +572 -0
- package/src/web/src/model-picker.ts +159 -0
- package/src/web/src/palette.ts +346 -0
- package/src/web/src/protocol.ts +62 -0
- package/src/web/src/quantize.ts +167 -0
- package/src/web/src/rag.ts +274 -0
- package/src/web/src/sessions.ts +469 -0
- package/src/web/src/shell.ts +804 -0
- package/src/web/src/status.ts +252 -0
- package/src/web/src/ui-catalog.ts +92 -0
- package/src/web/sw.js +71 -0
- package/src/web/vendor/README.md +61 -0
- package/src/web/vendor/hljs-LICENSE +29 -0
- package/src/web/vendor/hljs-theme.css +59 -0
- package/src/web/vendor/hljs.js +26 -0
- package/src/model/fused-decode-kernel.ts +0 -312
- package/src/model/fused-geglu-kernel.ts +0 -198
- package/src/model/fused-mlp-kernel.ts +0 -169
- package/src/model/fused-swiglu-kernel.ts +0 -240
- package/src/model/steel-linear-kernel.ts +0 -96
- package/src/status-page.html +0 -497
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// UniversalDense — the Tier-0 config-driven dense llama-family module
|
|
2
2
|
// (docs/design/generic-model-support.md §3.1). One module, shaped exactly
|
|
3
3
|
// like qwen3.ts, with every arch delta selected by the UniversalArgs
|
|
4
|
-
// descriptor (archs.ts). Monolith path only: no
|
|
4
|
+
// descriptor (archs.ts). Monolith path only: no compiled
|
|
5
5
|
// decode, no kv-quant — slow, never broken. The bar is L1 bit-exactness
|
|
6
6
|
// vs mlx-lm on this machine's GPU (tests/universal-parity.test.ts).
|
|
7
7
|
//
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
type Mask,
|
|
29
29
|
} from "../gemma4-base";
|
|
30
30
|
import { genericArgsFor, type UniversalArgs } from "./archs";
|
|
31
|
+
import { compiledSwiglu } from "../minicpm5";
|
|
31
32
|
import { initializeRope, NoRope, phi3SuRope, UniversalRope } from "./rope";
|
|
32
33
|
import {
|
|
33
34
|
loadEmbedding,
|
|
@@ -140,8 +141,18 @@ class UniversalAttention {
|
|
|
140
141
|
k = disposing(k, ops.transposeAxes(k, [0, 2, 1, 3]));
|
|
141
142
|
v = disposing(v, ops.transposeAxes(v, [0, 2, 1, 3]));
|
|
142
143
|
|
|
143
|
-
|
|
144
|
-
|
|
144
|
+
// Batched decode: the scheduler's mask wrapper exposes each row's REAL
|
|
145
|
+
// position as ropeOffsetArr (rows have different prompt lengths under
|
|
146
|
+
// left-padding; the scalar offset would mis-position every padded row by
|
|
147
|
+
// its pad amount — the 2026-07-03 uneven-batch bug). Serial lane: scalar
|
|
148
|
+
// offset, byte-identical to before (the S1b.1 pattern, cf. qwen3_5.ts).
|
|
149
|
+
const offArr = (cache as { ropeOffsetArr?: MlxArray }).ropeOffsetArr;
|
|
150
|
+
q = disposing(q, offArr
|
|
151
|
+
? this.rope.applyDynamic(q, offArr)
|
|
152
|
+
: this.rope.apply(q, cache.offset));
|
|
153
|
+
k = disposing(k, offArr
|
|
154
|
+
? this.rope.applyDynamic(k, offArr)
|
|
155
|
+
: this.rope.apply(k, cache.offset));
|
|
145
156
|
|
|
146
157
|
const [keys, values] = cache.updateAndFetch(k, v);
|
|
147
158
|
k.dispose();
|
|
@@ -215,11 +226,23 @@ class UniversalAttention {
|
|
|
215
226
|
}
|
|
216
227
|
}
|
|
217
228
|
|
|
218
|
-
|
|
229
|
+
/** swiglu(gate, up) = nn.silu(gate) * up as ONE call — the whole activation,
|
|
230
|
+
* not just silu. Defaults to the `@mx.compile` version (compiledSwiglu) — the
|
|
231
|
+
* same libmlx kernel mlx-lm dispatches (L1-faithful), bit-identical to the old
|
|
232
|
+
* uncompiled composition but one dispatch instead of three. Set to null to force
|
|
233
|
+
* the uncompiled path (the slower same-parity opt-in). */
|
|
234
|
+
export type SwigluFn = (gate: MlxArray, up: MlxArray) => MlxArray;
|
|
235
|
+
|
|
236
|
+
export class UniversalMLP {
|
|
219
237
|
readonly gate: AnyLinear | null;
|
|
220
238
|
readonly up: AnyLinear | null;
|
|
221
239
|
readonly gateUp: AnyLinear | null;
|
|
222
240
|
readonly down: AnyLinear;
|
|
241
|
+
/** Fused swiglu (silu(gate)*up), default = the oracle's `@mx.compile` closure.
|
|
242
|
+
* Only consumed for the swiglu / fused_swiglu kinds; geglu/geglu_approx/gelu_mlp
|
|
243
|
+
* are unaffected (the oracle does NOT @mx.compile those — gemma/gemma2/starcoder2
|
|
244
|
+
* use a plain nn.gelu composition). Set to null for the uncompiled composition. */
|
|
245
|
+
swigluFn: SwigluFn | null = compiledSwiglu;
|
|
223
246
|
|
|
224
247
|
constructor(
|
|
225
248
|
weights: Weights,
|
|
@@ -268,6 +291,18 @@ class UniversalMLP {
|
|
|
268
291
|
up = this.up!.forward(x);
|
|
269
292
|
}
|
|
270
293
|
|
|
294
|
+
// swiglu / fused_swiglu run silu(gate)*up as ONE fused call (mlx-lm's
|
|
295
|
+
// `@mx.compile swiglu`), matching the oracle kernel set exactly. This is the
|
|
296
|
+
// default (swigluFn = compiledSwiglu); null forces the uncompiled composition.
|
|
297
|
+
if (this.swigluFn && (this.kind === "swiglu" || this.kind === "fused_swiglu")) {
|
|
298
|
+
const hidden = this.swigluFn(gate, up);
|
|
299
|
+
gate.dispose();
|
|
300
|
+
up.dispose();
|
|
301
|
+
const out = this.down.forward(hidden);
|
|
302
|
+
hidden.dispose();
|
|
303
|
+
return out;
|
|
304
|
+
}
|
|
305
|
+
|
|
271
306
|
let act: MlxArray;
|
|
272
307
|
if (this.kind === "geglu") {
|
|
273
308
|
act = ops.geluPrecise(gate); // gemma-1: nn.gelu (erf)
|
|
@@ -289,7 +324,7 @@ class UniversalMLP {
|
|
|
289
324
|
}
|
|
290
325
|
}
|
|
291
326
|
|
|
292
|
-
class UniversalLayer {
|
|
327
|
+
export class UniversalLayer {
|
|
293
328
|
readonly attn: UniversalAttention;
|
|
294
329
|
readonly mlp: UniversalMLP;
|
|
295
330
|
/** pre/gemma2/glm4: input_layernorm. post (olmo2): unused (null). */
|
|
@@ -49,32 +49,44 @@ export class UniversalRope {
|
|
|
49
49
|
) {}
|
|
50
50
|
|
|
51
51
|
apply(x: MlxArray, offset: number): MlxArray {
|
|
52
|
-
|
|
53
|
-
let scaled: MlxArray | null = null;
|
|
54
|
-
if (this.preScaleAlways || this.preScale !== 1.0) {
|
|
55
|
-
// x[..., :dims] = preScale * x[..., :dims] (weak-scalar mul)
|
|
56
|
-
const D = x.shape[x.shape.length - 1]!;
|
|
57
|
-
if (this.dims === D) {
|
|
58
|
-
scaled = ops.mulScalar(x, this.preScale);
|
|
59
|
-
} else {
|
|
60
|
-
const start = x.shape.map(() => 0);
|
|
61
|
-
const stop = [...x.shape];
|
|
62
|
-
stop[stop.length - 1] = this.dims;
|
|
63
|
-
const head = x.slice(start, stop);
|
|
64
|
-
const headScaled = ops.mulScalar(head, this.preScale);
|
|
65
|
-
head.dispose();
|
|
66
|
-
scaled = ops.sliceUpdate(x, headScaled, start, stop);
|
|
67
|
-
headScaled.dispose();
|
|
68
|
-
}
|
|
69
|
-
input = scaled;
|
|
70
|
-
}
|
|
52
|
+
const input = this.#preScaled(x);
|
|
71
53
|
const out = ops.ropeScaled(
|
|
72
|
-
input, this.dims, this.traditional, this.base, this.scale, offset, this.freqs,
|
|
54
|
+
input ?? x, this.dims, this.traditional, this.base, this.scale, offset, this.freqs,
|
|
73
55
|
);
|
|
74
|
-
|
|
56
|
+
input?.dispose();
|
|
75
57
|
return out;
|
|
76
58
|
}
|
|
77
59
|
|
|
60
|
+
/** Per-row array-offset variant (batched decode under left-padding: each
|
|
61
|
+
* row's REAL position rides an int32 [B] array — the scalar offset would
|
|
62
|
+
* mis-position every padded row by its pad amount). Same math as
|
|
63
|
+
* `apply`; only the offset spelling differs. */
|
|
64
|
+
applyDynamic(x: MlxArray, offsetArr: MlxArray): MlxArray {
|
|
65
|
+
const input = this.#preScaled(x);
|
|
66
|
+
const out = ops.ropeScaledDynamic(
|
|
67
|
+
input ?? x, this.dims, this.traditional, this.base, this.scale, offsetArr, this.freqs,
|
|
68
|
+
);
|
|
69
|
+
input?.dispose();
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** x[..., :dims] = preScale * x[..., :dims] (weak-scalar mul); null when
|
|
74
|
+
* no pre-scale applies (caller uses x unchanged). */
|
|
75
|
+
#preScaled(x: MlxArray): MlxArray | null {
|
|
76
|
+
if (!(this.preScaleAlways || this.preScale !== 1.0)) return null;
|
|
77
|
+
const D = x.shape[x.shape.length - 1]!;
|
|
78
|
+
if (this.dims === D) return ops.mulScalar(x, this.preScale);
|
|
79
|
+
const start = x.shape.map(() => 0);
|
|
80
|
+
const stop = [...x.shape];
|
|
81
|
+
stop[stop.length - 1] = this.dims;
|
|
82
|
+
const head = x.slice(start, stop);
|
|
83
|
+
const headScaled = ops.mulScalar(head, this.preScale);
|
|
84
|
+
head.dispose();
|
|
85
|
+
const scaled = ops.sliceUpdate(x, headScaled, start, stop);
|
|
86
|
+
headScaled.dispose();
|
|
87
|
+
return scaled;
|
|
88
|
+
}
|
|
89
|
+
|
|
78
90
|
dispose(): void {
|
|
79
91
|
this.freqs?.dispose();
|
|
80
92
|
}
|
|
@@ -89,6 +101,9 @@ export class NoRope extends UniversalRope {
|
|
|
89
101
|
// Return an owned copy-view so callers can dispose uniformly.
|
|
90
102
|
return x.slice(x.shape.map(() => 0), [...x.shape]);
|
|
91
103
|
}
|
|
104
|
+
override applyDynamic(x: MlxArray, _offsetArr: MlxArray): MlxArray {
|
|
105
|
+
return x.slice(x.shape.map(() => 0), [...x.shape]);
|
|
106
|
+
}
|
|
92
107
|
}
|
|
93
108
|
|
|
94
109
|
/** `base ** (arange(0, dims, 2) / dims)` with the oracle's dtypes:
|