文件導航

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