@LinQ444: jev 与 laya 的对比 https://github.com/mizorewww/laya-mlx…

X AI KOLs Timeline 工具

摘要

Laya-MLX是一个开源工具,用于在Apple Silicon上本地运行类型化决策AI模型,具有低延迟,提供无需云API的原生推理。它包括基准测试,显示在M3 Max等设备上的快速性能。

jev 与 laya 的对比 https://t.co/qKMvbIgqZs https://t.co/b1Ze6j6FWO
查看原文
查看缓存全文

缓存时间: 2026/09/21 03:32

jev 与 laya 的对比 https://t.co/qKMvbIgqZs https://t.co/b1Ze6j6FWO


mizorewww/laya-mlx

来源:https://github.com/mizorewww/laya-mlx

Laya-MLX

Laya MLX 玩贪吃蛇——真实的决策,原始的速度

开放权重的类型化决策,原生运行在 Apple Silicon 上。

13.4 毫秒 是一个简短英文类型化决策的端到端中位数时间。使用多语言检查点时为 7.4 毫秒。零输出令牌。本地 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": ["billing", "technical", "sales"],
        }
    },
)
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 的轮子包;本地安装器选择了 26 的轮子包。未在此机器上测试其他旧版支持的 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 毫秒7.39 毫秒
单个简短问题, P9513.92 毫秒7.79 毫秒
50 个问题的吞吐量146.8 问题/秒395.0 问题/秒
峰值 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 在双向前向传播中回答这些受限问题,无需逐令牌解码或生成 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": {
                "billing": "发票、付款、退款",
                "technical": "错误和宕机",
                "sales": "新购买",
            },
        },
        "urgency": {
            "type": "score",
            "instructions": "这个请求有多紧急?",
            "criteria": ["不紧急", "尽快", "关键"],
        },
        "refund": {
            "type": "noul",
            "instructions": "客户是否要求退款?",
        },
    },
)
print(result["answers"])

system_one 是 predict 的别名。状态可以是文本、JSON 字典或对话列表。choice 接受字典或唯一标签列表;score 返回预期的从零开始的评分等级;noul 返回 P(true)。结果保留上游的四舍五入到小数点后四位、action.act_probability 和令牌使用字段。

默认精度为 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"])  # multilingual

# 显式选择专门的检查点:
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 中重新实现。

相似文章

@cevenif: 用苹果电脑跑本地大模型的朋友,有个工具值得盯上——Rapid-MLX。它在 M 系列芯片上的推理速度比 Ollama 快 2 到 4 倍,因为它是直接基于苹果的 MLX 框架开发的,对芯片架构的压榨更彻底。 几个关键点: KV 缓存裁剪加…

X AI KOLs Timeline

Rapid-MLX 是一个针对苹果 M 系列芯片优化的本地大模型推理工具,基于 MLX 框架开发,推理速度比 Ollama 快 2 到 4 倍,支持多种模型、工具调用及 OpenAI API 兼容接口。

jundot/omlx

GitHub Trending (daily)

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