mlx-bun 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/README.md +1453 -88
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +10 -8
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +12 -10
  78. package/src/{serve → server}/chat-stage.ts +27 -22
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +42 -42
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +42 -83
  85. package/src/server/generated-token-history.ts +57 -0
  86. package/src/{serve → server}/http.ts +25 -13
  87. package/src/{serve → server}/inference-request.ts +5 -5
  88. package/src/server/job-routes.ts +20 -0
  89. package/src/server/media-prompt.ts +63 -0
  90. package/src/server/memory-completion-client.ts +46 -0
  91. package/src/server/model-routes.ts +192 -0
  92. package/src/{serve → server}/openai-wire.ts +3 -2
  93. package/src/{serve → server}/pipeline.ts +1 -1
  94. package/src/server/prompt-builder.ts +13 -0
  95. package/src/server/prompt-contracts.ts +17 -0
  96. package/src/server/proxy-routes.ts +187 -0
  97. package/src/server/publishing-routes.ts +41 -0
  98. package/src/{serve → server}/request-plan.ts +8 -8
  99. package/src/{serve → server}/request-prep.ts +82 -68
  100. package/src/{serve → server}/responses-client.ts +30 -13
  101. package/src/{responses.ts → server/responses.ts} +12 -93
  102. package/src/server/routes.ts +205 -0
  103. package/src/server/start.ts +72 -0
  104. package/src/server/status-routes.ts +108 -0
  105. package/src/{serve → server}/text-completion-stage.ts +25 -4
  106. package/src/server/text-prompt.ts +12 -0
  107. package/src/{serve → server}/token-streams.ts +36 -38
  108. package/src/server/worker-routes.ts +311 -0
  109. package/src/storage/paths.ts +61 -0
  110. package/src/web/assets.ts +37 -0
  111. package/src/web/{src → browser}/api.ts +5 -23
  112. package/src/web/browser/chat-host.ts +17 -0
  113. package/src/web/browser/installed-panels.ts +6 -0
  114. package/src/web/browser/main.ts +55 -0
  115. package/src/web/browser/markdown.ts +279 -0
  116. package/src/web/browser/memory-panel.ts +9 -0
  117. package/src/web/browser/palette.ts +64 -0
  118. package/src/web/browser/protocol.ts +13 -0
  119. package/src/web/browser/shell.ts +467 -0
  120. package/src/web/{src → browser}/status.ts +32 -36
  121. package/src/web/build.ts +51 -0
  122. package/src/web/public/app.html +1054 -0
  123. package/src/web/{sw.js → public/sw.js} +4 -3
  124. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  125. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  126. package/THIRD_PARTY_LICENSES.md +0 -51
  127. package/docs/README.md +0 -94
  128. package/docs/archive/hlg-sampling.md +0 -350
  129. package/docs/archive/investigations/audio-input-plan.md +0 -356
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  174. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  175. package/docs/design/batching.md +0 -1841
  176. package/docs/design/decode-speed-program.md +0 -2349
  177. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  178. package/docs/design/generic-model-support.md +0 -705
  179. package/docs/design/kv-cache.md +0 -824
  180. package/docs/design/orpo-training.md +0 -680
  181. package/docs/design/speculative-decoding.md +0 -1990
  182. package/docs/design/turboquant.md +0 -2212
  183. package/docs/design/unified-engine-frontier-plan.md +0 -1880
  184. package/docs/design/web-chat-redesign.md +0 -695
  185. package/docs/planning/PRODUCT_ROADMAP.md +0 -594
  186. package/docs/planning/ResearchTopics.md +0 -119
  187. package/docs/planning/release-notes-v0.4.0.md +0 -45
  188. package/docs/planning/video-series.md +0 -421
  189. package/docs/reference/benchmarks.md +0 -3613
  190. package/docs/reference/cli.md +0 -585
  191. package/docs/reference/distribution.md +0 -355
  192. package/docs/reference/environment.md +0 -398
  193. package/docs/reference/glossary.md +0 -39
  194. package/docs/reference/library-api.md +0 -674
  195. package/docs/reference/memory.md +0 -260
  196. package/docs/reference/models.md +0 -334
  197. package/docs/reference/server-api.md +0 -1775
  198. package/docs/reference/server-config.md +0 -846
  199. package/docs/reference/training.md +0 -462
  200. package/docs/reference/troubleshooting.md +0 -158
  201. package/src/admission-plan.ts +0 -18
  202. package/src/audio/conformer.ts +0 -647
  203. package/src/audio/decode.ts +0 -133
  204. package/src/audio/features.ts +0 -202
  205. package/src/audio/transcode.ts +0 -67
  206. package/src/backends/mlx/assistant-target.ts +0 -46
  207. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  208. package/src/backends/mlx/autoregressive.ts +0 -108
  209. package/src/backends/mlx/batch-group.ts +0 -1790
  210. package/src/backends/mlx/cache-attachment.ts +0 -67
  211. package/src/backends/mlx/cache-layout.ts +0 -31
  212. package/src/backends/mlx/checkpoint-state.ts +0 -53
  213. package/src/backends/mlx/continuation-persistence.ts +0 -106
  214. package/src/backends/mlx/continuation-request.ts +0 -43
  215. package/src/backends/mlx/continuation.ts +0 -77
  216. package/src/backends/mlx/diffusion.ts +0 -39
  217. package/src/backends/mlx/draft-target.ts +0 -32
  218. package/src/backends/mlx/evaluation.ts +0 -105
  219. package/src/backends/mlx/fill-append.ts +0 -45
  220. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  221. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  222. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  223. package/src/backends/mlx/gateway-binding.ts +0 -130
  224. package/src/backends/mlx/graph.ts +0 -38
  225. package/src/backends/mlx/kv-codec.ts +0 -9
  226. package/src/backends/mlx/kv-maintenance.ts +0 -133
  227. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  228. package/src/backends/mlx/memory-client.ts +0 -189
  229. package/src/backends/mlx/methods.ts +0 -90
  230. package/src/backends/mlx/model-prompt.ts +0 -164
  231. package/src/backends/mlx/model-serving.ts +0 -79
  232. package/src/backends/mlx/prefill-cohort.ts +0 -89
  233. package/src/backends/mlx/prefill-rows.ts +0 -200
  234. package/src/backends/mlx/prefill.ts +0 -33
  235. package/src/backends/mlx/projected-context-rows.ts +0 -72
  236. package/src/backends/mlx/request-policy.ts +0 -20
  237. package/src/backends/mlx/request-state-policy.ts +0 -41
  238. package/src/backends/mlx/rollback.ts +0 -89
  239. package/src/backends/mlx/row-sampling.ts +0 -49
  240. package/src/backends/mlx/serial-executor.ts +0 -242
  241. package/src/backends/mlx/speculative-group.ts +0 -359
  242. package/src/backends/mlx/speculative-round.ts +0 -161
  243. package/src/backends/mlx/speculative.ts +0 -114
  244. package/src/backends/mlx/state-rows.ts +0 -104
  245. package/src/backends/mlx/state-views.ts +0 -46
  246. package/src/backends/mlx/target-layout-capability.ts +0 -35
  247. package/src/backends/mlx/text-engine.ts +0 -73
  248. package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
  249. package/src/chat-template.ts +0 -382
  250. package/src/cli.ts +0 -3168
  251. package/src/config.ts +0 -399
  252. package/src/contracts/completion.ts +0 -16
  253. package/src/contracts/execution.ts +0 -60
  254. package/src/contracts/generation.ts +0 -103
  255. package/src/contracts/host.ts +0 -7
  256. package/src/contracts/pi-provider.ts +0 -30
  257. package/src/contracts/pi.ts +0 -259
  258. package/src/contracts/prefix-cache.ts +0 -23
  259. package/src/contracts/resources.ts +0 -25
  260. package/src/contracts/sampling.ts +0 -23
  261. package/src/contracts/scheduling.ts +0 -45
  262. package/src/contracts/tsconfig.json +0 -14
  263. package/src/dataset/generators.ts +0 -1087
  264. package/src/dataset/index.ts +0 -12
  265. package/src/dataset/job.ts +0 -81
  266. package/src/dataset/llm.ts +0 -71
  267. package/src/dataset/registry.ts +0 -528
  268. package/src/diffusion/diffusion-generate.ts +0 -507
  269. package/src/download.ts +0 -505
  270. package/src/embed.ts +0 -77
  271. package/src/engine/admission.ts +0 -59
  272. package/src/engine/cancellation.ts +0 -38
  273. package/src/engine/engine.ts +0 -56
  274. package/src/engine/execution-coordinator.ts +0 -70
  275. package/src/engine/execution-plan.ts +0 -53
  276. package/src/engine/resources.ts +0 -53
  277. package/src/engine/scheduler.ts +0 -72
  278. package/src/engine/session.ts +0 -247
  279. package/src/eval/README.md +0 -130
  280. package/src/eval/ifeval.ts +0 -81
  281. package/src/eval/kl-prompts.ts +0 -29
  282. package/src/eval/kl.ts +0 -590
  283. package/src/eval/perplexity.ts +0 -164
  284. package/src/eval/quality-db.ts +0 -92
  285. package/src/eval/reference-logits.ts +0 -207
  286. package/src/eval/runner.ts +0 -124
  287. package/src/eval/score.ts +0 -49
  288. package/src/eval/tasks/bfcl.ts +0 -535
  289. package/src/eval/tasks/gsm8k.ts +0 -98
  290. package/src/eval/tasks/hashhop.ts +0 -139
  291. package/src/eval/tasks/humaneval.ts +0 -275
  292. package/src/eval/tasks/ifeval.ts +0 -525
  293. package/src/eval/tasks/mmlu.ts +0 -157
  294. package/src/eval/ultrafeedback.ts +0 -60
  295. package/src/evaldb.ts +0 -199
  296. package/src/expert-io.ts +0 -393
  297. package/src/expert-offload-build.ts +0 -77
  298. package/src/expert-offload.ts +0 -76
  299. package/src/expert-residency.ts +0 -1134
  300. package/src/expert-usage.ts +0 -415
  301. package/src/fill/echo-index.ts +0 -188
  302. package/src/fill/fill-session.ts +0 -452
  303. package/src/fill/proposal.ts +0 -68
  304. package/src/fill/schema-rows.ts +0 -506
  305. package/src/fill/tool-boundary.ts +0 -103
  306. package/src/fit.ts +0 -249
  307. package/src/generate.ts +0 -1346
  308. package/src/grammar.ts +0 -591
  309. package/src/harness-pi.ts +0 -184
  310. package/src/hf-push.ts +0 -628
  311. package/src/hub-rest.ts +0 -242
  312. package/src/index.ts +0 -63
  313. package/src/inference/denoising.ts +0 -17
  314. package/src/inference/draft-acceptance.ts +0 -41
  315. package/src/inference/draft-output.ts +0 -49
  316. package/src/inference/graph.ts +0 -33
  317. package/src/inference/prefill.ts +0 -39
  318. package/src/inference/rollback.ts +0 -7
  319. package/src/jobs/index.ts +0 -31
  320. package/src/jobs/job-entry.ts +0 -107
  321. package/src/jobs/task-client.ts +0 -19
  322. package/src/jobs/types.ts +0 -2
  323. package/src/kv-scheme.ts +0 -257
  324. package/src/kv-store.ts +0 -1099
  325. package/src/lab/README.md +0 -18
  326. package/src/lab/curve/curve-designer.html +0 -303
  327. package/src/lab/curve/curve-sampler.ts +0 -122
  328. package/src/lab/expert-trace/expert-trace.ts +0 -69
  329. package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
  330. package/src/lab/paged-kv/paged-kv.ts +0 -270
  331. package/src/library.ts +0 -40
  332. package/src/lora.ts +0 -408
  333. package/src/md-modules.d.ts +0 -49
  334. package/src/media-fetch.ts +0 -442
  335. package/src/memory/article.ts +0 -558
  336. package/src/memory/chunk-validation.ts +0 -150
  337. package/src/memory/chunk.ts +0 -318
  338. package/src/memory/cluster.ts +0 -351
  339. package/src/memory/coverage.ts +0 -134
  340. package/src/memory/crosslink.ts +0 -0
  341. package/src/memory/db.ts +0 -253
  342. package/src/memory/entity.ts +0 -203
  343. package/src/memory/gate.ts +0 -187
  344. package/src/memory/history.ts +0 -152
  345. package/src/memory/ingest.ts +0 -335
  346. package/src/memory/model.ts +0 -183
  347. package/src/memory/normalize.ts +0 -671
  348. package/src/memory/parse.ts +0 -22
  349. package/src/memory/pipeline.ts +0 -275
  350. package/src/memory/prompts.ts +0 -65
  351. package/src/memory/query.ts +0 -334
  352. package/src/memory/reconcile.ts +0 -734
  353. package/src/memory/redirect.ts +0 -108
  354. package/src/memory/reindex.ts +0 -325
  355. package/src/memory/resolve.ts +0 -307
  356. package/src/memory/rest.ts +0 -245
  357. package/src/memory/route.ts +0 -272
  358. package/src/memory/schedule.ts +0 -165
  359. package/src/memory/stages.ts +0 -777
  360. package/src/memory/synthesize.ts +0 -1638
  361. package/src/memory/tools.ts +0 -749
  362. package/src/memory/vault.ts +0 -1194
  363. package/src/memory/wikify.ts +0 -1064
  364. package/src/mlx/array.ts +0 -388
  365. package/src/mlx/autograd.ts +0 -304
  366. package/src/mlx/checkpoint.ts +0 -149
  367. package/src/mlx/compile.ts +0 -168
  368. package/src/mlx/custom-vjp.ts +0 -188
  369. package/src/mlx/ffi.ts +0 -512
  370. package/src/mlx/materialize.ts +0 -23
  371. package/src/mlx/metal-kernel.ts +0 -159
  372. package/src/mlx/ops.ts +0 -1021
  373. package/src/mlx/quantized-rows.ts +0 -36
  374. package/src/mlx/token-bitmask.ts +0 -52
  375. package/src/mlx/turboquant-kv-decode.ts +0 -82
  376. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  377. package/src/mlx/turboquant-ops.ts +0 -861
  378. package/src/mlx/turboquant-tables.ts +0 -237
  379. package/src/mmap.ts +0 -90
  380. package/src/model/artifact-identity.ts +0 -73
  381. package/src/model/batched-kv.ts +0 -235
  382. package/src/model/batched-mask.ts +0 -279
  383. package/src/model/batched-quant.ts +0 -212
  384. package/src/model/batched-quantized-kv.ts +0 -144
  385. package/src/model/batched-rotating-quant.ts +0 -353
  386. package/src/model/batched-rotating-state.ts +0 -149
  387. package/src/model/batched-rotating.ts +0 -338
  388. package/src/model/batched-row-storage.ts +0 -179
  389. package/src/model/batched-ssm.ts +0 -52
  390. package/src/model/batched-turboquant-kv.ts +0 -93
  391. package/src/model/compiled-decode.ts +0 -712
  392. package/src/model/decoded-kv-donor.ts +0 -12
  393. package/src/model/delayed-quantized-kv.ts +0 -72
  394. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  395. package/src/model/delayed-turboquant-kv.ts +0 -55
  396. package/src/model/diffusion-gemma.ts +0 -1026
  397. package/src/model/factory.ts +0 -189
  398. package/src/model/fingerprint.ts +0 -33
  399. package/src/model/flash-attention.ts +0 -694
  400. package/src/model/full-prefill-padding.ts +0 -56
  401. package/src/model/full-prefill-row.ts +0 -105
  402. package/src/model/gemma4-base.ts +0 -2351
  403. package/src/model/gemma4.ts +0 -1315
  404. package/src/model/generated/gemma4-12b.ts +0 -429
  405. package/src/model/generated/gemma4-26b.ts +0 -448
  406. package/src/model/generated/gemma4-e4b.ts +0 -717
  407. package/src/model/generated/index.ts +0 -18
  408. package/src/model/glm52-atlas.ts +0 -511
  409. package/src/model/glm52-cache.ts +0 -792
  410. package/src/model/glm52-config.ts +0 -262
  411. package/src/model/glm52-container.ts +0 -305
  412. package/src/model/glm52-coupling.ts +0 -388
  413. package/src/model/glm52-dsa.ts +0 -606
  414. package/src/model/glm52-expert-layout.ts +0 -253
  415. package/src/model/glm52-layout.ts +0 -152
  416. package/src/model/glm52-memory.ts +0 -500
  417. package/src/model/glm52-mla.ts +0 -792
  418. package/src/model/glm52-moe.ts +0 -223
  419. package/src/model/glm52-pilot.ts +0 -537
  420. package/src/model/glm52-reference.ts +0 -445
  421. package/src/model/glm52-residency.ts +0 -557
  422. package/src/model/glm52-resident-weights.ts +0 -135
  423. package/src/model/glm52-streamed-experts.ts +0 -453
  424. package/src/model/glm52-streamed-metal.ts +0 -610
  425. package/src/model/glm52-weights.ts +0 -503
  426. package/src/model/glm52.ts +0 -1132
  427. package/src/model/implementation.ts +0 -69
  428. package/src/model/kv-attention-view.ts +0 -67
  429. package/src/model/minicpm5.ts +0 -376
  430. package/src/model/profile.ts +0 -443
  431. package/src/model/qwen-append.ts +0 -12
  432. package/src/model/qwen-conv.ts +0 -52
  433. package/src/model/qwen3-delta-state.ts +0 -74
  434. package/src/model/qwen3-delta.ts +0 -451
  435. package/src/model/qwen3-moe.ts +0 -404
  436. package/src/model/qwen3-mrope.ts +0 -252
  437. package/src/model/qwen3.ts +0 -277
  438. package/src/model/qwen3_5-checkpoint.ts +0 -164
  439. package/src/model/qwen3_5.ts +0 -819
  440. package/src/model/rotating-kv-donor.ts +0 -35
  441. package/src/model/rotating-kv-layout.ts +0 -262
  442. package/src/model/rotating-row-transaction.ts +0 -35
  443. package/src/model/speculative-rotating-kv.ts +0 -101
  444. package/src/model/ssm-prefill-padding.ts +0 -39
  445. package/src/model/support.ts +0 -102
  446. package/src/model/trellis-balanced-scatter.ts +0 -51
  447. package/src/model/trellis-linear.ts +0 -672
  448. package/src/model/trellis-shared-m.ts +0 -151
  449. package/src/model/trellis-shared-scatter.ts +0 -144
  450. package/src/model/trellis-splitk-prefill.ts +0 -158
  451. package/src/model/trellis-tiled-prefill.ts +0 -136
  452. package/src/model/trellis-vector-expand.ts +0 -62
  453. package/src/model/trellis-wide-prefill.ts +0 -94
  454. package/src/model/turboquant-codec.ts +0 -83
  455. package/src/model/universal/archs.ts +0 -332
  456. package/src/model/universal/dense.ts +0 -612
  457. package/src/model/universal/modules.ts +0 -170
  458. package/src/model/universal/rope.ts +0 -381
  459. package/src/native/expert_io.c +0 -523
  460. package/src/native/frame_extract.swift +0 -140
  461. package/src/native-pack.ts +0 -162
  462. package/src/pi-provider.ts +0 -53
  463. package/src/pi-session.ts +0 -81
  464. package/src/pi-terminal.ts +0 -274
  465. package/src/pi-web.ts +0 -1932
  466. package/src/preflight.ts +0 -158
  467. package/src/prompt-cache.ts +0 -460
  468. package/src/quantize/allocator.ts +0 -627
  469. package/src/quantize/atomic-output.ts +0 -38
  470. package/src/quantize/calibration.ts +0 -181
  471. package/src/quantize/config-writer.ts +0 -145
  472. package/src/quantize/index.ts +0 -84
  473. package/src/quantize/job.ts +0 -162
  474. package/src/quantize/quantizer.ts +0 -666
  475. package/src/quantize/rotate.ts +0 -603
  476. package/src/quantize/safetensors-writer.ts +0 -249
  477. package/src/quantize/sensitivity.ts +0 -216
  478. package/src/quantize/trellis.ts +0 -586
  479. package/src/quantize/weight-transform.ts +0 -292
  480. package/src/registry.ts +0 -602
  481. package/src/runtime-config.ts +0 -81
  482. package/src/safetensors.ts +0 -158
  483. package/src/sampler.ts +0 -1011
  484. package/src/serve/admin-routes.ts +0 -184
  485. package/src/serve/assets/curve-terrain.html +0 -105
  486. package/src/serve/assets/training-inference-map.html +0 -575
  487. package/src/serve/aux-routes.ts +0 -132
  488. package/src/serve/batch-scheduler.ts +0 -8
  489. package/src/serve/checkpoint-identity.ts +0 -64
  490. package/src/serve/generation-gateway.ts +0 -496
  491. package/src/serve/isolate.ts +0 -609
  492. package/src/serve/kv-budget.ts +0 -14
  493. package/src/serve/lab-routes.ts +0 -341
  494. package/src/serve/lane-registry.ts +0 -45
  495. package/src/serve/model-admin-routes.ts +0 -155
  496. package/src/serve/model-binding.ts +0 -43
  497. package/src/serve/model-host.ts +0 -511
  498. package/src/serve/parent-application.ts +0 -56
  499. package/src/serve/prompt-response-trace.ts +0 -147
  500. package/src/serve/response-lease.ts +0 -24
  501. package/src/serve/session-search.ts +0 -326
  502. package/src/serve/static-routes.ts +0 -101
  503. package/src/server.ts +0 -1314
  504. package/src/spec/assistant-rows.ts +0 -92
  505. package/src/spec/assistant-source.ts +0 -126
  506. package/src/spec/cache-identity.ts +0 -22
  507. package/src/spec/deepspec-rows.ts +0 -29
  508. package/src/spec/deepspec-source.ts +0 -145
  509. package/src/spec/dflash-source.ts +0 -149
  510. package/src/spec/drafter.ts +0 -304
  511. package/src/spec/dspark/ab-stats.ts +0 -136
  512. package/src/spec/dspark/calibration.ts +0 -112
  513. package/src/spec/dspark/data-dflash.ts +0 -156
  514. package/src/spec/dspark/data.ts +0 -201
  515. package/src/spec/dspark/deepspec-module.ts +0 -776
  516. package/src/spec/dspark/generate-dflash.ts +0 -245
  517. package/src/spec/dspark/generate.ts +0 -290
  518. package/src/spec/dspark/loader.ts +0 -23
  519. package/src/spec/dspark/loss.ts +0 -213
  520. package/src/spec/dspark/module-dflash.ts +0 -560
  521. package/src/spec/dspark/module.ts +0 -540
  522. package/src/spec/dspark/quantize-drafter.ts +0 -91
  523. package/src/spec/dspark/sample.ts +0 -112
  524. package/src/spec/generate.ts +0 -276
  525. package/src/spec/glm52-mtp-graph.ts +0 -29
  526. package/src/spec/glm52-mtp-rows.ts +0 -132
  527. package/src/spec/glm52-mtp-source.ts +0 -317
  528. package/src/spec/glm52-mtp-state.ts +0 -33
  529. package/src/spec/ngram-source.ts +0 -204
  530. package/src/spec/projected-draft-rows.ts +0 -73
  531. package/src/spec/qwen-mtp-module.ts +0 -171
  532. package/src/spec/qwen-mtp-rows.ts +0 -219
  533. package/src/spec/qwen-mtp-source.ts +0 -383
  534. package/src/spec/qwen-mtp-state.ts +0 -30
  535. package/src/spec/serve-loop.ts +0 -585
  536. package/src/spec/source.ts +0 -215
  537. package/src/spec/two-model-rows.ts +0 -61
  538. package/src/spec/two-model.ts +0 -113
  539. package/src/ssd-cache.ts +0 -372
  540. package/src/ssd-durability.ts +0 -211
  541. package/src/tokenizer.ts +0 -335
  542. package/src/tool-approvals.ts +0 -131
  543. package/src/tool-call.ts +0 -695
  544. package/src/train/dataset.ts +0 -484
  545. package/src/train/diffusion-lora.ts +0 -216
  546. package/src/train/export.ts +0 -32
  547. package/src/train/flash-cce.ts +0 -1234
  548. package/src/train/forward.ts +0 -266
  549. package/src/train/fuse.ts +0 -243
  550. package/src/train/index.ts +0 -46
  551. package/src/train/job.ts +0 -205
  552. package/src/train/lora-params.ts +0 -254
  553. package/src/train/loss.ts +0 -1591
  554. package/src/train/merge.ts +0 -195
  555. package/src/train/optimizer.ts +0 -183
  556. package/src/train/prefix-shared.ts +0 -490
  557. package/src/train/rank.ts +0 -137
  558. package/src/train/segmented.ts +0 -1828
  559. package/src/train/steel-qmm-header.ts +0 -1461
  560. package/src/train/trainer.ts +0 -1221
  561. package/src/train/watch.ts +0 -542
  562. package/src/vision/diffusion-vision.ts +0 -620
  563. package/src/vision/embedder.ts +0 -168
  564. package/src/vision/preprocess.ts +0 -247
  565. package/src/vision/prompt.ts +0 -373
  566. package/src/vision/qwen3vl-preprocess.ts +0 -409
  567. package/src/vision/qwen3vl-prompt.ts +0 -196
  568. package/src/vision/qwen3vl-tower.ts +0 -555
  569. package/src/vision/siglip.ts +0 -599
  570. package/src/vision/video-frames.ts +0 -148
  571. package/src/web/app.html +0 -2143
  572. package/src/web/app.js +0 -5703
  573. package/src/web/skills/memory/SKILL.md +0 -120
  574. package/src/web/skills/web-research/SKILL.md +0 -46
  575. package/src/web/skills.ts +0 -97
  576. package/src/web/src/adapters-panel.ts +0 -288
  577. package/src/web/src/assistant.ts +0 -451
  578. package/src/web/src/chat.ts +0 -1057
  579. package/src/web/src/composer.ts +0 -959
  580. package/src/web/src/dataset.ts +0 -132
  581. package/src/web/src/finetune.ts +0 -267
  582. package/src/web/src/hub.ts +0 -428
  583. package/src/web/src/main.ts +0 -98
  584. package/src/web/src/markdown.ts +0 -0
  585. package/src/web/src/memory-panel.ts +0 -572
  586. package/src/web/src/model-picker.ts +0 -159
  587. package/src/web/src/palette.ts +0 -346
  588. package/src/web/src/protocol.ts +0 -26
  589. package/src/web/src/quantize.ts +0 -167
  590. package/src/web/src/rag.ts +0 -274
  591. package/src/web/src/sessions.ts +0 -469
  592. package/src/web/src/shell.ts +0 -804
  593. package/src/web/src/ui-catalog.ts +0 -78
  594. package/src/web/vendor/README.md +0 -61
  595. package/src/web-assets.ts +0 -47
  596. package/src/web-tools.ts +0 -478
  597. package/src/weights.ts +0 -255
  598. /package/src/{serve → server}/completion-sink.ts +0 -0
  599. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  600. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  601. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,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
- }