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,123 +0,0 @@
1
- # Curve sampler: bisectors, routing, and the falsification
2
-
3
- **Question.** The v2 log-prob transfer-curve sampler (`src/curve-sampler.ts`, the
4
- `/curves` designer) replaces temperature+softmax with a drawn monotone curve. It
5
- *feels* like it reaches outputs temperature can't. Three experiments ask: is that
6
- real, where does it come from, and is the mechanism "routing through forks"?
7
-
8
- All runs: `mlx-community/gemma-4-e4b-it-OptiQ-4bit` (e4b), greedy reference paths,
9
- the local server / direct model load. Scripts are reusable (swap the `PROMPTS`).
10
-
11
- ---
12
-
13
- ## 1. Can pure temperature reproduce a curve's output? — No.
14
-
15
- `scripts/curve-temp-match.ts`, `curve-temp-seedsearch.ts`, `curve-temp-grid.ts`,
16
- `curve-temp-weights.ts`. Take a curve-generated sample; sweep **pure** temperature
17
- (top-p/top-k off) across T and across seeds (the seed is a free variable), looking
18
- for an exact match.
19
-
20
- - **Lighthouse (creative):** 924 pure-temperature samples across T = 0.4–2.0 and
21
- ~340 seeds → **0 exact matches, 0 crossings of the curve's fork.** The only seed
22
- that reproduced the curve's *opening* was the curve's own seed (102), which then
23
- forked away. Temperature shares ≤14 words then diverges into different content.
24
- - **Weights-advice (constrained):** also 0 exact, but the miss is **cosmetic** —
25
- temperature forks at word 6 (`when`→`with`) yet converges on the same advice.
26
- Same meaning, different surface form.
27
-
28
- So "couldn't temp do that anyway?" → no, but the curve's distinctiveness is
29
- **prompt-dependent**: real divergence on open prompts, phrasing-only on constrained
30
- ones. Different *shape* → different reachable samples. (Mechanism TBD — see §3.)
31
-
32
- ---
33
-
34
- ## 2. The bisector map — where do prompts route into separate timelines?
35
-
36
- `scripts/bisector-trace.ts`. Rank-2 probe: walk the greedy reference; at each
37
- position force the rank-2 token and greedy-continue; classify the branch as
38
- **reconverged** (re-merges with the reference content, alignment-free longest common
39
- token-substring) or **diverged**. A diverging branch whose rank-2 had real
40
- probability (≥0.05) is a **genuine fork / bisector**; rank-2 with ~0 probability is
41
- **forced** noise. Output: `docs/investigations/curve-runs/bisector-trace.json`.
42
-
43
- Among **genuine alternatives** (rank-2 prob ≥ 5%):
44
-
45
- | prompt | genuine alts | fork % | genuine-fork depths | deepest | path |
46
- |-----------|--------------|--------|--------------------------------|---------|------|
47
- | creative | 21 | **48%**| 1,3,10,12,18,19,20,22,**27,28**| 28 | 41 |
48
- | advice | 26 | **27%**| 1,13,14,16,17,**39,40** | 40 | 80 |
49
- | factual | 18 | **17%**| 14,15,18 | 18 | 62 |
50
-
51
- - **Creative:** forks spread continuously, deep, no flat region.
52
- - **Factual:** hard **funnel** (0–13 locked on "…is Paris"), thin choice band
53
- (14–18, population phrasing), then **flat** (19–61). 83% of genuine alternatives
54
- re-merge — the "constrained → rank-2 reconverges" prediction.
55
- - **Advice:** two-basin — opening stance, long re-merge body, second fork cluster
56
- at 39–40 (new list item).
57
-
58
- The bisector field is real, and its shape explains the §1 asymmetry.
59
-
60
- ---
61
-
62
- ## 3. Does the curve ACTUALLY route at the bisectors? — Falsified.
63
-
64
- `scripts/bisector-route.ts`. Ground truth = §2 labels. Under **matched seeds**,
65
- generate samples with each policy, align to the greedy reference, find the **first
66
- departure**, and compute the departure **hazard** at FORK vs RE-MERGE nodes (both
67
- high-entropy, so the ratio isolates fork-*selectivity* from raw entropy). Policies:
68
- `default` (T=1+top-p+top-k), `temp0.8` (pure), `curve-id` (identity curve — control,
69
- same machinery, no shaping), `curve-router` (gate tail, open head — the shape that
70
- *should* route). Step-5 coherence: fork-departures must stay within ~1 nat/token of
71
- the reference (not garbage). Output: `curve-runs/bisector-route.json`.
72
-
73
- **Creative**
74
-
75
- | policy | FORK | REMERGE | **FORK/REMERGE** | coherent |
76
- |--------------|------|---------|------------------|----------|
77
- | default | 26% | 34% | 0.75 | 9/9 |
78
- | temp 0.8 | 7% | 23% | 0.30 | 3/3 |
79
- | curve-id | 26% | 34% | **0.77** | 9/9 |
80
- | curve-router | 43% | 55% | **0.79** | 13/13 |
81
-
82
- `curve-router`'s fork-selectivity (0.79) **equals the no-op identity curve (0.77)**
83
- and default (0.75). The router shape raised departure *volume* (43%/55% vs 26%/34%)
84
- **proportionally** — targeting unchanged. Every ratio is below 1: all policies depart
85
- *more* at re-merge than at forks.
86
-
87
- **Factual:** `curve-router` 12.98 vs default 19.89 / temp 15.0 — *below* temperature.
88
- (High ratios just reflect the 3 forks being the only high-entropy nodes amid 38
89
- locked-elaboration positions.)
90
-
91
- ### Conclusion
92
-
93
- **The "routes through forks" claim is false** for this curve — its fork-selectivity
94
- matches a no-op control. The curve changes the **volume** of diversification, not its
95
- **targeting**. The trap: `curve-router` has the highest *absolute* fork-rate (43%),
96
- which naively reads as "forks most"; that's only more diversification overall.
97
-
98
- This reconciles §1 honestly: the curve still reaches outputs temperature can't
99
- (different *shape* → different reachable samples), but **not by targeting forks** —
100
- it's a different reshuffle, not a smarter one. All fork-departures stayed coherent,
101
- so this is a *coherent* reshuffle, not a garbage artifact.
102
-
103
- **Likely structural reason:** fork-ness (does the rank-2 branch reconverge?) is a
104
- property of the downstream trajectory — invisible in the local next-token
105
- distribution. A local transfer curve can only see current logits, so it can't
106
- preferentially depart at forks vs locally-identical re-merges. A local sampler
107
- probably *can't* be a fork-router by construction; only an entropy reshuffle.
108
-
109
- ### Caveats / next steps
110
-
111
- - `curve-router` is the natural router shape, **not a user-drawn curve** — drop a
112
- real curve JSON in as a 5th policy to confirm.
113
- - 20 seeds × 1 prompt/pole — scale to ~5 prompts/pole × more seeds for error bars.
114
- - Loophole: test whether fork nodes carry a distinct *local* logit shape (e.g.
115
- bimodality) that a cleverer curve could exploit.
116
-
117
- ## Reproduce
118
-
119
- ```bash
120
- bun run scripts/bisector-trace.ts # the map → curve-runs/bisector-trace.json
121
- bun run scripts/bisector-route.ts # the test → curve-runs/bisector-route.json
122
- bun run scripts/curve-temp-grid.ts # temp-can't-reproduce (server on :8080)
123
- ```
@@ -1,348 +0,0 @@
1
- # Decode perf "look again" — adversarial re-exam of the M=1 floor claim (2026-07-01)
2
-
3
- > **2026-07-02 CORRECTION — the host-graph-tax claim is itself overturned; see
4
- > §7.** The fix-plan items 1a–1d were built on "host graph build is serial with
5
- > the GPU"; the overlap spike (decode-overlap-probe.ts) shows the pipelined loop
6
- > ALREADY hides the build. The §3 wall times and %-of-roofline stand; the
7
- > §4(b)/(c) decomposition does not — the whole gap is GPU-side.
8
-
9
- **Machine:** Apple M1 Max, 32 GB (MacBookPro18,2), `sysctl` verified. All eval-DB
10
- rows are also M1 Max — same box. **All numbers below are directional (session,
11
- loaded-machine caveat); quotable numbers remain benchmark.sh-gated.** GPU idle
12
- verified before every probe (one contaminated bandwidth run was discarded and
13
- re-run; another agent's `bun test` was live during it).
14
-
15
- **Mandate:** re-attack the PLAN-archive megakernel post-mortem conclusion —
16
- "mlx per-op decode = 4.62 ms vs ~4.5 ms pure weight-read floor (~0.12 ms
17
- overhead, near optimal)" — the way the ORPO backward was attacked.
18
-
19
- ## Verdict up front
20
-
21
- **The floor claim was wrong.** The ~4.5 ms "pure weight-read floor" for CPM5 was
22
- never derived from measured bandwidth and overstates the true floor by ~70%:
23
-
24
- - CPM5 reads **0.694 GB** of weights/token (safetensors-header accounting:
25
- 0.448 GiB layers + 0.198 GiB untied lm_head; the 0.198 GiB embed table is
26
- row-gathered, not streamed). The old "~1 GB" figure counted the embed table.
27
- - Measured achieved bandwidth on this M1 Max: **~337 GB/s raw streaming read**
28
- (4 GiB bf16 sum), **~250–295 GB/s in mlx's own `quantized_matmul` GEMV** at
29
- decode shapes (large matrices). 4.5 ms for 0.694 GB implies 154 GB/s — no
30
- measurement supports that.
31
- - True CPM5 floor: **~2.6 ms/tok** at GEMV-achieved BW (~2.1 ms at raw-read BW).
32
- Production-shaped decode measures **4.06 ms/tok**. That is **~64% of the
33
- measured roofline**, not 97%.
34
-
35
- The megakernel was still right to shelve (it was slower for its own reasons),
36
- but "mlx is already at the floor" is false for every model except the 12B.
37
- There is ~1.4 ms/tok recoverable on CPM5 (+35–55%), ~5–7 ms on e4b (+30–50%),
38
- ~8 ms on the 26B (+40–60%), and ~3 ms (~9%) on the 12B.
39
-
40
- Two inconsistencies in the record corroborate that the old floor was never
41
- measured: `megakernel-perf.ts`'s own comment says "floor ~394 tok/s" (2.54 ms —
42
- 0.694 GB at the M4 Pro's 273 GB/s spec sheet), while the post-mortem says
43
- ~4.5 ms; and the production eval-DB h2h rows (255–266 tok/s = 3.76–3.92 ms)
44
- were ALREADY faster than the claimed 4.5 ms "floor" when the post-mortem was
45
- written.
46
-
47
- ## 1. Measured bandwidth (this machine, idle, `decode-roofline-bw.ts`)
48
-
49
- | probe | result |
50
- |---|---|
51
- | raw streaming read, bf16 sum 1/2/4 GiB | 299 / 320 / **337 GB/s** |
52
- | qmv 4-bit GEMV 540 MiB (12B tied head) | 2.12 ms → **268 GB/s** |
53
- | qmv 4-bit GEMV 360 MiB (e4b tied head) | 1.31 ms → **289 GB/s** |
54
- | qmv 4-bit GEMV 108 MiB (CPM5 head) | 0.45 ms → **249 GB/s** |
55
- | qmv 8-bit GEMV 60 MiB | **295 GB/s** |
56
- | qmv 4-bit GEMV 32 MiB (12B MLP) | **256 GB/s** |
57
- | qmv 4-bit GEMV 3.8 MiB (CPM5 MLP) | 0.022 ms → **183 GB/s** |
58
- | qmv 4-bit GEMV 1.3 MiB (small qkv) | 0.013 ms → **100 GB/s** |
59
- | bf16 GEMV 113 MiB | **296 GB/s** |
60
- | dependent tiny-op chain (in one eval) | **~10–15 µs/op** incl. host encode |
61
-
62
- GEMVs were chained back-to-back inside one eval over distinct matrix copies
63
- (cycling ≥ SLC) — the in-step cost, not eval round-trip latency. Methodology
64
- trap worth recording: mlx is lazy — disposing unevaluated outputs silently
65
- skips their compute; the first draft of this probe "measured" 4.4 TB/s.
66
-
67
- So: mlx's `qmv_fast` reaches **74–88% of raw machine bandwidth on large
68
- matrices** and degrades hard below ~10 MiB (fixed per-kernel cost). Small-model
69
- decode is a mix of both regimes.
70
-
71
- ## 2. Weights + KV bytes per decode token (safetensors headers, exact)
72
-
73
- | model | streamed weights/tok | how |
74
- |---|---|---|
75
- | CPM5-1B | **0.694 GB** | 0.448 layers + 0.198 lm_head (untied; embed row-gathered) |
76
- | e4b | **3.536 GB** | 2.547 layers + 0.664 tied head + 0.082 altup; 2.789 GiB per-layer embeds are ROW-gathered; vision/audio 0.891 GiB untouched |
77
- | 12B | **8.860 GB** | 7.255 layers + 0.996 tied head |
78
- | 26B-A4B | **3.444 GB** | 1.597 dense + 0.730 tied head + 8/128 × 14.091 GiB experts (top_k 8 of 128, all 30 layers) |
79
-
80
- KV read/token (bf16): CPM5 24.6 KB/pos (24L·2kv·128d); e4b 7 full + 35
81
- sliding@512 (2kv·256d) → 45 MB @600, 154 MB @8k; 12B 8 full + 40 sliding@1024
82
- (8kv·256d) → 236 MB @600, 872 MB @8k; 26B 5 full + 25 sliding@1024 → 147 MB @600.
83
-
84
- ## 3. Roofline table (floor at 270 GB/s GEMV-achieved; ceiling at 337 GB/s raw)
85
-
86
- Measured with `decode-roofline-step.ts` (mirrors generateInner's pipelined
87
- loop; greedy; bf16 KV; clearCache cadence; two passes each; uncompiled arm
88
- unless noted).
89
-
90
- | model @ctx | bytes/tok | floor ms (270) | ceiling tok/s (337) | measured ms (tok/s) | GPU ms | host graph ms | read ms | % of floor-roofline |
91
- |---|---|---|---|---|---|---|---|---|
92
- | CPM5 @132 | 0.70 GB | 2.58 | 483 | 4.06 (246) | 3.0 | 1.0 | 0.02 | **64%** |
93
- | CPM5 @4k | 0.80 GB | 2.94 | 424 | 5.03 (199) | 4.0 | 1.0 | 0.02 | **58%** |
94
- | e4b @600 | 3.58 GB | 13.3 | 94 | 18.9 (53.0) | 15.1 | 3.6 | 0.03 | **70%** |
95
- | e4b @600 compiled | 3.58 GB | 13.3 | 94 | 18.1 (55.2) | 16.8 | 1.2 | 0.03 | 73% |
96
- | e4b @8k | 3.69 GB | 13.7 | 91 | 21.3 (46.9) | 17.4 | 3.5 | 0.03 | **64%** |
97
- | e4b @8k compiled | 3.69 GB | 13.7 | 91 | 21.5 (46.5) | 20.2 | 1.3 | 0.03 | 64% |
98
- | 12B @600 | 9.10 GB | 33.7 | 37 | 36.8 (27.2) | 33.0 | 3.4 | 0.03 | **92%** |
99
- | 12B @8k | 9.73 GB | 36.0 | 35 | 37.5–40.9 (26.6–24.4) | 33.2–36.1 | 3.4 | 0.03 | **~93%** |
100
- | 12B @8k compiled | 9.73 GB | 36.0 | 35 | 39.4–41.6 | 37.0–39.7 | 1.9 | 0.03 | (thermal drift muddies the arm A/B) |
101
- | 26B @600 | 3.59 GB | 13.3 | 92 | 21.5–22.3 (46.5–44.8) | 17.3 | 3.7 | 0.02 | **60–62%** |
102
-
103
- (12B pass-to-pass drift @8k was ~8% — machine warming across the long runs;
104
- within-run medians are the trustworthy split.)
105
-
106
- **The inversion:** the bigger the model, the closer to the roofline. The 12B's
107
- GPU time IS the bandwidth floor (its GEMVs are all in the 250–295 GB/s regime
108
- and its dispatch count amortizes); the small/sparse models leave 30–40% on the
109
- table. The old conclusion was accidentally ~true for the 12B only — it was
110
- derived on CPM5, where it is most wrong.
111
-
112
- ## 4. Gap decomposition
113
-
114
- Per-step wall time = GPU step + host graph build + readback, **serial** (PLAN's
115
- structural finding re-confirmed: async_eval hides only the ~0.03 ms token read,
116
- never the graph build — measured directly in every row above).
117
-
118
- **(a) Weight+KV read floor** — §3 table. Dominant everywhere; the only true
119
- "physics".
120
-
121
- **(b) GPU overhead above floor** (dispatch gaps + small-GEMV inefficiency +
122
- elementwise/norm/rope kernels):
123
- - CPM5: 0.4 ms @132 rising to 1.0 @4k (KV-append/attention kernels are in the
124
- 100–183 GB/s small-buffer regime).
125
- - e4b: **1.8 @600 → 3.7 ms @8k** — the worst dense offender. 42 layers of
126
- per-layer-input machinery (gate/proj GEMVs ~1–2 MiB each = the 100 GB/s
127
- regime, ×42), altup ops, KV-share plumbing → dispatch count several hundred
128
- per token at ~5–15 µs each.
129
- - 12B: ~0 (at floor).
130
- - 26B: **~4.0 ms** — gather-qmm expert GEMVs: each expert slice is ~3.3 MiB
131
- (2816×704×3 mats, 4-bit) read at the ~180 GB/s small-buffer rate, ×8 experts
132
- ×30 layers, plus router argpartition/take chains.
133
- - Corroboration: the dependent tiny-op chain costs ~10–15 µs/op; a ~200–400
134
- dispatch decode step predicts 2–5 ms of pure serialization if nothing
135
- overlaps, consistent with the observed overheads.
136
-
137
- **(c) Host JS loop** — the single biggest NON-physics term across models:
138
- graph build 1.0 ms (CPM5) / 3.4–3.7 ms (e4b, 12B, 26B) per token, serial with
139
- the GPU. Sampler readback is already free (0.02–0.03 ms, pipelined).
140
- clearCache cadence already mlx-lm-faithful.
141
-
142
- **(d) Compiled decode reality check** (suspect d):
143
- - e4b (whole-graph form): graph 3.5→1.2 ms but GPU +1.7 ms (the concat-fetch
144
- materializes each growing cache's window every step) → net **+3.6% @600,
145
- ~0 @8k**. The trade is real and grows with context.
146
- - 12B (segmented form): **@600 it compiles NOTHING** — sliding rings only
147
- enter ring phase at offset ≥ window (1024), and the 8 full-attention layers
148
- are concat-phase (never compiled) forever. So at short context the default
149
- MLX_BUN_COMPILED_DECODE=1 delivers zero and the full 3.4 ms host tax stands.
150
- @8k it halves the host term (3.6→1.9 ms); net effect within thermal noise
151
- today, historically +0–1%.
152
- - CPM5 / Qwen / 26B-MoE: **no compiled decode exists at all** (gemma4-dense
153
- gate in generate.ts:512-516). CPM5 pays 25% of its step in host graph build.
154
-
155
- ## 5. Suspect-by-suspect verdicts (2026-07-01 kernel review)
156
-
157
- **(a) Backlog #4 — fused decode kernel's 6 ensureRowContiguous copies/layer/step: CONFIRMED structurally.**
158
- `fused-decode-kernel.ts:227,234` build both kernels with
159
- `ensureRowContiguous: true`; the dispatch site passes step-padded fetch VIEWS,
160
- non-contiguous whenever offset < capacity → mlx copies all six
161
- packed/scales/biases arrays per quantized full-attention layer per step.
162
- Order-of-magnitude at 12B @8k (8-bit KV): ~38 MB/layer × 8 full layers ≈
163
- 300 MB/step ≈ 1–2 ms ≈ 3–5% — matches the review's 1–3% @8k and grows linearly
164
- with context. Note this only helps the kv=config arm, which today is SLOWER
165
- than bf16 KV (eval DB: 12B @16k 24.7 vs 27.3; CPM5 209 vs 255) — this fix
166
- narrows the quantized-KV speed tax, it does not move the bf16 headline.
167
-
168
- **(b) qmv_fast port → live kernel: NOTHING TO FLOW.** Live weight GEMVs go
169
- through `ops.quantizedMatmul` (gemma4-base.ts:121,198) = mlx's own `qmv_fast`
170
- — the thing the megakernel port was catching up TO (0.70→0.94x, never above
171
- 1.0). The live perf kernel (fused SDPA) already uses the same quantized.h qdot
172
- pattern (fused-decode-kernel.ts:47-55 comment, predates the megakernel per
173
- PLAN.md:1109-1130). Review's claim verified correct; no action.
174
-
175
- **(c) "Megakernel could win at M=K": AGREE WITH THE REVIEW — recorded
176
- misleadingly.** The post-mortem's own numbers show the megakernel losing at
177
- M=1 even with zero barriers (4.95 vs 4.62) on the atomic-coherence tax and a
178
- 0.94x GEMV. At M=K, mlx ALSO amortizes: the live spec-decode verify is already
179
- one batched forward sharing the weight read, and mlx's steel GEMM kernels are
180
- strongest exactly at small-M GEMM. Nothing measured supports the megakernel
181
- overtaking at M=K. The banked learning should read: "M=K amortizes the
182
- per-forward fixed cost for ANY engine; the megakernel's specific coordination
183
- primitives were measured net-negative." The real M=K lever is the small-L
184
- flash-decoding SDPA kernel (review opportunity) + spec decode.
185
-
186
- **(d) Compiled decode: see §4(d).** On by default where applicable, but it
187
- delivers far less than its billing: nothing at 12B short-context (window
188
- phase-gating), a wash on e4b @8k (concat tax), absent on CPM5/MoE. The 3.4 ms
189
- host term it was built to kill is still ~85–100% alive at short context.
190
-
191
- **(e) e4b prefill gap: NOT REPRODUCIBLE ON THIS MACHINE — the RESULTS.md row
192
- is suspect, profile on the other laptop before building anything.**
193
- - RESULTS.md says e4b prefill 304 (ours) vs 373 (mlx-lm). This machine's eval
194
- DB has NO such rows (e4b prefill rows: ours 505–725 tok/s @600–16k; the only
195
- oracle e4b rows are @24–31 ctx where "prefill tok/s" is meaningless).
196
- - Measured today, same prompt, this machine: ours 689 tok/s @3266 (probe,
197
- in-process), mlx-lm 715–763 tok/s @3266 (two runs, cross-process). Gap ≈
198
- −4 to −10% directional, thermally muddy — nowhere near −20%.
199
- - Flag arms @2048: FUSED_GELU=0 changes prefill ~nothing (2.31→2.36 s) but
200
- costs −7% DECODE (18.4→19.9 ms — the fused GeGLU is a decode win); fused
201
- SDPA off: no prefill change.
202
- - Conclusion: the 304/373 row most likely came from the M4 Pro or a stale
203
- build. Re-benchmark there before spending on backlog #10. (Also noted: the
204
- oracle venv's mlx-lm cannot even load the 12B — `gemma4_unified not
205
- supported` — so the 12B baseline rows came through some other path.)
206
- - Bonus decode observation while pairing: mlx-lm e4b decode measured 61.3
207
- tok/s over 8 tokens but 34.0 tok/s over 64 tokens in back-to-back runs —
208
- cross-process decode comparisons at this granularity are thermal noise;
209
- trust the recorded paired result (−5% @short) and the in-process split.
210
-
211
- ## 6. Ranked fix plan (estimated wins are directional, this machine)
212
-
213
- 1. **Kill/hide the serial host graph-build tax** — the largest cross-model,
214
- non-physics term (CPM5 25%, e4b 17%, 26B 17%, 12B 9% of step):
215
- 1a. **CPM5 (and Qwen): extend CompiledDecode beyond gemma4.** CPM5 is
216
- dense, no per-layer inputs, no MoE — the EASY shape (whole-graph, no
217
- concat-tax caveat beyond growing KV, same as 12B's ring layers after
218
- window). Worth ~0.8 ms/tok ≈ **+20–25% CPM5 decode**. Effort M.
219
- 1b. **Research spike: overlap graph build with the GPU instead of
220
- compiling it away.** Today asyncEvalAll(step n+1) blocks until step n
221
- drains and the build happens outside that window. If the build of step
222
- n+2 can run while step n's buffer drains (build-two-ahead, or move the
223
- blocking wait off the loop thread), the host term hides under the GPU
224
- for EVERY model with zero numerics risk — this would also beat mlx-lm's
225
- loop, which pays the same serial cost (their pybind build is just
226
- cheaper). Effort S to spike, M to land. **This is the "no way we can't
227
- be faster" candidate.**
228
- 1c. **e4b: SharedKv segmented compile plumbing** (already-scoped review
229
- item) so e4b gets graph 3.5→~1.2 without the whole-graph concat tax:
230
- ~**+10–12% e4b**, more at long context. Effort L.
231
- 1d. **12B short-context: compile the concat phase too** (or accept 1b as
232
- the fix). The current segmented form compiles nothing below the 1024
233
- window and never compiles the 8 full-attention layers. ~+9% @600.
234
- 2. **26B GPU overhead (~4 ms/tok over floor):** ~~profile gather-qmm expert
235
- reads~~ **PROFILED 2026-07-02** (moe-expert-read-profile.ts, exact 26B
236
- shapes; real decode @600 re-measured 21.0–22.6 ms/tok ✓). The gap is real
237
- and located, but BOTH cheap candidates are refuted: expert-contiguous
238
- layout does nothing (a chain with ONE expert repeated ×8 — 1/8 the unique
239
- bytes — runs at the same speed: not bandwidth/locality-bound), and merging
240
- gate+up stacks to cut dispatches is SLOWER (9.6 vs 8.1 ms). Root cause:
241
- **mx.gather_qmm at M=1 is compute-bound** (~99 GB/s effective vs the qmv
242
- kernel's ~180 on identical bytes; upstream python mlx 0.31.2 reproduces
243
- 6.18 vs 4.01 ms) — it lacks a qmv-class fast path, so each per-expert
244
- [1,2816]→[704] product runs on mostly-idle GEMM tiles. The router chain
245
- adds a secondary ~1.6–2.6 ms of tiny-op dispatches.
246
- **Custom-kernel attempt (same day): built, correct, SHELVED.** A gather-qmv
247
- Metal kernel (scripts/experiments/moe-qmv-kernel.ts + moe-qmv-parity.ts)
248
- passes bounded-divergence on all three 26B dispatch patterns, but five
249
- structural variants (occupancy/staging/bank-conflict/mask-trick sweeps —
250
- post-mortem table in the kernel header) all measure SLOWER than gather_qmm
251
- (best 12.5 vs 8–10 ms on the 30-layer chain), and the killer measurement is
252
- structural: **mx.fast.metal_kernel dispatches cost ~60–95 µs each in a
253
- dependent chain, nearly independent of the work inside** — at 3
254
- dispatches/layer × 30 layers that fixed cost alone eats the entire ~4 ms
255
- prize. Remaining routes, in order: (a) UPSTREAM — give mlx's gather_qmm an
256
- M=1 qmv-class path in C++ (no dispatch overhead; natural companion to the
257
- quantized_matmul M=2/3 bug report), (b) a fused whole-MLP kernel (gate+up+
258
- gelu in one dispatch, down in a second → 60 dispatches/step) with a
259
- qmv-class body — a dedicated fused-decode-v2-style session starting from
260
- the post-mortem map.
261
- 3. **e4b GPU overhead (1.8–3.7 ms):** dispatch-count reduction on the
262
- per-layer-input machinery (the ~1–2 MiB gate/proj GEMVs and altup
263
- elementwise chains; batch the 42 per-layer gate GEMVs into one [42·width]
264
- GEMM where semantics allow). **+8–15% e4b.** Effort M–L.
265
- 4. **Backlog #4 (ensureRowContiguous full-capacity buffers + activeN):**
266
- validated; ~3–5% on the kv=config arm @8k, ~4x that @32k. Small, safe,
267
- makes quantized KV stop losing to bf16 on speed. Effort S.
268
- 5. **CPM5 @4k KV-path overhead (GPU 3.0→4.0 ms while KV adds only 0.35 ms of
269
- bytes):** the attention/append kernels at CPM5's small KV shapes run in the
270
- ~100–180 GB/s regime; candidates: the existing fused-decode kernel path for
271
- CPM5 (currently gemma-shaped sites only?) or upstream sdpa-vector tuning.
272
- ~+10% CPM5 @4k+. Effort M (profile first).
273
- 6. **Spec decode (M=K)** remains the only lever that beats the 12B's
274
- bandwidth wall (weight read shared across K tokens) — unchanged priority,
275
- now with the roofline to prove why nothing else can.
276
-
277
- ## 7. The overlap spike (2026-07-02) — fix 1b REFUTED; §4(c) decomposition corrected
278
-
279
- Fix 1b asked: can the host graph build hide under the GPU (build-two-ahead /
280
- off-thread dispatch)? `decode-overlap-probe.ts` answers two ways — the
281
- decisive one is DIRECT REMOVAL: take the per-step host build out of the loop
282
- entirely (pre-build all N step graphs up front, chained through the lazy
283
- argmax outputs — identical graph structure to production — then run
284
- dispatch+read with zero interleaved build) and see if decode gets faster.
285
-
286
- M1 Max, greedy, uncompiled, all arms token-IDENTICAL to baseline:
287
-
288
- | arm | CPM5 @132 (spin 2 ms) | e4b @600 (spin 4 ms) |
289
- |---|---|---|
290
- | baseline (pipelined) | 4.05 ms/tok (graph 0.86, dispatch 3.13) | 19.02→18.06 across passes (graph ~3.3–3.6, dispatch ~14) |
291
- | **prebuilt (host build REMOVED)** | **4.11 (+0.07)** | **19.03 (+0.01)** |
292
- | prebuilt-1buf (also no per-step dispatch boundaries) | 4.33 | 19.73 |
293
- | serial (evalAll, no pipeline) | **+1.75 ms** | **+3.36 ms** |
294
- | spin-build / spin-pre / spin-post (+W injected host work) | **+0.4 ms** (not +2) | **+1.0–1.4 ms** (not +4) |
295
- | chain-2 / chain-3 (deeper pipeline) | ±0.01 ms | +0.02 / −0.96 (== pass drift) |
296
-
297
- - **Removing the work gains nothing**: with the entire 0.9 ms (CPM5) /
298
- 3.6 ms (e4b) per-token build lifted out of the loop, decode speed is
299
- unchanged (+0.07 / +0.01 ms, inside pass-to-pass drift). Even the one-buffer
300
- floor — no host work AND no per-step dispatch boundaries — is no faster.
301
- **The build already overlaps; wall = GPU step time.**
302
- - The injection arms agree from the other direction: extra host work is
303
- ABSORBED (dispatch shrinks 3.13→1.6 exactly as `gpu − host` predicts) — the
304
- GPU is busy with step n while the host builds step n+1.
305
- - The serial anchor costs MORE than the build itself (CPM5 +1.75 vs 0.86;
306
- e4b +3.36 vs 3.6): the pipelined loop hides the build AND the per-step
307
- launch gap. The loop shape is already right; mlx-lm's identical shape gets
308
- the identical hiding.
309
- - Deeper pipelining (chain-2/3) buys exactly nothing — there is no residual
310
- host term to hide.
311
-
312
- **Corrections to this doc:**
313
- - §4(c) "host JS loop — the single biggest NON-physics term" is WRONG as an
314
- additive claim. The "host graph ms" column was measured as time-in-JS-calls,
315
- but that window runs concurrently with the GPU; "GPU ms" (= the dispatch
316
- wait) is `gpu − graph`, so summing them reconstructs the wall without any
317
- recoverable host term. The true GPU step time ≈ the measured wall itself.
318
- - §6.1a (CPM5 CompiledDecode "+20–25%"): premise gone. Any compiled-decode win
319
- is GPU-side (fewer/denser dispatches from C++ replay), not host removal —
320
- re-bill as profile-first, expected small. This also re-explains §4(d):
321
- e4b @600 compiled wall 18.9→18.1 means compiled made the GPU ~0.8 ms faster
322
- (net of concat tax), not "host −2.4, GPU +1.7".
323
- - §6.1b (this spike): answered, REFUTED — nothing to build.
324
- - §6.1c/1d (SharedKv segmented-compile plumbing ~L effort, 12B concat-phase
325
- compile): the host-tax share of their billing is gone; only GPU-side effects
326
- remain. De-prioritize pending a GPU-side profile.
327
- - §6 items 2 (26B expert reads), 3 (e4b dispatch count), 4 (backlog #4
328
- contiguity), 5 (CPM5 KV-path), 6 (spec decode) are UNAFFECTED — they were
329
- always GPU-side, and they are now the entire recoverable gap.
330
- - 12B/26B not re-probed (structurally the same loop; 12B was at-wall under
331
- either reading; 26B's 3.7 ms graph ≪ its ~18 ms step has the same slack).
332
-
333
- ## Probes added (scripts/experiments/, tsc-clean)
334
- - `decode-overlap-probe.ts` — direct-removal (prebuilt / prebuilt-1buf) +
335
- spin-injection + serial-anchor + chain-depth arms for the overlap question
336
- (§7).
337
- - `decode-roofline-bw.ts` — machine bandwidth: raw read, decode-shaped qmv
338
- GEMV (multi-copy, one-eval chaining), bf16 GEMV, dispatch chain.
339
- - `decode-roofline-step.ts` — factory-generic pipelined decode split
340
- (graph/dispatch/read) with `--compiled` arm, any model/context.
341
-
342
- ## Standing-rule notes
343
- - Pre-existing tsc error in `src/eval/runner.ts:161` (kvBits on a Pick union)
344
- in Josh's working tree — not introduced here, not fixed here (outside the
345
- edit boundary for this task).
346
- - RESULTS.md "Direct" table's e4b prefill row contradicts this machine's eval
347
- DB (no supporting rows) — per the verify-against-evaldb rule it needs a
348
- machine label or a re-run on the M4 Pro.