mlx-bun 0.0.13 → 0.3.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 (427) hide show
  1. package/README.md +71 -578
  2. package/bin/mlx-bun.mjs +1 -1
  3. package/docs/README.md +91 -0
  4. package/docs/{design → archive}/hlg-sampling.md +3 -3
  5. package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
  6. package/docs/{design → archive/investigations}/colibri-glm52-port.md +1 -1
  7. package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
  8. package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
  9. package/docs/{investigations → archive/investigations}/hlg-sampling-investigation.md +1 -1
  10. package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
  11. package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
  12. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +92 -0
  13. package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
  14. package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
  15. package/docs/{planning → archive/planning}/chat-ui-vision.md +1 -1
  16. package/docs/{planning → archive/planning}/chunk-task-roadmap.md +1 -1
  17. package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +4 -4
  18. package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +1 -1
  19. package/docs/{planning → archive/planning}/release-notes-v0.0.9.md +1 -1
  20. package/docs/archive/planning/release-notes-v0.2.0.md +49 -0
  21. package/docs/{planning → archive/planning}/website-readme-pass-plan.md +1 -1
  22. package/docs/design/batching.md +569 -0
  23. package/docs/design/decode-speed-program.md +3178 -169
  24. package/docs/design/dreaming-nightly-pipeline.md +675 -282
  25. package/docs/design/generic-model-support.md +579 -334
  26. package/docs/design/kv-cache.md +680 -0
  27. package/docs/design/orpo-training.md +673 -1239
  28. package/docs/design/speculative-decoding.md +1627 -0
  29. package/docs/design/turboquant.md +2102 -0
  30. package/docs/design/unified-engine-frontier-plan.md +1831 -727
  31. package/docs/design/web-chat-redesign.md +666 -1083
  32. package/docs/planning/PRODUCT_ROADMAP.md +34 -1
  33. package/docs/planning/release-notes-v0.3.0.md +35 -0
  34. package/docs/planning/video-series.md +421 -0
  35. package/docs/reference/benchmarks.md +1162 -0
  36. package/docs/reference/cli.md +395 -149
  37. package/docs/reference/distribution.md +321 -181
  38. package/docs/reference/environment.md +348 -0
  39. package/docs/reference/glossary.md +39 -0
  40. package/docs/reference/library-api.md +580 -142
  41. package/docs/reference/memory.md +227 -64
  42. package/docs/reference/models.md +137 -6
  43. package/docs/reference/server-api.md +938 -422
  44. package/docs/reference/server-config.md +652 -320
  45. package/docs/reference/training.md +393 -254
  46. package/docs/reference/troubleshooting.md +166 -0
  47. package/package.json +10 -5
  48. package/src/admission-plan.ts +18 -0
  49. package/src/anthropic.ts +92 -3
  50. package/src/audio/decode.ts +2 -2
  51. package/src/audio/features.ts +2 -2
  52. package/src/backends/mlx/autoregressive.ts +108 -0
  53. package/src/backends/mlx/batch-group.ts +1646 -0
  54. package/src/backends/mlx/diffusion.ts +39 -0
  55. package/src/backends/mlx/draft-target.ts +47 -0
  56. package/src/backends/mlx/evaluation.ts +105 -0
  57. package/src/backends/mlx/fill-append.ts +45 -0
  58. package/src/backends/mlx/gateway-binding.ts +71 -0
  59. package/src/backends/mlx/graph.ts +38 -0
  60. package/src/backends/mlx/memory-client.ts +189 -0
  61. package/src/backends/mlx/memory-guard.ts +40 -0
  62. package/src/backends/mlx/methods.ts +90 -0
  63. package/src/backends/mlx/model-prompt.ts +164 -0
  64. package/src/backends/mlx/model-serving.ts +79 -0
  65. package/src/backends/mlx/prefill.ts +33 -0
  66. package/src/backends/mlx/request-policy.ts +20 -0
  67. package/src/backends/mlx/rollback.ts +51 -0
  68. package/src/backends/mlx/serial-executor.ts +273 -0
  69. package/src/backends/mlx/speculative.ts +114 -0
  70. package/src/backends/mlx/state-views.ts +26 -0
  71. package/src/backends/mlx/text-engine.ts +73 -0
  72. package/src/cli.ts +189 -61
  73. package/src/client.ts +66 -0
  74. package/src/config.ts +21 -4
  75. package/src/contracts/completion.ts +16 -0
  76. package/src/contracts/execution.ts +49 -0
  77. package/src/contracts/generation.ts +103 -0
  78. package/src/contracts/host.ts +7 -0
  79. package/src/contracts/jobs.ts +66 -0
  80. package/src/contracts/pi-provider.ts +30 -0
  81. package/src/contracts/pi.ts +259 -0
  82. package/src/contracts/resources.ts +18 -0
  83. package/src/contracts/scheduling.ts +27 -0
  84. package/src/contracts/tsconfig.json +14 -0
  85. package/src/diffusion/diffusion-generate.ts +218 -153
  86. package/src/embed.ts +1 -1
  87. package/src/engine/admission.ts +59 -0
  88. package/src/engine/cancellation.ts +38 -0
  89. package/src/engine/engine.ts +56 -0
  90. package/src/engine/execution-coordinator.ts +70 -0
  91. package/src/engine/execution-plan.ts +51 -0
  92. package/src/engine/resources.ts +42 -0
  93. package/src/engine/scheduler.ts +67 -0
  94. package/src/engine/session.ts +247 -0
  95. package/src/eval/README.md +44 -1
  96. package/src/eval/kl.ts +263 -23
  97. package/src/eval/reference-logits.ts +207 -0
  98. package/src/eval/runner.ts +10 -79
  99. package/src/eval/tasks/bfcl.ts +2 -1
  100. package/src/eval/tasks/gsm8k.ts +2 -1
  101. package/src/eval/tasks/hashhop.ts +2 -1
  102. package/src/eval/tasks/humaneval.ts +5 -4
  103. package/src/eval/tasks/ifeval.ts +2 -1
  104. package/src/eval/tasks/mmlu.ts +2 -1
  105. package/src/expert-io.ts +3 -1
  106. package/src/expert-offload.ts +3 -1
  107. package/src/fill/echo-index.ts +188 -0
  108. package/src/fill/fill-session.ts +452 -0
  109. package/src/fill/proposal.ts +68 -0
  110. package/src/fill/schema-rows.ts +506 -0
  111. package/src/fill/tool-boundary.ts +103 -0
  112. package/src/fit.ts +24 -43
  113. package/src/generate.ts +740 -337
  114. package/src/grammar.ts +14 -8
  115. package/src/harness-pi.ts +15 -34
  116. package/src/hub-rest.ts +4 -4
  117. package/src/index.ts +27 -0
  118. package/src/inference/denoising.ts +17 -0
  119. package/src/inference/graph.ts +33 -0
  120. package/src/inference/prefill.ts +39 -0
  121. package/src/inference/rollback.ts +7 -0
  122. package/src/jobs/db.ts +4 -0
  123. package/src/jobs/index.ts +2 -0
  124. package/src/jobs/job-entry.ts +15 -14
  125. package/src/jobs/runner.ts +98 -13
  126. package/src/jobs/task-client.ts +19 -0
  127. package/src/jobs/types.ts +2 -58
  128. package/src/kv-scheme.ts +199 -0
  129. package/src/kv-store.ts +459 -234
  130. package/src/lab/README.md +18 -0
  131. package/src/{assets → lab/curve}/curve-designer.html +2 -2
  132. package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
  133. package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +7 -5
  134. package/src/{model → lab/paged-kv}/paged-kv.ts +9 -6
  135. package/src/library.ts +40 -0
  136. package/src/lora.ts +18 -0
  137. package/src/media-fetch.ts +20 -4
  138. package/src/memory/article.ts +1 -1
  139. package/src/memory/chunk.ts +1 -1
  140. package/src/memory/model.ts +32 -170
  141. package/src/memory/prompts.ts +1 -1
  142. package/src/memory/rest.ts +1 -1
  143. package/src/memory/schedule.ts +1 -1
  144. package/src/memory/stages.ts +4 -1
  145. package/src/memory/vault.ts +3 -4
  146. package/src/mlx/array.ts +9 -10
  147. package/src/mlx/compile.ts +12 -2
  148. package/src/mlx/ffi.ts +66 -22
  149. package/src/mlx/materialize.ts +23 -0
  150. package/src/mlx/metal-kernel.ts +10 -11
  151. package/src/mlx/ops.ts +64 -19
  152. package/src/mlx/quantized-rows.ts +36 -0
  153. package/src/mlx/token-bitmask.ts +52 -0
  154. package/src/mlx/turboquant-kv-decode.ts +82 -0
  155. package/src/mlx/turboquant-kv-inverse.ts +122 -0
  156. package/src/mlx/turboquant-ops.ts +33 -3
  157. package/src/mlx/turboquant-tables.ts +2 -2
  158. package/src/model/batched-mask.ts +9 -3
  159. package/src/model/batched-quant.ts +2 -2
  160. package/src/model/batched-rotating-quant.ts +45 -99
  161. package/src/model/batched-rotating-state.ts +73 -0
  162. package/src/model/batched-rotating.ts +57 -106
  163. package/src/model/batched-row-storage.ts +127 -0
  164. package/src/model/compiled-decode.ts +4 -3
  165. package/src/model/diffusion-gemma.ts +8 -8
  166. package/src/model/factory.ts +87 -49
  167. package/src/model/fingerprint.ts +1 -1
  168. package/src/model/flash-attention.ts +3 -3
  169. package/src/model/gemma4-base.ts +187 -17
  170. package/src/model/gemma4.ts +6 -6
  171. package/src/model/generated/gemma4-12b.ts +52 -148
  172. package/src/model/generated/gemma4-26b.ts +34 -94
  173. package/src/model/generated/gemma4-e4b.ts +28 -76
  174. package/src/model/glm52-cache.ts +19 -9
  175. package/src/model/glm52-dsa.ts +13 -9
  176. package/src/model/glm52-memory.ts +28 -1
  177. package/src/model/implementation.ts +69 -0
  178. package/src/model/minicpm5.ts +7 -8
  179. package/src/model/profile.ts +443 -0
  180. package/src/model/qwen-append.ts +12 -0
  181. package/src/model/qwen-conv.ts +52 -0
  182. package/src/model/qwen3-delta.ts +98 -2
  183. package/src/model/qwen3-mrope.ts +252 -0
  184. package/src/model/qwen3_5-checkpoint.ts +164 -0
  185. package/src/model/qwen3_5.ts +336 -60
  186. package/src/model/support.ts +1 -1
  187. package/src/model/trellis-balanced-scatter.ts +51 -0
  188. package/src/model/trellis-linear.ts +672 -0
  189. package/src/model/trellis-shared-m.ts +151 -0
  190. package/src/model/trellis-shared-scatter.ts +144 -0
  191. package/src/model/trellis-splitk-prefill.ts +158 -0
  192. package/src/model/trellis-tiled-prefill.ts +136 -0
  193. package/src/model/trellis-vector-expand.ts +62 -0
  194. package/src/model/trellis-wide-prefill.ts +94 -0
  195. package/src/model/universal/dense.ts +1 -1
  196. package/src/model/universal/modules.ts +8 -1
  197. package/src/native/frame_extract.swift +140 -0
  198. package/src/native-pack.ts +15 -7
  199. package/src/pi-provider.ts +6 -64
  200. package/src/pi-web.ts +14 -320
  201. package/src/prompt-cache.ts +97 -54
  202. package/src/quantize/allocator.ts +1 -1
  203. package/src/quantize/atomic-output.ts +38 -0
  204. package/src/quantize/calibration.ts +2 -1
  205. package/src/quantize/config-writer.ts +16 -3
  206. package/src/quantize/index.ts +28 -1
  207. package/src/quantize/job.ts +11 -0
  208. package/src/quantize/quantizer.ts +265 -100
  209. package/src/quantize/rotate.ts +603 -0
  210. package/src/quantize/safetensors-writer.ts +79 -1
  211. package/src/quantize/sensitivity.ts +41 -59
  212. package/src/quantize/trellis.ts +586 -0
  213. package/src/quantize/weight-transform.ts +292 -0
  214. package/src/responses.ts +130 -3
  215. package/src/runtime-config.ts +81 -0
  216. package/src/sampler.ts +276 -4
  217. package/src/serve/admin-routes.ts +184 -0
  218. package/src/serve/aux-routes.ts +132 -0
  219. package/src/serve/batch-scheduler.ts +8 -1558
  220. package/src/serve/chat-request.ts +391 -0
  221. package/src/serve/chat-stage.ts +195 -0
  222. package/src/serve/checkpoint-identity.ts +64 -0
  223. package/src/serve/completion-executor.ts +354 -0
  224. package/src/serve/completion-sink.ts +157 -0
  225. package/src/serve/discovery-routes.ts +204 -0
  226. package/src/serve/generation-gateway.ts +211 -243
  227. package/src/serve/http.ts +159 -0
  228. package/src/serve/inference-request.ts +79 -0
  229. package/src/serve/isolate.ts +297 -105
  230. package/src/serve/kv-budget.ts +14 -0
  231. package/src/serve/lab-routes.ts +341 -0
  232. package/src/serve/lane-registry.ts +2 -1
  233. package/src/serve/model-admin-routes.ts +155 -0
  234. package/src/serve/model-binding.ts +43 -0
  235. package/src/serve/model-host.ts +512 -0
  236. package/src/serve/openai-wire.ts +103 -0
  237. package/src/serve/parent-application.ts +56 -0
  238. package/src/serve/pipeline.ts +33 -0
  239. package/src/serve/preparation.ts +33 -0
  240. package/src/serve/prompt-response-trace.ts +147 -0
  241. package/src/serve/request-plan.ts +162 -0
  242. package/src/serve/request-prep.ts +346 -0
  243. package/src/serve/response-lease.ts +24 -0
  244. package/src/serve/responses-client.ts +69 -0
  245. package/src/serve/session-completion-engine.ts +110 -0
  246. package/src/serve/session-search.ts +1 -1
  247. package/src/serve/static-routes.ts +101 -0
  248. package/src/serve/text-completion-stage.ts +104 -0
  249. package/src/serve/token-streams.ts +519 -0
  250. package/src/server.ts +523 -3551
  251. package/src/spec/assistant-source.ts +10 -44
  252. package/src/spec/deepspec-source.ts +6 -6
  253. package/src/spec/dflash-source.ts +9 -8
  254. package/src/spec/dspark/ab-stats.ts +3 -3
  255. package/src/spec/dspark/calibration.ts +2 -2
  256. package/src/spec/dspark/deepspec-module.ts +2 -2
  257. package/src/spec/dspark/generate-dflash.ts +2 -2
  258. package/src/spec/dspark/generate.ts +2 -2
  259. package/src/spec/dspark/loader.ts +1 -1
  260. package/src/spec/dspark/module-dflash.ts +5 -4
  261. package/src/spec/dspark/module.ts +3 -3
  262. package/src/spec/dspark/quantize-drafter.ts +1 -1
  263. package/src/spec/generate.ts +1 -1
  264. package/src/spec/glm52-mtp-source.ts +9 -1
  265. package/src/spec/ngram-source.ts +1 -1
  266. package/src/spec/prefix-state.ts +45 -0
  267. package/src/spec/qwen-mtp-source.ts +528 -0
  268. package/src/spec/serve-loop.ts +179 -213
  269. package/src/spec/source.ts +42 -10
  270. package/src/spec/two-model.ts +1 -1
  271. package/src/ssd-cache.ts +95 -24
  272. package/src/ssd-durability.ts +207 -0
  273. package/src/tool-call.ts +51 -14
  274. package/src/train/flash-cce.ts +14 -13
  275. package/src/train/forward.ts +38 -1
  276. package/src/train/loss.ts +3 -2
  277. package/src/train/prefix-shared.ts +5 -1
  278. package/src/train/segmented.ts +9 -6
  279. package/src/train/trainer.ts +9 -8
  280. package/src/vision/preprocess.ts +1 -1
  281. package/src/vision/prompt.ts +48 -2
  282. package/src/vision/qwen3vl-preprocess.ts +409 -0
  283. package/src/vision/qwen3vl-prompt.ts +196 -0
  284. package/src/vision/qwen3vl-tower.ts +555 -0
  285. package/src/vision/video-frames.ts +148 -0
  286. package/src/web/app.html +1 -1
  287. package/src/web/app.js +15 -6
  288. package/src/web/src/adapters-panel.ts +3 -3
  289. package/src/web/src/assistant.ts +2 -36
  290. package/src/web/src/chat.ts +16 -9
  291. package/src/web/src/composer.ts +4 -4
  292. package/src/web/src/hub.ts +1 -1
  293. package/src/web/src/markdown.ts +0 -0
  294. package/src/web/src/memory-panel.ts +1 -1
  295. package/src/web/src/model-picker.ts +1 -1
  296. package/src/web/src/palette.ts +1 -1
  297. package/src/web/src/protocol.ts +3 -39
  298. package/src/web/src/sessions.ts +1 -1
  299. package/src/web/src/ui-catalog.ts +4 -18
  300. package/src/web-assets.ts +47 -0
  301. package/src/weights.ts +134 -33
  302. package/docs/archive/mlx-bun-lab-report.html +0 -275
  303. package/docs/archive/wwdc-mlx-bun.html +0 -848
  304. package/docs/design/adapters-end-to-end.md +0 -205
  305. package/docs/design/batching-perf-path.md +0 -255
  306. package/docs/design/batching-v2-plan.md +0 -529
  307. package/docs/design/bucketing-stage.md +0 -197
  308. package/docs/design/compat-cli-surface-design.md +0 -230
  309. package/docs/design/docs-reorg-plan.md +0 -165
  310. package/docs/design/dspark-serving-program.md +0 -371
  311. package/docs/design/dspark-speculative-decoding.md +0 -268
  312. package/docs/design/grammar-spec-batching-integration.md +0 -301
  313. package/docs/design/memory-inference-path.md +0 -422
  314. package/docs/design/memory-synthesis.md +0 -287
  315. package/docs/design/memory-system.md +0 -237
  316. package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
  317. package/docs/design/omlx-adoption-map.md +0 -98
  318. package/docs/design/orpo-dynamic-lambda.md +0 -220
  319. package/docs/design/orpo-future-enhancements.md +0 -340
  320. package/docs/design/paged-kv-cache.md +0 -214
  321. package/docs/design/parallel-slots.md +0 -567
  322. package/docs/design/parity-tier-dag.md +0 -161
  323. package/docs/design/repo-cleanup-plan.md +0 -189
  324. package/docs/design/runtime-isolation.md +0 -263
  325. package/docs/design/segmented-backward-training.md +0 -543
  326. package/docs/design/spec-decode-larger-targets.md +0 -229
  327. package/docs/design/ssd-kv-cold-tier.md +0 -288
  328. package/docs/design/structured-output.md +0 -484
  329. package/docs/design/tauri-desktop-app.md +0 -127
  330. package/docs/design/the-dreaming-master-plan.md +0 -445
  331. package/docs/design/turboquant-kv.md +0 -235
  332. package/docs/design/w4a16-compute-precision-spike.md +0 -232
  333. package/docs/design/web-chat-beat-matrix.md +0 -315
  334. package/docs/design/write-pipeline-entity.md +0 -468
  335. package/docs/investigations/curve-runs/bisector-route.json +0 -98
  336. package/docs/investigations/curve-runs/bisector-trace.json +0 -1393
  337. package/docs/investigations/curve-runs/curve-terrain.json +0 -1179
  338. package/docs/investigations/curve-runs/curve-terrain.svg +0 -42
  339. package/docs/investigations/hlg-ab.html +0 -34
  340. package/docs/investigations/hlg-explorer.html +0 -238
  341. package/docs/investigations/hlg-figs/cliff.svg +0 -1
  342. package/docs/investigations/hlg-figs/cross.svg +0 -1
  343. package/docs/investigations/hlg-figs/edges.svg +0 -1
  344. package/docs/investigations/hlg-figs/k20-grids.svg +0 -1
  345. package/docs/investigations/hlg-figs/k20-peaks.svg +0 -1
  346. package/docs/investigations/hlg-figs/lw-curve.svg +0 -1
  347. package/docs/investigations/hlg-figs/terrain.svg +0 -1
  348. package/docs/investigations/hlg-report.html +0 -262
  349. package/docs/investigations/hlg-runs/hlg-ab.json +0 -149
  350. package/docs/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
  351. package/docs/investigations/hlg-runs/hlg-blind.json +0 -107
  352. package/docs/investigations/hlg-runs/hlg-cliff.json +0 -197
  353. package/docs/investigations/hlg-runs/hlg-cross.json +0 -505
  354. package/docs/investigations/hlg-runs/hlg-edge.json +0 -388
  355. package/docs/investigations/hlg-runs/hlg-eval1.json +0 -25
  356. package/docs/investigations/hlg-runs/hlg-frontier.json +0 -86
  357. package/docs/investigations/hlg-runs/hlg-grid.json +0 -242
  358. package/docs/investigations/hlg-runs/hlg-grid2.json +0 -343
  359. package/docs/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
  360. package/docs/investigations/hlg-runs/hlg-map.json +0 -383
  361. package/docs/investigations/hlg-runs/run0-original.log +0 -159
  362. package/docs/investigations/hlg-runs/runA-recommended.log +0 -131
  363. package/docs/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
  364. package/docs/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
  365. package/docs/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
  366. package/docs/investigations/hlg-runs/runAD-ab-samples.log +0 -8
  367. package/docs/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
  368. package/docs/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
  369. package/docs/investigations/hlg-runs/runAG-eval-config2.log +0 -16
  370. package/docs/investigations/hlg-runs/runB-gain-variants.log +0 -192
  371. package/docs/investigations/hlg-runs/runC-pivots.log +0 -162
  372. package/docs/investigations/hlg-runs/runD-oetf.log +0 -132
  373. package/docs/investigations/hlg-runs/runE-eotf.log +0 -162
  374. package/docs/investigations/hlg-runs/runF-shaper-working.log +0 -86
  375. package/docs/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
  376. package/docs/investigations/hlg-runs/runH-wsweep.log +0 -176
  377. package/docs/investigations/hlg-runs/runI-asweep.log +0 -176
  378. package/docs/investigations/hlg-runs/runJ-knobmap.log +0 -49
  379. package/docs/investigations/hlg-runs/runK-frontier.log +0 -19
  380. package/docs/investigations/hlg-runs/runL-widemap.log +0 -65
  381. package/docs/investigations/hlg-runs/runM-frontier-emb.log +0 -15
  382. package/docs/investigations/hlg-runs/runN-verify.log +0 -116
  383. package/docs/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
  384. package/docs/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
  385. package/docs/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
  386. package/docs/investigations/hlg-runs/runR-blind-transcript.log +0 -79
  387. package/docs/investigations/hlg-runs/runS-cross-coherence.log +0 -33
  388. package/docs/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
  389. package/docs/investigations/hlg-runs/runU-cross-12b.log +0 -33
  390. package/docs/investigations/hlg-runs/runV-lw-e4b.log +0 -22
  391. package/docs/investigations/hlg-runs/runW-lw-12b.log +0 -22
  392. package/docs/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
  393. package/docs/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
  394. package/docs/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
  395. package/docs/planning/IDEAS.md +0 -69
  396. package/docs/reference/embedding.md +0 -197
  397. package/docs/reference/features-matrix.md +0 -100
  398. package/docs/reference/orpo-quickstart.md +0 -135
  399. package/src/flags.ts +0 -13
  400. /package/docs/{investigations → archive/investigations}/chunk-finetune-experiment.md +0 -0
  401. /package/docs/{investigations → archive/investigations}/colibri-oracle-pin.md +0 -0
  402. /package/docs/{investigations → archive/investigations}/curve-bisector-routing.md +0 -0
  403. /package/docs/{investigations → archive/investigations}/decode-roofline-lookagain.md +0 -0
  404. /package/docs/{investigations → archive/investigations}/dspark-handoff.md +0 -0
  405. /package/docs/{investigations → archive/investigations}/expert-offload-single-user-moe.md +0 -0
  406. /package/docs/{investigations → archive/investigations}/indexshare-performance-spike.md +0 -0
  407. /package/docs/{investigations → archive/investigations}/kernel-perf-review-2026-07.md +0 -0
  408. /package/docs/{investigations → archive/investigations}/lab-build-journal.md +0 -0
  409. /package/docs/{investigations → archive/investigations}/openwiki-evaluation.md +0 -0
  410. /package/docs/{investigations → archive/investigations}/orpo-base-uf-experiment-and-directions.md +0 -0
  411. /package/docs/{investigations → archive/investigations}/orpo-flash-cce-pin-leak.md +0 -0
  412. /package/docs/{investigations → archive/investigations}/orpo-uf-testing-handoff.md +0 -0
  413. /package/docs/{investigations → archive/investigations}/pi-builtin-investigation.md +0 -0
  414. /package/docs/{investigations → archive/investigations}/segmented-backward-handoff.md +0 -0
  415. /package/docs/{investigations → archive/investigations}/starter-model-port-handoff.md +0 -0
  416. /package/docs/{investigations → archive/investigations}/steel-flash-cce-handoff.md +0 -0
  417. /package/docs/{investigations → archive/investigations}/trainer-validation-experiment.md +0 -0
  418. /package/docs/{planning → archive/planning}/chat-ui-vision-memory-first.md +0 -0
  419. /package/docs/{planning → archive/planning}/journal.md +0 -0
  420. /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
  421. /package/docs/{planning → archive/planning}/release-notes-v0.0.10.md +0 -0
  422. /package/docs/{planning → archive/planning}/release-notes-v0.0.11.md +0 -0
  423. /package/docs/{planning → archive/planning}/release-notes-v0.0.12.md +0 -0
  424. /package/docs/{planning → archive/planning}/release-notes-v0.0.13.md +0 -0
  425. /package/docs/{planning → archive/planning}/web-ui-pass-plan.md +0 -0
  426. /package/{docs/investigations → src/serve/assets}/curve-terrain.html +0 -0
  427. /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
