Snake 速度与稳定性:M3 Max
最终的 truecolor 批次完成了 8,160 次移动,零死亡、4 次安全干预。默认模型是 FP16 的 aac6fef/laya-multilingual-mlx,使用精简的规划器描述、24 × 16 的棋盘和初始长度 6。这些测量使用默认的 eager 运行时;可选的编译另行在 Snake 优化中评估。
持续的不设上限吞吐:2,400 步整体 63.61 次移动/秒。 四个种子各完成 600 次移动。它们的速率介于 46.32 到 76.37 次移动/秒之间。每一局都存活了下来,保持了身体循环顺序,并持续吃到食物。在这些回合中,安全层纠正了 2 次模型的原始提议。
通过测试的最高节流计算预算:20 FPS。 四个种子都满足「至少 99% 的活动 tick 落在 50 ms 内」的要求。包含操作系统睡眠超时在内的实际真实时间速率是 18.69–18.94 次移动/秒。这是一个预算设置,不是声称每秒恰好渲染 20 帧。
持续最高速度
| 种子 | 步数 | 实际步/秒 | 活动 tick p50 / p99(ms) | 分数 / 长度 | 干预次数 |
|---|---|---|---|---|---|
| 101 | 600 | 46.32 | 15.52 / 39.67 | 20 / 26 | 1 |
| 102 | 600 | 67.91 | 13.84 / 22.96 | 24 / 30 | 0 |
| 103 | 600 | 74.20 | 12.27 / 21.42 | 23 / 29 | 1 |
| 104 | 600 | 76.37 | 11.98 / 21.00 | 16 / 22 | 0 |
合并后的不设上限模型推理 p50 / p95 / p99 为 10.08 / 31.68 / 33.61 ms。完整的活动 tick p50 / p99 为 12.70 / 37.21 ms。一个活动 tick 包含规划、同步推理、Rich 组装、truecolor ANSI 序列化和游戏更新。不插入任何节流延迟。
固定预算稳定性
| 种子 | 目标 FPS | 步数 | 实际步/秒 | 活动 tick p99(ms) | 预算未达标 |
|---|---|---|---|---|---|
| 101 | 20.0 | 600 | 18.69 | 39.93 | 0 (0.00%) |
| 102 | 20.0 | 600 | 18.86 | 45.09 | 0 (0.00%) |
| 103 | 20.0 | 600 | 18.94 | 48.66 | 6 (1.00%) |
| 104 | 20.0 | 600 | 18.85 | 44.53 | 0 (0.00%) |
通过的测试在 2,400 个活动 tick 中有 6 个迟到(整体 99.75% 落在预算内)。最差的种子是 6/600 个迟到 tick,正好是预先定义的 1% 上限。所有移动都会等待一个新的模型结果,所以推理变慢会降低游戏速率,而不是执行过期的动作。
短程扫描
下面的每个候选用种子 7 跑了 120 次移动。短程通过探测用于为更长的四种子测试挑选候选;它本身不足以声称稳定性。所有游戏都存活,包括计时失败的。
| 目标 FPS | 实际步/秒 | 活动 tick p99(ms) | 预算未达标 | 短程扫描 |
|---|---|---|---|---|
| 10.0 | 9.60 | 52.13 | 0.00% | 通过 |
| 12.0 | 11.39 | 42.07 | 0.00% | 通过 |
| 15.0 | 14.10 | 48.69 | 0.00% | 通过 |
| 18.0 | 16.95 | 58.10 | 2.50% | 失败 |
| 20.0 | 18.84 | 43.84 | 0.00% | 通过 |
| 25.0 | 24.23 | 45.66 | 5.83% | 失败 |
| 30.0 | 28.60 | 40.04 | 97.50% | 失败 |
| 35.0 | 28.69 | 40.12 | 100.00% | 失败 |
| 40.0 | 28.16 | 44.15 | 100.00% | 失败 |
| 45.0 | 26.70 | 45.56 | 100.00% | 失败 |
| 50.0 | 28.67 | 40.23 | 100.00% | 失败 |
| 60.0 | 28.89 | 40.97 | 100.00% | 失败 |
短程扫描是非单调的,且测得延迟随时间变化明显。节流与不设上限的运行在设备空闲期上不同;正常的桌面活动、调度和时钟行为没有在实验上被隔离。这些数据并未指出单一原因或普遍的速度上限。我们报告达到的速率、全部样本,以及通过测试的最高设置。
稳定性结果包含什么
Laya 接收规划器特征,包括合法方向和朝食物最可接受的进展。它计算真实概率。循环安全层可以纠正执行,同时保留原始的概率条并计入每一次干预。这里的 checkpoint 没有在 Snake 上训练过。UI 各指标的准确含义与策略行为。
一个单独的原始 top-1 对照在关闭执行护盾的情况下让种子 101–103 各跑 600 次移动。三者都存活;分数为 9、24 和 19,对应的带护盾版本则是 20、24 和 23。原始对照仍然提供规划器特征。它在这段时长内存活,并不能证明无限期的无护盾存活或无辅助的棋盘推理。
发布的展示是一次单独的 100.005 秒真实 TTY 运行,目标 12 FPS:1,144 次移动,分数 40、长度 46,零死亡、零干预。达到的吞吐是 11.44 次移动/秒。每一个录制的棋盘和动作都在测试套件里由确定性回放校验。屏幕上可见的推理数字来自那次运行,而不是被替换成有利的基准数字。
一次单独的优化最高速度 TTY 录制在 20.01 秒内完成 1,296 次移动(64.77 次移动/秒),分数 44、长度 50,零死亡、零干预。这包含实际的终端流写入。它的 15 秒原速视频和完整录制与较慢的展示片段一并提供。
测量边界与来源
- Apple M3 Max,40 个 GPU 核心,128 GiB 统一内存;macOS 27.2,Python 3.12.13。
- MLX 0.32.2,NumPy 2.5.3,Rich 15.0.0,tokenizers 0.23.2,huggingface-hub 1.32.0。
- 原始 FP16 权重,未做量化,未用自定义 kernel。上游模型 revision:
052592a15d198d9ad47da779604259b10b47b7aa。 - 权重 SHA-256 来自此前已验证的已发布 manifest:
7fc5834af4d8fdfb268d272a9d1a66e5819a0daac98241651c4c888cc43adff1。 - 每次移动调用一次
Agent.predict,带三个批处理的问题。推理计时包含分词、同步 MLX 求值和输出转换。 - 基准会显式启用 true color,与
NO_COLOR无关,并把 Rich 输出序列化进内存流。终端模拟器的屏幕绘制、模型加载和预热不计入。实际的终端控制与清理另行测试。 - 报告存储配置、环境、源指纹,以及每一步的概率、执行决策和计时。后来新增的输出 token 标签和可选优化不改变基线模型或游戏策略。
早期运行予以保留
早期的 detailed-prompt 与 compact-prompt 批次从工具环境继承了 NO_COLOR=1。它们测的是单色序列化,作为探索性结果保留,而不是被替换成最终的彩色基准。更早的 compact 批次完成了 12,360 次移动且无死亡,整体测得 52.55 次不设上限移动/秒;它通过测试的最高预算设置是 18 FPS。与最终运行的差异不归因于启用了颜色:这台机器的计时波动很大。
detailed-prompt 的 20 FPS 长跑在四个种子上都没通过计时标准,但每一局都存活。更早的 compact 批次中更高速率的失败也予以保留。没有任何一个完成的失败回合被从那些文件里移除。
文件与复现
uv run --extra demo laya-snake benchmark \
--rates 10,12,15,18,20,25,30,35,40,45,50,60 \
--raw-steps 600 --sweep-steps 120 --soak-steps 600 \
--seeds 101,102,103,104 --output artifacts/snake/benchmark.json
中断后用相同的输出路径加 --resume。实时展示默认采用可读的 12 FPS 目标;--max-speed 测量当前的连续决策速率。