文档导航

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 测量当前的连续决策速率。