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 測量當前的連續決策速率。