mlx-bun 0.4.0 → 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.
Files changed (601) hide show
  1. package/README.md +1453 -88
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +10 -8
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +12 -10
  78. package/src/{serve → server}/chat-stage.ts +27 -22
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +42 -42
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +42 -83
  85. package/src/server/generated-token-history.ts +57 -0
  86. package/src/{serve → server}/http.ts +25 -13
  87. package/src/{serve → server}/inference-request.ts +5 -5
  88. package/src/server/job-routes.ts +20 -0
  89. package/src/server/media-prompt.ts +63 -0
  90. package/src/server/memory-completion-client.ts +46 -0
  91. package/src/server/model-routes.ts +192 -0
  92. package/src/{serve → server}/openai-wire.ts +3 -2
  93. package/src/{serve → server}/pipeline.ts +1 -1
  94. package/src/server/prompt-builder.ts +13 -0
  95. package/src/server/prompt-contracts.ts +17 -0
  96. package/src/server/proxy-routes.ts +187 -0
  97. package/src/server/publishing-routes.ts +41 -0
  98. package/src/{serve → server}/request-plan.ts +8 -8
  99. package/src/{serve → server}/request-prep.ts +82 -68
  100. package/src/{serve → server}/responses-client.ts +30 -13
  101. package/src/{responses.ts → server/responses.ts} +12 -93
  102. package/src/server/routes.ts +205 -0
  103. package/src/server/start.ts +72 -0
  104. package/src/server/status-routes.ts +108 -0
  105. package/src/{serve → server}/text-completion-stage.ts +25 -4
  106. package/src/server/text-prompt.ts +12 -0
  107. package/src/{serve → server}/token-streams.ts +36 -38
  108. package/src/server/worker-routes.ts +311 -0
  109. package/src/storage/paths.ts +61 -0
  110. package/src/web/assets.ts +37 -0
  111. package/src/web/{src → browser}/api.ts +5 -23
  112. package/src/web/browser/chat-host.ts +17 -0
  113. package/src/web/browser/installed-panels.ts +6 -0
  114. package/src/web/browser/main.ts +55 -0
  115. package/src/web/browser/markdown.ts +279 -0
  116. package/src/web/browser/memory-panel.ts +9 -0
  117. package/src/web/browser/palette.ts +64 -0
  118. package/src/web/browser/protocol.ts +13 -0
  119. package/src/web/browser/shell.ts +467 -0
  120. package/src/web/{src → browser}/status.ts +32 -36
  121. package/src/web/build.ts +51 -0
  122. package/src/web/public/app.html +1054 -0
  123. package/src/web/{sw.js → public/sw.js} +4 -3
  124. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  125. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  126. package/THIRD_PARTY_LICENSES.md +0 -51
  127. package/docs/README.md +0 -94
  128. package/docs/archive/hlg-sampling.md +0 -350
  129. package/docs/archive/investigations/audio-input-plan.md +0 -356
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  174. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  175. package/docs/design/batching.md +0 -1841
  176. package/docs/design/decode-speed-program.md +0 -2349
  177. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  178. package/docs/design/generic-model-support.md +0 -705
  179. package/docs/design/kv-cache.md +0 -824
  180. package/docs/design/orpo-training.md +0 -680
  181. package/docs/design/speculative-decoding.md +0 -1990
  182. package/docs/design/turboquant.md +0 -2212
  183. package/docs/design/unified-engine-frontier-plan.md +0 -1880
  184. package/docs/design/web-chat-redesign.md +0 -695
  185. package/docs/planning/PRODUCT_ROADMAP.md +0 -594
  186. package/docs/planning/ResearchTopics.md +0 -119
  187. package/docs/planning/release-notes-v0.4.0.md +0 -45
  188. package/docs/planning/video-series.md +0 -421
  189. package/docs/reference/benchmarks.md +0 -3613
  190. package/docs/reference/cli.md +0 -585
  191. package/docs/reference/distribution.md +0 -355
  192. package/docs/reference/environment.md +0 -398
  193. package/docs/reference/glossary.md +0 -39
  194. package/docs/reference/library-api.md +0 -674
  195. package/docs/reference/memory.md +0 -260
  196. package/docs/reference/models.md +0 -334
  197. package/docs/reference/server-api.md +0 -1775
  198. package/docs/reference/server-config.md +0 -846
  199. package/docs/reference/training.md +0 -462
  200. package/docs/reference/troubleshooting.md +0 -158
  201. package/src/admission-plan.ts +0 -18
  202. package/src/audio/conformer.ts +0 -647
  203. package/src/audio/decode.ts +0 -133
  204. package/src/audio/features.ts +0 -202
  205. package/src/audio/transcode.ts +0 -67
  206. package/src/backends/mlx/assistant-target.ts +0 -46
  207. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  208. package/src/backends/mlx/autoregressive.ts +0 -108
  209. package/src/backends/mlx/batch-group.ts +0 -1790
  210. package/src/backends/mlx/cache-attachment.ts +0 -67
  211. package/src/backends/mlx/cache-layout.ts +0 -31
  212. package/src/backends/mlx/checkpoint-state.ts +0 -53
  213. package/src/backends/mlx/continuation-persistence.ts +0 -106
  214. package/src/backends/mlx/continuation-request.ts +0 -43
  215. package/src/backends/mlx/continuation.ts +0 -77
  216. package/src/backends/mlx/diffusion.ts +0 -39
  217. package/src/backends/mlx/draft-target.ts +0 -32
  218. package/src/backends/mlx/evaluation.ts +0 -105
  219. package/src/backends/mlx/fill-append.ts +0 -45
  220. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  221. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  222. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  223. package/src/backends/mlx/gateway-binding.ts +0 -130
  224. package/src/backends/mlx/graph.ts +0 -38
  225. package/src/backends/mlx/kv-codec.ts +0 -9
  226. package/src/backends/mlx/kv-maintenance.ts +0 -133
  227. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  228. package/src/backends/mlx/memory-client.ts +0 -189
  229. package/src/backends/mlx/methods.ts +0 -90
  230. package/src/backends/mlx/model-prompt.ts +0 -164
  231. package/src/backends/mlx/model-serving.ts +0 -79
  232. package/src/backends/mlx/prefill-cohort.ts +0 -89
  233. package/src/backends/mlx/prefill-rows.ts +0 -200
  234. package/src/backends/mlx/prefill.ts +0 -33
  235. package/src/backends/mlx/projected-context-rows.ts +0 -72
  236. package/src/backends/mlx/request-policy.ts +0 -20
  237. package/src/backends/mlx/request-state-policy.ts +0 -41
  238. package/src/backends/mlx/rollback.ts +0 -89
  239. package/src/backends/mlx/row-sampling.ts +0 -49
  240. package/src/backends/mlx/serial-executor.ts +0 -242
  241. package/src/backends/mlx/speculative-group.ts +0 -359
  242. package/src/backends/mlx/speculative-round.ts +0 -161
  243. package/src/backends/mlx/speculative.ts +0 -114
  244. package/src/backends/mlx/state-rows.ts +0 -104
  245. package/src/backends/mlx/state-views.ts +0 -46
  246. package/src/backends/mlx/target-layout-capability.ts +0 -35
  247. package/src/backends/mlx/text-engine.ts +0 -73
  248. package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
  249. package/src/chat-template.ts +0 -382
  250. package/src/cli.ts +0 -3168
  251. package/src/config.ts +0 -399
  252. package/src/contracts/completion.ts +0 -16
  253. package/src/contracts/execution.ts +0 -60
  254. package/src/contracts/generation.ts +0 -103
  255. package/src/contracts/host.ts +0 -7
  256. package/src/contracts/pi-provider.ts +0 -30
  257. package/src/contracts/pi.ts +0 -259
  258. package/src/contracts/prefix-cache.ts +0 -23
  259. package/src/contracts/resources.ts +0 -25
  260. package/src/contracts/sampling.ts +0 -23
  261. package/src/contracts/scheduling.ts +0 -45
  262. package/src/contracts/tsconfig.json +0 -14
  263. package/src/dataset/generators.ts +0 -1087
  264. package/src/dataset/index.ts +0 -12
  265. package/src/dataset/job.ts +0 -81
  266. package/src/dataset/llm.ts +0 -71
  267. package/src/dataset/registry.ts +0 -528
  268. package/src/diffusion/diffusion-generate.ts +0 -507
  269. package/src/download.ts +0 -505
  270. package/src/embed.ts +0 -77
  271. package/src/engine/admission.ts +0 -59
  272. package/src/engine/cancellation.ts +0 -38
  273. package/src/engine/engine.ts +0 -56
  274. package/src/engine/execution-coordinator.ts +0 -70
  275. package/src/engine/execution-plan.ts +0 -53
  276. package/src/engine/resources.ts +0 -53
  277. package/src/engine/scheduler.ts +0 -72
  278. package/src/engine/session.ts +0 -247
  279. package/src/eval/README.md +0 -130
  280. package/src/eval/ifeval.ts +0 -81
  281. package/src/eval/kl-prompts.ts +0 -29
  282. package/src/eval/kl.ts +0 -590
  283. package/src/eval/perplexity.ts +0 -164
  284. package/src/eval/quality-db.ts +0 -92
  285. package/src/eval/reference-logits.ts +0 -207
  286. package/src/eval/runner.ts +0 -124
  287. package/src/eval/score.ts +0 -49
  288. package/src/eval/tasks/bfcl.ts +0 -535
  289. package/src/eval/tasks/gsm8k.ts +0 -98
  290. package/src/eval/tasks/hashhop.ts +0 -139
  291. package/src/eval/tasks/humaneval.ts +0 -275
  292. package/src/eval/tasks/ifeval.ts +0 -525
  293. package/src/eval/tasks/mmlu.ts +0 -157
  294. package/src/eval/ultrafeedback.ts +0 -60
  295. package/src/evaldb.ts +0 -199
  296. package/src/expert-io.ts +0 -393
  297. package/src/expert-offload-build.ts +0 -77
  298. package/src/expert-offload.ts +0 -76
  299. package/src/expert-residency.ts +0 -1134
  300. package/src/expert-usage.ts +0 -415
  301. package/src/fill/echo-index.ts +0 -188
  302. package/src/fill/fill-session.ts +0 -452
  303. package/src/fill/proposal.ts +0 -68
  304. package/src/fill/schema-rows.ts +0 -506
  305. package/src/fill/tool-boundary.ts +0 -103
  306. package/src/fit.ts +0 -249
  307. package/src/generate.ts +0 -1346
  308. package/src/grammar.ts +0 -591
  309. package/src/harness-pi.ts +0 -184
  310. package/src/hf-push.ts +0 -628
  311. package/src/hub-rest.ts +0 -242
  312. package/src/index.ts +0 -63
  313. package/src/inference/denoising.ts +0 -17
  314. package/src/inference/draft-acceptance.ts +0 -41
  315. package/src/inference/draft-output.ts +0 -49
  316. package/src/inference/graph.ts +0 -33
  317. package/src/inference/prefill.ts +0 -39
  318. package/src/inference/rollback.ts +0 -7
  319. package/src/jobs/index.ts +0 -31
  320. package/src/jobs/job-entry.ts +0 -107
  321. package/src/jobs/task-client.ts +0 -19
  322. package/src/jobs/types.ts +0 -2
  323. package/src/kv-scheme.ts +0 -257
  324. package/src/kv-store.ts +0 -1099
  325. package/src/lab/README.md +0 -18
  326. package/src/lab/curve/curve-designer.html +0 -303
  327. package/src/lab/curve/curve-sampler.ts +0 -122
  328. package/src/lab/expert-trace/expert-trace.ts +0 -69
  329. package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
  330. package/src/lab/paged-kv/paged-kv.ts +0 -270
  331. package/src/library.ts +0 -40
  332. package/src/lora.ts +0 -408
  333. package/src/md-modules.d.ts +0 -49
  334. package/src/media-fetch.ts +0 -442
  335. package/src/memory/article.ts +0 -558
  336. package/src/memory/chunk-validation.ts +0 -150
  337. package/src/memory/chunk.ts +0 -318
  338. package/src/memory/cluster.ts +0 -351
  339. package/src/memory/coverage.ts +0 -134
  340. package/src/memory/crosslink.ts +0 -0
  341. package/src/memory/db.ts +0 -253
  342. package/src/memory/entity.ts +0 -203
  343. package/src/memory/gate.ts +0 -187
  344. package/src/memory/history.ts +0 -152
  345. package/src/memory/ingest.ts +0 -335
  346. package/src/memory/model.ts +0 -183
  347. package/src/memory/normalize.ts +0 -671
  348. package/src/memory/parse.ts +0 -22
  349. package/src/memory/pipeline.ts +0 -275
  350. package/src/memory/prompts.ts +0 -65
  351. package/src/memory/query.ts +0 -334
  352. package/src/memory/reconcile.ts +0 -734
  353. package/src/memory/redirect.ts +0 -108
  354. package/src/memory/reindex.ts +0 -325
  355. package/src/memory/resolve.ts +0 -307
  356. package/src/memory/rest.ts +0 -245
  357. package/src/memory/route.ts +0 -272
  358. package/src/memory/schedule.ts +0 -165
  359. package/src/memory/stages.ts +0 -777
  360. package/src/memory/synthesize.ts +0 -1638
  361. package/src/memory/tools.ts +0 -749
  362. package/src/memory/vault.ts +0 -1194
  363. package/src/memory/wikify.ts +0 -1064
  364. package/src/mlx/array.ts +0 -388
  365. package/src/mlx/autograd.ts +0 -304
  366. package/src/mlx/checkpoint.ts +0 -149
  367. package/src/mlx/compile.ts +0 -168
  368. package/src/mlx/custom-vjp.ts +0 -188
  369. package/src/mlx/ffi.ts +0 -512
  370. package/src/mlx/materialize.ts +0 -23
  371. package/src/mlx/metal-kernel.ts +0 -159
  372. package/src/mlx/ops.ts +0 -1021
  373. package/src/mlx/quantized-rows.ts +0 -36
  374. package/src/mlx/token-bitmask.ts +0 -52
  375. package/src/mlx/turboquant-kv-decode.ts +0 -82
  376. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  377. package/src/mlx/turboquant-ops.ts +0 -861
  378. package/src/mlx/turboquant-tables.ts +0 -237
  379. package/src/mmap.ts +0 -90
  380. package/src/model/artifact-identity.ts +0 -73
  381. package/src/model/batched-kv.ts +0 -235
  382. package/src/model/batched-mask.ts +0 -279
  383. package/src/model/batched-quant.ts +0 -212
  384. package/src/model/batched-quantized-kv.ts +0 -144
  385. package/src/model/batched-rotating-quant.ts +0 -353
  386. package/src/model/batched-rotating-state.ts +0 -149
  387. package/src/model/batched-rotating.ts +0 -338
  388. package/src/model/batched-row-storage.ts +0 -179
  389. package/src/model/batched-ssm.ts +0 -52
  390. package/src/model/batched-turboquant-kv.ts +0 -93
  391. package/src/model/compiled-decode.ts +0 -712
  392. package/src/model/decoded-kv-donor.ts +0 -12
  393. package/src/model/delayed-quantized-kv.ts +0 -72
  394. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  395. package/src/model/delayed-turboquant-kv.ts +0 -55
  396. package/src/model/diffusion-gemma.ts +0 -1026
  397. package/src/model/factory.ts +0 -189
  398. package/src/model/fingerprint.ts +0 -33
  399. package/src/model/flash-attention.ts +0 -694
  400. package/src/model/full-prefill-padding.ts +0 -56
  401. package/src/model/full-prefill-row.ts +0 -105
  402. package/src/model/gemma4-base.ts +0 -2351
  403. package/src/model/gemma4.ts +0 -1315
  404. package/src/model/generated/gemma4-12b.ts +0 -429
  405. package/src/model/generated/gemma4-26b.ts +0 -448
  406. package/src/model/generated/gemma4-e4b.ts +0 -717
  407. package/src/model/generated/index.ts +0 -18
  408. package/src/model/glm52-atlas.ts +0 -511
  409. package/src/model/glm52-cache.ts +0 -792
  410. package/src/model/glm52-config.ts +0 -262
  411. package/src/model/glm52-container.ts +0 -305
  412. package/src/model/glm52-coupling.ts +0 -388
  413. package/src/model/glm52-dsa.ts +0 -606
  414. package/src/model/glm52-expert-layout.ts +0 -253
  415. package/src/model/glm52-layout.ts +0 -152
  416. package/src/model/glm52-memory.ts +0 -500
  417. package/src/model/glm52-mla.ts +0 -792
  418. package/src/model/glm52-moe.ts +0 -223
  419. package/src/model/glm52-pilot.ts +0 -537
  420. package/src/model/glm52-reference.ts +0 -445
  421. package/src/model/glm52-residency.ts +0 -557
  422. package/src/model/glm52-resident-weights.ts +0 -135
  423. package/src/model/glm52-streamed-experts.ts +0 -453
  424. package/src/model/glm52-streamed-metal.ts +0 -610
  425. package/src/model/glm52-weights.ts +0 -503
  426. package/src/model/glm52.ts +0 -1132
  427. package/src/model/implementation.ts +0 -69
  428. package/src/model/kv-attention-view.ts +0 -67
  429. package/src/model/minicpm5.ts +0 -376
  430. package/src/model/profile.ts +0 -443
  431. package/src/model/qwen-append.ts +0 -12
  432. package/src/model/qwen-conv.ts +0 -52
  433. package/src/model/qwen3-delta-state.ts +0 -74
  434. package/src/model/qwen3-delta.ts +0 -451
  435. package/src/model/qwen3-moe.ts +0 -404
  436. package/src/model/qwen3-mrope.ts +0 -252
  437. package/src/model/qwen3.ts +0 -277
  438. package/src/model/qwen3_5-checkpoint.ts +0 -164
  439. package/src/model/qwen3_5.ts +0 -819
  440. package/src/model/rotating-kv-donor.ts +0 -35
  441. package/src/model/rotating-kv-layout.ts +0 -262
  442. package/src/model/rotating-row-transaction.ts +0 -35
  443. package/src/model/speculative-rotating-kv.ts +0 -101
  444. package/src/model/ssm-prefill-padding.ts +0 -39
  445. package/src/model/support.ts +0 -102
  446. package/src/model/trellis-balanced-scatter.ts +0 -51
  447. package/src/model/trellis-linear.ts +0 -672
  448. package/src/model/trellis-shared-m.ts +0 -151
  449. package/src/model/trellis-shared-scatter.ts +0 -144
  450. package/src/model/trellis-splitk-prefill.ts +0 -158
  451. package/src/model/trellis-tiled-prefill.ts +0 -136
  452. package/src/model/trellis-vector-expand.ts +0 -62
  453. package/src/model/trellis-wide-prefill.ts +0 -94
  454. package/src/model/turboquant-codec.ts +0 -83
  455. package/src/model/universal/archs.ts +0 -332
  456. package/src/model/universal/dense.ts +0 -612
  457. package/src/model/universal/modules.ts +0 -170
  458. package/src/model/universal/rope.ts +0 -381
  459. package/src/native/expert_io.c +0 -523
  460. package/src/native/frame_extract.swift +0 -140
  461. package/src/native-pack.ts +0 -162
  462. package/src/pi-provider.ts +0 -53
  463. package/src/pi-session.ts +0 -81
  464. package/src/pi-terminal.ts +0 -274
  465. package/src/pi-web.ts +0 -1932
  466. package/src/preflight.ts +0 -158
  467. package/src/prompt-cache.ts +0 -460
  468. package/src/quantize/allocator.ts +0 -627
  469. package/src/quantize/atomic-output.ts +0 -38
  470. package/src/quantize/calibration.ts +0 -181
  471. package/src/quantize/config-writer.ts +0 -145
  472. package/src/quantize/index.ts +0 -84
  473. package/src/quantize/job.ts +0 -162
  474. package/src/quantize/quantizer.ts +0 -666
  475. package/src/quantize/rotate.ts +0 -603
  476. package/src/quantize/safetensors-writer.ts +0 -249
  477. package/src/quantize/sensitivity.ts +0 -216
  478. package/src/quantize/trellis.ts +0 -586
  479. package/src/quantize/weight-transform.ts +0 -292
  480. package/src/registry.ts +0 -602
  481. package/src/runtime-config.ts +0 -81
  482. package/src/safetensors.ts +0 -158
  483. package/src/sampler.ts +0 -1011
  484. package/src/serve/admin-routes.ts +0 -184
  485. package/src/serve/assets/curve-terrain.html +0 -105
  486. package/src/serve/assets/training-inference-map.html +0 -575
  487. package/src/serve/aux-routes.ts +0 -132
  488. package/src/serve/batch-scheduler.ts +0 -8
  489. package/src/serve/checkpoint-identity.ts +0 -64
  490. package/src/serve/generation-gateway.ts +0 -496
  491. package/src/serve/isolate.ts +0 -609
  492. package/src/serve/kv-budget.ts +0 -14
  493. package/src/serve/lab-routes.ts +0 -341
  494. package/src/serve/lane-registry.ts +0 -45
  495. package/src/serve/model-admin-routes.ts +0 -155
  496. package/src/serve/model-binding.ts +0 -43
  497. package/src/serve/model-host.ts +0 -511
  498. package/src/serve/parent-application.ts +0 -56
  499. package/src/serve/prompt-response-trace.ts +0 -147
  500. package/src/serve/response-lease.ts +0 -24
  501. package/src/serve/session-search.ts +0 -326
  502. package/src/serve/static-routes.ts +0 -101
  503. package/src/server.ts +0 -1314
  504. package/src/spec/assistant-rows.ts +0 -92
  505. package/src/spec/assistant-source.ts +0 -126
  506. package/src/spec/cache-identity.ts +0 -22
  507. package/src/spec/deepspec-rows.ts +0 -29
  508. package/src/spec/deepspec-source.ts +0 -145
  509. package/src/spec/dflash-source.ts +0 -149
  510. package/src/spec/drafter.ts +0 -304
  511. package/src/spec/dspark/ab-stats.ts +0 -136
  512. package/src/spec/dspark/calibration.ts +0 -112
  513. package/src/spec/dspark/data-dflash.ts +0 -156
  514. package/src/spec/dspark/data.ts +0 -201
  515. package/src/spec/dspark/deepspec-module.ts +0 -776
  516. package/src/spec/dspark/generate-dflash.ts +0 -245
  517. package/src/spec/dspark/generate.ts +0 -290
  518. package/src/spec/dspark/loader.ts +0 -23
  519. package/src/spec/dspark/loss.ts +0 -213
  520. package/src/spec/dspark/module-dflash.ts +0 -560
  521. package/src/spec/dspark/module.ts +0 -540
  522. package/src/spec/dspark/quantize-drafter.ts +0 -91
  523. package/src/spec/dspark/sample.ts +0 -112
  524. package/src/spec/generate.ts +0 -276
  525. package/src/spec/glm52-mtp-graph.ts +0 -29
  526. package/src/spec/glm52-mtp-rows.ts +0 -132
  527. package/src/spec/glm52-mtp-source.ts +0 -317
  528. package/src/spec/glm52-mtp-state.ts +0 -33
  529. package/src/spec/ngram-source.ts +0 -204
  530. package/src/spec/projected-draft-rows.ts +0 -73
  531. package/src/spec/qwen-mtp-module.ts +0 -171
  532. package/src/spec/qwen-mtp-rows.ts +0 -219
  533. package/src/spec/qwen-mtp-source.ts +0 -383
  534. package/src/spec/qwen-mtp-state.ts +0 -30
  535. package/src/spec/serve-loop.ts +0 -585
  536. package/src/spec/source.ts +0 -215
  537. package/src/spec/two-model-rows.ts +0 -61
  538. package/src/spec/two-model.ts +0 -113
  539. package/src/ssd-cache.ts +0 -372
  540. package/src/ssd-durability.ts +0 -211
  541. package/src/tokenizer.ts +0 -335
  542. package/src/tool-approvals.ts +0 -131
  543. package/src/tool-call.ts +0 -695
  544. package/src/train/dataset.ts +0 -484
  545. package/src/train/diffusion-lora.ts +0 -216
  546. package/src/train/export.ts +0 -32
  547. package/src/train/flash-cce.ts +0 -1234
  548. package/src/train/forward.ts +0 -266
  549. package/src/train/fuse.ts +0 -243
  550. package/src/train/index.ts +0 -46
  551. package/src/train/job.ts +0 -205
  552. package/src/train/lora-params.ts +0 -254
  553. package/src/train/loss.ts +0 -1591
  554. package/src/train/merge.ts +0 -195
  555. package/src/train/optimizer.ts +0 -183
  556. package/src/train/prefix-shared.ts +0 -490
  557. package/src/train/rank.ts +0 -137
  558. package/src/train/segmented.ts +0 -1828
  559. package/src/train/steel-qmm-header.ts +0 -1461
  560. package/src/train/trainer.ts +0 -1221
  561. package/src/train/watch.ts +0 -542
  562. package/src/vision/diffusion-vision.ts +0 -620
  563. package/src/vision/embedder.ts +0 -168
  564. package/src/vision/preprocess.ts +0 -247
  565. package/src/vision/prompt.ts +0 -373
  566. package/src/vision/qwen3vl-preprocess.ts +0 -409
  567. package/src/vision/qwen3vl-prompt.ts +0 -196
  568. package/src/vision/qwen3vl-tower.ts +0 -555
  569. package/src/vision/siglip.ts +0 -599
  570. package/src/vision/video-frames.ts +0 -148
  571. package/src/web/app.html +0 -2143
  572. package/src/web/app.js +0 -5703
  573. package/src/web/skills/memory/SKILL.md +0 -120
  574. package/src/web/skills/web-research/SKILL.md +0 -46
  575. package/src/web/skills.ts +0 -97
  576. package/src/web/src/adapters-panel.ts +0 -288
  577. package/src/web/src/assistant.ts +0 -451
  578. package/src/web/src/chat.ts +0 -1057
  579. package/src/web/src/composer.ts +0 -959
  580. package/src/web/src/dataset.ts +0 -132
  581. package/src/web/src/finetune.ts +0 -267
  582. package/src/web/src/hub.ts +0 -428
  583. package/src/web/src/main.ts +0 -98
  584. package/src/web/src/markdown.ts +0 -0
  585. package/src/web/src/memory-panel.ts +0 -572
  586. package/src/web/src/model-picker.ts +0 -159
  587. package/src/web/src/palette.ts +0 -346
  588. package/src/web/src/protocol.ts +0 -26
  589. package/src/web/src/quantize.ts +0 -167
  590. package/src/web/src/rag.ts +0 -274
  591. package/src/web/src/sessions.ts +0 -469
  592. package/src/web/src/shell.ts +0 -804
  593. package/src/web/src/ui-catalog.ts +0 -78
  594. package/src/web/vendor/README.md +0 -61
  595. package/src/web-assets.ts +0 -47
  596. package/src/web-tools.ts +0 -478
  597. package/src/weights.ts +0 -255
  598. /package/src/{serve → server}/completion-sink.ts +0 -0
  599. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  600. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  601. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,224 +0,0 @@
