mlx-bun 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/README.md +1449 -109
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +7 -5
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +10 -10
  78. package/src/{serve → server}/chat-stage.ts +14 -14
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +33 -41
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +25 -82
  85. package/src/{serve → server}/http.ts +25 -13
  86. package/src/{serve → server}/inference-request.ts +5 -5
  87. package/src/server/job-routes.ts +20 -0
  88. package/src/server/media-prompt.ts +63 -0
  89. package/src/server/memory-completion-client.ts +46 -0
  90. package/src/server/model-routes.ts +192 -0
  91. package/src/{serve → server}/openai-wire.ts +3 -2
  92. package/src/{serve → server}/pipeline.ts +1 -1
  93. package/src/server/prompt-builder.ts +13 -0
  94. package/src/server/prompt-contracts.ts +17 -0
  95. package/src/server/proxy-routes.ts +187 -0
  96. package/src/server/publishing-routes.ts +41 -0
  97. package/src/{serve → server}/request-plan.ts +6 -8
  98. package/src/{serve → server}/request-prep.ts +47 -50
  99. package/src/{serve → server}/responses-client.ts +30 -13
  100. package/src/{responses.ts → server/responses.ts} +12 -93
  101. package/src/server/routes.ts +205 -0
  102. package/src/server/start.ts +72 -0
  103. package/src/server/status-routes.ts +108 -0
  104. package/src/{serve → server}/text-completion-stage.ts +25 -4
  105. package/src/server/text-prompt.ts +12 -0
  106. package/src/{serve → server}/token-streams.ts +36 -38
  107. package/src/server/worker-routes.ts +311 -0
  108. package/src/storage/paths.ts +61 -0
  109. package/src/web/assets.ts +37 -0
  110. package/src/web/{src → browser}/api.ts +5 -23
  111. package/src/web/browser/chat-host.ts +17 -0
  112. package/src/web/browser/installed-panels.ts +6 -0
  113. package/src/web/browser/main.ts +55 -0
  114. package/src/web/browser/markdown.ts +279 -0
  115. package/src/web/browser/memory-panel.ts +9 -0
  116. package/src/web/browser/palette.ts +64 -0
  117. package/src/web/browser/protocol.ts +13 -0
  118. package/src/web/browser/shell.ts +467 -0
  119. package/src/web/{src → browser}/status.ts +32 -36
  120. package/src/web/build.ts +51 -0
  121. package/src/web/public/app.html +1054 -0
  122. package/src/web/{sw.js → public/sw.js} +4 -3
  123. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  124. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  125. package/THIRD_PARTY_LICENSES.md +0 -51
  126. package/docs/README.md +0 -107
  127. package/docs/archive/hlg-sampling.md +0 -350
  128. package/docs/archive/investigations/audio-input-plan.md +0 -356
  129. package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
  174. package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
  175. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  176. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  177. package/docs/design/batching.md +0 -2054
  178. package/docs/design/decode-speed-program.md +0 -2404
  179. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  180. package/docs/design/generic-model-support.md +0 -821
  181. package/docs/design/kv-cache.md +0 -993
  182. package/docs/design/orpo-training.md +0 -680
  183. package/docs/design/speculative-decoding.md +0 -2129
  184. package/docs/design/turboquant.md +0 -2225
  185. package/docs/design/unified-engine-frontier-plan.md +0 -1987
  186. package/docs/design/web-chat-redesign.md +0 -695
  187. package/docs/planning/PRODUCT_ROADMAP.md +0 -593
  188. package/docs/planning/ResearchTopics.md +0 -119
  189. package/docs/planning/public-readiness-handoff.md +0 -244
  190. package/docs/planning/public-readiness.md +0 -149
  191. package/docs/planning/video-series.md +0 -421
  192. package/docs/reference/benchmarks.md +0 -3587
  193. package/docs/reference/cli.md +0 -646
  194. package/docs/reference/distribution.md +0 -380
  195. package/docs/reference/environment.md +0 -494
  196. package/docs/reference/glossary.md +0 -39
  197. package/docs/reference/library-api.md +0 -688
  198. package/docs/reference/memory.md +0 -260
  199. package/docs/reference/models.md +0 -346
  200. package/docs/reference/server-api.md +0 -1945
  201. package/docs/reference/server-config.md +0 -973
  202. package/docs/reference/training.md +0 -462
  203. package/docs/reference/troubleshooting.md +0 -158
  204. package/src/admission-plan.ts +0 -18
  205. package/src/audio/audiotoolbox.ts +0 -112
  206. package/src/audio/conformer.ts +0 -655
  207. package/src/audio/decode.ts +0 -133
  208. package/src/audio/features.ts +0 -202
  209. package/src/audio/mic-capture.ts +0 -98
  210. package/src/audio/silero-vad.ts +0 -379
  211. package/src/audio/transcode.ts +0 -67
  212. package/src/audio/whisper-decode.ts +0 -774
  213. package/src/audio/whisper-fast.ts +0 -732
  214. package/src/audio/whisper-format.ts +0 -73
  215. package/src/audio/whisper-mel.ts +0 -185
  216. package/src/audio/whisper-timing.ts +0 -274
  217. package/src/audio/whisper-tokenizer.ts +0 -239
  218. package/src/audio/whisper-transcribe.ts +0 -410
  219. package/src/backends/mlx/assistant-target.ts +0 -46
  220. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  221. package/src/backends/mlx/autoregressive.ts +0 -129
  222. package/src/backends/mlx/batch-group.ts +0 -1874
  223. package/src/backends/mlx/cache-attachment.ts +0 -67
  224. package/src/backends/mlx/cache-layout.ts +0 -31
  225. package/src/backends/mlx/checkpoint-state.ts +0 -53
  226. package/src/backends/mlx/continuation-persistence.ts +0 -107
  227. package/src/backends/mlx/continuation-request.ts +0 -43
  228. package/src/backends/mlx/continuation.ts +0 -77
  229. package/src/backends/mlx/diffusion.ts +0 -39
  230. package/src/backends/mlx/draft-target.ts +0 -32
  231. package/src/backends/mlx/encoder-cache.ts +0 -25
  232. package/src/backends/mlx/evaluation.ts +0 -105
  233. package/src/backends/mlx/fill-append.ts +0 -58
  234. package/src/backends/mlx/fill-group.ts +0 -497
  235. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  236. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  237. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  238. package/src/backends/mlx/gateway-binding.ts +0 -174
  239. package/src/backends/mlx/graph.ts +0 -38
  240. package/src/backends/mlx/kv-codec.ts +0 -9
  241. package/src/backends/mlx/kv-maintenance.ts +0 -161
  242. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  243. package/src/backends/mlx/memory-client.ts +0 -189
  244. package/src/backends/mlx/methods.ts +0 -90
  245. package/src/backends/mlx/mixed-iteration.ts +0 -62
  246. package/src/backends/mlx/model-prompt.ts +0 -178
  247. package/src/backends/mlx/model-serving.ts +0 -80
  248. package/src/backends/mlx/paged-cache-codec.ts +0 -27
  249. package/src/backends/mlx/prefill-cohort.ts +0 -100
  250. package/src/backends/mlx/prefill-policy.ts +0 -26
  251. package/src/backends/mlx/prefill-rows.ts +0 -244
  252. package/src/backends/mlx/prefill.ts +0 -33
  253. package/src/backends/mlx/projected-context-rows.ts +0 -72
  254. package/src/backends/mlx/prompt-input.ts +0 -29
  255. package/src/backends/mlx/qwen-prompt-input.ts +0 -40
  256. package/src/backends/mlx/request-policy.ts +0 -20
  257. package/src/backends/mlx/request-state-policy.ts +0 -54
  258. package/src/backends/mlx/rollback.ts +0 -92
  259. package/src/backends/mlx/row-sampling.ts +0 -49
  260. package/src/backends/mlx/serial-executor.ts +0 -251
  261. package/src/backends/mlx/speculative-group.ts +0 -438
  262. package/src/backends/mlx/speculative-round.ts +0 -161
  263. package/src/backends/mlx/speculative.ts +0 -131
  264. package/src/backends/mlx/state-rows.ts +0 -104
  265. package/src/backends/mlx/state-views.ts +0 -46
  266. package/src/backends/mlx/target-layout-capability.ts +0 -35
  267. package/src/backends/mlx/text-engine.ts +0 -73
  268. package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
  269. package/src/chat-template.ts +0 -382
  270. package/src/cli.ts +0 -3490
  271. package/src/config.ts +0 -399
  272. package/src/contracts/completion.ts +0 -16
  273. package/src/contracts/execution.ts +0 -70
  274. package/src/contracts/generation.ts +0 -103
  275. package/src/contracts/host.ts +0 -7
  276. package/src/contracts/object-cache.ts +0 -8
  277. package/src/contracts/pi-provider.ts +0 -30
  278. package/src/contracts/pi.ts +0 -261
  279. package/src/contracts/prefix-cache.ts +0 -33
  280. package/src/contracts/resources.ts +0 -25
  281. package/src/contracts/sampling.ts +0 -23
  282. package/src/contracts/scheduling.ts +0 -54
  283. package/src/contracts/tsconfig.json +0 -14
  284. package/src/dataset/generators.ts +0 -1087
  285. package/src/dataset/index.ts +0 -12
  286. package/src/dataset/job.ts +0 -81
  287. package/src/dataset/llm.ts +0 -71
  288. package/src/dataset/registry.ts +0 -528
  289. package/src/diffusion/diffusion-generate.ts +0 -507
  290. package/src/download.ts +0 -505
  291. package/src/embed.ts +0 -77
  292. package/src/engine/admission.ts +0 -59
  293. package/src/engine/cancellation.ts +0 -38
  294. package/src/engine/engine.ts +0 -56
  295. package/src/engine/execution-coordinator.ts +0 -70
  296. package/src/engine/execution-plan.ts +0 -64
  297. package/src/engine/execution-tasks.ts +0 -44
  298. package/src/engine/namespaced-cache.ts +0 -13
  299. package/src/engine/resources.ts +0 -53
  300. package/src/engine/scheduler.ts +0 -92
  301. package/src/engine/session.ts +0 -247
  302. package/src/eval/README.md +0 -130
  303. package/src/eval/ifeval.ts +0 -81
  304. package/src/eval/kl-prompts.ts +0 -29
  305. package/src/eval/kl.ts +0 -590
  306. package/src/eval/perplexity.ts +0 -164
  307. package/src/eval/quality-db.ts +0 -92
  308. package/src/eval/reference-logits.ts +0 -207
  309. package/src/eval/runner.ts +0 -124
  310. package/src/eval/score.ts +0 -49
  311. package/src/eval/tasks/bfcl.ts +0 -535
  312. package/src/eval/tasks/gsm8k.ts +0 -98
  313. package/src/eval/tasks/hashhop.ts +0 -139
  314. package/src/eval/tasks/humaneval.ts +0 -275
  315. package/src/eval/tasks/ifeval.ts +0 -525
  316. package/src/eval/tasks/mmlu.ts +0 -157
  317. package/src/eval/ultrafeedback.ts +0 -60
  318. package/src/evaldb.ts +0 -199
  319. package/src/expert-io.ts +0 -393
  320. package/src/expert-offload-build.ts +0 -77
  321. package/src/expert-offload.ts +0 -76
  322. package/src/expert-residency.ts +0 -1134
  323. package/src/expert-usage.ts +0 -415
  324. package/src/fill/echo-index.ts +0 -188
  325. package/src/fill/fill-session.ts +0 -463
  326. package/src/fill/proposal.ts +0 -68
  327. package/src/fill/schema-rows.ts +0 -506
  328. package/src/fill/tool-boundary.ts +0 -103
  329. package/src/fit.ts +0 -249
  330. package/src/generate.ts +0 -1352
  331. package/src/grammar.ts +0 -604
  332. package/src/harness-pi.ts +0 -184
  333. package/src/hf-push.ts +0 -628
  334. package/src/hub-rest.ts +0 -242
  335. package/src/index.ts +0 -63
  336. package/src/inference/denoising.ts +0 -17
  337. package/src/inference/draft-acceptance.ts +0 -41
  338. package/src/inference/draft-output.ts +0 -49
  339. package/src/inference/graph.ts +0 -33
  340. package/src/inference/prefill.ts +0 -45
  341. package/src/inference/rollback.ts +0 -7
  342. package/src/jobs/index.ts +0 -31
  343. package/src/jobs/job-entry.ts +0 -107
  344. package/src/jobs/task-client.ts +0 -19
  345. package/src/jobs/types.ts +0 -2
  346. package/src/kv-scheme.ts +0 -279
  347. package/src/kv-store.ts +0 -1135
  348. package/src/lab/README.md +0 -22
  349. package/src/lab/curve/curve-designer.html +0 -303
  350. package/src/lab/curve/curve-sampler.ts +0 -122
  351. package/src/lab/expert-trace/expert-trace.ts +0 -69
  352. package/src/lab/paged-kv/paged-attention.ts +0 -117
  353. package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
  354. package/src/lab/paged-kv/paged-kv.ts +0 -336
  355. package/src/library.ts +0 -40
  356. package/src/lora.ts +0 -408
  357. package/src/md-modules.d.ts +0 -54
  358. package/src/media-fetch.ts +0 -442
  359. package/src/memory/article.ts +0 -558
  360. package/src/memory/chunk-validation.ts +0 -150
  361. package/src/memory/chunk.ts +0 -318
  362. package/src/memory/cluster.ts +0 -351
  363. package/src/memory/coverage.ts +0 -134
  364. package/src/memory/crosslink.ts +0 -0
  365. package/src/memory/db.ts +0 -253
  366. package/src/memory/entity.ts +0 -203
  367. package/src/memory/gate.ts +0 -187
  368. package/src/memory/history.ts +0 -152
  369. package/src/memory/ingest.ts +0 -335
  370. package/src/memory/model.ts +0 -183
  371. package/src/memory/normalize.ts +0 -671
  372. package/src/memory/parse.ts +0 -22
  373. package/src/memory/pipeline.ts +0 -275
  374. package/src/memory/prompts.ts +0 -65
  375. package/src/memory/query.ts +0 -334
  376. package/src/memory/reconcile.ts +0 -734
  377. package/src/memory/redirect.ts +0 -108
  378. package/src/memory/reindex.ts +0 -325
  379. package/src/memory/resolve.ts +0 -307
  380. package/src/memory/rest.ts +0 -245
  381. package/src/memory/route.ts +0 -272
  382. package/src/memory/schedule.ts +0 -165
  383. package/src/memory/stages.ts +0 -777
  384. package/src/memory/synthesize.ts +0 -1638
  385. package/src/memory/tools.ts +0 -749
  386. package/src/memory/vault.ts +0 -1194
  387. package/src/memory/wikify.ts +0 -1064
  388. package/src/mlx/array.ts +0 -425
  389. package/src/mlx/autograd.ts +0 -304
  390. package/src/mlx/checkpoint.ts +0 -149
  391. package/src/mlx/compile.ts +0 -168
  392. package/src/mlx/custom-vjp.ts +0 -188
  393. package/src/mlx/ffi.ts +0 -531
  394. package/src/mlx/materialize.ts +0 -23
  395. package/src/mlx/metal-kernel.ts +0 -159
  396. package/src/mlx/normalized-argmax.ts +0 -116
  397. package/src/mlx/ops.ts +0 -1108
  398. package/src/mlx/quantized-rows.ts +0 -36
  399. package/src/mlx/token-bitmask.ts +0 -52
  400. package/src/mlx/turboquant-kv-decode.ts +0 -82
  401. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  402. package/src/mlx/turboquant-ops.ts +0 -861
  403. package/src/mlx/turboquant-tables.ts +0 -237
  404. package/src/mmap.ts +0 -90
  405. package/src/model/artifact-identity.ts +0 -73
  406. package/src/model/batched-kv.ts +0 -235
  407. package/src/model/batched-mask.ts +0 -279
  408. package/src/model/batched-quant.ts +0 -212
  409. package/src/model/batched-quantized-kv.ts +0 -144
  410. package/src/model/batched-rotating-quant.ts +0 -353
  411. package/src/model/batched-rotating-state.ts +0 -149
  412. package/src/model/batched-rotating.ts +0 -338
  413. package/src/model/batched-row-storage.ts +0 -179
  414. package/src/model/batched-ssm.ts +0 -52
  415. package/src/model/batched-turboquant-kv.ts +0 -94
  416. package/src/model/compiled-decode.ts +0 -712
  417. package/src/model/decoded-kv-donor.ts +0 -12
  418. package/src/model/delayed-quantized-kv.ts +0 -72
  419. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  420. package/src/model/delayed-turboquant-kv.ts +0 -57
  421. package/src/model/diffusion-gemma.ts +0 -1026
  422. package/src/model/factory.ts +0 -215
  423. package/src/model/fingerprint.ts +0 -45
  424. package/src/model/flash-attention.ts +0 -694
  425. package/src/model/full-prefill-padding.ts +0 -56
  426. package/src/model/full-prefill-row.ts +0 -105
  427. package/src/model/gemma4-base.ts +0 -2370
  428. package/src/model/gemma4.ts +0 -1395
  429. package/src/model/generated/gemma4-12b.ts +0 -429
  430. package/src/model/generated/gemma4-26b.ts +0 -448
  431. package/src/model/generated/gemma4-e4b.ts +0 -717
  432. package/src/model/generated/index.ts +0 -18
  433. package/src/model/glm52-atlas.ts +0 -511
  434. package/src/model/glm52-cache.ts +0 -792
  435. package/src/model/glm52-config.ts +0 -262
  436. package/src/model/glm52-container.ts +0 -305
  437. package/src/model/glm52-coupling.ts +0 -388
  438. package/src/model/glm52-dsa.ts +0 -606
  439. package/src/model/glm52-expert-layout.ts +0 -253
  440. package/src/model/glm52-layout.ts +0 -152
  441. package/src/model/glm52-memory.ts +0 -500
  442. package/src/model/glm52-mla.ts +0 -792
  443. package/src/model/glm52-moe.ts +0 -223
  444. package/src/model/glm52-pilot.ts +0 -537
  445. package/src/model/glm52-reference.ts +0 -445
  446. package/src/model/glm52-residency.ts +0 -557
  447. package/src/model/glm52-resident-weights.ts +0 -135
  448. package/src/model/glm52-streamed-experts.ts +0 -453
  449. package/src/model/glm52-streamed-metal.ts +0 -610
  450. package/src/model/glm52-weights.ts +0 -503
  451. package/src/model/glm52.ts +0 -1132
  452. package/src/model/implementation.ts +0 -69
  453. package/src/model/kv-attention-view.ts +0 -70
  454. package/src/model/minicpm5.ts +0 -376
  455. package/src/model/profile.ts +0 -468
  456. package/src/model/quantized-append-attention.ts +0 -31
  457. package/src/model/qwen-append.ts +0 -12
  458. package/src/model/qwen-conv.ts +0 -52
  459. package/src/model/qwen3-delta-state.ts +0 -74
  460. package/src/model/qwen3-delta.ts +0 -451
  461. package/src/model/qwen3-moe.ts +0 -404
  462. package/src/model/qwen3-mrope.ts +0 -250
  463. package/src/model/qwen3.ts +0 -277
  464. package/src/model/qwen3_5-checkpoint.ts +0 -164
  465. package/src/model/qwen3_5.ts +0 -881
  466. package/src/model/rotating-kv-donor.ts +0 -35
  467. package/src/model/rotating-kv-layout.ts +0 -262
  468. package/src/model/rotating-row-transaction.ts +0 -35
  469. package/src/model/speculative-rotating-kv.ts +0 -101
  470. package/src/model/ssm-prefill-padding.ts +0 -39
  471. package/src/model/support.ts +0 -110
  472. package/src/model/token-groups.ts +0 -66
  473. package/src/model/trellis-balanced-scatter.ts +0 -51
  474. package/src/model/trellis-linear.ts +0 -672
  475. package/src/model/trellis-shared-m.ts +0 -151
  476. package/src/model/trellis-shared-scatter.ts +0 -144
  477. package/src/model/trellis-splitk-prefill.ts +0 -158
  478. package/src/model/trellis-tiled-prefill.ts +0 -136
  479. package/src/model/trellis-vector-expand.ts +0 -62
  480. package/src/model/trellis-wide-prefill.ts +0 -94
  481. package/src/model/turboquant-codec.ts +0 -89
  482. package/src/model/universal/archs.ts +0 -332
  483. package/src/model/universal/dense.ts +0 -612
  484. package/src/model/universal/modules.ts +0 -170
  485. package/src/model/universal/rope.ts +0 -381
  486. package/src/model/whisper.ts +0 -435
  487. package/src/native/expert_io.c +0 -523
  488. package/src/native/frame_extract.swift +0 -140
  489. package/src/native/mic_capture.swift +0 -92
  490. package/src/native-pack.ts +0 -163
  491. package/src/pi-provider.ts +0 -53
  492. package/src/pi-session.ts +0 -81
  493. package/src/pi-terminal.ts +0 -274
  494. package/src/pi-web.ts +0 -1940
  495. package/src/preflight.ts +0 -158
  496. package/src/prompt-cache.ts +0 -682
  497. package/src/quantize/allocator.ts +0 -627
  498. package/src/quantize/atomic-output.ts +0 -38
  499. package/src/quantize/calibration.ts +0 -181
  500. package/src/quantize/config-writer.ts +0 -145
  501. package/src/quantize/index.ts +0 -84
  502. package/src/quantize/job.ts +0 -162
  503. package/src/quantize/quantizer.ts +0 -666
  504. package/src/quantize/rotate.ts +0 -603
  505. package/src/quantize/safetensors-writer.ts +0 -249
  506. package/src/quantize/sensitivity.ts +0 -216
  507. package/src/quantize/trellis.ts +0 -586
  508. package/src/quantize/weight-transform.ts +0 -292
  509. package/src/registry.ts +0 -602
  510. package/src/runtime-config.ts +0 -77
  511. package/src/safetensors.ts +0 -165
  512. package/src/sampler.ts +0 -1012
  513. package/src/serve/admin-routes.ts +0 -184
  514. package/src/serve/assets/curve-terrain.html +0 -105
  515. package/src/serve/assets/training-inference-map.html +0 -575
  516. package/src/serve/audio-routes.ts +0 -323
  517. package/src/serve/aux-routes.ts +0 -132
  518. package/src/serve/batch-scheduler.ts +0 -8
  519. package/src/serve/checkpoint-identity.ts +0 -64
  520. package/src/serve/generation-gateway.ts +0 -537
  521. package/src/serve/isolate.ts +0 -609
  522. package/src/serve/kv-budget.ts +0 -14
  523. package/src/serve/lab-routes.ts +0 -341
  524. package/src/serve/lane-registry.ts +0 -45
  525. package/src/serve/model-admin-routes.ts +0 -155
  526. package/src/serve/model-binding.ts +0 -49
  527. package/src/serve/model-host.ts +0 -511
  528. package/src/serve/parent-application.ts +0 -56
  529. package/src/serve/prompt-response-trace.ts +0 -161
  530. package/src/serve/response-lease.ts +0 -24
  531. package/src/serve/session-search.ts +0 -326
  532. package/src/serve/static-routes.ts +0 -101
  533. package/src/serve/transcription-server.ts +0 -64
  534. package/src/serve/transcription-service.ts +0 -502
  535. package/src/server.ts +0 -1282
  536. package/src/spec/assistant-rows.ts +0 -93
  537. package/src/spec/assistant-source.ts +0 -126
  538. package/src/spec/cache-identity.ts +0 -22
  539. package/src/spec/deepspec-rows.ts +0 -29
  540. package/src/spec/deepspec-source.ts +0 -145
  541. package/src/spec/dflash-source.ts +0 -149
  542. package/src/spec/drafter.ts +0 -304
  543. package/src/spec/dspark/ab-stats.ts +0 -136
  544. package/src/spec/dspark/calibration.ts +0 -112
  545. package/src/spec/dspark/data-dflash.ts +0 -156
  546. package/src/spec/dspark/data.ts +0 -201
  547. package/src/spec/dspark/deepspec-module.ts +0 -776
  548. package/src/spec/dspark/generate-dflash.ts +0 -245
  549. package/src/spec/dspark/generate.ts +0 -290
  550. package/src/spec/dspark/loader.ts +0 -23
  551. package/src/spec/dspark/loss.ts +0 -213
  552. package/src/spec/dspark/module-dflash.ts +0 -560
  553. package/src/spec/dspark/module.ts +0 -540
  554. package/src/spec/dspark/quantize-drafter.ts +0 -91
  555. package/src/spec/dspark/sample.ts +0 -112
  556. package/src/spec/generate.ts +0 -276
  557. package/src/spec/glm52-mtp-graph.ts +0 -29
  558. package/src/spec/glm52-mtp-rows.ts +0 -132
  559. package/src/spec/glm52-mtp-source.ts +0 -318
  560. package/src/spec/glm52-mtp-state.ts +0 -33
  561. package/src/spec/ngram-source.ts +0 -226
  562. package/src/spec/projected-draft-rows.ts +0 -73
  563. package/src/spec/qwen-mtp-module.ts +0 -171
  564. package/src/spec/qwen-mtp-rows.ts +0 -230
  565. package/src/spec/qwen-mtp-source.ts +0 -386
  566. package/src/spec/qwen-mtp-state.ts +0 -30
  567. package/src/spec/serve-loop.ts +0 -587
  568. package/src/spec/source.ts +0 -228
  569. package/src/spec/two-model-rows.ts +0 -62
  570. package/src/spec/two-model.ts +0 -113
  571. package/src/ssd-cache.ts +0 -431
  572. package/src/ssd-durability.ts +0 -209
  573. package/src/storage/host-buffer.ts +0 -24
  574. package/src/storage/kv-writer.ts +0 -83
  575. package/src/storage/kv-writer.worker.js +0 -264
  576. package/src/storage/retention-policy.ts +0 -37
  577. package/src/tiered-prompt-cache.ts +0 -45
  578. package/src/tokenizer.ts +0 -335
  579. package/src/tool-approvals.ts +0 -131
  580. package/src/tool-call.ts +0 -695
  581. package/src/train/dataset.ts +0 -484
  582. package/src/train/diffusion-lora.ts +0 -216
  583. package/src/train/export.ts +0 -32
  584. package/src/train/flash-cce.ts +0 -1234
  585. package/src/train/forward.ts +0 -266
  586. package/src/train/fuse.ts +0 -243
  587. package/src/train/index.ts +0 -46
  588. package/src/train/job.ts +0 -205
  589. package/src/train/lora-params.ts +0 -254
  590. package/src/train/loss.ts +0 -1591
  591. package/src/train/merge.ts +0 -195
  592. package/src/train/optimizer.ts +0 -183
  593. package/src/train/prefix-shared.ts +0 -490
  594. package/src/train/rank.ts +0 -137
  595. package/src/train/segmented.ts +0 -1828
  596. package/src/train/steel-qmm-header.ts +0 -1461
  597. package/src/train/trainer.ts +0 -1221
  598. package/src/train/watch.ts +0 -542
  599. package/src/vision/diffusion-vision.ts +0 -620
  600. package/src/vision/embedder.ts +0 -176
  601. package/src/vision/preprocess.ts +0 -247
  602. package/src/vision/prompt.ts +0 -409
  603. package/src/vision/qwen3vl-preprocess.ts +0 -409
  604. package/src/vision/qwen3vl-prompt.ts +0 -233
  605. package/src/vision/qwen3vl-tower.ts +0 -566
  606. package/src/vision/siglip.ts +0 -607
  607. package/src/vision/video-frames.ts +0 -148
  608. package/src/web/app.html +0 -2155
  609. package/src/web/app.js +0 -5863
  610. package/src/web/skills/memory/SKILL.md +0 -120
  611. package/src/web/skills/web-research/SKILL.md +0 -46
  612. package/src/web/skills.ts +0 -97
  613. package/src/web/src/adapters-panel.ts +0 -288
  614. package/src/web/src/assistant.ts +0 -451
  615. package/src/web/src/chat.ts +0 -1060
  616. package/src/web/src/composer.ts +0 -962
  617. package/src/web/src/dataset.ts +0 -132
  618. package/src/web/src/finetune.ts +0 -267
  619. package/src/web/src/hub.ts +0 -428
  620. package/src/web/src/main.ts +0 -98
  621. package/src/web/src/markdown.ts +0 -0
  622. package/src/web/src/memory-panel.ts +0 -572
  623. package/src/web/src/model-picker.ts +0 -159
  624. package/src/web/src/palette.ts +0 -346
  625. package/src/web/src/protocol.ts +0 -26
  626. package/src/web/src/quantize.ts +0 -167
  627. package/src/web/src/rag.ts +0 -274
  628. package/src/web/src/sessions.ts +0 -469
  629. package/src/web/src/shell.ts +0 -804
  630. package/src/web/src/ui-catalog.ts +0 -78
  631. package/src/web/src/voice.ts +0 -141
  632. package/src/web/vendor/README.md +0 -61
  633. package/src/web-assets.ts +0 -47
  634. package/src/web-tools.ts +0 -478
  635. package/src/weights.ts +0 -255
  636. /package/src/{serve → server}/completion-sink.ts +0 -0
  637. /package/src/{serve → server}/generated-token-history.ts +0 -0
  638. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  639. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  640. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,1461 +0,0 @@
