Laya Snake: lokale Terminal-Demo
Ein tatsächliches Snake-Spiel, angetrieben von Laya MLX-Vorhersagen auf Apple Silicon, mit einem Terminal-Layout, das für einen lesbaren Social-Clip entworfen wurde. Das linke Panel zeigt das Board, Punktzahl, Länge und Bestpunktzahl. Das rechte Panel zeigt vier Richtungswahrscheinlichkeiten, den ausgeführten Zug, zwei Modellschätzungen, die gemessene Inferenzzeit, die Entscheidungsrate und den Lokal-/Offline-Status.

Ausführen
Aus diesem Repository auf einem Apple-Silicon-Mac:
uv run --extra demo laya-snake
Das Standardmodell ist aac6fef/laya-multilingual-mlx, unter Verwendung der ursprünglichen FP16-Gewichte. Die Demo prüft zuerst models/hub/laya-multilingual-mlx und models/laya-multilingual, dann den lokalen Hugging Face-Cache. Sie lädt ein fehlendes Modell nie während des Spiels herunter. Bei einem frischen Checkout lade die Gewichte einmal vorher herunter:
uv run --extra demo hf download aac6fef/laya-multilingual-mlx \
--local-dir models/hub/laya-multilingual-mlx
uv run --extra demo laya-snake
Verwende ein Terminal mit mindestens 104 Spalten × 35 Zeilen, einer Monospace-Schrift und True Color. Menlo funktioniert unter macOS gut. Ein kleineres Terminal pausiert das Spiel, bis es vergrößert wird. Die Standard-Boardgröße ist 24 × 16, die Anfangslänge ist 6, und das Präsentationsziel ist 12 Entscheidungen/Sekunde.
Die Live-Anzeige respektiert NO_COLOR. Wenn deine Shell es setzt, verwende env -u NO_COLOR uv run --extra demo laya-snake für die farbige Präsentation. Der Benchmark aktiviert explizit True Color, damit diese Umgebungseinstellung seinen Rendering-Workload nicht stillschweigend verändern kann.
| Steuerung | Aktion |
|---|---|
| Leertaste | Pause / Fortsetzen |
| ↑ / ↓ oder + / − | Das getaktete Ziel um 2 Entscheidungen/Sekunde erhöhen / verringern |
| R | Eine neue Runde mit dem nächsten Seed starten |
| Q oder Ctrl-C | Beenden und das Terminal wiederherstellen |
Nützliche Modi:
# 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 akzeptiert ein lokales Verzeichnis oder eine bereits gecachte Hub-ID. --width, --height, --seed und --initial-length konfigurieren einen Lauf. Boards müssen mindestens 4 × 4 groß sein, mit einer geraden Dimension, weil der Sicherheits-Planner einen Hamilton-Zyklus verwendet. Geschwindigkeitstasten wirken im getakteten Modus; --max-speed rückt immer vor, sobald die aktuelle Entscheidung abgeschlossen ist.
Aufzeichnen und exportieren
Die Aufzeichnung enthält tatsächliche Board-Zustände, ursprüngliche Modellwahrscheinlichkeiten, ausgeführte Aktionen, Zeitmessungen, Modellherkunft und Laufzusammenfassungen. Jedes Board ist mit der Vorhersage gepaart, die vor seinem nächsten Zug getroffen wurde.
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
Der MP4-Export verwendet standardmäßig 1920 × 1080, 30 Video-Frames/Sekunde, H.264 und die ursprüngliche Echtzeitgeschwindigkeit. Er rendert dieselben Terminalzellen aus den aufgezeichneten Daten; er ist ein gerendertes Replay, kein Screen Capture. Ein sichtbares RECORDED RUN · 1×-Label und ein JSON-Sidecar identifizieren dies. Der Export mit 30 FPS macht aus einem Spiel mit 12 Entscheidungen/Sekunde kein Spiel mit 30 Entscheidungen/Sekunde. Bei jedem Video-Zeitstempel verwendet der Exporter den jüngsten tatsächlichen Quell-Frame. Schnelle Aufzeichnungen können mehr Entscheidungen haben, als die gewählte Video-Framerate anzeigen kann.
Verwende --headless, wenn du ohne angeschlossenes Terminal aufnimmst. Die Modellinferenz findet weiterhin für jeden Zug statt; das Live-Terminalzeichnen entfällt. Ausgabedateien werden nicht überschrieben. Starte eine neue Aufzeichnung, wenn du Präsentation oder Geschwindigkeit änderst, statt Pausen oder Resets in einen kurzen Social-Ausschnitt zu mischen.
Der MP4 verwendet standardmäßig einen 30-sekündigen Ausschnitt, und --gif exportiert dessen erste 15 Sekunden im selben Originaltempo. Verwende --gif-seconds, um die GIF-Dauer zu ändern. Die ausgelieferten Social-Assets umfassen beide Formate plus ein PNG-Poster.
Was die KI tut
Dies ist eine merkmalgestützte neuronale Entscheidungs-Demo, die den bestehenden Laya-Checkpoint ohne Snake-Training verwendet. Ein deterministischer Planner beschreibt legale Richtungen, sicheren Zyklusfortschritt und die aktuelle Konnektivität der leeren Zellen. Laya erhält diese Beschreibungen, darunter, welche sichere Richtung den meisten Fortschritt macht. Es gibt eine Verteilung über UP, DOWN, LEFT und RIGHT zurück. Die Wahrscheinlichkeitsbalken sind diese ursprünglichen Modellausgaben.
Das standardmäßige Sicherheitsschild führt die zulässige Richtung mit der höchsten Wahrscheinlichkeit des Modells aus. Wenn die rohe erste Wahl unzulässig ist, behält die UI diese ursprüngliche Verteilung und markiert den ausgeführten Zug mit SHIELD; der Eingriffszähler steigt. Der Standardlauf ist mit Laya + cycle safety beschriftet. --unassisted deaktiviert diese Ausführungsbeschränkung; es gibt dem Modell weiterhin Planner-Features. Keiner der Modi belegt, dass der Checkpoint eine Snake-Strategie aus einem unverarbeiteten Board ableiten kann.
Ein Agent.predict-Aufruf batcht drei echte Fragen pro Zug:
| Anzeige | Tatsächliche Bedeutung |
|---|---|
| NEXT MOVE | Laya-choice-Wahrscheinlichkeiten über die vier beschriebenen Richtungen |
| DEAD-END RISK | 1 − P(safe route available), aus einer Laya-noul-Antwort |
| FOOD REACHABLE | Laya-noul-Antwort über die gelieferte aktuelle Erreichbarkeitszusammenfassung der leeren Zellen |
| INFERENCE | Synchronisierte Agent.predict-Wanduhrzeit, einschließlich Tokenisierung und Ergebniskonvertierung |
| DECISIONS | Kürzlich gemessene Rate abgeschlossener Entscheidungen |
| NETWORK OFFLINE | Lokales Checkpoint-Laden und lokale Inferenz mit Hub-Offline-Modus; dies schaltet das WLAN des Macs nicht ab |
Die beiden Schätzungen sind Modellausgaben, keine kalibrierten Snake-Todeswahrscheinlichkeiten. Die aktuelle Erreichbarkeit leerer Zellen unterscheidet sich auch von der zukünftigen Erreichbarkeit, nachdem sich der Schwanz bewegt hat. Das Risiko kann lange niedrig bleiben, weil der Planner eine sichere Route liefert. Während des Live-Spiels werden keine Zufallswerte oder voraufgezeichneten Vorhersagen eingesetzt.
Das Zyklus-Schild bewahrt die zyklische Reihenfolge des Körpers und rückt nie über den Schwanz oder das Futter hinaus. Jede zugelassene Aktion macht positiven Fortschritt zum aktuellen Futter. Für ein anfänglich gültiges Board ergibt dies einen verfügbaren sicheren Nachfolger und eine endliche Futter-Fortschrittsgrenze. Tests üben beliebige Auswahlen unter den zulässigen Aktionen, bis ein Board voll ist.
Den Geschwindigkeitstest reproduzieren
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
Verwende --resume --output artifacts/snake/benchmark.json, um abgeschlossene Episoden zu bewahren und die aufgezeichnete Konfiguration fortzusetzen. Jeder Bericht identifiziert Checkpoint, Prompt, Umgebung und Quell-Hash. Eine fehlgeschlagene Rate braucht keine weiteren Seeds; eine bestandene Rate muss jeden angeforderten Seed abschließen.
Der Benchmark misst Modellinferenz, Planung, Rich-Komposition, ANSI-Serialisierung in den Speicher und Spiel-Updates. Er schließt Modellladen, Warmup und das eigene Zeichnen des Terminal-Emulators aus. Ungedrosselte Episoden messen tatsächliche anhaltende Züge/Sekunde. Getaktete Episoden prüfen separat, ob mindestens 99% der aktiven Ticks in das angeforderte Rechenbudget passen, für jeden Seed. Die OS-Schlaf-Überschreitung bleibt in der berichteten erreichten Rate enthalten.
Der finale Truecolor-M3-Max-Lauf absolvierte 8,160 Entscheidungen mit null Toden, darunter 2,400 ungedrosselte Schritte mit 63.61 Schritten/Sekunde insgesamt. Seine höchste bestandene getestete Rechenbudget-Einstellung war 20 FPS, mit einer erreichten getakteten Rate von 18.69–18.94 Schritten/Sekunde. Höhere getaktete Einstellungen scheiterten am genannten Fristkriterium, während das Spiel am Leben blieb. Siehe den vollständigen Snake-Benchmark-Bericht für Ergebnisse pro Seed, Eingriffe und Einschränkungen.
Für einen Social-Clip gibt das Standardziel von 12 FPS den Zuschauern Zeit, die gewählte Richtung und die wachsende Punktzahl zu sehen. --max-speed demonstriert den gemessenen Durchsatz. Das enthaltene 30-sekündige Video bewahrt das Originaltempo seines Quelllaufs.