@@ -1,301 +0,0 @@
1
- # Grammar × spec decode × batching — integration plan + feature-matrix benchmark
2
-
3
- Status: **ALL PHASES EXECUTED** (A/B/C/E 2026-07-03; D completed
4
- 2026-07-04: KV-budget admission + vectorized homogeneous sampling +
5
- extend-join, each oracle/A-B gated — see the execution log). Remaining
6
- follow-ups live in "Later / parked" with their triggers.
7
- Execution log at the bottom of this doc. Successor plan tying together
8
- three workstreams so they compose deliberately instead of colliding:
9
-
10
- - **Structured output** — SHIPPED on main (serial + batched lanes;
11
- docs/design/structured-output.md). Open debt: B2 model-gated batch
12
- tests + bench, F4 compiler cache, F5 regex, F6 escaping, F7 structural
13
- tags, U1/U2 engine upgrades.
14
- - **Batching perf path** — P5 done; P0–P4 open
15
- (docs/design/batching-perf-path.md).
16
- - **Speculative decoding** — research proven (assistant drafter bit-exact
17
- vs optiq, 12B γ=1 ≈ 1.09× win, docs/design/spec-decode-larger-targets.md;
18
- DSpark architecture verified, docs/investigations/dspark-handoff.md) but
19
- **not served**: no `--draft-model`. Build plan already written:
20
- docs/design/mlx-lm-tool-parity-plan.md §7 (the `DraftSource` interface,
21
- two-model L1 source, serve loop, admission, prompt-cache composition).
22
-
23
- This doc does NOT restate those plans — it sequences them, defines the
24
- composition rules where they meet, and specifies the benchmark that
25
- measures every combination. The per-feature designs stay canonical in
26
- their own docs.
27
-
28
- ## The composition matrix (v1 target state)
29
-
30
- `GenerationGateway.willBatch` is the single routing point; every rule
31
- below is one predicate there. "Serial" routing is a v1 rule, not a
32
- limitation to hide — upstream mlx-lm routes spec serial too
33
- (`is_batchable = draft_model is None`, server.py:371).
34
-
35
- | Request shape | Lane | Mechanism | Status |
36
- | --- | --- | --- | --- |
37
- | plain | batch (or serial) | shipped engine | DONE |
38
- | grammar only | batch (or serial) | B1 per-row matchers / serial mask loop | DONE (B2 gates open) |
39
- | spec only | **serial** | `hasDraft` routes serial (upstream parity) | Phase B |
40
- | grammar + spec | **serial** | constrained verify walk (novel — §Phase C) | Phase C |
41
- | batch + spec | serial per request | `hasDraft` wins over batch | Phase B (routing) |
42
- | batch + grammar + spec | serial per request | `hasDraft` wins | falls out of B+C |
43
-
44
- Non-goals (explicitly out of scope, revisit only on measured demand):
45
- per-row spec inside the batch scheduler (variable accept-lengths break
46
- uniform-B; a research project, not a feature gap), DSpark as a served
47
- source before its 27B retrain/data-scale lands, grammar on the
48
- `/v1/responses` shim beyond what chat inheritance already gives.
49
-
50
- ## Phases
51
-
52
- Ordering rationale: A is small and closes the trust gap on what already
53
- shipped. B is the flagship parity feature and lays the `DraftSource`
54
- seam C needs. C is the novel composition. D runs parallel to B/C
55
- (scheduler files vs serial-loop files — near-zero overlap). E needs all
56
- of them and produces the numbers.
57
-
58
- ### Phase A — structured-output debt (B2 + F4) [S, 2–3 days]
59
-
60
- 1. **B2 model-gated scheduler tests** (spec'd in structured-output.md):
61
- mixed batch mask isolation; **all-grammar B=4 with four different
62
- schemas** (THE bug-class gate — row↔matcher misalignment after
63
- eviction/join); early termination + churn + joiner; max_tokens
64
- mid-JSON truncation under batch; prefill-terminated row never merges.
65
- 2. **F4 compiler cache**: one `GrammarCompiler` per `TokenizerInfo`
66
- (both vocab-structural; `ownsCompiler=false` path already exists).
67
- Measure compile time cold vs cached on a real JSON schema — this is
68
- the agentic-replay win and a benchmark row in Phase E.
69
- 3. Opportunistic: F6 choice escaping (tiny), F3 explicit padded-vocab
70
- comment. F5/F7 stay parked for the structural-tag pass (see Later).
71
-
72
- Exit: gated suites green on cpm5 + e4b; compile-cache A/B number
73
- recorded.
74
-
75
- ### Phase B — `serve --draft-model` (two-model, serial lane) [M, ~1 wk]
76
-
77
- Execute mlx-lm-tool-parity-plan.md §7 as written (it is already the
78
- hand-to-an-implementer plan). Integration deltas this plan adds:
79
-
80
- - **`RequestShape.hasDraft`** beside `hasGrammar`; `willBatch` returns
81
- false for it. Lane-debug line includes it. (The B0-grammar routing
82
- pattern, reused verbatim.)
83
- - **The serve verify loop lands grammar-aware from day one**: the loop
84
- emits bursts of ≤ n+1 tokens; the stop-sequence/detokenizer audit in
85
- §7 ("risky parts") must treat the grammar mask hook as a first-class
86
- participant even while it's unused in this phase — i.e. the per-round
87
- walk is structured as `for pos in verifyWindow: sample(logits[pos],
88
- maskHook?)` so Phase C is a hook implementation, not a loop rewrite.
89
- - **Kill switch** `MLX_BUN_SPEC=0` (degrade: ignore the flag, log once),
90
- house style.
91
-
92
- Oracle: L1 spec-vs-spec token equality with `mlx_lm.server
93
- --draft-model` from the oracle venv (§7.8). Acceptance telemetry
94
- (`drafted/accepted/targetCalls`) in stats — Phase E consumes it.
95
-
96
- Exit: greedy token-for-token vs mlx-lm spec on a fixed pair; rotating
97
- wrap falls back non-spec (no 500); `--batch 4` + `--draft-model` routes
98
- spec requests serial and batches the rest; admission accounts for draft
99
- weights + KV.
100
-
101
- ### Phase C — grammar × spec: the constrained verify walk [M, ~1 wk]
102
-
103
- Novel territory — **no oracle serves grammar+spec** (mlx-lm has no
104
- grammar; oMLX has no spec). No-oracle (Lab-class) gating per the
105
- parity-tier contract: equivalence + validity gates, not bit-parity to an
106
- ancestor.
107
-
108
- Design (v1 = verify-side masking, drafter free-running):
109
-
110
- 1. **Drafter is unconstrained.** Drafts are proposals; correctness never
111
- depends on them (a grammar-invalid draft is simply rejected at
112
- verify). No matcher state touches the draft path.
113
- 2. **The verify walk applies the mask sequentially.** One batched target
114
- forward over `[pending, ...drafts]` (n+1 positions) as in Phase B;
115
- then the host-side accept walk goes position by position:
116
- `mask_i = matcher.bitmask` → apply to `logits[i]` → sample → if
117
- sampled == draft_i: `matcher.accept(draft_i)`, continue; else emit
118
- the masked correction token, `matcher.accept(correction)`, stop.
119
- The matcher only ever advances on **emitted** tokens — no rollback
120
- needed in v1. Sequential bitmask fills cost 0.004–0.19 ms each
121
- (measured, structured-output.md); at γ≤3 that's ≤0.8 ms/round against
122
- a 12B target step of ~40 ms — noise.
123
- 3. **Grammar termination mid-burst** truncates the accepted prefix at
124
- the terminating token (same all-`-inf` guarantee as serial/batched:
125
- nothing is sampled past termination), finish_reason "stop".
126
- 4. **The measured fork** ([[flag-and-try-both-on-forks]]): on
127
- grammar-tight spans (e.g. `guided_choice`, closing braces) a
128
- free-running drafter's acceptance may crater — every draft off-grammar
129
- is a wasted round. If Phase E shows that, the alternative is built
130
- behind `MLX_BUN_SPEC_GRAMMAR_DRAFT=1`: mask the drafter's logits too
131
- (matcher advances per draft, `rollBack(n − kAccept)` on rejection —
132
- the WASM API exposes rollBack; this is its use case). Build the flag
133
- only if the default's acceptance number demands it; don't pre-build.
134
-
135
- Gates (no external oracle):
136
- - **Equivalence**: greedy grammar+spec long-prefix-equal to greedy
137
- grammar-only serial on fixed prompts (exact-match acceptance means
138
- spec must reproduce the non-spec masked-greedy stream, modulo the
139
- documented batched-verify-head knife-edges — same caveat class as L1
140
- spec-vs-spec).
141
- - **Validity**: every grammar+spec output parses / conforms to its
142
- schema (100%, no exceptions), matcher never rejects an emitted token.
143
- - **Composition regression fence**: grammar-only and spec-only suites
144
- byte-unchanged.
145
-
146
- ### Phase D — batching P0 (+ admission slice of P3) [M, ~1 wk, parallel with B/C]
147
-
148
- From batching-perf-path.md, the subset that the benchmark needs and that
149
- doesn't collide with B/C's serial-loop work:
150
-
151
- 1. **P0**: `scripts/bench-serving-load.ts` (N concurrent vs live server,
152
- aggregate tok/s + TTFT p50/p95 at the SSE first-token event) —
153
- Phase E builds on this harness; `extend` join (kill the O(B·S)
154
- re-merge); vectorized homogeneous-sampler fast path.
155
- - `extend` + grammar rows: the B1 read-before-build step must hold
156
- across an extend-join — add one B2-style churn test with a joiner
157
- landing while a grammar row is live.
158
- 2. **P3 admission slice only**: `projectKvBytes` + `--kv-budget`
159
- queueing (the OOM backstop the combined benchmark needs before it
160
- pushes B=4 × long prompts on 24 GB). Prompt-cache-under-batching,
161
- adapters, and the default flip stay in batching-perf-path P3.
162
-
163
- P1 (quantized KV at B>1) is NOT in this plan's critical path — it's the
164
- next wave after the matrix benchmark exists, and the benchmark is exactly
165
- what will size its payoff. (P2 — perf kernel at B>1 — is OBSOLETE: the
166
- kernel was deleted 2026-07-05, docs/design/unified-engine-frontier-plan.md §6.)
167
-
168
- ### Phase E — the feature-matrix benchmark [S–M, 3–4 days]
169
-
170
- One harness answering "what does each feature — and each legal
171
- combination — cost or buy, per model?" Extends P0's
172
- `bench-serving-load.ts`; preflight-gated like benchmark.sh (dirty-machine
173
- numbers are garbage; quotable rows need the clean-machine protocol).
174
-
175
- **Cells** (skip-if-unavailable, like the model-gated suites):
176
-
177
- - Lanes/features: `serial`, `batch4`, `serial+grammar`, `batch4+grammar`,
178
- `serial+spec`, `serial+grammar+spec` — the six legal shapes from the
179
- matrix. (batch+spec cells route serial by design; the harness records
180
- them as routing checks, not perf rows.)
181
- - Models: cpm5 + e4b (fast movers, both lanes), 12B (+ its assistant
182
- drafter — the measured spec win), Qwen3.5 (batch + thinking-model
183
- grammar canary; grammar cells expected to expose F7 until structural
184
- tags land — record, don't hide).
185
- - Workloads: short-chat (128 tok), JSON-extraction (a real schema,
186
- grammar cells), long-form (512 tok). 4 concurrent for batch cells,
187
- 1 for serial cells; N=3 median.
188
-
189
- **Metrics per cell**: aggregate + per-stream decode tok/s · TTFT
190
- p50/p95 (SSE first token, wall-clock) · spec acceptance
191
- (drafted/accepted/targetCalls) · grammar overhead vs the same cell
192
- without grammar (%) · schema-conformance rate (**must be 100% in every
193
- grammar cell — a conformance failure fails the run, it's a correctness
194
- gate wearing a benchmark costume**) · peak RSS.
195
-
196
- **Denominator discipline** (spec-decode-larger-targets.md): every
197
- feature cell is compared to the SAME model+lane baseline cell from the
198
- SAME run. No cross-model or cross-run speedup claims.
199
-
200
- **Output**: eval-DB rows tagged `feature-matrix[<host>]` + a dated
201
- markdown artifact (gitignored, like benchmark.sh's); promoted rows land
202
- in benchmarks/RESULTS.md under a new "composition" table. Josh-gated
203
- clean-machine run for anything quotable.
204
-
205
- Exit: the matrix runs end-to-end on this machine; a first
206
- (loaded-machine, unquotable) sweep sanity-checks every cell; the
207
- clean-machine run is queued in STATUS Josh-gated.
208
-
209
- ## Later / parked (pointers, so they aren't lost)
210
-
211
- - **F7 + F5 structural-tag pass** (thinking-model grammar + real regex)
212
- — try the installed WASM package's `fromStructuralTag`/`RegexFormat`
213
- first; U1 rebuild only if its Dec-2025 core predates the semantics
214
- (structured-output.md addendum). Qwen3.5's grammar cells in Phase E
215
- are the forcing function.
216
- - **U2 native XGrammar-2 via TVM-FFI** — trigger conditions unchanged
217
- (B≫8, spec+grammar draft-tree masking via `traverse_draft_tree`, or
218
- compile time visible despite F4). Phase C's v1 walk deliberately
219
- avoids needing it.
220
- - **Batching P1** (quant-KV at B>1) — next wave, sized by the matrix.
221
- (P2, perf kernel at B>1, is obsolete — kernel deleted 2026-07-05.)
222
- - **P4 device-side step chaining** — orthogonal serial-decode work; the
223
- matrix's serial baselines will show its headroom.
224
- - **Assistant/DSpark sources behind `--draft-model`** —
225
- mlx-lm-tool-parity-plan §7.9; DSpark stays research until 27B
226
- retrain + data scale (dspark-handoff.md).
227
- - **Spec inside the batch lane** — research question, not scheduled.
228
-
229
- ## Execution log (2026-07-03)
230
-
231
- - **Phase A** ✅ — B2 gates in `tests/batch-grammar.test.ts` (all five
232
- scenarios + a sixth found later, below); F4 compiler cache went through a
233
- bring-up fix (single-flight rebuild — concurrent compiles after a
234
- tokenizer switch double-disposed the previous compiler); F6, F3 landed.
235
- - **Phase B** ✅ — `serve --draft-model`/`--num-draft-tokens`;
236
- `src/spec/{source,two-model,serve-loop}.ts`. **L1 gate: 48/48
237
- token-for-token vs mlx-lm spec** (Llama 3B+1B greedy, 65% acceptance,
238
- `scripts/oracle-spec-two-model.py`). Deviations as designed (ring-wrap
239
- degrades pre-pollution via an offset+n+1 gate — upstream's post-hoc check
240
- would already have polluted the ring; prompt cache bypassed v1).
241
- - **Phase C** ✅ — the constrained verify walk in `samplePos`; gates green
242
- (100% validity; 12/12 token-identical to grammar-only serial; choice
243
- terminates mid-spec). Drafter-masking flag NOT built (acceptance 6/15 on
244
- a tight schema — usable; revisit only if Phase E's clean run says so).
245
- - **Phase E** ✅ (harness) — `scripts/bench-feature-matrix.ts` (the planned
246
- bench-serving-load extension became its own script: that file already
247
- exists as a client-only stack-vs-stack tool and stays one). Six cells
248
- green end-to-end on Llama 3B+1B; `usage.speculation` telemetry on all
249
- four API usage blocks. Clean-machine run for RESULTS.md is Josh-gated.
250
- - **The conformance gate paid for the whole phase in one smoke run** —
251
- three real bugs: (1) snake_case wire fields never reached the grammar
252
- resolver (structured output was DEAD over HTTP since it landed);
253
- (2) `#flushPipeline` didn't advance matchers → stale masks on mid-decode
254
- joins (regression test added); (3) **UniversalDenseModel batched RoPE
255
- uses the scalar cache.offset** → uneven-row batches decode joiners at
256
- wrong positions — latent for ALL Tier-0 archs since v0.0.9. **Fixed
257
- same day**: `UniversalRope.applyDynamic` (+ `ops.ropeScaledDynamic`)
258
- routes the wrapper's per-row `ropeOffsetArr`; gated **token-exact vs
259
- mlx-lm B=2 on Llama-3.2-3B** — static uneven rows AND the dynamic
260
- join/leave protocol (tests/batched-decode-parity.test.ts "Llama 3B
261
- Tier-0"). Plain full-attention universal archs now batch; maskArray
262
- (gemma2-family, pad-blind causal mask in forwardLayers) and
263
- sliding-window universal archs remain serial (unvalidated cells).
264
- Lesson, per [[per-model-quant-specialization]]: the gateway's
265
- capability gate admitted a model family no batched-parity suite ever
266
- validated.
267
-
268
- ### Phase D completion (2026-07-04)
269
-
270
- - **KV-budget admission** — `--kv-budget <GB>`: aggregate projected-KV gate
271
- in the scheduler (queue-don't-OOM, oversized-alone rejects,
272
- `/stats.batch.{pending_rows,kv_bytes,kv_budget_bytes}`;
273
- tests/batch-kv-budget.test.ts).
274
- - **Vectorized homogeneous sampling** — all-plain-greedy batches sample via
275
- ONE log-softmax+argmax over [B,V]; gateway flags `plainGreedy`; BIT-equal
276
- A/B vs the per-row path (`MLX_BUN_BATCH_VEC_SAMPLE=0` kill switch;
277
- tests/batch-vec-sample.test.ts).
278
- - **Extend-join** — `extendKVRows` (mlx-lm `BatchKVCache.extend` semantics:
279
- one pad + one B-axis concat, running rows untouched, pads grow) replaces
280
- the O(B·S) re-merge for full-attention layers in `#mergeJoiner`
281
- (`MLX_BUN_BATCH_EXTEND=0` = re-merge). **Own oracle** (extend's pad
282
- layout ≠ re-merge's): scripts/gen-batched-extend-golden.py →
283
- token-for-token on CPM AND Llama-3B (tests/batched-decode-parity.test.ts
284
- "EXTEND-JOIN ORACLE"); full scheduler suite incl. the grammar-churn join
285
- test green through the extend path AND the kill-switch path.
286
- Rotating-layer extend (Gemma joins re-merge their sliding layers, extend
287
- their full layers) is a follow-up.
288
-
289
- ## Risks
290
-
291
- - **Grammar+spec has no oracle** — mitigated by the three-gate stack
292
- (equivalence to grammar-only greedy, 100% validity, regression fence)
293
- and by keeping the drafter out of the grammar state in v1.
294
- - **Multi-token bursts through stop-sequence/detokenizer state** — the
295
- known §7 risky part, now load-bearing for two phases; land the burst
296
- audit with Phase B tests, not after.
297
- - **Memory at 12B+drafter / B=4 on 24 GB** — Phase D's admission slice
298
- is the backstop; benchmark cells must go through it, not around it.
299
- - **Scope creep via the matrix** — the benchmark measures what exists;
300
- it must not become a reason to build P1/P2/drafter-masking
301
- speculatively. Each parked item has its trigger written above.