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.
- package/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /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).
|
package/src/admission-plan.ts
DELETED
|
@@ -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
|
-
}
|