@mizorewww: 推出比Jev快50倍的版本,在您的设备上运行:laya-mlx!内存占用最高仅1G……
摘要
介绍laya-mlx,这是一个使用MLX优化的开源分类系统,适用于Apple Silicon,提供比Jev快50倍的性能,最大内存使用仅1G,并通过实时贪吃蛇游戏演示进行展示。
查看缓存全文
缓存时间: 2026/09/20 07:13
介绍一个比Jev快50倍的版本,在你的设备上运行:laya-mlx!在你的设备上最多仅占用1G内存。Laya是一个类似Jev的开源分类系统,基于文本输出概率。我将其移植到MLX并进行了性能优化!在视频中,这个模型在我的本地M3 Max上玩贪吃蛇。该模型能以每秒60次的决策速度玩贪吃蛇!https://github.com/mizorewww/laya-mlx…
mizorewww/laya-mlx
来源:https://github.com/mizorewww/laya-mlx
Laya-MLX
Laya MLX 玩贪吃蛇——真实决策,原始速度
开放权重的类型化决策,原生运行在Apple Silicon上。
13.4 ms 是短英文类型化决策的中位端到端延迟。7.4 ms 使用多语言检查点。0个输出token。 本地MLX推理,无PyTorch、Transformers运行时或云API。
中文版 (https://github.com/mizorewww/laya-mlx/blob/main/README.zh-CN.md) · 基准测试 (https://github.com/mizorewww/laya-mlx/blob/main/BENCHMARKS.md) · 贪吃蛇演示 (https://github.com/mizorewww/laya-mlx/blob/main/docs/SNAKE_DEMO.md) · Hugging Face权重 (https://huggingface.co/aac6fef/laya-mlx)
此GIF是真实本地贪吃蛇运行的原始速度渲染。每一步都调用Laya;可见的循环安全层可以修正不安全的提议。上述延迟数据是单独的单问题API基准测试,而非三问题贪吃蛇循环的帧时间。观看30秒MP4 (https://github.com/mizorewww/laya-mlx/blob/main/docs/assets/snake-demo.mp4) · 贪吃蛇速度和稳定性 (https://github.com/mizorewww/laya-mlx/blob/main/docs/SNAKE_BENCHMARKS.md)。
快速开始
pip install laya-mlx
import laya_mlx as laya
agent = laya.load("aac6fef/laya-mlx")
result = agent.predict(
"我被重复扣款了,请退还多付的款项。",
{
"department": {
"type": "choice",
"instructions": "应由谁处理?",
"criteria": ["账单", "技术", "销售"],
}
},
)
print(result["answers"]["department"])
需要Apple Silicon, Python 3.11+, macOS 14+。首次加载会下载检查点;后续推理完全本地进行。测量环境为 macOS 27.2, Python 3.12.13 和 MLX 0.32.2。该MLX版本提供了 macOS 14、15 和 26 的wheel;本地安装器选择了26版本的wheel。未在本机测试旧版支持的macOS版本。
运行终端演示:
pip install 'laya-mlx[demo]'
hf download aac6fef/laya-multilingual-mlx
laya-snake
离线演示前需先下载一次。请使用至少 104 × 35 单元格的终端。空格键暂停,↑/↓键改变速度,R键重置,Q键退出。laya-snake --max-speed 会为每一步进行新的决策,没有节拍控制。录制、控制和精确指标含义请参阅 (https://github.com/mizorewww/laya-mlx/blob/main/docs/SNAKE_DEMO.md)。
laya-snake --optimize --max-speed 启用测试过的编译和前缀复用路径:在2,400步中达到 75.40 步/秒,零死亡,在配对的M3 Max测试中有2次可见的安全干预。这比其同次运行的急切模式控制快约6.5%。游戏玩法、性能和正确性证据 (https://github.com/mizorewww/laya-mlx/blob/main/docs/SNAKE_OPTIMIZATION.md)。
在 M3 Max 上的性能
| FP16, 端到端 | Laya 421M | 多语言 322M |
|---|---|---|
| 单个短问题,P50 | 13.42 ms | 7.39 ms |
| 单个短问题,P95 | 13.92 ms | 7.79 ms |
| 50个问题吞吐量 | 146.8 q/s | 395.0 q/s |
| 峰值 MLX 分配,单个短问题 | 943.6 MiB | 687.6 MiB |
M3 Max, 40个GPU核心, 128 GiB内存。计时包括提示准备、分词、张量、同步推理、校准和结果格式化;不包括模型加载。50个问题测量使用 batch_size=64;API默认值为16。不同的长度、问题数量和运行时条件会改变延迟。完整方法和每个时间样本 (https://github.com/mizorewww/laya-mlx/blob/main/BENCHMARKS.md)。
移植保真度:所有三个检查点在FP32和FP16下,在63/63个验证问题上与上游选定的答案匹配——378/378次比较。每个配置还通过了100次重复的有限、确定性调用,测量的主动内存增长为零。这衡量了在这些固定数据上的保真度,而非在所有可能问题上的准确性。概率误差和验证 (https://github.com/mizorewww/laya-mlx/blob/main/BENCHMARKS.md#numerical-parity-and-stability)。
为何选择类型化决策?
软件通常需要一个选择、一个评分标准分数或一个概率。Laya通过双向前向传播回答这些受限问题,无需逐token解码或生成JSON。
状态 + 类型化问题 → 双向编码器 → 决策头 → 概率
choice:命名选项上的概率。score:有序评分标准级别及其预期分数上的概率。noul:命题的 P(true)。
问题行是独立批处理的。它们的双向编码器表示取决于状态和问题;本运行时未声称编码一次状态并在任意问题之间复用其隐藏状态。
编码器、决策Transformer、评分头和动作头都在MLX中运行。分词使用Hugging Face的Rust分词器。原始的预训练权重、问题格式、校准和输出模式被保留。这是一个独立的MLX移植,而非Convai Innovations的官方发布。
支持的检查点
| 模型 | 编码器 | 参数量 | 上下文限制 | 用途 |
|---|---|---|---|---|
convaiinnovations/laya | ModernBERT-large | 421M | 512 | 英文 |
convaiinnovations/laya-multilingual | mmBERT-base | 322M | 1,024 | 多语言输入 |
convaiinnovations/laya-typed-decisions | ModernBERT-large | 421M | 1,024 | 上游类型化决策工作流 |
上下文包括指令、选项和状态。所有三个模型都使用原始权重、提示格式、温度校准和输出模式。本仓库提供推理和转换;RLCD训练和微调仍留在上游项目中。这是一个独立的移植,而非Convai Innovations的官方发布。
预转换的FP16检查点已发布在Hugging Face:
- aac6fef/laya-mlx (https://huggingface.co/aac6fef/laya-mlx)
- aac6fef/laya-multilingual-mlx (https://huggingface.co/aac6fef/laya-multilingual-mlx)
- aac6fef/laya-typed-decisions-mlx (https://huggingface.co/aac6fef/laya-typed-decisions-mlx)
使用 laya.load("aac6fef/laya-mlx") 直接加载,或使用上述原始检查点ID。每个发布的检查点都包含其模型卡、验证结果、来源、许可证和文件校验和。所有36个发布文件都通过了严格的远程校验和验证;固定版本和权重哈希记录在 hub-publication.json (https://github.com/mizorewww/laya-mlx/blob/main/benchmarks/results/hub-publication.json) 中。
开发安装
gh repo clone mizorewww/laya-mlx
cd laya-mlx
uv sync --extra demo
uv run --extra demo laya-snake
或使用 pip install 'git+https://github.com/mizorewww/laya-mlx.git' 安装最新的GitHub修订版。模型权重单独下载,不包含在Git中。
Python API
import laya_mlx as laya
agent = laya.load("aac6fef/laya-mlx", dtype="float16")
result = agent.predict(
"我被重复扣款了,请在今天退还多付的款项。",
{
"department": {
"type": "choice",
"instructions": "哪个团队应处理此请求?",
"criteria": {
"账单": "发票、付款、退款",
"技术": "错误和故障",
"销售": "新购买",
},
},
"urgency": {
"type": "score",
"instructions": "此请求的紧急程度如何?",
"criteria": ["不紧急", "很快", "紧急"],
},
"refund": {
"type": "noul",
"instructions": "客户是否要求退款?",
},
},
)
print(result["answers"])
system_one 是 predict 的别名。状态可以是文本、JSON字典或对话列表。choice 接受字典或唯一标签列表;score 返回预期的零基评分标准级别;noul 返回 P(true)。结果保留了上游的四位小数舍入、action.act_probability 和token使用字段。
默认精度是FP16。使用 dtype="float32" 以获得更接近的数值一致性。即使选定的标签一致,概率在不同精度下也可能略有不同;参见 BENCHMARKS.md (https://github.com/mizorewww/laya-mlx/blob/main/BENCHMARKS.md) 中的测量误差。可以请求BF16,但它不属于已发布的验证矩阵。
batch_size=16 限制每次前向传播的问题数量;更大的请求会被分块处理。在内存允许时增大它。device="gpu" 或 device="cpu" 显式选择设备;否则使用MLX的默认设备。
对于重复工作负载,在加载Agent时选择启用 compile=True、pad_to_multiple=16 和 cache_prompts=True。前缀缓存限制为128个问题,并共享CPU状态分词,而每个问题仍获得自己的编码器计算。编译有首次使用成本和形状特化;填充可能使某些工作负载变慢。这三个选项默认禁用。测量的贪吃蛇消融和使用 (https://github.com/mizorewww/laya-mlx/blob/main/docs/SNAKE_OPTIMIZATION.md)。
agent = laya.load("./models/laya", dtype="float32", batch_size=32)
# 从上游捆绑仓库中选择一个检查点:
multi = laya.load("convaiinnovations/laya", subfolder="multilingual")
# 固定一个Hub修订版以确保可重现性:
agent = laya.load(
"convaiinnovations/laya",
revision="c5d78730f3493e4fe16d61507ef4b78eef7318cf",
)
加载时会验证每个参数名称和形状。不支持的编码器和非默认RoPE缩放会明确失败。ModernBERT的全局/局部注意力模式、包含的滑动窗口边界、不同的局部/全局RoPE基以及第一层归一化行为均被保留。
语言路由和预设
from laya_mlx import Router, triage_questions
router = Router(dtype="float16", max_loaded=2)
result = router.predict({"message": "发票被重复扣款,请退款。"}, triage_questions())
print(result["routing"]) # 多语言
# 显式选择专门的检查点:
result = router.predict(state, questions, task="typed_decisions")
路由器、语言启发式、邮件助手和应用程序预设均改编自上游。Router(preload=True) 使所有三个检查点常驻内存;支持 attach、preload、unload、显式 lang= 和显式 model=。类型化决策工作流检测保持为选择加入。移植保留了模型限制:英文检查点不能替代多语言检查点,且置信度不保证准确性。
命令行
uv run laya-mlx predict \
--model aac6fef/laya-mlx \
--state-file examples/state.json \
--questions examples/questions.json
uv run laya-mlx predict \
--model aac6fef/laya-multilingual-mlx \
--state '发票被重复扣款,请退款。' \
--questions examples/questions.json
导出MLX检查点
uv run laya-mlx convert \
--model convaiinnovations/laya \
--dtype float16 \
--output models/laya-mlx-fp16
uv run laya-mlx predict \
--model models/laya-mlx-fp16 \
--state-file examples/state.json \
--questions examples/questions.json
导出包含 model.safetensors、编码器和代理配置、分词器文件和 mlx_config.json。永远不会覆盖现有的输出目录。这是参数名称/数据类型转换,而非量化或重训练。源检查点已存储FP16权重;选择FP32会增加算术精度,而非源权重的精度。
测试和基准测试
uv sync --extra dev --extra reference --extra benchmark --extra demo
source .venv/bin/activate
gh repo clone NandhaKishorM/laya .upstream
git -C .upstream checkout 6a5819129eb220570792e417e49723d697efd76f
pytest -q
python -m benchmarks.download
python -m benchmarks.validate --repeats 100
python -m benchmarks.run --iterations 50 --warmup 5
python -m benchmarks.accuracy --per-class 64
python -m benchmarks.report
顺序运行GPU测量。单元测试使用小型随机模型,并包括与Transformers和固定的上游决策头的直接比较。真实的检查点验证测试分词、logits、校准概率、重复输出和主动内存增长。基准测试在每个新进程中运行每个后端/检查点,并将每个时间样本存储在 benchmarks/results (https://github.com/mizorewww/laya-mlx/blob/main/benchmarks/results) 中。完整报告 (https://github.com/mizorewww/laya-mlx/blob/main/BENCHMARKS.md) 解释了时间边界和精度差异。
GitHub Actions在macOS arm64运行器上运行小型模型CPU测试。完整的检查点GPU基准测试在本地测量,不包含在托管CI中。
性能研究
性能调查包括数学分析和独立本地实验:
- 初始性能研究 (https://github.com/mizorewww/laya-mlx/blob/main/docs/PERFORMANCE_RESEARCH.md):实现瓶颈、MLX内核分发和受控实验计划。
- 进一步10倍加速的数学研究 (https://github.com/mizorewww/laya-mlx/blob/main/docs/MATH_10X_RESEARCH.md):算术预算、条件带宽界限、真实权重谱、精确复用和更小模型设计。
- 工程研究 (https://github.com/mizorewww/laya-mlx/blob/main/docs/ENGINEERING_10X_RESEARCH.md):测量的编译、量化、最终头选择、自定义Metal内核和代表性矩阵乘法。
experiments/ (https://github.com/mizorewww/laya-mlx/blob/main/experiments) 包含研究脚本及其原始测量数据。已发布运行时的性能和验证结果在 BENCHMARKS.md (https://github.com/mizorewww/laya-mlx/blob/main/BENCHMARKS.md) 中;每个实验变体都有自己的时间和正确性结果。
当前调查不支持在相同检查点上进一步实现通用10倍加速。选定案例显示约1.03–1.08倍的配对中位数加速;工程报告给出了不确定性区间、量化保真度结果和自定义Metal内核测量。
要为发布准备模型卡和经过验证的导出,请安装参考附加组件并运行:
python -m scripts.prepare_hub --account YOUR_HF_USERNAME
hf upload YOUR_HF_USERNAME/laya-mlx models/hub/laya-mlx . --exclude '.cache/*'
准备脚本会根据其原始FP16源检查每个导出的张量。以相同方式上传其他两个准备好的文件夹,然后使用 hf cache verify REPO_ID --local-dir EXPORT_PATH 检查远程文件。
归属和许可
Apache-2.0;参见 LICENSE (https://github.com/mizorewww/laya-mlx/blob/main/LICENSE) 和 NOTICE (https://github.com/mizorewww/laya-mlx/blob/main/NOTICE)。Laya及其预训练权重由Convai Innovations和上游贡献者提供。提示构建、输出格式、语言路由、邮件工具和预设改编自 NandhaKishorM/laya (https://github.com/NandhaKishorM/laya) 的提交 6a5819129eb220570792e417e49723d697efd76f。神经架构是根据Laya和Hugging Face ModernBERT在MLX中重新实现的。
相似文章
@ivanfioravanti: Apple M5 Max + MLX = 原始算力!看看我正在玩的“FasterLivePortrait-MLX”演示,我从 MPS 开始,但结果不……
作者演示了在搭载 M5 Max 芯片的设备上,将 LivePortrait 的实现从 MPS 迁移到 Apple 的 MLX 框架后,性能和速度有了显著提升。
jundot/omlx
oMLX 是一个用于在 Apple Silicon Mac 上进行优化 LLM 推理的新开源工具,具备持续批处理和分层 KV 缓存功能,并通过菜单栏应用进行管理。
@LinusEkenstam: 相当重要的进展。比MLX-LM推理速度快1.35倍,在预填充阶段速度快1.23倍,能够从内部选择混合选项。
Perplexity已经开源了Lily,这是一个针对Apple Silicon优化的本地推理引擎,专门用于Qwen3.6-35B-A3B模型,实现了比MLX-LM快1.35倍的推理速度。
@jun_song: MLX 的新引擎正处于开发的最后阶段。刚刚在一台 MacBook(116GB)上运行 GLM-5.2,达到 41.8…
Jun Song 宣布 MLX 新引擎进入最终开发阶段,在 MacBook 上以 256k 上下文窗口达到 41.8 tok/s,仅有约 4% 质量损失,代表着显著的性能提升。
优化Apple Silicon设备端推理(20分钟阅读)
Apple的Lily引擎通过利用统一内存和硬件,优化了Apple silicon上的设备端LLM推理,性能超越MLX-LM,并针对Qwen3.6-35B-A3B模型架构进行了调优。