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,462 +0,0 @@
1
- # Training / fine-tuning reference
2
-
3
- How to fine-tune a served model with LoRA adapters: the commands, the data
4
- formats, every config field, the long-context memory stack, and the
5
- methodology behind the knobs.
6
-
7
- mlx-bun trains **LoRA adapters** (the base quantized weights stay frozen),
8
- supports **SFT**, **DPO**, and **ORPO**, and runs on a single Apple-Silicon
9
- GPU. The output is a PEFT-compatible adapter directory you mount into the
10
- server (`mlx-bun serve <model> --adapter <dir>`) or fold into the base
11
- weights (`mlx-bun fuse`).
12
-
13
- > Source of truth: `mlx-bun train` in [`src/cli.ts`](../../src/cli.ts)
14
- > (flags + defaults), the submit schema `FinetuneSubmit` in
15
- > [`src/train/job.ts`](../../src/train/job.ts), and `DEFAULT_TRAIN_CONFIG` in
16
- > [`src/train/trainer.ts`](../../src/train/trainer.ts). If this doc and the
17
- > code disagree, the code wins.
18
-
19
- ## Entry points
20
-
21
- Every path drives the **same** runner (`finetuneRunner` in `src/train/job.ts`):
22
-
23
- | Path | How | Use when |
24
- |---|---|---|
25
- | **CLI** | `mlx-bun train <model> --data <dir> [options]` — foreground, streams loss to the terminal, ORPO with the full memory stack by default. `mlx-bun help train` lists every flag. | **The default.** |
26
- | **Live dashboard** | `mlx-bun train-watch <adapter-dir>` — tails `<adapter-dir>/metrics.jsonl` from another terminal. | Watching a detached run |
27
- | **Fuse** | `mlx-bun fuse <model> --adapter <dir> [--save-path <out>]` — fold the adapter into the base weights → standalone snapshot. | Shipping a merged model |
28
- | **Web app** | The Fine-tune tab (`#/finetune`, behind the app's Developer toggle): model → dataset → hyperparameters → train, live train/val loss, merge/export. | Interactive |
29
- | **HTTP API** | `POST /api/finetune/{inspect-dataset,submit,merge,export}` — same runner as a subprocess job with SSE events; documented in [server-api.md](server-api.md). | Scripted / remote |
30
- | **ORPO launcher** | [`scripts/train-orpo.ts`](../../scripts/train-orpo.ts) — the CLI's ORPO stack driven by env vars (`MODEL=`, `DATA=`, `SEQ=`, `SEG=`, `RESUME=`, …). | Env-var scripting |
31
- | **Library** | `import { finetuneRunner } from "./src/train/job"` (snake_case submit record + event emitter) or `trainLora` / `DEFAULT_TRAIN_CONFIG` from `./src/train` (camelCase `TrainConfig`). | Embedding training in your own TS |
32
-
33
- The CLI and the launcher run in-process in the foreground; the web app and
34
- HTTP API run the job as a subprocess (crash isolation, one GPU lease across
35
- concurrent server requests).
36
-
37
- ## Quickstart — ORPO on preference data
38
-
39
- ORPO is the CLI default: reference-free, two forwards per step, and the
40
- whole long-context stack (flash-CCE head + prefix-sharing + segmented
41
- backward) is on unless you turn pieces off.
42
-
43
- **1. Data.** `--data <dir>` must contain `train.jsonl` (+ optional
44
- `valid.jsonl`); rows are `{"prompt": "...", "chosen": "...", "rejected": "..."}`
45
- (`prompt` may also be a chat-messages array — it is rendered through the
46
- model's chat template). To build one from UltraFeedback:
47
-
48
- ```bash
49
- # <input.jsonl> = HuggingFaceH4/ultrafeedback_binarized exported to JSONL (you fetch it)
50
- bun scripts/curate-ultrafeedback.ts <input.jsonl> ./prefs [maxTokens=2048] [valFrac=0.02]
51
- ```
52
-
53
- **2. Plan without training.** `--dry-run` inspects the dataset (counts,
54
- detected format) and prints the resolved plan box: model, loop knobs, head,
55
- stack, adapter path.
56
-
57
- ```bash
58
- mlx-bun train e4b --data ./prefs --dry-run
59
- ```
60
-
61
- **3. Train — detached from your own shell.** The command blocks and streams
62
- per-step loss, s/step, and peak memory until done. Save a mountable
63
- checkpoint every N steps so a crash costs you nothing, and put the adapter
64
- somewhere the server discovers it (see [Outputs](#outputs)).
65
-
66
- ```bash
67
- nohup mlx-bun train e4b --data ./prefs --iters 1000 --save-every 200 \
68
- --adapter ~/.cache/mlx-bun/adapters/my-e4b > train.log 2>&1 &
69
- ```
70
-
71
- **4. Watch it from another tab.**
72
-
73
- ```bash
74
- mlx-bun train-watch ~/.cache/mlx-bun/adapters/my-e4b
75
- ```
76
-
77
- **5. Resume** warm-starts the LoRA weights from a checkpoint or adapter dir
78
- (optimizer state + LR schedule restart; rank/targets must match).
79
-
80
- ```bash
81
- mlx-bun train e4b --data ./prefs --iters 500 \
82
- --resume ~/.cache/mlx-bun/adapters/my-e4b/checkpoints/step-00200-val<loss> \
83
- --adapter ~/.cache/mlx-bun/adapters/my-e4b-2
84
- ```
85
-
86
- **6. Serve or fuse.**
87
-
88
- ```bash
89
- mlx-bun serve e4b --adapter ~/.cache/mlx-bun/adapters/my-e4b
90
- mlx-bun fuse e4b --adapter ~/.cache/mlx-bun/adapters/my-e4b --save-path ./my-e4b-merged
91
- mlx-bun serve ./my-e4b-merged
92
- ```
93
-
94
- `<model>` is a registry query or a snapshot path (`e4b`, `MiniCPM5`, …);
95
- omit it to auto-pick the default model. Per-model defaults: Gemma/e4b gets
96
- `--seq 8192`, everything else `4096`. ORPO defaults `--rank 16 --scale 2.0
97
- --seg 2`; SFT/DPO default `--rank 8 --scale 1.0` and **no** segmented
98
- backward unless you pass `--seg <n>`.
99
-
100
- Measured memory/throughput for these runs live in
101
- [benchmarks.md](benchmarks.md) — this doc records only the ceilings that
102
- decide whether a run fits (see [Sequence-length ceilings](#sequence-length-ceilings-measured)).
103
-
104
- ### `mlx-bun train` flags
105
-
106
- | Flag | Default | Meaning |
107
- |---|---|---|
108
- | `--data <dir>` | required | dataset dir with `train.jsonl` (+ `valid.jsonl`) |
109
- | `--method <m>` | `orpo` | `sft` · `dpo` · `orpo` |
110
- | `--adapter <dir>` | `~/.cache/mlx-bun/mlx-bun-finetunes/<method>-<model>` | output adapter dir (`<model>` = `e4b` for Gemma, else `cpm5`) |
111
- | `--iters <n>` | 100 | training iterations |
112
- | `--lr <f>` | orpo 1e-5 · dpo 5e-5 · sft 2e-4 | learning rate (ORPO/DPO: cosine schedule; ORPO warmup = min(10, iters/10)) |
113
- | `--rank <n>` | orpo 16 · else 8 | LoRA rank (`by_bits`-scaled per layer) |
114
- | `--scale <f>` | orpo 2.0 · else 1.0 | LoRA scale |
115
- | `--seq <n>` | gemma 8192 · else 4096 | max sequence length |
116
- | `--batch <n>` | 1 | batch size |
117
- | `--grad-accum <n>` | 1 | gradient accumulation steps (effective batch = batch × grad-accum at batch-1 memory) |
118
- | `--grad-clip <f>` | 1.0 | gradient-norm clip (0 = off) |
119
- | `--seed <n>` | 0 | data-shuffle / init seed |
120
- | `--val-size <n>` | 256 | max validation examples per eval |
121
- | `--lambda <f>` | 0.1 | ORPO odds-ratio weight |
122
- | `--sft-scope <s>` | `full` | ORPO chosen-NLL scope: `full` (paper/TRL-faithful prompt+response) · `response` (pre-2026-07 runs, bit-exact) |
123
- | `--seg <n>` | orpo 2 · else 0 | layers per segment (segmented backward) |
124
- | `--no-segment` | — | disable the segmented backward (all activations resident) |
125
- | `--save-every <n>` | off | crash-safe mountable checkpoint every n steps (turns on `save_checkpoints`; eval runs at the same cadence) |
126
- | `--resume <dir>` | — | warm-start LoRA weights from a checkpoint/adapter dir |
127
- | `--no-flash` | — | ORPO: use the MLX fused linear-CE head instead of the flash-CCE Metal head |
128
- | `--no-prefix` | — | ORPO: disable prefix-sharing (two-forward branches) |
129
- | `--dry-run` | — | inspect the dataset + print the plan, don't train |
130
-
131
- The CLI always sets `rank_scaling: by_bits`, `num_layers: -1`,
132
- `steps_per_report: 1`, and for ORPO `orpo_chunk_size: 512` plus
133
- `orpo_flash_ce` / `orpo_fused_ce` / `orpo_prefix_shared` from the flags
134
- above. Anything not exposed as a flag (`lora_dropout`, `rs_lora`,
135
- `lora_plus_ratio`, `grad_checkpoint`, `target_modules`, …) is reachable
136
- through the submit record — see [Configuration reference](#configuration-reference).
137
-
138
- ### The launcher (env-var alternative)
139
-
140
- [`scripts/train-orpo.ts`](../../scripts/train-orpo.ts) runs the identical
141
- ORPO stack from env vars. `MODEL` is a snapshot **path** (a dir with
142
- `config.json`), not a query.
143
-
144
- ```bash
145
- MODEL=<snapshot-dir> DATA=./prefs ITERS=200 bun scripts/train-orpo.ts
146
- ```
147
-
148
- | Env | Default | Meaning |
149
- |---|---|---|
150
- | `SEQ` | e4b 8192 · cpm 4096 | max sequence length |
151
- | `SEG` | 2 | layers per segment; `SEGOFF=1` disables the segmented backward |
152
- | `ITERS` / `LR` | 100 / 1e-5 | iterations / learning rate (cosine + short warmup) |
153
- | `RANK` / `SCALE` | 16 / 2.0 | LoRA rank (by_bits scaled) / scale |
154
- | `LAMBDA` | 0.1 | ORPO odds-ratio weight |
155
- | `SFT_SCOPE` | `full` | `full` · `response` (as `--sft-scope`) |
156
- | `FLASH=0` | (on) | MLX fused head instead of the flash Metal head |
157
- | `PREFIX=0` | (on) | disable prefix-sharing |
158
- | `SAVE_EVERY` | 0 (off) | mountable checkpoint every N steps |
159
- | `RESUME` | — | adapter/checkpoint dir to warm-start from |
160
- | `ADAPTER` | `~/.cache/mlx-bun/mlx-bun-finetunes/orpo-<e4b\|cpm5>` | output dir |
161
-
162
- ## Data formats
163
-
164
- Each row of `train.jsonl` (and optional `valid.jsonl`) is auto-detected by
165
- its keys ([`src/train/dataset.ts`](../../src/train/dataset.ts)):
166
-
167
- | Format | Shape | Loss boundary |
168
- |---|---|---|
169
- | `messages` | `{"messages": [{"role","content"}, …]}` | response-only — loss on the final turn; prompt = chat-template render of all prior turns |
170
- | `prompt-completion` | `{"prompt": "...", "completion": "..."}` | loss on the completion only |
171
- | `text` | `{"text": "..."}` | full-sequence (no prompt mask) |
172
- | `preference` *(dpo / orpo)* | `{"prompt", "chosen", "rejected"}` | preference loss on chosen vs rejected; `prompt` may be a string or a messages array |
173
-
174
- `mlx-bun train --dry-run` (or `POST /api/finetune/inspect-dataset`) reports
175
- `n_train`, `n_valid`, and the detected format before any weights load.
176
-
177
- ## SFT vs DPO vs ORPO
178
-
179
- - **SFT** (`--method sft`) — supervised fine-tune; response-only
180
- cross-entropy. Default LR `2e-4`. Instruction-following, formatting, task
181
- adaptation. Segmented backward is available (`--seg <n>`) but off by
182
- default.
183
- - **DPO** (`--method dpo`) — Direct Preference Optimization on
184
- chosen/rejected pairs; loss `-log σ(β·((π_c − ref_c) − (π_r − ref_r)))`
185
- with reference log-probs computed at LoRA scale 0 (4 forwards/step).
186
- Default LR `5e-5`. Tune with `dpo_beta`, `dpo_warmup_iters`,
187
- `dpo_lr_schedule`. No segmented backward on this path.
188
- - **ORPO** (`--method orpo`, the default) — Odds Ratio Preference
189
- Optimization (Hong et al. 2024): a **reference-free** objective
190
- `L = L_NLL(chosen) + λ·L_OR`, `L_OR = -log σ(log_odds)`,
191
- `log_odds = (ℓ_w − ℓ_r) − (log1mexp(ℓ_w) − log1mexp(ℓ_r))`, where `ℓ` is
192
- the length-normalized (mean over response tokens) log-prob. `--sft-scope
193
- full` (default; paper/TRL-faithful) computes `L_NLL` as the token-mean CE
194
- over the **full prompt+response** of the chosen sequence from the same
195
- forward; `response` uses `L_NLL = −ℓ_w` (pre-2026-07 behavior, kept for
196
- reproducing old runs). The odds-ratio terms are response-only in both
197
- modes. Same data as DPO, no reference model (2 forwards/step). Default LR
198
- `1e-5` — the loss carries a full NLL term a high LR destabilizes. Design:
199
- [orpo-training](../design/orpo-training.md).
200
-
201
- ## The long-context stack (ORPO defaults)
202
-
203
- Each piece is independently toggled, composes with the others (all B=1),
204
- and falls back with a logged message when a precondition isn't met.
205
-
206
- - **flash-CCE head** (`--no-flash` to disable; `orpo_flash_ce`) — the
207
- `[M,vocab]`-free cross-entropy head in
208
- [`src/train/flash-cce.ts`](../../src/train/flash-cce.ts): Apple's Cut
209
- Cross-Entropy + Liger's fused linear-CE transpiled Triton → Metal, over
210
- the **quantized** head (in-kernel dequant, MLX steel GEMM tiles, forward
211
- and backward). Neither the logits nor a dequantized head ever touch HBM,
212
- so head memory is flat in vocab and sequence length. Batches with
213
- `M < MLX_BUN_FLASH_MIN_M` (default 1024) auto-take the exact MLX fused
214
- head, which is faster at short M; `=0` always honors flash. Falls back to
215
- the fused head when the tiling isn't clean. Two backward skips default ON
216
- at `1e-5` (`MLX_BUN_CCE_BWD_FILTER_EPS`, the coefficient filter;
217
- `MLX_BUN_CCE_BWD_BLOCK_EPS`, the lossless cold-block skip); set either to
218
- `0` for exact gradients.
219
- - **segmented backward** (`--seg <n>` / `--no-segment`; `segment_size`) —
220
- [`src/train/segmented.ts`](../../src/train/segmented.ts). The forward
221
- materializes and **detaches** the residual stream every n layers; the
222
- head is differentiated against the last boundary; then each segment is
223
- back-propagated in reverse via `mlx_vjp` with the incoming cotangent, so
224
- only one segment's activations are live. Bit-identical to the plain
225
- backward on MiniCPM5; bf16-class on e4b. Wired for MiniCPM5 and Gemma4
226
- (SFT and ORPO); mutually exclusive with `grad_checkpoint`. Design + proofs:
227
- [segmented-backward-training](../design/orpo-training.md).
228
- - **prefix-sharing** (`--no-prefix`; `orpo_prefix_shared`) —
229
- [`src/train/prefix-shared.ts`](../../src/train/prefix-shared.ts). One
230
- forward over `[prompt; chosen; rejected]` with a block-sparse mask and
231
- block-wise RoPE (each response resets to position P), so the shared
232
- prompt is encoded once: layer-token cost `2(P+R) → P+2R`. Bit-exact with
233
- the two-forward path; a big win when the prompt dominates, ~0 when the
234
- response does. Rows whose chosen/rejected prompts aren't byte-identical
235
- fall back to two-forward for that row (logged once). MiniCPM5 + Gemma4;
236
- other models error out rather than silently degrade.
237
- - **gradient checkpointing** (`grad_checkpoint`, API/library only) —
238
- per-layer recompute; bit-identical. Cheaper than nothing, but it does not
239
- stream the backward: at long context every layer's recompute is held at
240
- once, which is what segmented backward fixes. `mlp_split` (Gemma4)
241
- refines it to attention/MLP halves.
242
- - **warm-start** (`--resume <dir>`; `warm_start_adapter`) — load LoRA
243
- weights from an adapter/checkpoint dir; optimizer + schedule restart.
244
-
245
- ## Configuration reference
246
-
247
- The snake_case submit record (`FinetuneSubmit`) — what the CLI builds, what
248
- the web app and `POST /api/finetune/submit` accept, and what
249
- `finetuneRunner` takes. `model_dir`, `data_dir`, `adapter_path` are
250
- required; defaults are `DEFAULT_TRAIN_CONFIG` (the CLI overrides several —
251
- see the flags table).
252
-
253
- | Field | Type | Default | Effect |
254
- |---|---|---|---|
255
- | `method` | `sft` \| `dpo` \| `orpo` | `sft` | training objective |
256
- | `rank` | int ≥2 | `8` | LoRA rank per adapted linear |
257
- | `scale` | float >0 | `1.0` | LoRA α (effective update = α·BA) |
258
- | `rank_scaling` | `constant` \| `by_bits` \| `by_kl` | `by_bits` | per-layer rank policy (see Methodology) |
259
- | `target_modules` | string[] | `q,k,v,o,gate,up,down _proj` | which linears get adapters |
260
- | `num_layers` | int | `-1` | `-1` = all layers; `N` = last N only |
261
- | `iters` | int >0 | `100` | total training steps |
262
- | `learning_rate` | float >0 | `2e-4` | AdamW LR (CLI: orpo 1e-5 / dpo 5e-5) |
263
- | `max_seq_length` | int >0 | `512` | truncate/pad sequences (CLI: 8192 / 4096) |
264
- | `batch_size` | int ≥1 | `1` | rows per step (B=1 is the no-padding path; B>1 length-sorts + pads to 32) |
265
- | `grad_accumulation_steps` | int ≥1 | `1` | accumulate grads over N micro-steps |
266
- | `seed` | int | `0` | RNG for shuffling + LoRA init |
267
- | `steps_per_report` | int >0 | `10` | train-loss metric every N steps (CLI: 1) |
268
- | `steps_per_eval` | int >0 | `50` | eval on `valid.jsonl` every N steps (CLI: `--save-every`, else never) |
269
- | `weight_decay` | float ≥0 | `0.01` | AdamW weight decay (β = `[0.9, 0.999]`, fixed) |
270
- | `lora_dropout` | float [0,1) | `0.0` | LoRA-input dropout (PEFT-style); mask keyed by step+layer so segmented/checkpointed recompute reproduces it |
271
- | `rs_lora` | bool | `false` | rsLoRA — scale by α/√rank so `rank_scaling` changes capacity, not step size; recorded in the adapter config and honored at inference |
272
- | `lora_plus_ratio` | float ≥1 | `1.0` | LoRA+ — LR multiplier for the B leaves (A stays at base LR); 1 = off |
273
- | `grad_checkpoint` | bool | `false` | recompute layer activations in backward (bit-identical) |
274
- | `mlp_split` | bool | `false` | attention/MLP split inside the checkpoint (Gemma4; needs `grad_checkpoint`) |
275
- | `segment_size` | int | `0` | `>0` = segmented backward, layers per segment (CLI: orpo 2) |
276
- | `save_checkpoints` | bool | `false` | keep every eval-step checkpoint + write `metrics.json` (CLI: on with `--save-every`) |
277
- | `grad_clip_norm` | float ≥0 | `1.0` | global-norm gradient clipping; `0` = off |
278
- | `val_max_examples` | int >0 | `256` | fixed validation subset per eval |
279
- | `warm_start_adapter` | string | `""` | adapter dir to warm-start from (`--resume`) |
280
- | `dpo_beta` | float >0 | `0.1` | DPO strength |
281
- | `dpo_warmup_iters` | int ≥0 | `0` | DPO LR warmup |
282
- | `dpo_lr_schedule` | `constant` \| `cosine` | `cosine` | DPO LR schedule |
283
- | `orpo_lambda` | float >0 | `0.1` | ORPO λ — weights only the odds-ratio term |
284
- | `orpo_warmup_iters` | int ≥0 | `0` | ORPO LR warmup (CLI: min(10, iters/10)) |
285
- | `orpo_lr_schedule` | `constant` \| `cosine` | `cosine` | ORPO LR schedule |
286
- | `orpo_chunk_size` | int | `0` | token-chunk the response head to `[chunk,vocab]`; exact (CLI: 512) |
287
- | `orpo_fused_ce` | bool | `false` | fused linear-CE head: one CustomVjp with the analytic softmax−onehot backward, no retained `[M,vocab]` (CLI: on when `--no-flash`) |
288
- | `orpo_flash_ce` | bool | `false` | route the fused head through the flash-CCE Metal kernel; implies fused (CLI: on) |
289
- | `orpo_prefix_shared` | bool | `false` | shared prompt-prefix single forward (CLI: on) |
290
- | `sft_scope` | `full` \| `response` | `full` | scope of ORPO's chosen-NLL term (`--sft-scope`) |
291
-
292
- ### Environment variables (training)
293
-
294
- | Env var | Default | Effect |
295
- |---|---|---|
296
- | `MLX_BUN_TRAIN_ATTN` | unset → `ops.sdpa` | `ops.sdpa` **is** mlx's fused flash-attention kernel with an exact vjp — the working path. `flash` selects a hand-rolled O(L)-memory kernel: FD-validated at T≤256 (`tests/unit/flash-attention.test.ts`) but ~30× slower, and the trainer **refuses it for Gemma models** (e4b SIGTRAPed at seq ≥2048 and has not been re-validated at that scale). Leave unset. |
297
- | `MLX_BUN_MEM_LOG` | off | `1` prints per-step peak/active/cache memory |
298
- | `MLX_BUN_SEG_MEM_LOG` | off | `1` logs the within-step peak after each segmented phase (forward / head vjp / each segment) |
299
- | `MLX_BUN_SEG_HEAD` | `checkpoint` | bounded head inside the segmented vjp: `checkpoint` (per-chunk recompute) or `fused` |
300
- | `MLX_BUN_SEG_HEAD_CHUNK` | 512 | token-chunk for the segmented SFT head |
301
- | `MLX_BUN_FLASH_MIN_M` | 1024 | rows shorter than this take the exact fused head instead of flash; `0` = always flash |
302
- | `MLX_BUN_CCE_BWD_FILTER_EPS` / `MLX_BUN_CCE_BWD_BLOCK_EPS` | `1e-5` / `1e-5` | flash-CCE backward skips; `0` compiles each out (exact gradients) |
303
-
304
- `MLX_BUN_CCE_*` beyond those two (`NOSTEEL`, `BWD_NOSTEEL`, `SCALAR`,
305
- `LANE`, `BWD_SCALAR`, `SG_SKIPDQ`, `BWD_SKIP_P2*`) select kernel variants
306
- for A/B work in `flash-cce.ts`; they are not user knobs. Training needs no
307
- other env setup — the Gemma-specific flag sanitization older recipes
308
- exported is gone (those kernels were deleted 2026-07-05; exporting the old
309
- variables does nothing).
310
-
311
- ## Sequence-length ceilings (measured)
312
-
313
- What decides whether a run fits. Full tables (peak GB and s/step per
314
- seq/config) are in [benchmarks.md](benchmarks.md); the mechanism and the
315
- measurement method are in
316
- [segmented-backward-training](../design/orpo-training.md).
317
-
318
- - **MiniCPM5-1B (24 layers), M1 Max 32 GB, 2026-06-16** — segmented
319
- backward (`segment_size` 4) @2048: peak live **10.91 → 3.29 GB** vs the
320
- plain backward; @4096 the plain backward spikes to 21–26 GB while
321
- segmented stays at 6–8 GB. Trains at 8192 comfortably.
322
- - **e4b (Gemma4, 42 layers), M1 Max 32 GB, 2026-06-16** — without
323
- segmentation, `ops.sdpa` + `grad_checkpoint` peaks at **23.2 GB live @2048**
324
- and crashes at 4096 (linear: ≈ 7.7 GB + 7.6 MB/token). With segmented
325
- backward all 42 layers train at **8192 in 17.5 GB** (`segment_size` 2),
326
- where `mlx_lm.lora --grad-checkpoint` OOMs on all-42 @8192 and needs its
327
- default 16 trainable layers (25.7 GB) to fit.
328
- - **e4b, M1 Max 32 GB, 2026-07-02** — `segment_size` is the whole knob:
329
- mlx's sdpa backward materializes O(L²) scores for every layer (sliding
330
- window is only a mask), so the worst segment is set by layer count.
331
- `segment_size` 1 = **14.59 GB @8K**, +3% step time, loss identical —
332
- fits a 24 GB M4 Pro.
333
- - **e4b ORPO full stack (flash + prefix-share + seg 2), M1 Max 32 GB** —
334
- fits at 8192 with headroom; prefix-sharing is what makes prompt-dominant
335
- data cheap (memory and step time both drop when the prompt is encoded
336
- once). Numbers are from short probe runs — they prove fit and finite
337
- decreasing loss, not training quality.
338
-
339
- Rules of thumb: e4b at multi-K context **requires** segmented backward
340
- (`--seg`, on by default for ORPO; pass it explicitly for SFT); memory is
341
- linear in `--seq`; on a 24 GB machine use `--seg 1` at 8K.
342
-
343
- ## Examples (task-specific recipes)
344
-
345
- These are the scripts behind our own chunk-segmentation fine-tunes. They
346
- carry task defaults (data paths, eval corpus) that point at a sibling
347
- repo — override `DATA=` / `MODEL=` / `ADAPTER=` for your own data and treat
348
- them as templates, not tools.
349
-
350
- - [`scripts/examples/chunk-finetune.ts`](../../scripts/examples/chunk-finetune.ts)
351
- — SFT via `finetuneRunner` directly, env-driven. `MODEL` defaults to a
352
- MiniCPM5-1B-OptiQ-4bit snapshot; `SEQ` 8192, `ITERS` 2 (probe), `RANK`
353
- 16, `LR` 1e-5, `SCALE` 20, `SEG` 0, `EVAL_EVERY` auto, `CKPT=0` disables
354
- keep-all checkpoints, `GRAD_CKPT=1` enables gradient checkpointing.
355
- ```bash
356
- DATA=<dir> SEQ=8192 ITERS=2 bun scripts/examples/chunk-finetune.ts # memory/stability probe
357
- DATA=<dir> SEQ=8192 ITERS=300 SEG=2 bun scripts/examples/chunk-finetune.ts # real run
358
- ```
359
- - [`scripts/examples/ft-e4b-v2.sh`](../../scripts/examples/ft-e4b-v2.sh)
360
- `probe|train` — wraps `chunk-finetune.ts` for e4b with `SEQ=8192 SEG=4
361
- RANK=16 SCALE=20 LR=1e-5`, pinning the validated e4b OptiQ-4bit snapshot;
362
- `probe` = 2 iters (run first), `train` = 900 iters (~2 epochs over 450
363
- rows at batch 1).
364
- ```bash
365
- DATA=<dir> scripts/examples/ft-e4b-v2.sh probe
366
- DATA=<dir> ITERS=750 SEQ=4096 SEG=1 scripts/examples/ft-e4b-v2.sh train
367
- ```
368
- - [`scripts/examples/chunk-eval.ts`](../../scripts/examples/chunk-eval.ts)
369
- — in-process task eval (no server): loads a model, optionally mounts
370
- `ADAPTER=<dir>`, generates over a frozen holdout, and scores with the
371
- task's metric. Its holdout/scorer imports live in the sibling repo; copy
372
- the shape for your own task eval. Pick checkpoints by the task eval, not
373
- by val loss.
374
-
375
- ## Methodology
376
-
377
- ### LoRA
378
- Adapters attach to the target linears; A is initialized uniform, B zeros,
379
- so the adapted model equals the base at step 0. Only A/B are differentiated.
380
- Default targets are the 7 attention+MLP projections per block
381
- (`q/k/v/o_proj`, `gate/up/down_proj`). See
382
- [`src/train/lora-params.ts`](../../src/train/lora-params.ts).
383
-
384
- ### Rank scaling (`rank_scaling`)
385
- - `constant` — every target gets `rank`.
386
- - `by_bits` *(default)* — `rank × (bits / 4)`, clamped ≥2: wider adapters
387
- on the more-sensitive (higher-bit) layers of a mixed-precision model. The
388
- per-layer bits come from the loaded model's quant specs.
389
- - `by_kl` — scales by per-layer KL importance from `optiq_metadata.json`,
390
- clamped to [0.5×, 2×]; falls back to `by_bits` when none is recorded.
391
-
392
- ### Long-context memory
393
- At long `max_seq_length` activation memory dominates, not the head. Two
394
- levers, mutually exclusive: `grad_checkpoint` (per-layer recompute, does not
395
- stream) and `segment_size` (segmented backward, streams one segment at a
396
- time — the path to multi-K context). Detail, proofs, and the `mlx_vjp`
397
- vs surrogate-`value_and_grad` leak lesson:
398
- [segmented-backward-training](../design/orpo-training.md).
399
-
400
- ### Training attention
401
- `ops.sdpa` (mlx's fused SDPA, exact vjp, O(L²) backward memory) is the
402
- only supported path for Gemma and the default everywhere. The opt-in
403
- `MLX_BUN_TRAIN_ATTN=flash` kernel is an O(L)-memory experiment — ~30×
404
- slower and blocked for Gemma by the trainer (see the env table).
405
-
406
- ## Outputs
407
-
408
- A finished run writes a PEFT-compatible adapter directory:
409
-
410
- - `adapters.safetensors` — the `lora_a` / `lora_b` tensors
411
- - `optiq_lora_config.json` — mlx-bun/optiq metadata (per-layer ranks, scale, base model)
412
- - `adapter_config.json` — PEFT-compatible config
413
- - `metrics.jsonl` — append-only per-step log (what `train-watch` tails)
414
-
415
- The save completes only after both config files are written — including
416
- eval-step checkpoints — so a successful exit always leaves a mountable
417
- directory. With `save_checkpoints` (`--save-every`), each eval step also
418
- writes `checkpoints/step-<NNNNN>-val<loss>/` (each a full mountable adapter)
419
- and `metrics.json` (config, wall seconds, peak GB, final/best train+val
420
- loss, full val trajectory).
421
-
422
- **Where to save.** The CLI default is
423
- `~/.cache/mlx-bun/mlx-bun-finetunes/<method>-<model>`. The server's adapter
424
- discovery (`GET /v1/adapters/available`, the web chat's adapter picker)
425
- scans `~/.cache/mlx-bun-finetunes` and **`~/.cache/mlx-bun/adapters`** —
426
- so pass `--adapter ~/.cache/mlx-bun/adapters/<name>` if you want the
427
- adapter selectable without typing a path. `serve --adapter <dir>` and
428
- `fuse --adapter <dir>` accept any directory.
429
-
430
- Serving accepts both mlx-lm tensor layout (`[in, rank]` / `[rank, out]`)
431
- and standard PEFT layout (`[rank, in]` / `[out, rank]`, including
432
- `base_model.model.*` names); PEFT `use_rslora` metadata is honored as
433
- `lora_alpha / sqrt(rank)`. Hot-swap and per-request selection:
434
- [server-api.md](server-api.md) (Adapters) and
435
- [adapters-end-to-end](../design/web-chat-redesign.md).
436
-
437
- ## Memory & performance tips
438
-
439
- - Start at `--batch 1` (the no-padding path); raise only with headroom.
440
- `--grad-accum` raises the effective batch at batch-1 memory.
441
- - OOM → lower `--seq`, lower `--seg` (1 at 8K on 24 GB), or reduce
442
- `--rank`.
443
- - `MLX_BUN_MEM_LOG=1` for per-step peak; `MLX_BUN_SEG_MEM_LOG=1` to see
444
- which phase the peak lives in.
445
- - Short rows already take the exact fused head automatically
446
- (`MLX_BUN_FLASH_MIN_M`); on response-dominant data `--no-prefix` costs
447
- nothing and `--no-flash` is worth an A/B.
448
- - Select checkpoints by the downstream task eval or val accuracy/loss —
449
- not by preference margin, which keeps rising after the model has
450
- started overfitting.
451
-
452
- ## Rules for agents working alongside a run
453
-
454
- - **No GPU work while a training run is active.** The GPU is fully
455
- occupied; a "quick" benchmark, parity test, or model load corrupts both
456
- the probe's numbers and the run's throughput. Verify by reading source
457
- and logs (`train-watch`, `train.log`, `metrics.jsonl`), not by executing.
458
- - Long runs are launched by the user from their own shell (`nohup … &`),
459
- never as a session-spawned background task.
460
- - Docs for a training-surface change (flags, fields, defaults) land in the
461
- same commit: this file, [cli.md](cli.md), and
462
- [server-api.md](server-api.md) for the HTTP routes.
@@ -1,158 +0,0 @@
1
- # Troubleshooting
2
-
3
- Symptom → cause → fix, for the problems users actually hit. Every path and
4
- flag below is taken from the code (`src/`) or the linked reference doc; when a
5
- sentence here disagrees with the code, the code wins — fix the doc.
6
-
7
- Related: [cli.md](./cli.md) (commands), [server-config.md](./server-config.md)
8
- (serve flags, admission), [distribution.md](./distribution.md) (install paths,
9
- signing), [docs/reference/distribution.md](./distribution.md) (sidecar layout, self-signing),
10
- [environment.md](./environment.md) (contributor/agent platform facts).
11
-
12
- ## Runtime and install
13
-
14
- ### `dlopen` fails / `libmlxc.dylib` not found
15
-
16
- **Cause.** The `mlx-bun` executable ships without the MLX native runtime
17
- (`libmlxc.dylib`, `libmlx.dylib`, `libjaccl.dylib`, `mlx.metallib`, plus the
18
- expert-IO dylib and frame-extract helper — the list is `NATIVE_PACK_FILES` in
19
- `src/native-pack.ts`). The runtime is a versioned tarball downloaded on first
20
- run into `~/Library/Caches/mlx-bun/native-v<ver>-<arch>/`. The download is
21
- resumable and sha256-verified through the same machinery as model downloads
22
- (`src/download.ts`), so an interrupted first run leaves a partial file, not a
23
- broken install.
24
-
25
- **Fix.** Rerun `mlx-bun serve` (or any command that loads the runtime); it
26
- resumes and verifies. The library is resolved in this order
27
- (`resolveLibmlxc()` in `src/mlx/ffi.ts`, mirrored by `nativeRuntimeDir()` in
28
- `src/native-pack.ts`):
29
-
30
- 1. `MLX_BUN_LIBMLXC=/path/to/libmlxc.dylib` — explicit override; the other
31
- libs are expected in the same directory.
32
- 2. Beside the executable (the sidecar layout from `docs/reference/distribution.md`).
33
- 3. The native-pack cache dir above.
34
- 4. Homebrew: `/opt/homebrew/lib`, then `/usr/local/lib`.
35
-
36
- To use your own build, set `MLX_BUN_LIBMLXC`. If you see
37
- `no native pack published for <arch> — set MLX_BUN_LIBMLXC or install mlx via
38
- homebrew`, there is no published pack for that CPU architecture (only `arm64`
39
- has a baked checksum in `src/native-pack.ts`); use one of the two escapes in
40
- the message. `MLX_BUN_NATIVE_PACK_URL` overrides the download URL.
41
-
42
- ### Gatekeeper: "unidentified developer" / app can't be opened
43
-
44
- **Cause.** Released binaries are Developer-ID signed and notarized. macOS only
45
- checks the notarization ticket when a file carries the `com.apple.quarantine`
46
- xattr, which browser downloads and `curl -O`-style saves get. Homebrew installs
47
- and the documented `curl ... | tar -xz` one-liner never write a quarantined
48
- file, so they never prompt (`distribution.md`, "Direct download").
49
-
50
- **Fix.**
51
- - Online: the notarization ticket resolves the check; allow it once.
52
- - Offline: `xattr -d com.apple.quarantine mlx-bun` (the manual escape hatch
53
- from `distribution.md`).
54
- - Self-built binary: the bundle's dylibs must be (re)signed with the hardened
55
- runtime and entitlements — see "Signing & notarization" in
56
- [docs/reference/distribution.md](./distribution.md).
57
-
58
- ### Wrong Bun version / `Bun.Image` missing / FFI crashes in a source checkout
59
-
60
- **Cause.** `package.json` pins `"bun": ">=1.4.0"`. Two things depend on it:
61
- `Bun.Image` is the vision decode path (`src/vision/preprocess.ts`), and Bun
62
- 1.4 fixed a `bun:ffi` stack-argument ABI bug on macOS arm64 that made
63
- multi-argument mlx-c bindings hand the callee shifted garbage
64
- (`lab/repro/bun-ffi-stack-args/ISSUE.md`; the code now uses natural mlx-c
65
- signatures with no workaround).
66
-
67
- **Fix.** `bun upgrade`, then `bun --version` ≥ 1.4.0. The compiled release
68
- binary embeds its own Bun, so this only affects running from source.
69
-
70
- ### `port 8080 is already serving …`
71
-
72
- **Cause.** `serve` probes the port before loading weights and refuses to start
73
- a second server on a port that already answers `/v1` (`src/cli.ts`, serve
74
- branch; `--port` row in `server-config.md`).
75
-
76
- **Fix.** Reuse the running server (`mlx-bun pi` attaches automatically), stop
77
- it, or pass `--port <other>`. A second server is a second model in memory;
78
- check `mlx-bun fit` first.
79
-
80
- ## Models and downloads
81
-
82
- ### `no models match (try \`mlx-bun scan\`)`
83
-
84
- **Cause.** `ls`/`serve`/`fit` resolve models from a registry built by scanning
85
- the Hugging Face hub cache. The registry is stale or empty, or the model is
86
- not in the cache directory the registry reads.
87
-
88
- **Fix.** Run `mlx-bun scan` after downloading. The cache path is resolved
89
- exactly as `huggingface_hub` does (`DEFAULT_HUB` in `src/registry.ts`):
90
- `HF_HUB_CACHE`, else `HF_HOME/hub`, else `~/.cache/huggingface/hub`. If you
91
- downloaded to a custom location, set the same env var for `mlx-bun`. The
92
- registry database lives at `~/.cache/mlx-bun/registry.sqlite`.
93
-
94
- ### Hugging Face download stalls at 0%
95
-
96
- **Cause.** The Python `hf` downloader uses the Xet transfer path, which stalls
97
- on some networks.
98
-
99
- **Fix.** Use `mlx-bun get <org/repo>` — it speaks plain HTTPS resolve/CDN with
100
- no Xet, Range-resumes partial blobs, and verifies every file (sha256 for LFS
101
- blobs, git-blob sha1 for small files) into the standard hub cache layout
102
- (`src/download.ts`). Rerunning the same command resumes verified
103
- `.incomplete` prefixes. If you must use the Python CLI, set
104
- `HF_HUB_DISABLE_XET=1` before the download command.
105
-
106
- ### `get` refuses for lack of disk space
107
-
108
- **Cause.** Before transferring, `get` credits complete blobs and partial
109
- prefixes, then requires free space for the exact remainder plus a fixed 1 GiB
110
- reserve (`cli.md`, `get`).
111
-
112
- **Fix.** Free space, or point `HF_HUB_CACHE` at a larger volume before
113
- starting.
114
-
115
- ### Gated repo: 401/403 from Hugging Face
116
-
117
- **Cause.** No token. `get` reads `HF_TOKEN`, else
118
- `~/.cache/huggingface/token` (`hfToken()` in `src/download.ts`).
119
-
120
- **Fix.** `hf auth login`, or export `HF_TOKEN`.
121
-
122
- ## Memory and performance
123
-
124
- ### Will it fit? / decode is very slow on a model near the RAM ceiling
125
-
126
- Memory pressure can reduce speed or cause allocation failures. The default
127
- `fit` estimate uses machine RAM × 0.75 (`WIRED_FRACTION` in `src/fit.ts`).
128
- Serving treats that estimate as advisory; `--memory-budget` opts into a limit.
129
-
130
- **Fix.** Check first:
131
-
132
- ```sh
133
- mlx-bun fit <model> --ctx 8192 # this machine
134
- mlx-bun fit <model> --ctx 8192 --skus # across the Apple Silicon lineup
135
- mlx-bun fit <model> --kv-quant 4 # window with a 4-bit KV cache
136
- ```
137
-
138
- `fit` reports weights bytes (from safetensors headers), KV bytes/token, the
139
- calibrated prefill transient, and the wired ceiling. Then close memory-heavy
140
- apps, pick a smaller quantization, or serve with `--kv-quant 4|8` for a larger
141
- context window in the same budget. GLM-5.2 uses its own streamed-runtime plan
142
- (`fit GLM-5.2`; `--context-length`), not the resident-weights estimator.
143
-
144
- ### Completion stops before my `max_tokens` (no error)
145
-
146
- Check `finish_reason`: `stop` means EOS or a stop condition; `length` means
147
- an output/context cap was reached. Default memory estimates do not shorten
148
- requests. Explicit `--memory-budget`, context settings and GLM-5.2's fixed
149
- layout can cap a completion. `/stats.admission.enforced_context_tokens` shows
150
- that cap, or null when none applies. `max_safe_context` is only an estimate.
151
-
152
- ### `400` with `"type": "memory_admission"`, `"code": "context_over_budget"`
153
-
154
- This error applies to an explicitly configured budget/context cap or a fixed
155
- runtime layout. The prompt leaves no room to generate under that limit.
156
- Remove the optional budget/context cap to attempt the request without an
157
- estimated restriction, or adjust the limit you selected. See
158
- [server configuration](server-config.md#memory-admission-and-caches).
@@ -1,18 +0,0 @@
1
- /** Common admission contract for every runtime. Representation-specific
2
- * planners may expose richer fields, but serving consumes only this shape. */
3
- export interface MemoryPlan {
4
- readonly schemaVersion: 1;
5
- readonly strategy: "generic-kv" | "glm52-colibri";
6
- readonly fits: boolean;
7
- readonly contextTokens: number;
8
- readonly maxSafeContext: number;
9
- readonly weightsBytes: number;
10
- readonly kvBytes: number;
11
- readonly transientBytes: number;
12
- readonly reserveBytes: number;
13
- readonly totalBytes: number;
14
- readonly usableBytes: number;
15
- readonly predictedDecodeTps: number | null;
16
- /** mlx allocator-cache limit, distinct from the process admission limit. */
17
- readonly allocatorLimitBytes?: number;
18
- }