Laya Snake:ローカルターミナルデモ
Apple silicon 上の Laya MLX 予測で動く実際の Snake ゲームで、読みやすいソーシャルクリップのために設計したターミナルレイアウトを備えます。左パネルは盤面、スコア、長さ、ベストスコアを表示します。右パネルは 4 つの方向確率、実行された手、2 つのモデル推定値、計測された推論時間、判断レート、ローカル/オフライン状態を表示します。

実行
Apple silicon の Mac で、このリポジトリから:
uv run --extra demo laya-snake
既定のモデルは aac6fef/laya-multilingual-mlx で、元の FP16 の重みを使います。デモはまず models/hub/laya-multilingual-mlx と models/laya-multilingual を調べ、次にローカルの Hugging Face キャッシュを調べます。プレイ中に不足しているモデルをダウンロードすることはありません。新しくチェックアウトした場合は、事前に一度重みをダウンロードしておいてください:
uv run --extra demo hf download aac6fef/laya-multilingual-mlx \
--local-dir models/hub/laya-multilingual-mlx
uv run --extra demo laya-snake
等幅フォントとトゥルーカラーで、104 列 × 35 行以上のターミナルを使ってください。macOS では Menlo がよく合います。ターミナルが小さいと、リサイズされるまでゲームが一時停止します。既定の盤面サイズは 24 × 16、初期の長さは 6、表示目標は毎秒 12 判断です。
ライブ表示は NO_COLOR に従います。シェルがこれを設定している場合は、色付きの表示にするために env -u NO_COLOR uv run --extra demo laya-snake を使ってください。ベンチマークはトゥルーカラーを明示的に有効にするので、この環境設定がレンダリングのワークロードを黙って変えることはありません。
| 操作 | 動作 |
|---|---|
| Space | 一時停止/再開 |
| ↑ / ↓、または + / − | ペーシング目標を毎秒 2 判断ずつ増減 |
| R | 次のシードで新しいラウンドを開始 |
| Q または Ctrl-C | 終了してターミナルを復元 |
便利なモード:
# Every move waits for a new inference, with no pacing delay.
uv run --extra demo laya-snake --max-speed
# Optional measured compilation + prefix-reuse path.
uv run --extra demo laya-snake --optimize --max-speed
# Use the fixed computation-budget setting validated on the recorded M3 Max.
uv run --extra demo laya-snake --fps 20
# Execute the model's raw first choice without the execution safety shield.
uv run --extra demo laya-snake --unassisted
# A finite run without a terminal display.
uv run --extra demo laya-snake --headless --steps 600 --max-speed
--model はローカルディレクトリか、すでにキャッシュ済みの Hub ID を受け付けます。--width、--height、--seed、--initial-length で実行を設定します。安全プランナがハミルトン閉路を使うため、盤面は少なくとも 4 × 4 で、片方の次元が偶数である必要があります。速度キーはペーシングモードに効きます。--max-speed は常に、現在の判断が完了し次第すぐに進みます。
録画と書き出し
録画には実際の盤面状態、元のモデル確率、実行されたアクション、タイミング、モデルの来歴、実行サマリが含まれます。各盤面は、その次の手を打つ前に行われた予測と対になります。
uv run --extra demo laya-snake --fps 12 --duration 100 \
--record artifacts/snake/run.jsonl
# ffmpeg is required for video export; on macOS: brew install ffmpeg
uv run --extra demo laya-snake export artifacts/snake/run.jsonl \
--start 65 --seconds 30 --output artifacts/snake/demo.mp4 \
--gif artifacts/snake/demo.gif
uv run --extra demo laya-snake export artifacts/snake/run.jsonl \
--start 85 --output artifacts/snake/poster.png
MP4 の書き出しは既定で 1920 × 1080、毎秒 30 動画フレーム、H.264、元の実時間速度です。記録データから同じターミナルセルをレンダリングします。画面キャプチャではなく、レンダリングされたリプレイです。目に見える RECORDED RUN · 1× ラベルと JSON サイドカーがこれを示します。30 FPS で書き出しても、毎秒 12 判断のゲームが毎秒 30 判断のゲームになるわけではありません。各動画タイムスタンプで、エクスポータは直近の実際のソースフレームを使います。速い録画は、選んだ動画フレームレートが表示できる数より多くの判断を持つことがあります。
ターミナルを接続せずに録画する場合は --headless を使ってください。着手のたびにモデル推論は依然として行われ、ライブのターミナル描画は省略されます。出力ファイルは上書きされません。表示や速度を変えるときは、短いソーシャル抜粋に一時停止やリセットを混ぜるのではなく、新しい録画を始めてください。
MP4 は既定で 30 秒の抜粋になり、--gif はその最初の 15 秒を同じ元のペースで書き出します。GIF の長さは --gif-seconds で変えられます。同梱のソーシャル素材には両方の形式と PNG ポスターが含まれます。
AI が行うこと
これは 特徴量支援によるニューラル意思決定のデモで、Snake の訓練をしていない既存の Laya チェックポイントを使います。決定論的なプランナが、合法な方向、安全なサイクル進行、現在の空セルの連結性を記述します。Laya はそれらの記述(どの安全な方向が最も進むかを含む)を受け取り、UP、DOWN、LEFT、RIGHT にわたる分布を返します。確率バーは、その元のモデル出力です。
既定の安全シールドは、モデルの中で最も確率の高い許容方向を実行します。生の第一候補が許容できない場合、UI はその元の分布を保持し、実行された手に SHIELD を付け、介入カウンタが増えます。既定の実行は Laya + cycle safety と表示されます。--unassisted はその実行制限を無効にしますが、モデルには依然としてプランナの特徴量を与えます。どちらのモードも、チェックポイントが未処理の盤面から Snake の戦略を推論できることを示すものではありません。
1 回の Agent.predict 呼び出しが、着手ごとに 3 つの実際の質問をバッチ処理します:
| 表示 | 実際の意味 |
|---|---|
| NEXT MOVE | 記述された 4 方向に対する Laya の choice 確率 |
| DEAD-END RISK | Laya の noul の答えから得た 1 − P(safe route available) |
| FOOD REACHABLE | 与えられた現在の空セル到達可能性サマリに関する Laya の noul の答え |
| INFERENCE | トークナイズと結果変換を含む、同期された Agent.predict の実時間 |
| DECISIONS | 直近に計測した完了判断レート |
| NETWORK OFFLINE | Hub のオフラインモードでのローカルなチェックポイント読み込みとローカル推論。Mac の Wi-Fi を切るわけではありません |
この 2 つの推定値はモデルの出力であり、較正済みの Snake 死亡確率ではありません。現在の空セルの到達可能性も、しっぽが動いた後の将来の到達可能性とは異なります。プランナが安全な経路を供給するため、リスクは長いあいだ低いままかもしれません。ライブプレイ中にランダムな値や録画済みの予測で置き換えることはありません。
サイクルシールドは胴体の循環順序を保ち、しっぽや餌を越えて進むことは決してありません。許容されたすべてのアクションは、現在の餌に向けて正の進行をもたらします。初期状態が妥当な盤面では、これにより利用可能な安全な後継と、餌への進行の有限な上限が得られます。テストでは、盤面が埋まるまで許容アクションの中から恣意的な選択を試します。
速度テストの再現
uv run --extra demo laya-snake benchmark \
--rates 10,12,15,18,20,25,30,35,40,45,50,60 \
--sweep-steps 120 --soak-steps 600 --seeds 101,102,103,104 \
--output artifacts/snake/benchmark.json
--resume --output artifacts/snake/benchmark.json を使うと、完了したエピソードを保持し、記録された構成から再開できます。各レポートはチェックポイント、プロンプト、環境、ソースハッシュを特定します。失敗したレートにはこれ以上シードは不要で、合格したレートは要求されたすべてのシードを完了しなければなりません。
ベンチマークは、モデル推論、計画、Rich の構築、メモリへの ANSI シリアライズ、ゲームの更新を計測します。モデルのロード、ウォームアップ、ターミナルエミュレータ自身の描画は除外します。上限なしのエピソードは実際の持続的な手/秒を測ります。ペーシングありのエピソードは別に、すべてのシードで、アクティブなティックの少なくとも 99% が要求された計算予算に収まるかを調べます。OS のスリープによるオーバーシュートは、報告される達成レートに含まれたままです。
最後のトゥルーカラー M3 Max 実行は、死亡ゼロで 8,160 の判断を完了しました。これには上限なしの 2,400 手が含まれ、全体で毎秒 63.61 手でした。合格したテスト済み計算予算の最高設定は 20 FPS で、達成されたペーシングレートは 毎秒 18.69–18.94 手でした。より高いペーシング設定は、ゲームが生き続けたまま、示された期限の基準を満たしませんでした。シードごとの結果、介入、限界については、完全な Snake ベンチマークレポートを参照してください。
ソーシャルクリップでは、既定の 12 FPS 目標が、視聴者に選ばれた方向と伸びていくスコアを見る時間を与えます。--max-speed は計測されたスループットを示します。同梱の 30 秒動画は、そのソース実行の元のペースを保っています。