mlx-bun 0.0.11 → 0.0.13
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 +63 -27
- package/THIRD_PARTY_LICENSES.md +9 -0
- package/docs/design/colibri-glm52-port.md +1486 -0
- package/docs/design/pre-colibri-stabilization.md +329 -0
- package/docs/investigations/colibri-oracle-pin.md +1284 -0
- package/docs/investigations/indexshare-performance-spike.md +357 -0
- package/docs/planning/release-notes-v0.0.12.md +80 -0
- package/docs/planning/release-notes-v0.0.13.md +77 -0
- package/docs/reference/cli.md +28 -2
- package/docs/reference/distribution.md +25 -1
- package/docs/reference/embedding.md +5 -2
- package/docs/reference/features-matrix.md +5 -2
- package/docs/reference/library-api.md +41 -13
- package/docs/reference/models.md +49 -2
- package/docs/reference/server-api.md +113 -20
- package/docs/reference/server-config.md +21 -14
- package/docs/reference/training.md +10 -1
- package/package.json +1 -1
- package/src/anthropic.ts +54 -44
- package/src/chat-template.ts +189 -11
- package/src/cli.ts +127 -8
- package/src/config.ts +81 -26
- package/src/diffusion/diffusion-generate.ts +14 -8
- package/src/download.ts +103 -12
- package/src/eval/ifeval.ts +63 -120
- package/src/eval/runner.ts +14 -5
- package/src/eval/tasks/ifeval.ts +167 -31
- package/src/expert-io.ts +391 -0
- package/src/expert-residency.ts +1134 -0
- package/src/expert-usage.ts +415 -0
- package/src/generate.ts +114 -17
- package/src/hf-push.ts +1 -1
- package/src/index.ts +14 -2
- package/src/jobs/runner.ts +37 -18
- package/src/kv-store.ts +147 -8
- package/src/lora.ts +77 -14
- package/src/media-fetch.ts +198 -56
- package/src/mlx/array.ts +43 -0
- package/src/mlx/autograd.ts +51 -14
- package/src/mlx/checkpoint.ts +46 -13
- package/src/mlx/custom-vjp.ts +83 -35
- package/src/model/factory.ts +96 -5
- package/src/model/gemma4-base.ts +32 -0
- package/src/model/glm52-atlas.ts +511 -0
- package/src/model/glm52-cache.ts +706 -0
- package/src/model/glm52-config.ts +262 -0
- package/src/model/glm52-container.ts +305 -0
- package/src/model/glm52-coupling.ts +388 -0
- package/src/model/glm52-dsa.ts +602 -0
- package/src/model/glm52-expert-layout.ts +253 -0
- package/src/model/glm52-layout.ts +152 -0
- package/src/model/glm52-memory.ts +473 -0
- package/src/model/glm52-mla.ts +786 -0
- package/src/model/glm52-moe.ts +223 -0
- package/src/model/glm52-pilot.ts +537 -0
- package/src/model/glm52-reference.ts +445 -0
- package/src/model/glm52-residency.ts +557 -0
- package/src/model/glm52-resident-weights.ts +135 -0
- package/src/model/glm52-streamed-experts.ts +453 -0
- package/src/model/glm52-streamed-metal.ts +610 -0
- package/src/model/glm52-weights.ts +503 -0
- package/src/model/glm52.ts +1153 -0
- package/src/model/support.ts +8 -1
- package/src/native/expert_io.c +523 -0
- package/src/native-pack.ts +6 -4
- package/src/responses.ts +62 -49
- package/src/serve/batch-scheduler.ts +95 -16
- package/src/serve/generation-gateway.ts +41 -16
- package/src/server.ts +471 -93
- package/src/spec/glm52-mtp-source.ts +392 -0
- package/src/spec/serve-loop.ts +99 -18
- package/src/spec/source.ts +31 -6
- package/src/ssd-cache.ts +6 -2
- package/src/tool-call.ts +30 -2
- package/src/train/job.ts +0 -10
- package/src/train/lora-params.ts +17 -6
- package/src/train/trainer.ts +59 -26
- package/src/web/app.html +13 -2
- package/src/web/app.js +30 -3
- package/src/web/src/status.ts +51 -3
- package/src/web-tools.ts +54 -2
- package/src/weights.ts +82 -19
package/src/weights.ts
CHANGED
|
@@ -22,34 +22,97 @@ import { C } from "./mlx/ffi";
|
|
|
22
22
|
|
|
23
23
|
const cstr = (s: string) => Buffer.from(s + "\0", "utf8");
|
|
24
24
|
|
|
25
|
+
export interface WeightsNativeBindings {
|
|
26
|
+
newArrayMap(): bigint;
|
|
27
|
+
freeArrayMap(handle: bigint): void;
|
|
28
|
+
newStringMap(): bigint;
|
|
29
|
+
freeStringMap(handle: bigint): void;
|
|
30
|
+
loadSafetensors(
|
|
31
|
+
arrayMapSlot: BigUint64Array,
|
|
32
|
+
metadataMapSlot: BigUint64Array,
|
|
33
|
+
path: string,
|
|
34
|
+
): number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface WeightsOpenOptions {
|
|
38
|
+
/** Failure-injection seam; production callers use the native MLX bindings. */
|
|
39
|
+
native?: WeightsNativeBindings;
|
|
40
|
+
/** Parser seam used by ownership tests to provide deterministic shard order. */
|
|
41
|
+
openShards?: (modelDir: string) => Promise<ShardedSafetensors>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const NATIVE_WEIGHTS: WeightsNativeBindings = {
|
|
45
|
+
newArrayMap: () => C.mlx_map_string_to_array_new(),
|
|
46
|
+
freeArrayMap: (handle) => {
|
|
47
|
+
C.mlx_map_string_to_array_free(handle);
|
|
48
|
+
},
|
|
49
|
+
newStringMap: () => C.mlx_map_string_to_string_new(),
|
|
50
|
+
freeStringMap: (handle) => {
|
|
51
|
+
C.mlx_map_string_to_string_free(handle);
|
|
52
|
+
},
|
|
53
|
+
loadSafetensors: (arrayMapSlot, metadataMapSlot, path) =>
|
|
54
|
+
C.mlx_load_safetensors(
|
|
55
|
+
ptr(arrayMapSlot),
|
|
56
|
+
ptr(metadataMapSlot),
|
|
57
|
+
ptr(cstr(path)),
|
|
58
|
+
cpuStream,
|
|
59
|
+
),
|
|
60
|
+
};
|
|
61
|
+
|
|
25
62
|
export class Weights {
|
|
26
63
|
readonly shards: ShardedSafetensors;
|
|
27
64
|
/** shard filename → native mlx map handle (string → lazy array). */
|
|
28
65
|
readonly #maps = new Map<string, bigint>();
|
|
29
66
|
readonly #arrays = new Map<string, MlxArray>();
|
|
67
|
+
readonly #native: WeightsNativeBindings;
|
|
30
68
|
|
|
31
|
-
private constructor(
|
|
69
|
+
private constructor(
|
|
70
|
+
shards: ShardedSafetensors,
|
|
71
|
+
native: WeightsNativeBindings,
|
|
72
|
+
) {
|
|
32
73
|
this.shards = shards;
|
|
74
|
+
this.#native = native;
|
|
33
75
|
}
|
|
34
76
|
|
|
35
|
-
static async open(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
77
|
+
static async open(
|
|
78
|
+
modelDir: string,
|
|
79
|
+
options: WeightsOpenOptions = {},
|
|
80
|
+
): Promise<Weights> {
|
|
81
|
+
const native = options.native ?? NATIVE_WEIGHTS;
|
|
82
|
+
const shards = await (options.openShards ?? ShardedSafetensors.open)(modelDir);
|
|
83
|
+
const self = new Weights(shards, native);
|
|
84
|
+
try {
|
|
85
|
+
for (const [file, sf] of self.shards.files) {
|
|
86
|
+
// out-param slots read back via read.u64, not [0] (DFG stale-read
|
|
87
|
+
// bug — see outArray in mlx/ffi.ts). Cold path, but the rule is
|
|
88
|
+
// uniform: native wrote it, read.* reads it.
|
|
89
|
+
const arrMap = new BigUint64Array([native.newArrayMap()]);
|
|
90
|
+
const arrMapPtr = ptr(arrMap);
|
|
91
|
+
let arrayMapTransferred = false;
|
|
92
|
+
try {
|
|
93
|
+
const metaMap = new BigUint64Array([native.newStringMap()]);
|
|
94
|
+
const metaMapPtr = ptr(metaMap);
|
|
95
|
+
try {
|
|
96
|
+
const status = native.loadSafetensors(arrMap, metaMap, sf.path);
|
|
97
|
+
if (status !== 0)
|
|
98
|
+
throw new Error(`mlx_load_safetensors(${sf.path}) failed`);
|
|
99
|
+
self.#maps.set(file, read.u64(arrMapPtr, 0));
|
|
100
|
+
arrayMapTransferred = true;
|
|
101
|
+
} finally {
|
|
102
|
+
native.freeStringMap(read.u64(metaMapPtr, 0));
|
|
103
|
+
}
|
|
104
|
+
} finally {
|
|
105
|
+
if (!arrayMapTransferred)
|
|
106
|
+
native.freeArrayMap(read.u64(arrMapPtr, 0));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return self;
|
|
110
|
+
} catch (error) {
|
|
111
|
+
// A failure on shard N must release every array map transferred by
|
|
112
|
+
// shards 1..N-1. The current shard remains owned by the inner guard.
|
|
113
|
+
self.dispose();
|
|
114
|
+
throw error;
|
|
51
115
|
}
|
|
52
|
-
return self;
|
|
53
116
|
}
|
|
54
117
|
|
|
55
118
|
get tensorNames(): string[] {
|
|
@@ -85,7 +148,7 @@ export class Weights {
|
|
|
85
148
|
dispose(): void {
|
|
86
149
|
for (const arr of this.#arrays.values()) arr.dispose();
|
|
87
150
|
this.#arrays.clear();
|
|
88
|
-
for (const map of this.#maps.values())
|
|
151
|
+
for (const map of this.#maps.values()) this.#native.freeArrayMap(map);
|
|
89
152
|
this.#maps.clear();
|
|
90
153
|
}
|
|
91
154
|
}
|