1
- /* eslint-disable */
2
- // AUTO-PORTED VERBATIM from MLX quantized.h + steel/* (github.com/ml-explore/mlx).
3
- export const STEEL_QMM_HEADER = String.raw`// mlx metal_kernel preamble provides METAL_FUNC + using namespace metal; we add
4
- // the steel macros, type_traits + integral_constant (each self-manages its own
5
- // #pragma METAL internals enable/disable), then the GEMM-specific structs.
6
- #define STEEL_CONST static constant constexpr const
7
- #define STEEL_PRAGMA_UNROLL _Pragma("clang loop unroll(full)")
8
- #define STEEL_PRAGMA_NO_UNROLL _Pragma("clang loop unroll(disable)")
9
- #define MLX_MTL_CONST static constant constexpr const
10
- MLX_MTL_CONST int SIMD_SIZE = 32;
11
- // ===== type_traits.h (self-managed internals pragma) =====
12
-
13
-
14
-
15
- #pragma METAL internals : enable
16
-
17
- namespace metal {
18
-
19
- template <typename T>
20
- struct is_empty : metal::bool_constant<__is_empty(T)> {};
21
-
22
- #ifdef __cpp_variable_templates
23
- template <typename T>
24
- constexpr constant bool is_empty_v = is_empty<T>::value;
25
- #endif
26
-
27
- template <typename... Ts>
28
- struct make_void {
29
- typedef void type;
30
- };
31
-
32
- template <typename... Ts>
33
- using void_t = typename make_void<Ts...>::type;
34
-
35
- template <class T>
36
- struct is_static : metal::bool_constant<is_empty<remove_cv_t<T>>::value> {};
37
-
38
- template <typename T>
39
- struct pointer_element {};
40
-
41
- template <typename T>
42
- struct pointer_element<thread T*> {
43
- using type = remove_cv_t<T>;
44
- };
45
- template <typename T>
46
- struct pointer_element<device T*> {
47
- using type = remove_cv_t<T>;
48
- };
49
- template <typename T>
50
- struct pointer_element<constant T*> {
51
- using type = remove_cv_t<T>;
52
- };
53
- template <typename T>
54
- struct pointer_element<threadgroup T*> {
55
- using type = remove_cv_t<T>;
56
- };
57
-
58
- template <typename T>
59
- using pointer_element_t = typename pointer_element<remove_cv_t<T>>::type;
60
-
61
- } // namespace metal
62
-
63
- #pragma METAL internals : disable// ===== integral_constant.h (self-managed internals pragma) =====
64
-
65
-
66
-
67
- #pragma METAL internals : enable
68
-
69
- namespace mlx {
70
- namespace steel {
71
-
72
- ///////////////////////////////////////////////////////////////////////////////
73
- // Integral constant with casting
74
- ///////////////////////////////////////////////////////////////////////////////
75
-
76
- template <typename T, T v>
77
- struct integral_constant {
78
- static constexpr constant T value = v;
79
- using value_type = T;
80
- using type = integral_constant;
81
-
82
- METAL_FUNC constexpr operator value_type() const noexcept {
83
- return value;
84
- }
85
- };
86
-
87
- template <bool B>
88
- using bool_constant = integral_constant<bool, B>;
89
- using true_type = bool_constant<true>;
90
- using false_type = bool_constant<false>;
91
-
92
- template <class T>
93
- struct is_integral : bool_constant<metal::is_integral<T>::value> {};
94
-
95
- template <class T, T v>
96
- struct is_integral<integral_constant<T, v>>
97
- : bool_constant<metal::is_integral<T>::value> {};
98
-
99
- template <typename T>
100
- constexpr constant bool is_integral_v = is_integral<T>::value;
101
-
102
- template <int val>
103
- using Int = integral_constant<int, val>;
104
-
105
- ///////////////////////////////////////////////////////////////////////////////
106
- // Binary Operators on Integral constants
107
- ///////////////////////////////////////////////////////////////////////////////
108
-
109
- #define integral_const_binop(__op__, __operator__) \
110
- template <typename T, T tv, typename U, U uv> \
111
- METAL_FUNC constexpr auto __operator__( \
112
- integral_constant<T, tv>, integral_constant<U, uv>) { \
113
- constexpr auto res = tv __op__ uv; \
114
- return integral_constant<decltype(res), res>{}; \
115
- }
116
-
117
- integral_const_binop(+, operator+);
118
- integral_const_binop(-, operator-);
119
- integral_const_binop(*, operator*);
120
- integral_const_binop(/, operator/);
121
-
122
- integral_const_binop(==, operator==);
123
- integral_const_binop(!=, operator!=);
124
- integral_const_binop(<, operator<);
125
- integral_const_binop(>, operator>);
126
- integral_const_binop(<=, operator<=);
127
- integral_const_binop(>=, operator>=);
128
-
129
- integral_const_binop(&&, operator&&);
130
- integral_const_binop(||, operator||);
131
-
132
- template <typename T, typename = metal::enable_if_t<!is_integral_v<T>>>
133
- METAL_FUNC constexpr auto operator||(true_type, T) {
134
- return true_type{};
135
- }
136
- template <typename T, typename = metal::enable_if_t<!is_integral_v<T>>>
137
- METAL_FUNC constexpr auto operator||(T, true_type) {
138
- return true_type{};
139
- }
140
-
141
- template <typename T, typename = metal::enable_if_t<!is_integral_v<T>>>
142
- METAL_FUNC constexpr auto operator&&(false_type, T) {
143
- return false_type{};
144
- }
145
-
146
- template <typename T, typename = metal::enable_if_t<!is_integral_v<T>>>
147
- METAL_FUNC constexpr auto operator&&(T, false_type) {
148
- return false_type{};
149
- }
150
-
151
- // Dispatch utilities
152
- template <typename F>
153
- void dispatch_bool(bool v, F f) {
154
- if (v) {
155
- f(true_type{});
156
- } else {
157
- f(false_type{});
158
- }
159
- }
160
-
161
- template <int start, int stop, int step, typename F>
162
- constexpr void const_for_loop(F f) {
163
- if constexpr (start < stop) {
164
- constexpr auto idx = Int<start>{};
165
- f(idx);
166
- const_for_loop<start + step, stop, step, F>(f);
167
- }
168
- }
169
-
170
- #undef integral_const_binop
171
-
172
- ///////////////////////////////////////////////////////////////////////////////
173
- // Reduction operators
174
- ///////////////////////////////////////////////////////////////////////////////
175
-
176
- template <typename T>
177
- METAL_FUNC constexpr T sum(T x) {
178
- return x;
179
- }
180
-
181
- template <typename T, typename... Us>
182
- METAL_FUNC constexpr auto sum(T x, Us... us) {
183
- return x + sum(us...);
184
- }
185
-
186
- } // namespace steel
187
- } // namespace mlx
188
-
189
- #pragma METAL internals : disable
190
- // ===== transforms.h =====
191
-
192
-
193
-
194
- ///////////////////////////////////////////////////////////////////////////////
195
- // Transforms and Epilogues
196
- ///////////////////////////////////////////////////////////////////////////////
197
-
198
- namespace mlx {
199
- namespace steel {
200
-
201
- template <typename OutT, typename InT>
202
- struct TransformNone {
203
- static METAL_FUNC OutT apply(InT x) {
204
- return static_cast<OutT>(x);
205
- }
206
-
207
- static METAL_FUNC OutT apply(InT x, OutT) {
208
- return static_cast<OutT>(x);
209
- }
210
- };
211
-
212
- template <typename OutT, typename InT>
213
- struct TransformAdd {
214
- TransformAdd(const float, const float) {}
215
-
216
- static METAL_FUNC OutT apply(InT x) {
217
- return static_cast<OutT>(x);
218
- }
219
-
220
- static METAL_FUNC OutT apply(InT x, OutT c) {
221
- return static_cast<OutT>(x) + c;
222
- }
223
- };
224
-
225
- template <typename OutT, typename InT>
226
- struct TransformAxpby {
227
- const float alpha;
228
- const float beta;
229
-
230
- TransformAxpby(const float alpha_, const float beta_)
231
- : alpha(alpha_), beta(beta_) {}
232
-
233
- static METAL_FUNC OutT apply(InT x) {
234
- return static_cast<OutT>(x);
235
- }
236
-
237
- METAL_FUNC OutT apply(InT x, OutT c) const {
238
- return static_cast<OutT>(
239
- x * static_cast<InT>(alpha) + (static_cast<OutT>(beta) * c));
240
- }
241
- };
242
-
243
- template <typename T>
244
- struct AccumHelper {
245
- typedef float accum_type;
246
- };
247
-
248
- struct BlockSwizzle {
249
- static METAL_FUNC int2
250
- swizzle(uint3 tid [[threadgroup_position_in_grid]], const int swizzle_log) {
251
- const int tid_x = (tid.x) >> swizzle_log;
252
- const int tid_y =
253
- ((tid.y) << swizzle_log) + ((tid.x) & ((1 << swizzle_log) - 1));
254
- return int2(tid_x, tid_y);
255
- }
256
- };
257
-
258
- } // namespace steel
259
- } // namespace mlx// ===== quantized helpers =====
260
- template <int bits, int wsize = 8>
261
- inline constexpr short get_pack_factor() {
262
- return (bits == 3 || bits == 5) ? 8 : (bits == 6 ? 4 : wsize / bits);
263
- }
264
-
265
- template <int bits, int wsize = 8>
266
- inline constexpr short get_bytes_per_pack() {
267
- constexpr int power_of_2_bits = (bits & (bits - 1)) == 0;
268
- return power_of_2_bits ? (wsize / 8) : (bits == 5 ? 5 : 3);
269
- }
270
-
271
- // ===== dequantize =====
272
- template <typename U, int N, int bits>
273
- inline void
274
- dequantize(const device uint8_t* w, U scale, U bias, threadgroup U* w_local) {
275
- static_assert(
276
- bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 ||
277
- bits == 8,
278
- "Template undefined for bits not in {2, 3, 4, 5, 6, 8}");
279
-
280
- if (bits == 2) {
281
- U s[4] = {
282
- scale,
283
- scale / static_cast<U>(4.0f),
284
- scale / static_cast<U>(16.0f),
285
- scale / static_cast<U>(64.0f)};
286
- for (int i = 0; i < (N / 4); i++) {
287
- w_local[4 * i] = s[0] * (w[i] & 0x03) + bias;
288
- w_local[4 * i + 1] = s[1] * (w[i] & 0x0c) + bias;
289
- w_local[4 * i + 2] = s[2] * (w[i] & 0x30) + bias;
290
- w_local[4 * i + 3] = s[3] * (w[i] & 0xc0) + bias;
291
- }
292
- }
293
-
294
- else if (bits == 3) {
295
- for (int i = 0; i < (N / 8); i++) {
296
- w_local += 8 * i;
297
- w += 3 * i;
298
-
299
- w_local[0] = (w[0] & 0x7) * scale + bias;
300
- w_local[1] = ((w[0] & 0x38) >> 3) * scale + bias;
301
- w_local[2] = (((w[0] & 0xc0) >> 6) + ((w[1] & 0x1) << 2)) * scale + bias;
302
- w_local[3] = ((w[1] & 0xe) >> 1) * scale + bias;
303
- w_local[4] = ((w[1] & 0x70) >> 4) * scale + bias;
304
- w_local[5] = (((w[1] & 0x80) >> 7) + ((w[2] & 0x3) << 1)) * scale + bias;
305
- w_local[6] = ((w[2] & 0x1c) >> 2) * scale + bias;
306
- w_local[7] = ((w[2] & 0xe0) >> 5) * scale + bias;
307
- }
308
- }
309
-
310
- else if (bits == 4) {
311
- U s[2] = {scale, scale / static_cast<U>(16.0f)};
312
- for (int i = 0; i < (N / 2); i++) {
313
- w_local[2 * i] = s[0] * (w[i] & 0x0f) + bias;
314
- w_local[2 * i + 1] = s[1] * (w[i] & 0xf0) + bias;
315
- }
316
- }
317
-
318
- else if (bits == 5) {
319
- for (int i = 0; i < (N / 8); i++) {
320
- w_local += 8 * i;
321
- w += 5 * i;
322
-
323
- w_local[0] = (w[0] & 0x1f) * scale + bias;
324
- w_local[1] = (((w[0] & 0xe0) >> 5) + ((w[1] & 0x3) << 3)) * scale + bias;
325
- w_local[2] = ((w[1] & 0x7c) >> 2) * scale + bias;
326
- w_local[3] = (((w[1] & 0x80) >> 7) + ((w[2] & 0xf) << 1)) * scale + bias;
327
- w_local[4] = (((w[2] & 0xf0) >> 4) + ((w[3] & 0x1) << 4)) * scale + bias;
328
- w_local[5] = ((w[3] & 0x3e) >> 1) * scale + bias;
329
- w_local[6] = (((w[3] & 0xc0) >> 6) + ((w[4] & 0x7) << 2)) * scale + bias;
330
- w_local[7] = ((w[4] & 0xf8) >> 3) * scale + bias;
331
- }
332
- }
333
-
334
- else if (bits == 6) {
335
- for (int i = 0; i < (N / 4); i++) {
336
- w_local += 4 * i;
337
- w += 3 * i;
338
- w_local[0] = (w[0] & 0x3f) * scale + bias;
339
- w_local[1] = (((w[0] >> 6) & 0x03) + ((w[1] & 0x0f) << 2)) * scale + bias;
340
- w_local[2] = (((w[1] >> 4) & 0x0f) + ((w[2] & 0x03) << 4)) * scale + bias;
341
- w_local[3] = ((w[2] >> 2) & 0x3f) * scale + bias;
342
- }
343
- }
344
-
345
- else if (bits == 8) {
346
- for (int i = 0; i < N; i++) {
347
- w_local[i] = scale * w[i] + bias;
348
- }
349
- }
350
- }
351
-
352
- // ===== QuantizedBlockLoader =====
353
- template <
354
- typename T,
355
- short BROWS,
356
- short BCOLS,
357
- short dst_ld,
358
- short reduction_dim,
359
- short tgp_size,
360
- short group_size,
361
- short bits>
362
- struct QuantizedBlockLoader {
363
- static_assert(
364
- BCOLS <= group_size,
365
- "The group size should be larger than the columns");
366
- static_assert(
367
- group_size % BCOLS == 0,
368
- "The group size should be divisible by the columns");
369
- static_assert(
370
- bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 ||
371
- bits == 8,
372
- "Template undefined for bits not in {2, 3, 4, 5, 6, 8}");
373
-
374
- MLX_MTL_CONST short pack_factor = get_pack_factor<bits, 8>();
375
- MLX_MTL_CONST short bytes_per_pack = get_bytes_per_pack<bits>();
376
- MLX_MTL_CONST short BCOLS_PACKED = BCOLS / pack_factor;
377
- MLX_MTL_CONST short n_reads =
378
- (BCOLS_PACKED * BROWS < tgp_size) ? 1 : (BCOLS_PACKED * BROWS) / tgp_size;
379
- MLX_MTL_CONST short group_steps = group_size / BCOLS;
380
-
381
- const int src_ld;
382
- const int tile_stride;
383
- short group_step_cnt;
384
- const int group_stride;
385
-
386
- const short thread_idx;
387
- const short bi;
388
- const short bj;
389
-
390
- threadgroup T* dst;
391
- const device uint8_t* src;
392
- const device T* scales;
393
- const device T* biases;
394
-
395
- QuantizedBlockLoader(
396
- const device uint8_t* src_,
397
- const device T* scales_,
398
- const device T* biases_,
399
- const int src_ld_,
400
- threadgroup T* dst_,
401
- ushort simd_group_id [[simdgroup_index_in_threadgroup]],
402
- ushort simd_lane_id [[thread_index_in_simdgroup]])
403
- : src_ld(src_ld_),
404
- tile_stride(
405
- reduction_dim ? BCOLS_PACKED * bytes_per_pack
406
- : BROWS * src_ld * bytes_per_pack / pack_factor),
407
- group_step_cnt(0),
408
- group_stride(BROWS * src_ld / group_size),
409
- thread_idx(simd_group_id * 32 + simd_lane_id),
410
- bi(n_reads * thread_idx / BCOLS_PACKED),
411
- bj((n_reads * thread_idx) % BCOLS_PACKED),
412
- dst(dst_ + bi * dst_ld + bj * pack_factor),
413
- src(src_ + bi * src_ld * bytes_per_pack / pack_factor +
414
- bj * bytes_per_pack),
415
- scales(scales_ + bi * src_ld / group_size),
416
- biases(biases_ + bi * src_ld / group_size) {}
417
-
418
- void load_unsafe() const {
419
- if (BCOLS_PACKED * BROWS < tgp_size && bi >= BROWS) {
420
- return;
421
- }
422
-
423
- T scale = *scales;
424
- T bias = *biases;
425
- for (int i = 0; i < n_reads; i++) {
426
- dequantize<T, pack_factor, bits>(
427
- src + i * bytes_per_pack, scale, bias, dst + i * pack_factor);
428
- }
429
- }
430
-
431
- void load_safe(short2 src_tile_dim) const {
432
- if (BCOLS_PACKED * BROWS < tgp_size && bi >= BROWS) {
433
- return;
434
- }
435
-
436
- if (reduction_dim == 1 && bi >= src_tile_dim.x) {
437
- for (int i = 0; i < n_reads * pack_factor; i++) {
438
- dst[i] = T(0);
439
- }
440
- return;
441
- }
442
-
443
- if (reduction_dim == 0 && bi >= src_tile_dim.y) {
444
- for (int i = 0; i < n_reads * pack_factor; i++) {
445
- dst[i] = T(0);
446
- }
447
- return;
448
- }
449
-
450
- T scale = *scales;
451
- T bias = *biases;
452
- for (int i = 0; i < n_reads; i++) {
453
- dequantize<T, pack_factor, bits>(
454
- (device uint8_t*)(src + i * bytes_per_pack),
455
- scale,
456
- bias,
457
- dst + i * pack_factor);
458
- }
459
- }
460
-
461
- void next() {
462
- src += tile_stride;
463
- if (reduction_dim == 1) {
464
- if (group_steps > 1) {
465
- group_step_cnt++;
466
- if (group_step_cnt == group_steps) {
467
- group_step_cnt = 0;
468
- scales++;
469
- biases++;
470
- }
471
- } else {
472
- scales++;
473
- biases++;
474
- }
475
- } else {
476
- scales += group_stride;
477
- biases += group_stride;
478
- }
479
- }
480
- };
481
- // ===== BlockLoader (loader.h) =====
482
-
483
-
484
-
485
- ///////////////////////////////////////////////////////////////////////////////
486
- // Loading helper
487
- ///////////////////////////////////////////////////////////////////////////////
488
-
489
- namespace mlx {
490
- namespace steel {
491
-
492
- template <
493
- typename T,
494
- short BROWS,
495
- short BCOLS,
496
- short dst_ld,
497
- short reduction_dim,
498
- short tgp_size,
499
- short alignment = 1,
500
- short n_reads = (BCOLS * BROWS) / (tgp_size),
501
- short TCOLS = BCOLS / n_reads,
502
- short TROWS = tgp_size / TCOLS>
503
- struct BlockLoader {
504
- STEEL_CONST short n_rows = (BROWS + TROWS - 1) / TROWS;
505
- STEEL_CONST short vec_size = n_reads;
506
-
507
- // Leading dimension for src
508
- const int src_ld;
509
- const int tile_stride;
510
-
511
- // Thread location indices
512
- const short thread_idx;
513
- const short bi;
514
- const short bj;
515
-
516
- // threadgroup and device memory
517
- threadgroup T* dst;
518
- const device T* src;
519
-
520
- struct alignas(alignment * sizeof(T)) ReadVector {
521
- uint8_t v[sizeof(T) * vec_size];
522
- };
523
-
524
- /* Constructor */
525
- METAL_FUNC BlockLoader(
526
- const device T* src_,
527
- const int src_ld_,
528
- threadgroup T* dst_,
529
- ushort simd_group_id [[simdgroup_index_in_threadgroup]],
530
- ushort simd_lane_id [[thread_index_in_simdgroup]])
531
- : src_ld(src_ld_),
532
- tile_stride(reduction_dim ? BCOLS : BROWS * src_ld),
533
- thread_idx(simd_group_id * 32 + simd_lane_id),
534
- bi(thread_idx / TCOLS),
535
- bj(vec_size * (thread_idx % TCOLS)),
536
- dst(dst_ + bi * dst_ld + bj),
537
- src(src_ + bi * src_ld + bj) {}
538
-
539
- /* Apply operation to threadgroup without bound checking */
540
- template <typename UnaryOp>
541
- METAL_FUNC void apply_inplace_op(thread const UnaryOp& op) const {
542
- STEEL_PRAGMA_UNROLL
543
- for (short i = 0; i < BROWS; i += TROWS) {
544
- STEEL_PRAGMA_UNROLL
545
- for (short j = 0; j < vec_size; j++) {
546
- dst[i * dst_ld + j] = op.apply(dst[i * dst_ld + j]);
547
- }
548
- }
549
- }
550
-
551
- /* Load from device memory into threadgroup memory - without bound checking */
552
- METAL_FUNC void load_unsafe() const {
553
- STEEL_PRAGMA_UNROLL
554
- for (short i = 0; i < BROWS; i += TROWS) {
555
- *((threadgroup ReadVector*)(&dst[i * dst_ld])) =
556
- *((const device ReadVector*)(&src[i * src_ld]));
557
- }
558
- }
559
-
560
- /* Load from device memory into threadgroup memory - with bound checking */
561
- METAL_FUNC void load_safe(short2 src_tile_dim) const {
562
- src_tile_dim = src_tile_dim - short2(bj, bi);
563
-
564
- // Skip loading if thread has no valid reads
565
- if (src_tile_dim.x <= 0 || src_tile_dim.y <= 0) {
566
- STEEL_PRAGMA_UNROLL
567
- for (short i = 0; i < BROWS; i += TROWS) {
568
- STEEL_PRAGMA_UNROLL
569
- for (short j = 0; j < vec_size; j++) {
570
- dst[i * dst_ld + j] = T(0);
571
- }
572
- }
573
- return;
574
- }
575
-
576
- // Use fast thread memory for bound checks
577
- bool tmp_idx[vec_size];
578
- T tmp_val[vec_size];
579
-
580
- STEEL_PRAGMA_UNROLL
581
- for (short i = 0; i < BROWS; i += TROWS) {
582
- // Make sure tmp_idx only contains valid indices
583
- STEEL_PRAGMA_UNROLL
584
- for (short j = 0; j < vec_size; j++) {
585
- tmp_idx[j] = (i < src_tile_dim.y) && (j < src_tile_dim.x);
586
- }
587
-
588
- // Read valid indices into tmp_val
589
- STEEL_PRAGMA_UNROLL
590
- for (short j = 0; j < vec_size; j++) {
591
- tmp_val[j] = src[(tmp_idx[j] ? i * src_ld + j : 0)];
592
- }
593
-
594
- // Zero out unneeded values
595
- STEEL_PRAGMA_UNROLL
596
- for (short j = 0; j < vec_size; j++) {
597
- tmp_val[j] = tmp_idx[j] ? tmp_val[j] : T(0);
598
- }
599
-
600
- // Copy values to threadgroup memory
601
- STEEL_PRAGMA_UNROLL
602
- for (short j = 0; j < vec_size; j++) {
603
- dst[i * dst_ld + j] = tmp_val[j];
604
- }
605
- }
606
- }
607
-
608
- /* Iteration helper */
609
- METAL_FUNC void next() {
610
- src += tile_stride;
611
- }
612
- };
613
-
614
- } // namespace steel
615
- } // namespace mlx
616
- // ===== mma.h (BaseMMAFrag/MMATile/tile_matmad) =====
617
- namespace mlx {
618
- namespace steel {
619
-
620
- template <typename T, int kFragRows_, int kFragCols_>
621
- struct BaseMMAFrag {
622
- static_assert(
623
- kFragRows_ == 8,
624
- "Only 8 x 8 fragment matrices are currently supported");
625
- static_assert(
626
- kFragCols_ == 8,
627
- "Only 8 x 8 fragment matrices are currently supported");
628
- };
629
-
630
- template <typename T>
631
- struct BaseMMAFrag<T, 8, 8> {
632
- STEEL_CONST int kFragRows = 8;
633
- STEEL_CONST int kFragCols = 8;
634
-
635
- STEEL_CONST int kElemsPerFrag = (kFragRows * kFragCols) / 32;
636
-
637
- STEEL_CONST int kElemRows = 1;
638
- STEEL_CONST int kElemCols = 2;
639
-
640
- static_assert(
641
- kElemRows * kElemCols == kElemsPerFrag,
642
- "MMAFrag shape is not consistent with MMAFrag size");
643
-
644
- typedef metal::simdgroup_matrix<T, kFragRows, kFragCols> mat_type;
645
- typedef metal::vec<T, kElemsPerFrag> frag_type;
646
-
647
- METAL_FUNC static constexpr short2 get_coord(
648
- ushort simd_lane_id [[thread_index_in_simdgroup]]) {
649
- const short qid = simd_lane_id / 4;
650
- const short fm = (qid & 4) + ((simd_lane_id / 2) % 4);
651
- const short fn = (qid & 2) * 2 + (simd_lane_id % 2) * 2;
652
- return short2{fn, fm};
653
- }
654
-
655
- template <typename SrcPtrType, typename StrX, typename StrY>
656
- METAL_FUNC static constexpr void
657
- load(thread frag_type& dst, SrcPtrType src, StrX str_x, StrY str_y) {
658
- STEEL_PRAGMA_UNROLL
659
- for (short i = 0; i < kElemRows; i++) {
660
- STEEL_PRAGMA_UNROLL
661
- for (short j = 0; j < kElemCols; j++) {
662
- dst[i * kElemCols + j] = static_cast<T>(src[i * str_x + j * str_y]);
663
- }
664
- }
665
- }
666
-
667
- template <
668
- typename SrcPtrType,
669
- typename StrX,
670
- typename StrY,
671
- typename LimX,
672
- typename LimY,
673
- typename OffX,
674
- typename OffY>
675
- METAL_FUNC static constexpr void load_safe(
676
- thread frag_type& dst,
677
- SrcPtrType src,
678
- StrX str_x,
679
- StrY str_y,
680
- LimX lim_x,
681
- LimY lim_y,
682
- OffX off_x = Int<0>{},
683
- OffY off_y = Int<0>{}) {
684
- STEEL_PRAGMA_UNROLL
685
- for (short i = 0; i < kElemRows; i++) {
686
- STEEL_PRAGMA_UNROLL
687
- for (short j = 0; j < kElemCols; j++) {
688
- if ((off_x + i) < lim_x && (off_y + j) < lim_y) {
689
- dst[i * kElemCols + j] =
690
- static_cast<T>(src[(off_x + i) * str_x + (off_y + j) * str_y]);
691
- } else {
692
- dst[i * kElemCols + j] = T(0);
693
- }
694
- }
695
- }
696
- }
697
-
698
- template <typename DstPtrType, typename StrX, typename StrY>
699
- METAL_FUNC static constexpr void
700
- store(const thread frag_type& src, DstPtrType dst, StrX str_x, StrY str_y) {
701
- using U = pointer_element_t<DstPtrType>;
702
-
703
- STEEL_PRAGMA_UNROLL
704
- for (short i = 0; i < kElemRows; i++) {
705
- STEEL_PRAGMA_UNROLL
706
- for (short j = 0; j < kElemCols; j++) {
707
- dst[i * str_x + j * str_y] = static_cast<U>(src[i * kElemCols + j]);
708
- }
709
- }
710
- }
711
-
712
- template <
713
- typename DstPtrType,
714
- typename StrX,
715
- typename StrY,
716
- typename LimX,
717
- typename LimY,
718
- typename OffX,
719
- typename OffY>
720
- METAL_FUNC static constexpr void store_safe(
721
- const thread frag_type& src,
722
- DstPtrType dst,
723
- StrX str_x,
724
- StrY str_y,
725
- LimX lim_x,
726
- LimY lim_y,
727
- OffX off_x = Int<0>{},
728
- OffY off_y = Int<0>{}) {
729
- using U = pointer_element_t<DstPtrType>;
730
-
731
- STEEL_PRAGMA_UNROLL
732
- for (short i = 0; i < kElemRows; i++) {
733
- STEEL_PRAGMA_UNROLL
734
- for (short j = 0; j < kElemCols; j++) {
735
- if ((off_x + i) < lim_x && (off_y + j) < lim_y) {
736
- dst[(off_x + i) * str_x + (off_y + j) * str_y] =
737
- static_cast<U>(src[i * kElemCols + j]);
738
- }
739
- }
740
- }
741
- }
742
-
743
- template <
744
- typename DstPtrType,
745
- typename StrX,
746
- typename StrY,
747
- typename StartX,
748
- typename StopX,
749
- typename StartY,
750
- typename StopY,
751
- typename OffX,
752
- typename OffY>
753
- METAL_FUNC static constexpr void store_slice(
754
- const thread frag_type& src,
755
- DstPtrType dst,
756
- StrX str_x,
757
- StrY str_y,
758
- StartX start_x,
759
- StopX stop_x,
760
- StartY start_y,
761
- StopY stop_y,
762
- OffX off_x = Int<0>{},
763
- OffY off_y = Int<0>{}) {
764
- using U = pointer_element_t<DstPtrType>;
765
-
766
- STEEL_PRAGMA_UNROLL
767
- for (short i = 0; i < kElemRows; i++) {
768
- STEEL_PRAGMA_UNROLL
769
- for (short j = 0; j < kElemCols; j++) {
770
- if ((off_x + i) < stop_x && (off_x + i) >= start_x &&
771
- (off_y + j) < stop_y && (off_y + j) >= start_y) {
772
- dst[(off_x + i) * str_x + (off_y + j) * str_y] =
773
- static_cast<U>(src[i * kElemCols + j]);
774
- }
775
- }
776
- }
777
- }
778
-
779
- METAL_FUNC static constexpr void mma(
780
- thread frag_type& D,
781
- thread frag_type& A,
782
- thread frag_type& B,
783
- thread frag_type& C) {
784
- mat_type D_mat;
785
- mat_type A_mat;
786
- mat_type B_mat;
787
- mat_type C_mat;
788
-
789
- reinterpret_cast<thread frag_type&>(A_mat.thread_elements()) = A;
790
- reinterpret_cast<thread frag_type&>(B_mat.thread_elements()) = B;
791
- reinterpret_cast<thread frag_type&>(C_mat.thread_elements()) = C;
792
-
793
- mma(D_mat, A_mat, B_mat, C_mat);
794
-
795
- D = reinterpret_cast<thread frag_type&>(D_mat.thread_elements());
796
- }
797
-
798
- METAL_FUNC static constexpr void mma(
799
- thread mat_type& D,
800
- thread mat_type& A,
801
- thread mat_type& B,
802
- thread mat_type& C) {
803
- simdgroup_multiply_accumulate(D, A, B, C);
804
- }
805
- };
806
-
807
- template <
808
- typename T,
809
- int kTileRows_,
810
- int kTileCols_,
811
- class MMAFrag_ = BaseMMAFrag<T, 8, 8>>
812
- struct MMATile {
813
- using MMAFrag_t = MMAFrag_;
814
- using elem_type = T;
815
- STEEL_CONST int kFragRows = MMAFrag_t::kFragRows;
816
- STEEL_CONST int kFragCols = MMAFrag_t::kFragCols;
817
- STEEL_CONST int kElemsPerFrag = MMAFrag_t::kElemsPerFrag;
818
-
819
- STEEL_CONST int kTileRows = kTileRows_;
820
- STEEL_CONST int kTileCols = kTileCols_;
821
-
822
- STEEL_CONST int kRows = kTileRows * kFragRows;
823
- STEEL_CONST int kCols = kTileCols * kFragCols;
824
-
825
- STEEL_CONST int kNumFrags = kTileRows * kTileCols;
826
- STEEL_CONST int kElemsPerTile = kNumFrags * kElemsPerFrag;
827
-
828
- typedef typename MMAFrag_t::mat_type mat_type;
829
- typedef typename MMAFrag_t::frag_type frag_type;
830
-
831
- frag_type val_frags[kNumFrags] = {frag_type(0)};
832
-
833
- METAL_FUNC MMATile() thread {}
834
-
835
- METAL_FUNC constexpr void clear() {
836
- STEEL_PRAGMA_UNROLL
837
- for (short i = 0; i < kNumFrags; ++i) {
838
- val_frags[i] = frag_type(0);
839
- }
840
- }
841
-
842
- METAL_FUNC constexpr thread frag_type& frag_at(const short i, const short j) {
843
- return val_frags[i * kTileCols + j];
844
- }
845
-
846
- METAL_FUNC constexpr const thread frag_type& frag_at(
847
- const short i,
848
- const short j) const {
849
- return val_frags[i * kTileCols + j];
850
- }
851
-
852
- METAL_FUNC mat_type mat_at(const short i, const short j) {
853
- mat_type val_mat;
854
- STEEL_PRAGMA_UNROLL
855
- for (short ii = 0; ii < kElemsPerFrag; ++ii) {
856
- val_mat.thread_elements()[ii] = frag_at(i, j)[ii];
857
- }
858
- return val_mat;
859
- }
860
-
861
- METAL_FUNC thread elem_type* elems() {
862
- return reinterpret_cast<thread elem_type*>(val_frags);
863
- }
864
-
865
- METAL_FUNC const thread elem_type* elems() const {
866
- return reinterpret_cast<const thread elem_type*>(val_frags);
867
- }
868
-
869
- template <typename U, int w_x, int w_y, int str_x, int str_y>
870
- METAL_FUNC void load(const threadgroup U* src) {
871
- STEEL_PRAGMA_UNROLL
872
- for (short i = 0; i < kTileRows; ++i) {
873
- STEEL_PRAGMA_UNROLL
874
- for (short j = 0; j < kTileCols; ++j) {
875
- MMAFrag_t::load(
876
- frag_at(i, j),
877
- &(
878
- src[(i * kFragRows) * w_x * str_x +
879
- (j * kFragCols) * w_y * str_y]),
880
- Int<str_x>{},
881
- Int<str_y>{});
882
- }
883
- }
884
- }
885
-
886
- template <typename U, int w_x, int w_y, int str_x, int str_y>
887
- METAL_FUNC void store(threadgroup U* dst) const {
888
- STEEL_PRAGMA_UNROLL
889
- for (short i = 0; i < kTileRows; ++i) {
890
- STEEL_PRAGMA_UNROLL
891
- for (short j = 0; j < kTileCols; ++j) {
892
- MMAFrag_t::store(
893
- frag_at(i, j),
894
- &(
895
- dst[(i * kFragRows) * w_x * str_x +
896
- (j * kFragCols) * w_y * str_y]),
897
- Int<str_x>{},
898
- Int<str_y>{});
899
- }
900
- }
901
- }
902
-
903
- template <typename U, int w_x, int w_y>
904
- METAL_FUNC void load(const device U* src, const int ld) {
905
- STEEL_PRAGMA_UNROLL
906
- for (short i = 0; i < kTileRows; ++i) {
907
- STEEL_PRAGMA_UNROLL
908
- for (short j = 0; j < kTileCols; ++j) {
909
- MMAFrag_t::load(
910
- frag_at(i, j),
911
- &(src[(i * kFragRows) * w_x * ld + (j * kFragCols) * w_y]),
912
- ld,
913
- Int<1>{});
914
- }
915
- }
916
- }
917
-
918
- template <typename U, int w_x, int w_y>
919
- METAL_FUNC void store(device U* dst, const int ld) const {
920
- STEEL_PRAGMA_UNROLL
921
- for (short i = 0; i < kTileRows; ++i) {
922
- STEEL_PRAGMA_UNROLL
923
- for (short j = 0; j < kTileCols; ++j) {
924
- MMAFrag_t::store(
925
- frag_at(i, j),
926
- &(dst[(i * kFragRows) * w_x * ld + (j * kFragCols) * w_y]),
927
- ld,
928
- Int<1>{});
929
- }
930
- }
931
- }
932
-
933
- template <typename U, int w_x, int w_y>
934
- METAL_FUNC void
935
- load_safe(const device U* src, const int ld, const short2 src_tile_dims) {
936
- STEEL_PRAGMA_UNROLL
937
- for (int i = 0; i < kTileRows; ++i) {
938
- STEEL_PRAGMA_UNROLL
939
- for (int j = 0; j < kTileCols; ++j) {
940
- MMAFrag_t::load_safe(
941
- frag_at(i, j),
942
- src,
943
- ld,
944
- Int<1>{},
945
- src_tile_dims.y,
946
- src_tile_dims.x,
947
- (i * kFragRows) * w_x,
948
- (j * kFragCols) * w_y);
949
- }
950
- }
951
- }
952
-
953
- template <typename U, int w_x, int w_y>
954
- METAL_FUNC void
955
- store_safe(device U* dst, const int ld, const short2 dst_tile_dims) const {
956
- STEEL_PRAGMA_UNROLL
957
- for (int i = 0; i < kTileRows; ++i) {
958
- STEEL_PRAGMA_UNROLL
959
- for (int j = 0; j < kTileCols; ++j) {
960
- MMAFrag_t::store_safe(
961
- frag_at(i, j),
962
- dst,
963
- ld,
964
- Int<1>{},
965
- dst_tile_dims.y,
966
- dst_tile_dims.x,
967
- (i * kFragRows) * w_x,
968
- (j * kFragCols) * w_y);
969
- }
970
- }
971
- }
972
-
973
- template <typename U, int w_x, int w_y>
974
- METAL_FUNC void store_slice(
975
- device U* dst,
976
- const int ld,
977
- const short2 start,
978
- const short2 stop) const {
979
- STEEL_PRAGMA_UNROLL
980
- for (int i = 0; i < kTileRows; ++i) {
981
- STEEL_PRAGMA_UNROLL
982
- for (int j = 0; j < kTileCols; ++j) {
983
- MMAFrag_t::store_slice(
984
- frag_at(i, j),
985
- dst,
986
- ld,
987
- Int<1>{},
988
- start.y,
989
- stop.y,
990
- start.x,
991
- stop.x,
992
- (i * kFragRows) * w_x,
993
- (j * kFragCols) * w_y);
994
- }
995
- }
996
- }
997
- };
998
-
999
- template <typename T, typename U, int M, int N, int K>
1000
- METAL_FUNC void tile_matmad(
1001
- thread MMATile<T, M, N>& D,
1002
- thread MMATile<U, M, K>& A,
1003
- thread MMATile<U, K, N>& B,
1004
- thread MMATile<T, M, N>& C) {
1005
- STEEL_PRAGMA_UNROLL
1006
- for (short m = 0; m < M; ++m) {
1007
- STEEL_PRAGMA_UNROLL
1008
- for (short n = 0; n < N; ++n) {
1009
- short n_serp = (m % 2) ? (N - 1 - n) : n;
1010
- STEEL_PRAGMA_UNROLL
1011
- for (short k = 0; k < K; ++k) {
1012
- MMATile<T, M, N>::MMAFrag_t::mma(
1013
- D.frag_at(m, n_serp),
1014
- A.frag_at(m, k),
1015
- B.frag_at(k, n_serp),
1016
- C.frag_at(m, n_serp));
1017
- }
1018
- }
1019
- }
1020
- }
1021
- // ===== mma.h (BlockMMA non-complex) =====
1022
- template <
1023
- typename T,
1024
- typename U,
1025
- int BM,
1026
- int BN,
1027
- int BK,
1028
- int WM,
1029
- int WN,
1030
- bool transpose_a,
1031
- bool transpose_b,
1032
- short lda_tgp,
1033
- short ldb_tgp,
1034
- typename AccumType = float,
1035
- typename Epilogue = TransformNone<U, AccumType>>
1036
- struct BlockMMA {
1037
- // MMAFrag size
1038
- STEEL_CONST short kFragSize = 8;
1039
- using MMAFrag_acc_t = BaseMMAFrag<AccumType, kFragSize, kFragSize>;
1040
-
1041
- // Warp tile simdgroup matrix strides along M
1042
- STEEL_CONST short TM_stride = kFragSize * WM;
1043
- // Warp tile simdgroup matrix strides along M
1044
- STEEL_CONST short TN_stride = kFragSize * WN;
1045
-
1046
- // Warp tile size along M
1047
- STEEL_CONST short TM = BM / (kFragSize * WM);
1048
- // Warp tile size along N
1049
- STEEL_CONST short TN = BN / (kFragSize * WN);
1050
-
1051
- // Threadgroup A strides
1052
- STEEL_CONST short A_str_m = transpose_a ? 1 : lda_tgp; // M
1053
- STEEL_CONST short A_str_k = transpose_a ? lda_tgp : 1; // K
1054
-
1055
- // Threadgroup B strides
1056
- STEEL_CONST short B_str_k = transpose_b ? 1 : ldb_tgp; // K
1057
- STEEL_CONST short B_str_n = transpose_b ? ldb_tgp : 1; // N
1058
-
1059
- // Threadgroup strides along K
1060
- STEEL_CONST short tile_stride_a = kFragSize * A_str_k;
1061
- STEEL_CONST short tile_stride_b = kFragSize * B_str_k;
1062
-
1063
- // Simdgroup matrices
1064
- MMATile<AccumType, TM, 1, MMAFrag_acc_t> Atile;
1065
- MMATile<AccumType, 1, TN, MMAFrag_acc_t> Btile;
1066
- MMATile<AccumType, TM, TN, MMAFrag_acc_t> Ctile;
1067
-
1068
- // Offsets within threadgroup
1069
- short sm;
1070
- short sn;
1071
-
1072
- short As_offset;
1073
- short Bs_offset;
1074
-
1075
- /* Constructor */
1076
- METAL_FUNC BlockMMA(
1077
- ushort simd_group_id [[simdgroup_index_in_threadgroup]],
1078
- ushort simd_lane_id [[thread_index_in_simdgroup]]) {
1079
- // Determine thread position in simdgroup matrix
1080
- short tm = kFragSize * (simd_group_id / WN);
1081
- short tn = kFragSize * (simd_group_id % WN);
1082
-
1083
- short2 simd_coord = MMAFrag_acc_t::get_coord(simd_lane_id);
1084
- sm = simd_coord.y;
1085
- sn = simd_coord.x;
1086
-
1087
- // Determine thread and simdgroup offset
1088
- As_offset = (tm + sm) * A_str_m + (sn)*A_str_k; // M, K
1089
- Bs_offset = (sm)*B_str_k + (tn + sn) * B_str_n; // K, N
1090
-
1091
- sm += tm;
1092
- sn += tn;
1093
- }
1094
-
1095
- /* (BM, BK) X (BK, BN) multiply accumulate function */
1096
- METAL_FUNC void mma(const threadgroup T* As, const threadgroup T* Bs) {
1097
- // Adjust for simdgroup and thread location
1098
- As += As_offset;
1099
- Bs += Bs_offset;
1100
-
1101
- // Iterate over BK in blocks of kFragSize
1102
- STEEL_PRAGMA_UNROLL
1103
- for (short kk = 0; kk < BK; kk += kFragSize) {
1104
- simdgroup_barrier(mem_flags::mem_none);
1105
-
1106
- Atile.template load<T, WM, 1, A_str_m, A_str_k>(As);
1107
-
1108
- simdgroup_barrier(mem_flags::mem_none);
1109
-
1110
- Btile.template load<T, 1, WN, B_str_k, B_str_n>(Bs);
1111
-
1112
- simdgroup_barrier(mem_flags::mem_none);
1113
-
1114
- tile_matmad(Ctile, Atile, Btile, Ctile);
1115
-
1116
- // Progress to next simdgroup tile
1117
- As += tile_stride_a;
1118
- Bs += tile_stride_b;
1119
- }
1120
- }
1121
-
1122
- /* Store results from simdgroup_matrix results into device memory */
1123
- METAL_FUNC void store_result(device U* D, const int ldd) {
1124
- // Apply epilogue
1125
- STEEL_PRAGMA_UNROLL
1126
- for (short i = 0; i < decltype(Ctile)::kElemsPerTile; i++) {
1127
- Ctile.elems()[i] = Epilogue::apply(Ctile.elems()[i]);
1128
- }
1129
-
1130
- // Adjust for simdgroup and thread location
1131
- D += sm * ldd + sn;
1132
-
1133
- Ctile.template store<U, WM, WN>(D, ldd);
1134
- }
1135
-
1136
- METAL_FUNC void
1137
- store_result_slice(device U* D, const int ldd, short2 start, short2 stop) {
1138
- // Apply epilogue
1139
- STEEL_PRAGMA_UNROLL
1140
- for (short i = 0; i < decltype(Ctile)::kElemsPerTile; i++) {
1141
- Ctile.elems()[i] = Epilogue::apply(Ctile.elems()[i]);
1142
- }
1143
-
1144
- D += sm * ldd + sn;
1145
- start -= short2(sn, sm);
1146
- stop -= short2(sn, sm);
1147
-
1148
- // TODO: Check the start as well
1149
- if (stop.y <= 0 || stop.x <= 0) {
1150
- return;
1151
- }
1152
-
1153
- Ctile.template store_slice<U, WM, WN>(D, ldd, start, stop);
1154
- }
1155
-
1156
- METAL_FUNC void
1157
- store_result_safe(device U* D, const int ldd, short2 dst_tile_dims) {
1158
- // Apply epilogue
1159
- STEEL_PRAGMA_UNROLL
1160
- for (short i = 0; i < decltype(Ctile)::kElemsPerTile; i++) {
1161
- Ctile.elems()[i] = Epilogue::apply(Ctile.elems()[i]);
1162
- }
1163
-
1164
- // Adjust for simdgroup and thread location
1165
- D += sm * ldd + sn;
1166
- dst_tile_dims -= short2(sn, sm);
1167
-
1168
- if (dst_tile_dims.x <= 0 || dst_tile_dims.y <= 0)
1169
- return;
1170
-
1171
- Ctile.template store_safe<U, WM, WN>(D, ldd, dst_tile_dims);
1172
- }
1173
-
1174
- /* Apply epilogue */
1175
- template <typename UnaryEpilogue>
1176
- METAL_FUNC void apply_epilogue(thread const UnaryEpilogue& epilogue_op) {
1177
- // Loop over all simdgroup tiles
1178
- STEEL_PRAGMA_UNROLL
1179
- for (short i = 0; i < decltype(Ctile)::kElemsPerTile; i++) {
1180
- Ctile.elems()[i] = epilogue_op.apply(Ctile.elems()[i]);
1181
- }
1182
- }
1183
-
1184
- /* Apply epilogue */
1185
- template <typename BinaryEpilogue>
1186
- METAL_FUNC void apply_epilogue(
1187
- const device U* C,
1188
- const int ldc,
1189
- const int fdc,
1190
- thread const BinaryEpilogue& epilogue_op) {
1191
- // Adjust for simdgroup and thread location
1192
- C += (sm)*ldc + (sn)*fdc;
1193
-
1194
- // Loop over all simdgroup tiles
1195
- STEEL_PRAGMA_UNROLL
1196
- for (short i = 0; i < TM; i++) {
1197
- STEEL_PRAGMA_UNROLL
1198
- for (short j = 0; j < TN; j++) {
1199
- // Get accumulated result and associated offset in C
1200
- thread auto& accum = Ctile.frag_at(i, j);
1201
- int offset_c = (i * TM_stride) * ldc + (j * TN_stride) * fdc;
1202
-
1203
- // Apply epilogue
1204
- STEEL_PRAGMA_UNROLL
1205
- for (short k = 0; k < decltype(Ctile)::kElemsPerFrag; k++) {
1206
- accum[k] = epilogue_op.apply(accum[k], C[offset_c + k * fdc]);
1207
- }
1208
- }
1209
- }
1210
- }
1211
-
1212
- /* Apply epilogue */
1213
- template <typename BinaryEpilogue>
1214
- METAL_FUNC void apply_epilogue_safe(
1215
- const device U* C,
1216
- const int ldc,
1217
- const int fdc,
1218
- short2 dst_tile_dims,
1219
- thread const BinaryEpilogue& epilogue_op) {
1220
- // Adjust for simdgroup and thread location
1221
- C += (sm)*ldc + (sn)*fdc;
1222
- dst_tile_dims -= short2(sn, sm);
1223
-
1224
- if (dst_tile_dims.x <= 0 || dst_tile_dims.y <= 0)
1225
- return;
1226
-
1227
- // Loop over all simdgroup tiles
1228
- STEEL_PRAGMA_UNROLL
1229
- for (short i = 0; i < TM; i++) {
1230
- STEEL_PRAGMA_UNROLL
1231
- for (short j = 0; j < TN; j++) {
1232
- // Get accumulated result and associated offset in C
1233
- thread auto& accum = Ctile.frag_at(i, j);
1234
- int offset_c = (i * TM_stride) * ldc + (j * TN_stride) * fdc;
1235
-
1236
- constexpr short kelems = decltype(Ctile)::kElemsPerFrag;
1237
-
1238
- // Read C
1239
- U c_elems[kelems] = {0};
1240
-
1241
- STEEL_PRAGMA_UNROLL
1242
- for (short k = 0; k < kelems; k++) {
1243
- if ((j * TN_stride + k) < dst_tile_dims.x) {
1244
- c_elems[k] = C[offset_c + k * fdc];
1245
- }
1246
- }
1247
-
1248
- // Apply epilogue
1249
- STEEL_PRAGMA_UNROLL
1250
- for (short k = 0; k < kelems; k++) {
1251
- accum[k] = epilogue_op.apply(accum[k], c_elems[k]);
1252
- }
1253
- }
1254
- }
1255
- }
1256
-
1257
- /* Store results from simdgroup_matrix results into device memory */
1258
- METAL_FUNC void store_result(
1259
- device U* D,
1260
- const int ldd,
1261
- const device U* C,
1262
- const int ldc,
1263
- const int fdc,
1264
- thread const Epilogue& epilogue_op) const {
1265
- // Adjust for simdgroup and thread location
1266
- C += (sm)*ldc + (sn)*fdc;
1267
- D += (sm)*ldd + sn;
1268
-
1269
- constexpr short kelems = decltype(Ctile)::kElemsPerFrag;
1270
-
1271
- // Loop over all simdgroup tiles
1272
- STEEL_PRAGMA_UNROLL
1273
- for (short i = 0; i < TM; i++) {
1274
- STEEL_PRAGMA_UNROLL
1275
- for (short j = 0; j < TN; j++) {
1276
- // Get accumulated result and associated offset in C
1277
- thread const auto& accum = Ctile.frag_at(i, j);
1278
- int offset_c = (i * TM_stride) * ldc + (j * TN_stride) * fdc;
1279
- int offset_d = (i * TM_stride) * ldd + (j * TN_stride);
1280
-
1281
- // Apply epilogue
1282
- STEEL_PRAGMA_UNROLL
1283
- for (short k = 0; k < kelems; k++) {
1284
- D[offset_d + k] = epilogue_op.apply(accum[k], C[offset_c + k * fdc]);
1285
- }
1286
- }
1287
- }
1288
- }
1289
-
1290
- METAL_FUNC void store_result_safe(
1291
- device U* D,
1292
- const int ldd,
1293
- const device U* C,
1294
- const int ldc,
1295
- const int fdc,
1296
- short2 dst_tile_dims,
1297
- thread const Epilogue& epilogue_op) const {
1298
- // Adjust for simdgroup and thread location
1299
- C += (sm)*ldc + (sn)*fdc;
1300
- D += (sm)*ldd + sn;
1301
- dst_tile_dims -= short2(sn, sm);
1302
-
1303
- if (dst_tile_dims.x <= 0 || dst_tile_dims.y <= 0)
1304
- return;
1305
-
1306
- constexpr short kelems = decltype(Ctile)::kElemsPerFrag;
1307
-
1308
- STEEL_PRAGMA_UNROLL
1309
- for (int i = 0; i < TM; i++) {
1310
- if (i * TM_stride < dst_tile_dims.y) {
1311
- STEEL_PRAGMA_UNROLL
1312
- for (int j = 0; j < TN; j++) {
1313
- // Get accumulated result and associated offset in C
1314
- thread const auto& accum = Ctile.frag_at(i, j);
1315
- int offset_c = (i * TM_stride) * ldc + (j * TN_stride) * fdc;
1316
- int offset_d = (i * TM_stride) * ldd + (j * TN_stride);
1317
-
1318
- // Apply epilogue
1319
- STEEL_PRAGMA_UNROLL
1320
- for (short k = 0; k < kelems; k++) {
1321
- if ((j * TN_stride + k) < dst_tile_dims.x) {
1322
- D[offset_d + k] =
1323
- epilogue_op.apply(accum[k], C[offset_c + k * fdc]);
1324
- }
1325
- }
1326
- }
1327
- }
1328
- }
1329
- }
1330
- };
1331
- } // namespace steel
1332
- } // namespace mlx
1333
- // ===== qmm_t_impl =====
1334
- template <
1335
- typename T,
1336
- const int group_size,
1337
- const int bits,
1338
- const bool aligned_N,
1339
- const int BM = 32,
1340
- const int BK = 32,
1341
- const int BN = 32>
1342
- METAL_FUNC void qmm_t_impl(
1343
- const device uint32_t* w,
1344
- const device T* scales,
1345
- const device T* biases,
1346
- const device T* x,
1347
- device T* y,
1348
- threadgroup T* Xs,
1349
- threadgroup T* Ws,
1350
- const constant int& K,
1351
- const constant int& N,
1352
- const constant int& M,
1353
- const constant int& K_eff,
1354
- uint3 tid [[threadgroup_position_in_grid]],
1355
- uint lid [[thread_index_in_threadgroup]],
1356
- uint simd_gid [[simdgroup_index_in_threadgroup]],
1357
- uint simd_lid [[thread_index_in_simdgroup]]) {
1358
- static_assert(BK >= SIMD_SIZE, "BK should be larger than SIMD_SIZE");
1359
- static_assert(BK % SIMD_SIZE == 0, "BK should be divisible by SIMD_SIZE");
1360
-
1361
- (void)lid;
1362
-
1363
- constexpr int WM = 2;
1364
- constexpr int WN = 2;
1365
- constexpr int pack_factor = get_pack_factor<bits, 8>();
1366
- constexpr int bytes_per_pack = get_bytes_per_pack<bits>();
1367
-
1368
- constexpr int BK_padded = (BK + 16 / sizeof(T));
1369
-
1370
- // Instantiate the appropriate BlockMMA and Loader
1371
- using mma_t = mlx::steel::
1372
- BlockMMA<T, T, BM, BN, BK, WM, WN, false, true, BK_padded, BK_padded>;
1373
- using loader_x_t =
1374
- mlx::steel::BlockLoader<T, BM, BK, BK_padded, 1, WM * WN * SIMD_SIZE>;
1375
- using loader_w_t = QuantizedBlockLoader<
1376
- T,
1377
- BN,
1378
- BK,
1379
- BK_padded,
1380
- 1,
1381
- WM * WN * SIMD_SIZE,
1382
- group_size,
1383
- bits>;
1384
-
1385
- // Set the block
1386
- const int K_w = K * bytes_per_pack / pack_factor;
1387
- const int K_g = K / group_size;
1388
- const int y_row = tid.y * BM;
1389
- const int y_col = tid.x * BN;
1390
-
1391
- auto wl = (const device uint8_t*)w;
1392
-
1393
- x += y_row * static_cast<int64_t>(K);
1394
- wl += y_col * K_w;
1395
- scales += y_col * K_g;
1396
- biases += y_col * K_g;
1397
- y += y_row * static_cast<int64_t>(N) + y_col;
1398
-
1399
- // Make the x loader and mma operation
1400
- const short num_els = min(BM, M - y_row);
1401
- const short num_outs = min(BN, N - y_col);
1402
- loader_x_t loader_x(x, K, Xs, simd_gid, simd_lid);
1403
- loader_w_t loader_w(wl, scales, biases, K, Ws, simd_gid, simd_lid);
1404
- mma_t mma_op(simd_gid, simd_lid);
1405
-
1406
- if (num_els < BM) {
1407
- if (!aligned_N && num_outs < BN) {
1408
- for (int k = 0; k < K_eff; k += BK) {
1409
- threadgroup_barrier(mem_flags::mem_threadgroup);
1410
- loader_x.load_safe(short2(BK, num_els));
1411
- loader_w.load_safe(short2(BK, num_outs));
1412
- threadgroup_barrier(mem_flags::mem_threadgroup);
1413
- mma_op.mma(Xs, Ws);
1414
- loader_x.next();
1415
- loader_w.next();
1416
- }
1417
- } else {
1418
- for (int k = 0; k < K_eff; k += BK) {
1419
- threadgroup_barrier(mem_flags::mem_threadgroup);
1420
- loader_x.load_safe(short2(BK, num_els));
1421
- loader_w.load_unsafe();
1422
- threadgroup_barrier(mem_flags::mem_threadgroup);
1423
- mma_op.mma(Xs, Ws);
1424
- loader_x.next();
1425
- loader_w.next();
1426
- }
1427
- }
1428
- } else {
1429
- if (!aligned_N && num_outs < BN) {
1430
- for (int k = 0; k < K_eff; k += BK) {
1431
- threadgroup_barrier(mem_flags::mem_threadgroup);
1432
- loader_x.load_unsafe();
1433
- loader_w.load_safe(short2(BK, num_outs));
1434
- threadgroup_barrier(mem_flags::mem_threadgroup);
1435
- mma_op.mma(Xs, Ws);
1436
- loader_x.next();
1437
- loader_w.next();
1438
- }
1439
- } else {
1440
- for (int k = 0; k < K_eff; k += BK) {
1441
- threadgroup_barrier(mem_flags::mem_threadgroup);
1442
- loader_x.load_unsafe();
1443
- loader_w.load_unsafe();
1444
- threadgroup_barrier(mem_flags::mem_threadgroup);
1445
-
1446
- mma_op.mma(Xs, Ws);
1447
- loader_x.next();
1448
- loader_w.next();
1449
- }
1450
- }
1451
- }
1452
-
1453
- // Store results to device memory
1454
- threadgroup_barrier(mem_flags::mem_threadgroup);
1455
- if (num_els < BM || num_outs < BN) {
1456
- mma_op.store_result_safe(y, N, short2(num_outs, num_els));
1457
- } else {
1458
- mma_op.store_result(y, N);
1459
- }
1460
- }
1461
- `;