@mizorewww: 推出比Jev快50倍的版本,在您的设备上运行:laya-mlx!内存占用最高仅1G……

X AI KOLs Timeline 模型

摘要

介绍laya-mlx,这是一个使用MLX优化的开源分类系统,适用于Apple Silicon,提供比Jev快50倍的性能,最大内存使用仅1G,并通过实时贪吃蛇游戏演示进行展示。

推出一个比Jev快50倍的版本,在您的设备上运行:laya-mlx!仅在您的设备上占用最多1G内存。Laya是一个类似于Jev的开源分类系统,基于文本输出概率。我将它移植到MLX并进行了一些性能优化!在视频中,这个模型在我的本地M3 Max上玩贪吃蛇。这个模型可以以每秒60次的决策速度玩贪吃蛇!https://github.com/mizorewww/laya-mlx…
查看原文
查看缓存全文

缓存时间: 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
单个短问题,P5013.42 ms7.39 ms
单个短问题,P9513.92 ms7.79 ms
50个问题吞吐量146.8 q/s395.0 q/s
峰值 MLX 分配,单个短问题943.6 MiB687.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/layaModernBERT-large421M512英文
convaiinnovations/laya-multilingualmmBERT-base322M1,024多语言输入
convaiinnovations/laya-typed-decisionsModernBERT-large421M1,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_onepredict 的别名。状态可以是文本、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=Truepad_to_multiple=16cache_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) 使所有三个检查点常驻内存;支持 attachpreloadunload、显式 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中重新实现的。

相似文章

jundot/omlx

GitHub Trending (daily)

oMLX 是一个用于在 Apple Silicon Mac 上进行优化 LLM 推理的新开源工具,具备持续批处理和分层 KV 缓存功能,并通过菜单栏应用进行管理。