1
- # DSpark — handoff
2
-
3
- **State (2026-07-06): the DSpark paper is CODE-COMPLETE and serve-integrated.**
4
- Architecture proven correct (overfit τ=3.24, paper-range); serve-integrated
5
- behind `--draft-model` (Phase 1 — the `DraftSource` seam is KV-borrowing-ready;
6
- sibling AssistantSource verified bit-lossless on real weights,
7
- `tests/spec-serve-assistant.test.ts`); and every remaining paper component
8
- landed in Phase 2 the same day: Alg-1 confidence-scheduled draft-length pruning
9
- (checkpoint-driven, zero change for uncalibrated checkpoints), STS calibration
10
- (§3.2.1, `calibration.ts` + `scripts/dspark-calibrate.ts`), the RNN sequential
11
- head (Eq 6, `--seq-head rnn`, init-equivalent to Markov), the tightened draft
12
- loop (on-device token chaining + deferred conf reads + `collectLogits:false`
13
- on serve — bit-identity pinned), and the `dspark` variant rename + central
14
- loader. Suites: smoke 21/21 · dspark tests 17/17 · adjacent server suites
15
- green. **What remains is exactly the GPU work below** — data scale + 12B
16
- retarget + train + calibrate + measure; e4b not netting a speedup is a
17
- data/target-speed problem, not architecture. Full design:
18
- [docs/design/dspark-speculative-decoding.md](../design/dspark-speculative-decoding.md).
19
-
20
- ## PATH A (preferred, no training) — DeepSeek's published 12B drafter
21
-
22
- DeepSeek released a TRAINED drafter for our exact target:
23
- `deepseek-ai/dspark_gemma4_12b_block7` (6.86 GB bf16, γ=7; DeepSpec repo is
24
- the MIT reference impl + the oracle — see the "DeepSpec ground truth" section
25
- of the design doc). Once the deepspec-variant port lands:
26
-
27
- ```sh
28
- # 1. download the trained drafter (~6.9 GB)
29
- mlx-bun get deepseek-ai/dspark_gemma4_12b_block7
30
- # 2. oracle gate: dump their reference trace (temp 0 = RNG-free deterministic)
31
- # in a torch venv, then compare ours round-for-round (scripts staged)
32
- # 3. measure + serve (auto-detected via config.json architectures field)
33
- mlx-bun serve --model gemma-4-12B-it-OptiQ-4bit --draft-model <snapshot-of-dspark_gemma4_12b_block7>
34
- ```
35
-
36
- ### Oracle protocol (step 2, expanded)
37
-
38
- Two staged scripts implement the temp-0 deterministic trace protocol against
39
- DeepSpec's own reference implementation (github.com/deepseek-ai/DeepSpec, MIT).
40
- At temperature 0 their leaky-rejection verify degenerates to exact argmax
41
- token-match — the whole round trace is RNG-free and reproducible, so a
42
- plain round-for-round diff is a real bit-exact gate (same discipline as the
43
- D2 diffusion oracle, minus RNG parity entirely — see the design doc's
44
- "DeepSpec ground truth" section).
45
-
46
- ```sh
47
- # a. dump the reference trace — needs its OWN torch venv (NOT the mlx-lm
48
- # oracle venv at /Users/joshrossi/Code/mlx-lm/.venv, which has no
49
- # torch/deepspec and shouldn't); see the script header for the exact
50
- # venv-setup + pip install steps.
51
- .venv-deepspec/bin/python scripts/oracle-dspark-deepspec.py \
52
- --target <snapshot-dir-of-google/gemma-4-12B-it> \
53
- --drafter <snapshot-of-dspark_gemma4_12b_block7> \
54
- --data prompts.jsonl --n 8 --max-new-tokens 128 \
55
- --temperature 0 --confidence-threshold 0 \
56
- --out goldens/dspark-deepspec/trace-thr0.jsonl
57
-
58
- # b. compare our port round-for-round
59
- bun scripts/dspark-deepspec-compare.ts \
60
- --fixture goldens/dspark-deepspec/trace-thr0.jsonl \
61
- --target gemma-4-12B-it-bf16 --drafter <snapshot-of-dspark_gemma4_12b_block7>
62
- ```
63
-
64
- Run the pair twice — once at `--confidence-threshold 0` (no pruning), once at
65
- `0.5` — to gate both the base draft loop and the confidence-truncation path.
66
-
67
- Fixture location: `goldens/dspark-deepspec/*.jsonl` follows the house
68
- manifest convention (goldens/README.md) — these are machine-independent
69
- **JSON manifests** (prompts + token-id traces, no tensor blobs), so they are
70
- the **tracked** kind, not the `.bin` machine-specific kind. Regenerate by
71
- rerunning step (a); there is no `scripts/regen-*` wrapper for this family yet
72
- since the oracle run needs its own GPU-hosting torch venv, not the mlx-lm
73
- oracle venv this repo otherwise standardizes on.
74
-
75
- **The OptiQ-4bit caveat is load-bearing, not a footnote**: the fixture above
76
- is generated against the bf16 HF target. A `dspark-deepspec-compare.ts` run
77
- with `--target` pointing at our bf16 12B is the TRUE bit-exact gate. A run
78
- with `--target` pointing at the OptiQ-4bit-quantized 12B we actually serve is
79
- a **separate acceptance-rate measurement** — tapped hiddens differ
80
- numerically at 4-bit, so round-for-round divergence there is expected, not a
81
- bug; pass `--acceptance-only` on that arm so the script reports an aggregate
82
- accept-length reading instead of a PASS/FAIL assert.
83
-
84
- Caveat: trained against the bf16 HF target; our serving 12B is OptiQ-4bit —
85
- tapped hiddens differ numerically, so measure acceptance rather than assuming
86
- their 60–85%.
87
-
88
- **FIRST LIVE RUN (2026-07-07, loaded machine — directional only):** τ ≈ 2.8
89
- committed/target-forward (200 tok / 72 verify rounds; per-token acceptance
90
- 26–33% — the predicted OptiQ-4bit degradation), output coherent, losslessness
91
- holding. **But wall-clock LOST ~3.4×** (spec 14.6 vs serial 49.8 agg tok/s;
92
- the 20 s bench TTFT is conc-4 queueing on the serial-forced spec lane, not
93
- prefill). The tax is the drafter itself. **The full step-by-step program for
94
- the next pass is
95
- [docs/design/dspark-serving-program.md](../design/dspark-serving-program.md)**
96
- (phases, gates, dependency graph; pickup at TurboQuant merge, only its
97
- Phase 5 waits for it). Lever summary:
98
- 1. **Quantize the drafter** — the big one, and the ideal quantization target
99
- PERIOD: drafter numerics only move ACCEPTANCE, never correctness
100
- (losslessness is structural), so aggressive bpw is safe and the gate is a
101
- single acceptance A/B. 6.9 GB bf16 → ~1.8 GB @4-bit kills both the
102
- ~3 GB/round bandwidth tax (2 GB lm_head + 7×134 MB markov_w2 reads) and
103
- the 14 GB two-model memory pressure on 24 GB. Uniform 4-bit (mlx-native)
104
- first as the baseline; **TurboQuant (Phase 13), when it lands, competes
105
- on acceptance-per-byte against that baseline** — the drafter is its
106
- lowest-risk first customer. Enabler either way: quantized-weight support
107
- in deepspec-module's forward (quantized_matmul, the house pattern).
108
- 2. **Tighten deepspec draftBlock** — ~14 host syncs/round (7 argmax + 7
109
- confidence reads); replay the on-device chaining + deferred-conf
110
- tightening already done for our own module (threshold=0 needs NO conf
111
- reads).
112
- 3. **captureLayer in the GENERATED gemma forwards** — tapped verifies
113
- currently fall back to the monolith (correct-but-unspecialized); teach
114
- scripts/gen-model.ts to emit the tap so spec verifies keep the fast path.
115
- 4. **γ sweep** — γ=7 at ~30% acceptance wastes drafts;
116
- `--num-draft-tokens 2..3` may net better wall-clock free of any code.
117
-
118
- ## PATH B — train our own module (custom targets / research)
119
-
120
- The payoff target is **12B** (27B is memory-infeasible to train on 24 GB; the
121
- pipeline stays dim-generic so 27B remains a future recipe). All three scripts
122
- take `--model` and (new, 2026-07-06) `--tap-layers` — the retarget is now a
123
- pure parameterization, no code edits. **`--tap-layers` MUST be identical across
124
- regen and train** (the shard feature dim is `m*H`, `m = tapLayers.length`).
125
-
126
- 12B tap set: use **`5,17,29,41,46`** — DeepSeek's actual trained
127
- `target_layer_ids` for this model (their layer-output convention matches our
128
- tapLayers indexing; audited 2026-07-06). Our earlier `24,37,47,48` guess is
129
- superseded.
130
-
131
- ```sh
132
- # 0. one-time: cache the 12B target + a prompt/topic corpus (thousands of
133
- # on-distribution topics — the data-scale lever; 160 only reached per-pos ~0.17).
134
- mlx-bun get mlx-community/gemma-4-12B-it-OptiQ-4bit
135
- # (12B target may need the serve process stopped to free memory for regen.)
136
-
137
- # 1. regen multi-layer training shards from the 12B target's own generations
138
- bun scripts/dspark-regen-dflash.ts \
139
- --model gemma-4-12B-it-OptiQ-4bit --tap-layers 5,17,29,41,46 \
140
- --topics <thousands-of-topics.txt> --out data/dspark-12b --max-resp 320
141
-
142
- # 2. train the drafter against the 12B (warm-start survivable via --resume;
143
- # GPU runs kept getting killed ~step 5000 pre-resume). Optional A/B:
144
- # --seq-head rnn trains the Eq-6 RNN head instead of Markov (Eq 5).
145
- bun scripts/dspark-train-dflash.ts \
146
- --model gemma-4-12B-it-OptiQ-4bit --tap-layers 5,17,29,41,46 \
147
- --data data/dspark-12b --out ckpt/dspark-12b \
148
- --iters 8000 --batch 8 [--seq-head rnn] [--ddraft 2560] [--resume ckpt/dspark-12b]
149
-
150
- # 3. STS-calibrate (§3.2.1): fit per-position confidence thresholds on real
151
- # verify outcomes and stamp them into dspark.json — this ACTIVATES the
152
- # Alg-1 confidence scheduler at decode (uncalibrated = fixed-γ, no change).
153
- bun scripts/dspark-calibrate.ts \
154
- --model gemma-4-12B-it-OptiQ-4bit \
155
- --drafter ckpt/dspark-12b --data <prompts.jsonl> [--target 0.5]
156
-
157
- # 4. measure live τ + tok/s vs vanilla 12B decode (clean machine — dirty
158
- # numbers are garbage). Run BOTH pre- and post-calibration for the
159
- # scheduler's own A/B (MLX_BUN_DSPARK_MINCONF=<c> = manual uniform knob).
160
- bun scripts/dspark-measure-dflash.ts \
161
- --model gemma-4-12B-it-OptiQ-4bit \
162
- --drafter ckpt/dspark-12b --data <prompts.jsonl>
163
-
164
- # 5. serve it (auto-detected as kind=dspark via dspark.json; γ pinned to cfg.gamma)
165
- mlx-bun serve --model gemma-4-12B-it-OptiQ-4bit --draft-model ckpt/dspark-12b
166
- ```
167
-
168
- Decision gate (write it down, RESULTS.md only if clean-machine): does 12B live
169
- τ net a wall-clock win? If the draft loop dominates, do the loop-tightening
170
- (per-position host syncs + double 262K LM-head) first — see the open items in
171
- the design doc. Memory guard (`server.ts`) caps context to fit; a client
172
- sending huge `max_tokens` trips admission — lower it.
173
-
174
- ## What happened (short version)
175
- - Built v1 first as a single-vector shortcut — it dropped the paper's core KV
176
- injection and was never really DSpark. Chunk (τ≈1.26) and article (τ≈1.16)
177
- runs on it were misleading.
178
- - Rebuilt the **faithful** DFlash (multi-layer H_ctx injected into every draft
179
- layer, 5 layers) in parallel `*-dflash.ts` files (v1 kept as baseline; repo
180
- stays green).
181
- - Found + fixed an **off-by-one in the p^t target** (TV loss trained against a
182
- distribution shifted one token — present in v1 too, so all prior τ were bogus).
183
- - **Overfit test settled it:** 3 articles, eval on same → per-pos ~0.75, τ=3.24.
184
- The architecture reaches the paper's numbers; the plateau at ~0.17 on 160
185
- articles is data-starvation, not capacity (confirmed: width 1024 vs 2560 both
186
- plateau ~0.17).
187
- - **Target-speed is the other half.** Measured decode: e4b 45.9, 12b 27.5, 27B
188
- ~15 tok/s. The fixed draft overhead only amortizes on a slow target — so e4b
189
- is ~worst-case for spec decode; the **27B agentic workload is the real target**
190
- (τ≈3 there could plausibly net ~2–3× → 15 → ~35–45 tok/s).
191
-
192
- ## Verified / working
193
- - Parity-safe `hiddenTap` multi-layer extraction (`gemma4.ts`), no-op when off.
194
- - `trim(n, bypass=true)` physical-slice rollback past the sliding window (`gemma4-base.ts`) — lossless gate held on 6K context.
195
- - CPU smoke 16/16 (`dspark-dflash-smoke.ts`): KV-injection forward, autograd, inference, multi-layer variable-context data round-trip.
196
- - Training `--resume` (warm-start from checkpoint) — the GPU runs kept getting killed ~step 5000; resume survives that.
197
-
198
- ## Next (in priority order)
199
- 1. **Retarget to 12B + scale data + train + calibrate + measure** — the GPU
200
- recipe above is the complete remaining work. (27B stays a future recipe:
201
- memory-infeasible to train on the 24 GB M4 Pro.)
202
- 2. ~~Tighten the draft inference loop~~ **DONE 2026-07-06** (on-device token
203
- chaining, deferred conf reads, `collectLogits:false`; bit-identity pinned).
204
- 3. ~~Finish the paper~~ **DONE 2026-07-06**: RNN head (Eq 6, `--seq-head rnn`),
205
- STS calibration (§3.2.1), Alg-1 confidence-scheduled draft-length pruning
206
- (single-user form). ⚠ Eq 6 + §3.2.1 shapes are design-doc-faithful readings
207
- (paper PDF absent) — verify against the paper when available.
208
- 4. ~~Rename `dflash`→`dspark`~~ **DONE 2026-07-06** (canonical variant +
209
- central loader `src/spec/dspark/loader.ts`; legacy stamps still load).
210
-
211
- ## Key files
212
- `src/spec/dspark/{module,data,generate}-dflash.ts`, `{loss,sample,calibration,loader}.ts`;
213
- `src/spec/{source,serve-loop,dflash-source,assistant-source}.ts` (the serve seam);
214
- `src/model/gemma4.ts` (hiddenTap), `gemma4-base.ts` (trim bypass);
215
- `scripts/dspark-{regen,train,measure}-dflash.ts`, `dspark-dflash-smoke.ts`.
216
-
217
- ## Memory / gotchas
218
- - `dspark-drafter-built-v1`, `dont-inflate-scope-build-the-paper` (the lesson:
219
- build the paper's mechanism first — the faithful build was ~1hr; the wrong
220
- builds cost the session).
221
- - e4b hidden_size = **2560** (not 2816 — a different config block). Module reads dims live.
222
- - Memory admission guard (`server.ts:1538`) rejects `prompt+max_tokens > maxSafeContext`
223
- because a mid-gen GPU OOM SIGKILLs the server. 27B/32GB caps ~22.5k; a client
224
- sending `max_tokens=64k` trips it — lower max_tokens (or make it a runtime stop).
@@ -1,292 +0,0 @@
1
- # Expert offload for single-user local MoE — findings + design sketch
2
-
3
- *2026-06-14. Research spike. Question: can Apple's AFM-3 "flash-resident
4
- experts" idea (Instruction-Following Pruning) be applied to the MoE models
5
- we already run, to stop the inactive experts from squatting in RAM? Sources:
6
- Apple AFM-3 blog + IFP (arXiv 2501.02086) + LLM-in-a-flash (2312.11514);
7
- MoE-offload prior art (Mixtral-offloading 2312.17238, Fiddler 2402.07033,
8
- KTransformers SOSP'25, llama.cpp `--n-cpu-moe`). Grounded against PLAN
9
- Phase 6 (MoE bring-up, measured), Phase 8 (LoRA hot-swap, shipped),
10
- Phase 14 (Qwen 35B-A3B fit-table line), Phase 18 (slots).*
11
-
12
- ---
13
-
14
- ## 0. TL;DR
15
-
16
- A trained MoE already activates a tiny fraction of its weights per token, but
17
- we currently hold **all** experts resident — measured at 14.09 GB of expert
18
- pool to use ~0.9 GB/token on `gemma-4-26B-A4B` (PLAN Phase 6). Those cold
19
- experts are read-only and rarely touched; the KV cache is hot, dirty, and
20
- un-offloadable. The hardware is telling us which one goes to disk.
21
-
22
- The catch with Apple's approach — it needs **task locality** (you can't swap
23
- experts per token across the flash bus, only per prompt/period) — is the exact
24
- property **single-user local AI gives us for free**: one human works on one
25
- kind of thing for minutes-to-hours at a time. A multi-tenant server can't
26
- promise that; a personal appliance can. So this is a feature that fits *our*
27
- product identity specifically.
28
-
29
- Two payoffs from one residency manager:
30
- 1. **Shrink a model that already fits**: 26B-A4B from ~16.4 GB resident →
31
- ~4–6 GB, returning ~10 GB to KV-context-length and to the user's other
32
- apps. (Today the 26B leaves ~0 GB for anything else — see §2.)
33
- 2. **Admit a model that doesn't fit**: e.g. a 35B-A3B class model on 24 GB,
34
- flipping PLAN Phase 14's "larger hardware only" line into "fits, with a
35
- domain-switch warm-up cost."
36
-
37
- **What's already done (de-risks this a lot):** the MoE forward is bit-exact
38
- today (Phase 6, `gather_qmm`, `tests/moe-ops.test.ts`). The missing piece is
39
- *only* the memory-tiering layer — not a new architecture.
40
-
41
- ---
42
-
43
- ## 0.5 Empirical findings — the mechanism is de-risked (2026-06-14)
44
-
45
- Two probes on the M4 Pro (`scripts/probe-expert-residency.ts`,
46
- `scripts/probe-mmap-gather.ts`) turned the design from a sketch into a verified
47
- mechanism. Three results:
48
-
49
- 1. **Disposing MLX *device* buffers does NOT reliably return RAM to the OS.**
50
- In the controlled case, allocating a 512 MB array and then calling
51
- `dispose()` *and* `clearCache()` moved `rss` not one byte; `cache_memory`
52
- read 0 throughout. So a **fixed device-buffer slot pool is the wrong
53
- mechanism** — it can hold *less*, but it can't give RAM *back* when idle,
54
- which is the whole point.
55
- 2. **The mmap clean-page path returns RAM to the OS deterministically.**
56
- `munmap` of a mapped region dropped `rss` by exactly the mapped size
57
- (−1 GB, and −2 GB at scale). This is the elastic-eviction substrate, and
58
- it's exactly what expert weights are: read-only files.
59
- 3. **The GPU gathers straight from a page-aligned mmap, bit-exact.** GPU
60
- `gather_qmm` reading a quantized expert directly from a 16 KB-page-aligned
61
- mmap (at a realistic non-zero offset) was **bit-exact** vs the same weights
62
- resident (`max|diff| = 0`, no NaN). The Phase-1 "GPU reads garbage from
63
- unaligned wrapped pointers" hazard is avoided purely by page alignment — so
64
- we need **no copy into (sticky) device buffers** at all.
65
-
66
- **Revised design (supersedes the "materialize into resident MLX buffers / slot
67
- pool" framing in §5):** bit-exact transparent offload where expert weights live
68
- as **page-aligned, mmap-backed clean file pages** — a miss *maps* the region
69
- (GPU gathers from it directly), eviction *unmaps* it (`munmap`/
70
- `madvise(DONTNEED)`). Idle footprint collapses toward the core; a cold expert
71
- is just an unmapped clean region re-faulted from SSD when routing asks. The one
72
- requirement this forces: a one-time conversion to an **offload-ready expert
73
- file** with each expert's weight/scales/biases starting on a page boundary
74
- (safetensors packs them contiguously; the registry already scans the per-expert
75
- byte offsets).
76
-
77
- ---
78
-
79
- ## 1. What Apple actually does — and what's portable
80
-
81
- Apple's AFM-3 "Core Advanced" is **two separable things**, and only one is
82
- bolt-on:
83
-
84
- - **Portable (inference-time runtime):** store the model in flash, stream only
85
- the needed experts into DRAM, manage a resident working set. This is a
86
- memory-management strategy — adoptable.
87
- - **NOT portable (trained architecture):** the *per-prompt routing* that makes
88
- it work is **Instruction-Following Pruning** — a predictor co-trained
89
- end-to-end with the base weights so the model is *prunable by prompt*. The
90
- base weights are updated during training. You cannot bolt IFP onto a
91
- finished model, and trained-MoE experts are **not** human-interpretable by
92
- task ("expert 7 = Python" is a myth). LLM-in-a-flash additionally needs a
93
- ReLU-sparse FFN (a relufication fine-tune for SiLU/GeGLU models).
94
-
95
- **Why per-prompt, not per-token:** flash→DRAM is ~1 GB/s on a phone vs ~100
96
- GB/s DRAM — a standard token-routed MoE would thrash the bus, so Apple decides
97
- the expert set once per prompt and freezes it. We don't need to copy the
98
- *mechanism* (we have unified memory + a fast SSD, not a 1 GB/s phone bus); we
99
- need the *insight* — amortize expert movement over a span where the working
100
- set is stable.
101
-
102
- ---
103
-
104
- ## 2. The memory problem, measured
105
-
106
- On the M4 Pro (24 GB), a real desktop commits memory before the model loads:
107
- macOS baseline ~4–6 GB, plus a working set of Chrome + IDE + Slack + Claude
108
- Desktop + Mail + WhatsApp + Calendar ≈ 6–10 GB. That is ~10–16 GB gone before
109
- inference.
110
-
111
- `gemma-4-26B-A4B-OptiQ-4bit`, measured (PLAN Phase 6):
112
- - **16.4 GB resident**, of which **14.09 GB is the expert pool**.
113
- - **~0.9 GB of experts read per token** (top_k/num_experts of the pool). The
114
- other ~13 GB is resident-but-idle on any given token — the squat.
115
- - KV is *not* the hog for this model: 5/30 global layers, 2 global KV heads,
116
- Gemma sliding window ⇒ max safe context ~17.6k at bf16 KV, gated by the
117
- weight footprint, not the cache. (KV bites harder on longer contexts or
118
- models with fatter global attention; the tiering principle below still
119
- holds, but for *this* model the experts are unambiguously the target.)
120
-
121
- So today the 26B leaves ~0 GB for apps and limits context to ~17.6k — and that
122
- is the *good* case (a model that fits at all).
123
-
124
- **The tiering principle.** Rank everything that wants RAM by access-frequency ×
125
- mutability:
126
-
127
- | What | Touched | Mutable | Belongs |
128
- |---|---|---|---|
129
- | KV cache | every token | read **+ write**, per-session dirty | resident — cannot offload (only quantize) |
130
- | Attention / embeddings / shared experts | every token | read-only | resident |
131
- | Active routed experts | ~top_k/N per token | read-only | resident working set + LRU |
132
- | Cold routed experts | rarely, this token | read-only, **clean file pages** | **SSD** — the natural victim |
133
-
134
- The current layout is backwards: it spends the fast tier on the coldest data.
135
- Cold experts are read-only and clean (cheap to evict / re-read); KV is dirty
136
- and hot (must stay). Two orthogonal levers compose along this split — quantized
137
- KV shrinks the hot tier (Phase 9, shipped), expert offload shrinks the cold
138
- tier (this note).
139
-
140
- ---
141
-
142
- ## 3. The personal-AI insight: task locality is the unlock
143
-
144
- Per-prompt/period expert selection only avoids thrash if the working set is
145
- stable across that span. That is false for a topic-hopping chat and false for a
146
- multi-tenant server — but **true for one human doing one job**: two hours of
147
- coding, then a session reorganizing a 5,000-doc wiki. Within a task the hot
148
- expert set is stable; you pay a re-warm only at task boundaries.
149
-
150
- This is structurally the **same shape as the LoRA adapter system we already
151
- ship** (Phase 8): one resident base model, the calling app declares intent
152
- ("use the coding fine-tune") via `/v1/adapters` + `adapterScoped()` in
153
- `src/lora.ts` / `src/generate.ts`. Expert offload reuses that surface: the app
154
- declares a *domain*, and the residency manager warms the experts that domain
155
- has historically hit. The difference from LoRA: a hint, not a hard mount —
156
- misses fall through to SSD (see §4), so correctness never depends on the hint.
157
-
158
- **Scope boundary (important):** this is a single-user / single-active-task
159
- feature. Under Phase 18 concurrent slots with diverse requests the locality
160
- guarantee disappears — in that mode experts should stay resident (or accept
161
- thrash). Don't combine the two naively; keep offload files separate from the
162
- batch/slots work, per the slots discipline.
163
-
164
- ---
165
-
166
- ## 4. The correctness fork
167
-
168
- Two designs, very different parity implications:
169
-
170
- - **A — Transparent offload (BIT-EXACT).** Cold experts on SSD; materialize
171
- whichever experts routing picks into a resident buffer before `gather_qmm`;
172
- hot LRU cache. Output is identical to today's all-resident path — same
173
- `gather_qmm`, same tokens — only latency varies on a miss. Stays L1/L2. This
174
- is the foundation.
175
- - **B — Task-pinned routing (LOSSY).** Restrict routing to a pinned set and
176
- skip cold experts → zero misses, lower latency, but the computation changed →
177
- L3, KL-gated, default-off. This is the closest off-the-shelf analog to IFP's
178
- select-and-freeze, and it's quality-risky on weights trained for per-token
179
- routing.
180
-
181
- **Recommendation:** ship A as the always-correct floor; layer the §3 domain
182
- hint as a *prefetch* on top of A (warms the likely set, still bit-exact because
183
- misses fall to SSD). Offer B only as an opt-in mode for users who'll trade a
184
- little quality to eliminate switch latency — and keep it as a documented
185
- default-off flag, never the only path (per the "don't delete optionality"
186
- principle).
187
-
188
- ---
189
-
190
- ## 5. Proposed architecture
191
-
192
- Layered, each layer independently useful and independently gated:
193
-
194
- 1. **Offload-ready expert file (page-aligned).** A one-time conversion stores
195
- each expert's packed weight/scales/biases starting on a 16 KB page boundary
196
- (safetensors packs them contiguously; the registry already scans the per-
197
- expert byte offsets). This is what lets the GPU gather straight from the
198
- mmap — confirmed bit-exact in §0.5.
199
- 2. **Residency manager (mmap-backed).** Per (layer, expert) state: `unmapped`
200
- (clean on SSD) / `mapped`. A miss maps the expert's page-aligned region
201
- (`MlxArray.fromView` over the mmap) and the GPU gathers from it directly —
202
- **no copy into device buffers** (§0.5 showed those don't reliably return to
203
- the OS). Eviction = `munmap`/`madvise(DONTNEED)`, which returns RAM to the
204
- OS deterministically. Attention + embeddings + shared experts stay pinned;
205
- LRU over the mapped expert set under a byte budget. Default = everything
206
- mapped (inert, like the slots flag), opt-in via `--expert-offload`.
207
- 3. **Domain prefetch (the LoRA-shaped surface).** Per-session/request `domain`
208
- hint → prefetch that domain's profiled hot-set. Profiles are per-user,
209
- persisted, updated online from observed routing (ties into the memory
210
- flywheel). No hint ⇒ pure adaptive cache (still works, just pays re-warm at
211
- task boundaries).
212
- 4. **(Optional) Pinned mode (B).** Hard-restrict routing to the warm set; L3
213
- gated; default-off.
214
-
215
- Correctness is preserved at layers 1–3 by construction: we always compute with
216
- the experts routing actually selected; offload changes *where weights live and
217
- when they arrive*, not *what is computed*.
218
-
219
- ---
220
-
221
- ## 6. The two payoffs, quantified where we can
222
-
223
- - **Shrink the 26B (already fits):** resident floor after offload ≈ non-expert
224
- (16.4 − 14.09 ≈ 2.3 GB) + active working set + a hot cache. With a ~2–3 GB
225
- hot cache that's ~5–6 GB resident vs 16.4 GB today → ~10 GB returned to KV
226
- context length and to the user's apps. Decode cost is the unknown to measure
227
- (§7).
228
- - **Admit a 35B-A3B (doesn't fit):** characterize as a fit-table row today
229
- (Phase 14), then show it runs usable with offload; the domain-switch warm-up
230
- is the price. This *changes* the Phase 14 line.
231
-
232
- All tok/s figures here are **unmeasured** until §7 runs on a cleared machine —
233
- treat as hypotheses, not promises.
234
-
235
- ---
236
-
237
- ## 7. Tradeoffs and the load-bearing unknown
238
-
239
- - **The #1 thing to measure: per-task expert skew.** Does a coding session
240
- actually concentrate its routing on a stable subset, and how big is it? If
241
- the hot ~50% of experts covers ≥90% of activations and is stable within a
242
- task, the whole idea works; if routing is near-uniform per task, it doesn't.
243
- This is empirical and unknown — measure before building anything else.
244
-
245
- **E0 result (scripted, 2026-06-14 — `scripts/run-expert-trace.ts`, 8 prompts
246
- × coding/writing/chat on the 26B): gate PASSES all three.** 90% of
247
- activations land on ~40–47% of experts (51/53/60 of 128; uniform ≈ 90%) —
248
- concentrated but moderate. Within-task stability (hot-set Jaccard over 4
249
- windows) 0.63–0.70. Unique experts touched over ~1.2k tokens: 81–85% of the
250
- 3840 instances → the *touched* working set is large (~12 GB) even though
251
- *activations* concentrate. Cross-task: coding vs prose 0.42–0.44
252
- (specialised — domain prefetch pays), writing vs chat 0.68 (similar). Net:
253
- bit-exact offload realistically frees ~6–7 GB (resident ~9–10 GB vs 16.4),
254
- keeping the 90% hot set resident and re-faulting the rare tail — the exact
255
- footprint-vs-miss-rate curve is E1's measurement, not an E0 promise. Caveat:
256
- scripted short sessions; a real long focused session may tighten or broaden
257
- the curve — worth a confirming real-session trace before locking a budget.
258
- - **Switch cost.** = (bytes that must become newly resident) / SSD bandwidth
259
- (~5–7 GB/s) + dequant + buffer setup. Pure I/O floor for a few-GB working set
260
- is single-digit seconds; the conservative "30–60 s" budget leaves room for
261
- dequant/repack and a near-total set change. Measure the real number; it
262
- depends on how much the hot set overlaps between domains.
263
- - **Miss latency on the bit-exact path.** A cold expert miss is a synchronous
264
- SSD read on the decode critical path; bounded by ~7 GB/s × miss-rate. Hot
265
- cache + domain prefetch are what keep miss-rate low.
266
- - **Not for multi-tenant serving** (§3 scope boundary).
267
-
268
- ---
269
-
270
- ## 8. Phased plan (proposed — for promotion into PLAN.md)
271
-
272
- - **E0 — Measurement spike (no runtime risk).** Instrument the existing MoE
273
- forward to log per-(layer,expert) selection over real coding / writing / chat
274
- sessions. Produce the coverage curve (% experts covering 90/95/99% of
275
- activations), within-task stability, and cross-task set shift. **Gate to
276
- proceed:** hot-set coverage + stability good enough that offload pays. This
277
- is the make-or-break, and it's pure observation.
278
- - **E1 — Transparent offload (bit-exact).** Expert store + residency manager +
279
- on-demand materialization + hot LRU, behind `--expert-offload` (default off /
280
- inert). **Parity gate:** bit-exact vs current all-resident (L1/L2 unchanged).
281
- Measure resident footprint + decode tok/s vs miss-rate on a cleared machine.
282
- - **E2 — Domain prefetch (LoRA-shaped).** Per-session `domain` hint reusing the
283
- adapter surface; per-user profile, learned online. Still bit-exact. Measure
284
- cold-start vs warm latency and task-boundary switch cost.
285
- - **E3 — Admit a non-fitting model.** Bring a 35B-A3B-class model up under
286
- offload; show usable serving on 24 GB; flip the Phase 14 fit-table line.
287
- - **E4 — (Optional) Pinned mode.** L3 KL-gated, default-off flag; only where the
288
- quality delta is acceptable.
289
-
290
- **Exit criterion (overall):** 26B-A4B served at bit-exact parity with resident
291
- footprint cut to a measured target, leaving a usable machine, with a quantified
292
- domain-switch cost — promoted into `benchmarks/RESULTS.md`.