mlx-bun 0.5.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 (640) hide show
  1. package/README.md +1449 -109
  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 +7 -5
  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 +10 -10
  78. package/src/{serve → server}/chat-stage.ts +14 -14
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +33 -41
  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 +25 -82
  85. package/src/{serve → server}/http.ts +25 -13
  86. package/src/{serve → server}/inference-request.ts +5 -5
  87. package/src/server/job-routes.ts +20 -0
  88. package/src/server/media-prompt.ts +63 -0
  89. package/src/server/memory-completion-client.ts +46 -0
  90. package/src/server/model-routes.ts +192 -0
  91. package/src/{serve → server}/openai-wire.ts +3 -2
  92. package/src/{serve → server}/pipeline.ts +1 -1
  93. package/src/server/prompt-builder.ts +13 -0
  94. package/src/server/prompt-contracts.ts +17 -0
  95. package/src/server/proxy-routes.ts +187 -0
  96. package/src/server/publishing-routes.ts +41 -0
  97. package/src/{serve → server}/request-plan.ts +6 -8
  98. package/src/{serve → server}/request-prep.ts +47 -50
  99. package/src/{serve → server}/responses-client.ts +30 -13
  100. package/src/{responses.ts → server/responses.ts} +12 -93
  101. package/src/server/routes.ts +205 -0
  102. package/src/server/start.ts +72 -0
  103. package/src/server/status-routes.ts +108 -0
  104. package/src/{serve → server}/text-completion-stage.ts +25 -4
  105. package/src/server/text-prompt.ts +12 -0
  106. package/src/{serve → server}/token-streams.ts +36 -38
  107. package/src/server/worker-routes.ts +311 -0
  108. package/src/storage/paths.ts +61 -0
  109. package/src/web/assets.ts +37 -0
  110. package/src/web/{src → browser}/api.ts +5 -23
  111. package/src/web/browser/chat-host.ts +17 -0
  112. package/src/web/browser/installed-panels.ts +6 -0
  113. package/src/web/browser/main.ts +55 -0
  114. package/src/web/browser/markdown.ts +279 -0
  115. package/src/web/browser/memory-panel.ts +9 -0
  116. package/src/web/browser/palette.ts +64 -0
  117. package/src/web/browser/protocol.ts +13 -0
  118. package/src/web/browser/shell.ts +467 -0
  119. package/src/web/{src → browser}/status.ts +32 -36
  120. package/src/web/build.ts +51 -0
  121. package/src/web/public/app.html +1054 -0
  122. package/src/web/{sw.js → public/sw.js} +4 -3
  123. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  124. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  125. package/THIRD_PARTY_LICENSES.md +0 -51
  126. package/docs/README.md +0 -107
  127. package/docs/archive/hlg-sampling.md +0 -350
  128. package/docs/archive/investigations/audio-input-plan.md +0 -356
  129. package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
  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/release-notes-v0.4.0.md +0 -45
  174. package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
  175. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  176. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  177. package/docs/design/batching.md +0 -2054
  178. package/docs/design/decode-speed-program.md +0 -2404
  179. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  180. package/docs/design/generic-model-support.md +0 -821
  181. package/docs/design/kv-cache.md +0 -993
  182. package/docs/design/orpo-training.md +0 -680
  183. package/docs/design/speculative-decoding.md +0 -2129
  184. package/docs/design/turboquant.md +0 -2225
  185. package/docs/design/unified-engine-frontier-plan.md +0 -1987
  186. package/docs/design/web-chat-redesign.md +0 -695
  187. package/docs/planning/PRODUCT_ROADMAP.md +0 -593
  188. package/docs/planning/ResearchTopics.md +0 -119
  189. package/docs/planning/public-readiness-handoff.md +0 -244
  190. package/docs/planning/public-readiness.md +0 -149
  191. package/docs/planning/video-series.md +0 -421
  192. package/docs/reference/benchmarks.md +0 -3587
  193. package/docs/reference/cli.md +0 -646
  194. package/docs/reference/distribution.md +0 -380
  195. package/docs/reference/environment.md +0 -494
  196. package/docs/reference/glossary.md +0 -39
  197. package/docs/reference/library-api.md +0 -688
  198. package/docs/reference/memory.md +0 -260
  199. package/docs/reference/models.md +0 -346
  200. package/docs/reference/server-api.md +0 -1945
  201. package/docs/reference/server-config.md +0 -973
  202. package/docs/reference/training.md +0 -462
  203. package/docs/reference/troubleshooting.md +0 -158
  204. package/src/admission-plan.ts +0 -18
  205. package/src/audio/audiotoolbox.ts +0 -112
  206. package/src/audio/conformer.ts +0 -655
  207. package/src/audio/decode.ts +0 -133
  208. package/src/audio/features.ts +0 -202
  209. package/src/audio/mic-capture.ts +0 -98
  210. package/src/audio/silero-vad.ts +0 -379
  211. package/src/audio/transcode.ts +0 -67
  212. package/src/audio/whisper-decode.ts +0 -774
  213. package/src/audio/whisper-fast.ts +0 -732
  214. package/src/audio/whisper-format.ts +0 -73
  215. package/src/audio/whisper-mel.ts +0 -185
  216. package/src/audio/whisper-timing.ts +0 -274
  217. package/src/audio/whisper-tokenizer.ts +0 -239
  218. package/src/audio/whisper-transcribe.ts +0 -410
  219. package/src/backends/mlx/assistant-target.ts +0 -46
  220. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  221. package/src/backends/mlx/autoregressive.ts +0 -129
  222. package/src/backends/mlx/batch-group.ts +0 -1874
  223. package/src/backends/mlx/cache-attachment.ts +0 -67
  224. package/src/backends/mlx/cache-layout.ts +0 -31
  225. package/src/backends/mlx/checkpoint-state.ts +0 -53
  226. package/src/backends/mlx/continuation-persistence.ts +0 -107
  227. package/src/backends/mlx/continuation-request.ts +0 -43
  228. package/src/backends/mlx/continuation.ts +0 -77
  229. package/src/backends/mlx/diffusion.ts +0 -39
  230. package/src/backends/mlx/draft-target.ts +0 -32
  231. package/src/backends/mlx/encoder-cache.ts +0 -25
  232. package/src/backends/mlx/evaluation.ts +0 -105
  233. package/src/backends/mlx/fill-append.ts +0 -58
  234. package/src/backends/mlx/fill-group.ts +0 -497
  235. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  236. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  237. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  238. package/src/backends/mlx/gateway-binding.ts +0 -174
  239. package/src/backends/mlx/graph.ts +0 -38
  240. package/src/backends/mlx/kv-codec.ts +0 -9
  241. package/src/backends/mlx/kv-maintenance.ts +0 -161
  242. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  243. package/src/backends/mlx/memory-client.ts +0 -189
  244. package/src/backends/mlx/methods.ts +0 -90
  245. package/src/backends/mlx/mixed-iteration.ts +0 -62
  246. package/src/backends/mlx/model-prompt.ts +0 -178
  247. package/src/backends/mlx/model-serving.ts +0 -80
  248. package/src/backends/mlx/paged-cache-codec.ts +0 -27
  249. package/src/backends/mlx/prefill-cohort.ts +0 -100
  250. package/src/backends/mlx/prefill-policy.ts +0 -26
  251. package/src/backends/mlx/prefill-rows.ts +0 -244
  252. package/src/backends/mlx/prefill.ts +0 -33
  253. package/src/backends/mlx/projected-context-rows.ts +0 -72
  254. package/src/backends/mlx/prompt-input.ts +0 -29
  255. package/src/backends/mlx/qwen-prompt-input.ts +0 -40
  256. package/src/backends/mlx/request-policy.ts +0 -20
  257. package/src/backends/mlx/request-state-policy.ts +0 -54
  258. package/src/backends/mlx/rollback.ts +0 -92
  259. package/src/backends/mlx/row-sampling.ts +0 -49
  260. package/src/backends/mlx/serial-executor.ts +0 -251
  261. package/src/backends/mlx/speculative-group.ts +0 -438
  262. package/src/backends/mlx/speculative-round.ts +0 -161
  263. package/src/backends/mlx/speculative.ts +0 -131
  264. package/src/backends/mlx/state-rows.ts +0 -104
  265. package/src/backends/mlx/state-views.ts +0 -46
  266. package/src/backends/mlx/target-layout-capability.ts +0 -35
  267. package/src/backends/mlx/text-engine.ts +0 -73
  268. package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
  269. package/src/chat-template.ts +0 -382
  270. package/src/cli.ts +0 -3490
  271. package/src/config.ts +0 -399
  272. package/src/contracts/completion.ts +0 -16
  273. package/src/contracts/execution.ts +0 -70
  274. package/src/contracts/generation.ts +0 -103
  275. package/src/contracts/host.ts +0 -7
  276. package/src/contracts/object-cache.ts +0 -8
  277. package/src/contracts/pi-provider.ts +0 -30
  278. package/src/contracts/pi.ts +0 -261
  279. package/src/contracts/prefix-cache.ts +0 -33
  280. package/src/contracts/resources.ts +0 -25
  281. package/src/contracts/sampling.ts +0 -23
  282. package/src/contracts/scheduling.ts +0 -54
  283. package/src/contracts/tsconfig.json +0 -14
  284. package/src/dataset/generators.ts +0 -1087
  285. package/src/dataset/index.ts +0 -12
  286. package/src/dataset/job.ts +0 -81
  287. package/src/dataset/llm.ts +0 -71
  288. package/src/dataset/registry.ts +0 -528
  289. package/src/diffusion/diffusion-generate.ts +0 -507
  290. package/src/download.ts +0 -505
  291. package/src/embed.ts +0 -77
  292. package/src/engine/admission.ts +0 -59
  293. package/src/engine/cancellation.ts +0 -38
  294. package/src/engine/engine.ts +0 -56
  295. package/src/engine/execution-coordinator.ts +0 -70
  296. package/src/engine/execution-plan.ts +0 -64
  297. package/src/engine/execution-tasks.ts +0 -44
  298. package/src/engine/namespaced-cache.ts +0 -13
  299. package/src/engine/resources.ts +0 -53
  300. package/src/engine/scheduler.ts +0 -92
  301. package/src/engine/session.ts +0 -247
  302. package/src/eval/README.md +0 -130
  303. package/src/eval/ifeval.ts +0 -81
  304. package/src/eval/kl-prompts.ts +0 -29
  305. package/src/eval/kl.ts +0 -590
  306. package/src/eval/perplexity.ts +0 -164
  307. package/src/eval/quality-db.ts +0 -92
  308. package/src/eval/reference-logits.ts +0 -207
  309. package/src/eval/runner.ts +0 -124
  310. package/src/eval/score.ts +0 -49
  311. package/src/eval/tasks/bfcl.ts +0 -535
  312. package/src/eval/tasks/gsm8k.ts +0 -98
  313. package/src/eval/tasks/hashhop.ts +0 -139
  314. package/src/eval/tasks/humaneval.ts +0 -275
  315. package/src/eval/tasks/ifeval.ts +0 -525
  316. package/src/eval/tasks/mmlu.ts +0 -157
  317. package/src/eval/ultrafeedback.ts +0 -60
  318. package/src/evaldb.ts +0 -199
  319. package/src/expert-io.ts +0 -393
  320. package/src/expert-offload-build.ts +0 -77
  321. package/src/expert-offload.ts +0 -76
  322. package/src/expert-residency.ts +0 -1134
  323. package/src/expert-usage.ts +0 -415
  324. package/src/fill/echo-index.ts +0 -188
  325. package/src/fill/fill-session.ts +0 -463
  326. package/src/fill/proposal.ts +0 -68
  327. package/src/fill/schema-rows.ts +0 -506
  328. package/src/fill/tool-boundary.ts +0 -103
  329. package/src/fit.ts +0 -249
  330. package/src/generate.ts +0 -1352
  331. package/src/grammar.ts +0 -604
  332. package/src/harness-pi.ts +0 -184
  333. package/src/hf-push.ts +0 -628
  334. package/src/hub-rest.ts +0 -242
  335. package/src/index.ts +0 -63
  336. package/src/inference/denoising.ts +0 -17
  337. package/src/inference/draft-acceptance.ts +0 -41
  338. package/src/inference/draft-output.ts +0 -49
  339. package/src/inference/graph.ts +0 -33
  340. package/src/inference/prefill.ts +0 -45
  341. package/src/inference/rollback.ts +0 -7
  342. package/src/jobs/index.ts +0 -31
  343. package/src/jobs/job-entry.ts +0 -107
  344. package/src/jobs/task-client.ts +0 -19
  345. package/src/jobs/types.ts +0 -2
  346. package/src/kv-scheme.ts +0 -279
  347. package/src/kv-store.ts +0 -1135
  348. package/src/lab/README.md +0 -22
  349. package/src/lab/curve/curve-designer.html +0 -303
  350. package/src/lab/curve/curve-sampler.ts +0 -122
  351. package/src/lab/expert-trace/expert-trace.ts +0 -69
  352. package/src/lab/paged-kv/paged-attention.ts +0 -117
  353. package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
  354. package/src/lab/paged-kv/paged-kv.ts +0 -336
  355. package/src/library.ts +0 -40
  356. package/src/lora.ts +0 -408
  357. package/src/md-modules.d.ts +0 -54
  358. package/src/media-fetch.ts +0 -442
  359. package/src/memory/article.ts +0 -558
  360. package/src/memory/chunk-validation.ts +0 -150
  361. package/src/memory/chunk.ts +0 -318
  362. package/src/memory/cluster.ts +0 -351
  363. package/src/memory/coverage.ts +0 -134
  364. package/src/memory/crosslink.ts +0 -0
  365. package/src/memory/db.ts +0 -253
  366. package/src/memory/entity.ts +0 -203
  367. package/src/memory/gate.ts +0 -187
  368. package/src/memory/history.ts +0 -152
  369. package/src/memory/ingest.ts +0 -335
  370. package/src/memory/model.ts +0 -183
  371. package/src/memory/normalize.ts +0 -671
  372. package/src/memory/parse.ts +0 -22
  373. package/src/memory/pipeline.ts +0 -275
  374. package/src/memory/prompts.ts +0 -65
  375. package/src/memory/query.ts +0 -334
  376. package/src/memory/reconcile.ts +0 -734
  377. package/src/memory/redirect.ts +0 -108
  378. package/src/memory/reindex.ts +0 -325
  379. package/src/memory/resolve.ts +0 -307
  380. package/src/memory/rest.ts +0 -245
  381. package/src/memory/route.ts +0 -272
  382. package/src/memory/schedule.ts +0 -165
  383. package/src/memory/stages.ts +0 -777
  384. package/src/memory/synthesize.ts +0 -1638
  385. package/src/memory/tools.ts +0 -749
  386. package/src/memory/vault.ts +0 -1194
  387. package/src/memory/wikify.ts +0 -1064
  388. package/src/mlx/array.ts +0 -425
  389. package/src/mlx/autograd.ts +0 -304
  390. package/src/mlx/checkpoint.ts +0 -149
  391. package/src/mlx/compile.ts +0 -168
  392. package/src/mlx/custom-vjp.ts +0 -188
  393. package/src/mlx/ffi.ts +0 -531
  394. package/src/mlx/materialize.ts +0 -23
  395. package/src/mlx/metal-kernel.ts +0 -159
  396. package/src/mlx/normalized-argmax.ts +0 -116
  397. package/src/mlx/ops.ts +0 -1108
  398. package/src/mlx/quantized-rows.ts +0 -36
  399. package/src/mlx/token-bitmask.ts +0 -52
  400. package/src/mlx/turboquant-kv-decode.ts +0 -82
  401. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  402. package/src/mlx/turboquant-ops.ts +0 -861
  403. package/src/mlx/turboquant-tables.ts +0 -237
  404. package/src/mmap.ts +0 -90
  405. package/src/model/artifact-identity.ts +0 -73
  406. package/src/model/batched-kv.ts +0 -235
  407. package/src/model/batched-mask.ts +0 -279
  408. package/src/model/batched-quant.ts +0 -212
  409. package/src/model/batched-quantized-kv.ts +0 -144
  410. package/src/model/batched-rotating-quant.ts +0 -353
  411. package/src/model/batched-rotating-state.ts +0 -149
  412. package/src/model/batched-rotating.ts +0 -338
  413. package/src/model/batched-row-storage.ts +0 -179
  414. package/src/model/batched-ssm.ts +0 -52
  415. package/src/model/batched-turboquant-kv.ts +0 -94
  416. package/src/model/compiled-decode.ts +0 -712
  417. package/src/model/decoded-kv-donor.ts +0 -12
  418. package/src/model/delayed-quantized-kv.ts +0 -72
  419. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  420. package/src/model/delayed-turboquant-kv.ts +0 -57
  421. package/src/model/diffusion-gemma.ts +0 -1026
  422. package/src/model/factory.ts +0 -215
  423. package/src/model/fingerprint.ts +0 -45
  424. package/src/model/flash-attention.ts +0 -694
  425. package/src/model/full-prefill-padding.ts +0 -56
  426. package/src/model/full-prefill-row.ts +0 -105
  427. package/src/model/gemma4-base.ts +0 -2370
  428. package/src/model/gemma4.ts +0 -1395
  429. package/src/model/generated/gemma4-12b.ts +0 -429
  430. package/src/model/generated/gemma4-26b.ts +0 -448
  431. package/src/model/generated/gemma4-e4b.ts +0 -717
  432. package/src/model/generated/index.ts +0 -18
  433. package/src/model/glm52-atlas.ts +0 -511
  434. package/src/model/glm52-cache.ts +0 -792
  435. package/src/model/glm52-config.ts +0 -262
  436. package/src/model/glm52-container.ts +0 -305
  437. package/src/model/glm52-coupling.ts +0 -388
  438. package/src/model/glm52-dsa.ts +0 -606
  439. package/src/model/glm52-expert-layout.ts +0 -253
  440. package/src/model/glm52-layout.ts +0 -152
  441. package/src/model/glm52-memory.ts +0 -500
  442. package/src/model/glm52-mla.ts +0 -792
  443. package/src/model/glm52-moe.ts +0 -223
  444. package/src/model/glm52-pilot.ts +0 -537
  445. package/src/model/glm52-reference.ts +0 -445
  446. package/src/model/glm52-residency.ts +0 -557
  447. package/src/model/glm52-resident-weights.ts +0 -135
  448. package/src/model/glm52-streamed-experts.ts +0 -453
  449. package/src/model/glm52-streamed-metal.ts +0 -610
  450. package/src/model/glm52-weights.ts +0 -503
  451. package/src/model/glm52.ts +0 -1132
  452. package/src/model/implementation.ts +0 -69
  453. package/src/model/kv-attention-view.ts +0 -70
  454. package/src/model/minicpm5.ts +0 -376
  455. package/src/model/profile.ts +0 -468
  456. package/src/model/quantized-append-attention.ts +0 -31
  457. package/src/model/qwen-append.ts +0 -12
  458. package/src/model/qwen-conv.ts +0 -52
  459. package/src/model/qwen3-delta-state.ts +0 -74
  460. package/src/model/qwen3-delta.ts +0 -451
  461. package/src/model/qwen3-moe.ts +0 -404
  462. package/src/model/qwen3-mrope.ts +0 -250
  463. package/src/model/qwen3.ts +0 -277
  464. package/src/model/qwen3_5-checkpoint.ts +0 -164
  465. package/src/model/qwen3_5.ts +0 -881
  466. package/src/model/rotating-kv-donor.ts +0 -35
  467. package/src/model/rotating-kv-layout.ts +0 -262
  468. package/src/model/rotating-row-transaction.ts +0 -35
  469. package/src/model/speculative-rotating-kv.ts +0 -101
  470. package/src/model/ssm-prefill-padding.ts +0 -39
  471. package/src/model/support.ts +0 -110
  472. package/src/model/token-groups.ts +0 -66
  473. package/src/model/trellis-balanced-scatter.ts +0 -51
  474. package/src/model/trellis-linear.ts +0 -672
  475. package/src/model/trellis-shared-m.ts +0 -151
  476. package/src/model/trellis-shared-scatter.ts +0 -144
  477. package/src/model/trellis-splitk-prefill.ts +0 -158
  478. package/src/model/trellis-tiled-prefill.ts +0 -136
  479. package/src/model/trellis-vector-expand.ts +0 -62
  480. package/src/model/trellis-wide-prefill.ts +0 -94
  481. package/src/model/turboquant-codec.ts +0 -89
  482. package/src/model/universal/archs.ts +0 -332
  483. package/src/model/universal/dense.ts +0 -612
  484. package/src/model/universal/modules.ts +0 -170
  485. package/src/model/universal/rope.ts +0 -381
  486. package/src/model/whisper.ts +0 -435
  487. package/src/native/expert_io.c +0 -523
  488. package/src/native/frame_extract.swift +0 -140
  489. package/src/native/mic_capture.swift +0 -92
  490. package/src/native-pack.ts +0 -163
  491. package/src/pi-provider.ts +0 -53
  492. package/src/pi-session.ts +0 -81
  493. package/src/pi-terminal.ts +0 -274
  494. package/src/pi-web.ts +0 -1940
  495. package/src/preflight.ts +0 -158
  496. package/src/prompt-cache.ts +0 -682
  497. package/src/quantize/allocator.ts +0 -627
  498. package/src/quantize/atomic-output.ts +0 -38
  499. package/src/quantize/calibration.ts +0 -181
  500. package/src/quantize/config-writer.ts +0 -145
  501. package/src/quantize/index.ts +0 -84
  502. package/src/quantize/job.ts +0 -162
  503. package/src/quantize/quantizer.ts +0 -666
  504. package/src/quantize/rotate.ts +0 -603
  505. package/src/quantize/safetensors-writer.ts +0 -249
  506. package/src/quantize/sensitivity.ts +0 -216
  507. package/src/quantize/trellis.ts +0 -586
  508. package/src/quantize/weight-transform.ts +0 -292
  509. package/src/registry.ts +0 -602
  510. package/src/runtime-config.ts +0 -77
  511. package/src/safetensors.ts +0 -165
  512. package/src/sampler.ts +0 -1012
  513. package/src/serve/admin-routes.ts +0 -184
  514. package/src/serve/assets/curve-terrain.html +0 -105
  515. package/src/serve/assets/training-inference-map.html +0 -575
  516. package/src/serve/audio-routes.ts +0 -323
  517. package/src/serve/aux-routes.ts +0 -132
  518. package/src/serve/batch-scheduler.ts +0 -8
  519. package/src/serve/checkpoint-identity.ts +0 -64
  520. package/src/serve/generation-gateway.ts +0 -537
  521. package/src/serve/isolate.ts +0 -609
  522. package/src/serve/kv-budget.ts +0 -14
  523. package/src/serve/lab-routes.ts +0 -341
  524. package/src/serve/lane-registry.ts +0 -45
  525. package/src/serve/model-admin-routes.ts +0 -155
  526. package/src/serve/model-binding.ts +0 -49
  527. package/src/serve/model-host.ts +0 -511
  528. package/src/serve/parent-application.ts +0 -56
  529. package/src/serve/prompt-response-trace.ts +0 -161
  530. package/src/serve/response-lease.ts +0 -24
  531. package/src/serve/session-search.ts +0 -326
  532. package/src/serve/static-routes.ts +0 -101
  533. package/src/serve/transcription-server.ts +0 -64
  534. package/src/serve/transcription-service.ts +0 -502
  535. package/src/server.ts +0 -1282
  536. package/src/spec/assistant-rows.ts +0 -93
  537. package/src/spec/assistant-source.ts +0 -126
  538. package/src/spec/cache-identity.ts +0 -22
  539. package/src/spec/deepspec-rows.ts +0 -29
  540. package/src/spec/deepspec-source.ts +0 -145
  541. package/src/spec/dflash-source.ts +0 -149
  542. package/src/spec/drafter.ts +0 -304
  543. package/src/spec/dspark/ab-stats.ts +0 -136
  544. package/src/spec/dspark/calibration.ts +0 -112
  545. package/src/spec/dspark/data-dflash.ts +0 -156
  546. package/src/spec/dspark/data.ts +0 -201
  547. package/src/spec/dspark/deepspec-module.ts +0 -776
  548. package/src/spec/dspark/generate-dflash.ts +0 -245
  549. package/src/spec/dspark/generate.ts +0 -290
  550. package/src/spec/dspark/loader.ts +0 -23
  551. package/src/spec/dspark/loss.ts +0 -213
  552. package/src/spec/dspark/module-dflash.ts +0 -560
  553. package/src/spec/dspark/module.ts +0 -540
  554. package/src/spec/dspark/quantize-drafter.ts +0 -91
  555. package/src/spec/dspark/sample.ts +0 -112
  556. package/src/spec/generate.ts +0 -276
  557. package/src/spec/glm52-mtp-graph.ts +0 -29
  558. package/src/spec/glm52-mtp-rows.ts +0 -132
  559. package/src/spec/glm52-mtp-source.ts +0 -318
  560. package/src/spec/glm52-mtp-state.ts +0 -33
  561. package/src/spec/ngram-source.ts +0 -226
  562. package/src/spec/projected-draft-rows.ts +0 -73
  563. package/src/spec/qwen-mtp-module.ts +0 -171
  564. package/src/spec/qwen-mtp-rows.ts +0 -230
  565. package/src/spec/qwen-mtp-source.ts +0 -386
  566. package/src/spec/qwen-mtp-state.ts +0 -30
  567. package/src/spec/serve-loop.ts +0 -587
  568. package/src/spec/source.ts +0 -228
  569. package/src/spec/two-model-rows.ts +0 -62
  570. package/src/spec/two-model.ts +0 -113
  571. package/src/ssd-cache.ts +0 -431
  572. package/src/ssd-durability.ts +0 -209
  573. package/src/storage/host-buffer.ts +0 -24
  574. package/src/storage/kv-writer.ts +0 -83
  575. package/src/storage/kv-writer.worker.js +0 -264
  576. package/src/storage/retention-policy.ts +0 -37
  577. package/src/tiered-prompt-cache.ts +0 -45
  578. package/src/tokenizer.ts +0 -335
  579. package/src/tool-approvals.ts +0 -131
  580. package/src/tool-call.ts +0 -695
  581. package/src/train/dataset.ts +0 -484
  582. package/src/train/diffusion-lora.ts +0 -216
  583. package/src/train/export.ts +0 -32
  584. package/src/train/flash-cce.ts +0 -1234
  585. package/src/train/forward.ts +0 -266
  586. package/src/train/fuse.ts +0 -243
  587. package/src/train/index.ts +0 -46
  588. package/src/train/job.ts +0 -205
  589. package/src/train/lora-params.ts +0 -254
  590. package/src/train/loss.ts +0 -1591
  591. package/src/train/merge.ts +0 -195
  592. package/src/train/optimizer.ts +0 -183
  593. package/src/train/prefix-shared.ts +0 -490
  594. package/src/train/rank.ts +0 -137
  595. package/src/train/segmented.ts +0 -1828
  596. package/src/train/steel-qmm-header.ts +0 -1461
  597. package/src/train/trainer.ts +0 -1221
  598. package/src/train/watch.ts +0 -542
  599. package/src/vision/diffusion-vision.ts +0 -620
  600. package/src/vision/embedder.ts +0 -176
  601. package/src/vision/preprocess.ts +0 -247
  602. package/src/vision/prompt.ts +0 -409
  603. package/src/vision/qwen3vl-preprocess.ts +0 -409
  604. package/src/vision/qwen3vl-prompt.ts +0 -233
  605. package/src/vision/qwen3vl-tower.ts +0 -566
  606. package/src/vision/siglip.ts +0 -607
  607. package/src/vision/video-frames.ts +0 -148
  608. package/src/web/app.html +0 -2155
  609. package/src/web/app.js +0 -5863
  610. package/src/web/skills/memory/SKILL.md +0 -120
  611. package/src/web/skills/web-research/SKILL.md +0 -46
  612. package/src/web/skills.ts +0 -97
  613. package/src/web/src/adapters-panel.ts +0 -288
  614. package/src/web/src/assistant.ts +0 -451
  615. package/src/web/src/chat.ts +0 -1060
  616. package/src/web/src/composer.ts +0 -962
  617. package/src/web/src/dataset.ts +0 -132
  618. package/src/web/src/finetune.ts +0 -267
  619. package/src/web/src/hub.ts +0 -428
  620. package/src/web/src/main.ts +0 -98
  621. package/src/web/src/markdown.ts +0 -0
  622. package/src/web/src/memory-panel.ts +0 -572
  623. package/src/web/src/model-picker.ts +0 -159
  624. package/src/web/src/palette.ts +0 -346
  625. package/src/web/src/protocol.ts +0 -26
  626. package/src/web/src/quantize.ts +0 -167
  627. package/src/web/src/rag.ts +0 -274
  628. package/src/web/src/sessions.ts +0 -469
  629. package/src/web/src/shell.ts +0 -804
  630. package/src/web/src/ui-catalog.ts +0 -78
  631. package/src/web/src/voice.ts +0 -141
  632. package/src/web/vendor/README.md +0 -61
  633. package/src/web-assets.ts +0 -47
  634. package/src/web-tools.ts +0 -478
  635. package/src/weights.ts +0 -255
  636. /package/src/{serve → server}/completion-sink.ts +0 -0
  637. /package/src/{serve → server}/generated-token-history.ts +0 -0
  638. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  639. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  640. /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`.