Published
laya-mlx runs the Laya checkpoints on Apple Silicon
mizorewww/laya-mlx is an Apache 2.0 MLX port of Convai's Laya weights. On an M3 Max the README's one-question median is 13.42 ms for the 421M checkpoint and 7.39 ms for the 322M multilingual checkpoint. Selected answers matched upstream on 63 of 63 validation questions. The port does not publish a new accuracy table against Jev.
@0xNeoArch posted mizorewww/laya-mlx on September 22. The package is laya-mlx. The README calls it an independent MLX port of Convai Innovations’ Laya checkpoints, not an official Convai release, under Apache 2.0. Prompt formatting and the language router are adapted from NandhaKishorM/laya at commit 573e5b6. It wants Apple Silicon, Python 3.11 or newer, and macOS 14 or newer. Weights download on first load. Later calls stay on the machine.
The tweet says 7 to 14 ms, and a Snake demo at 60 decisions a second. The README’s table is more specific, and it is a different clock from the game. On an M3 Max with 40 GPU cores and 128 GiB, macOS 27.2, Python 3.12.13, MLX 0.32.2, FP16, one short question, model load left out:
| Checkpoint | P50 | P95 | 50-question throughput | Peak allocation |
|---|---|---|---|---|
| Laya 421M | 13.42 ms | 13.92 ms | 146.8 q/s | 943.6 MiB |
| Multilingual 322M | 7.39 ms | 7.79 ms | 395.0 q/s | 687.6 MiB |
The throughput row uses batch_size=64. The API default is 16. The three checkpoints are the ones from the earlier Laya story: English ModernBERT-large at 421M and context 512, multilingual mmBERT-base at 322M and context 1,024, and a typed-decisions ModernBERT-large at 421M and context 1,024. Preconverted FP16 weights are under the Hugging Face account aac6fef.
Selected answers matched upstream Laya on 63 of 63 validation questions, in FP32 and in FP16, which is 378 of 378 comparisons. Each configuration also passed 100 repeated calls with no measured growth in active memory. The README says that is agreement on those fixtures, not a claim about every question, and it does not add a table against hosted Jev. The JevBench row of 70.1 for Laya sits on the earlier story. This port does not replace it.
Snake is a separate loop. laya-snake --optimize --max-speed is reported at 75.40 moves per second across 2,400 moves, with zero deaths and two corrections from a visible safety layer, about 6.5 percent faster than the eager path in the same run. The README says the 13.42 ms number is the one-question benchmark, not the frame time of the three-question Snake loop. The tweet’s 60 decisions a second is not that 75.40 line.
One load-time change is in the calibration. Upstream v0.3.5 temperatures are clamped to the range 0.5 to 5.0. The shipped choice:11+ bucket is 0.1006, and the README says using it raw would sharpen logits about tenfold and turn a coin flip into a near certainty. The raw values stay readable as temperature_raw. A warning names every clamped bucket at load. We did not install the package or run the Snake demo.
This site's reading
Editorial notes evaluating claims against primary sources, contextualizing findings alongside related implementations, and defining technical terms.
Verify
Post is @0xNeoArch, September 22, 2026, 05:38 UTC. It says typed decisions on Apple Silicon in 7 to 14 ms, no tokens generated, no PyTorch, no cloud API, a Snake demo at 60 decisions per second, pip install laya-mlx, and links mizorewww/laya-mlx. The README calls the project an independent MLX port, not an official Convai Innovations release. Apache 2.0. Prompt construction and routing are adapted from NandhaKishorM/laya at commit 573e5b62696ba441230cd6be71d593331b5d23af. Apple Silicon, Python 3.11 or newer, macOS 14 or newer. Measured environment in the README: macOS 27.2, Python 3.12.13, MLX 0.32.2, M3 Max with 40 GPU cores and 128 GiB. FP16, end to end, model load excluded. One short question, P50 / P95: Laya 421M 13.42 ms / 13.92 ms, multilingual 322M 7.39 ms / 7.79 ms. Fifty-question throughput at batch_size 64: 146.8 questions per second and 395.0. The API default batch is 16. Peak MLX allocation on one short question: 943.6 MiB and 687.6 MiB. Port fidelity: all three checkpoints matched the upstream selected answer on 63 of 63 validation questions in both FP32 and FP16, 378 of 378 comparisons. Each configuration also passed 100 repeated finite deterministic calls with zero measured active-memory growth. The README says this is fidelity on those fixtures, not accuracy on every question. Snake with --optimize --max-speed: 75.40 moves per second across 2,400 moves, zero deaths, two visible safety interventions, about 6.5 percent faster than the same-run eager control. The 13.42 ms figure is the one-question API benchmark, not the frame time of the three-question Snake loop. The tweet's 60 decisions per second is not the 75.40 moves per second line. Fitted calibration temperatures are clamped to the range 0.5 to 5.0. The shipped choice:11+ bucket is 0.1006, which the README says would sharpen logits about tenfold. Checkpoints: convaiinnovations/laya (421M, context 512), laya-multilingual (322M, context 1,024), laya-typed-decisions (421M, context 1,024). Preconverted weights: aac6fef/laya-mlx and the two sibling repos. We did not install the package. Upstream Laya's JevBench row of 70.1 is a different measurement, on the earlier story, and this README does not add one.
Compare
The earlier Laya story quotes the author's T4 times: 39.5 ms for one English question and 32.8 ms multilingual. This port's M3 Max medians are 13.42 ms and 7.39 ms on a different machine, for the same weight families. llamacpp-jev's fresh-image median on an idle M4 Pro is 526 ms, on Qwen, with a raw label softmax, and it accepts images. laya-mlx reports selected-answer agreement with upstream Laya on 63 questions. It does not report agreement with hosted Jev.
Terms
- port fidelity
- In the laya-mlx README, whether the MLX port selects the same answer as upstream Laya on a fixed set of 63 validation questions. The README separates that check from accuracy against a human label or against Jev.