Core ML Snake: Live-Wahrscheinlichkeiten, lokale Inferenz
Die Terminal-Demo lässt bei jedem Zug ein echtes Laya-Modell laufen. Das linke Panel zeigt das Spielfeld, die Punktzahl und die Snake-Länge; das rechte Panel zeigt Richtungswahrscheinlichkeiten, geschätztes Sackgassen-Risiko, Futter-Erreichbarkeit, gemessene Vorhersagezeit, Engine, null Ausgabe-Tokens und Offline-Inferenzstatus.
Start auf einem Apple-Silicon-Mac
pip install 'laya-coreml[demo]'
hf download aac6fef/laya-multilingual-coreml-ane --local-dir models/snake
laya-coreml-snake --model ./models/snake --fps 12
Verwende ein Terminal mit mindestens 104 Spalten × 35 Zeilen, einer Monospace-Schrift und Truecolor-Unterstützung. Das Laden des Modells und die erste Core ML-Kompilierung erfolgen vor Spielbeginn und können beim ersten Lauf Dutzende Sekunden dauern. Zwölf Entscheidungen pro Sekunde sind eine lesbare Darstellungsgeschwindigkeit, kein Hardware-Maximum.
Der Modellpfad ist nach dem expliziten Download vollständig lokal. Startet man das Spiel mit
einer nicht gecachten Hub-ID, schlägt es mit Anweisungen fehl, statt während der Anzeige von
OFFLINE herunterzuladen. Die Laufzeit benötigt kein MLX, PyTorch oder Transformers.
| Steuerung | Aktion |
|---|---|
| Leertaste | Pause oder Fortsetzen |
↑ / ↓ oder + / - |
Entscheidungsrate erhöhen oder verringern |
| R | Die nächste Runde mit Seed starten |
| Q / Ctrl-C | Beenden und das Terminal wiederherstellen |
Die UI wartet, wenn das Terminal zu klein ist. --no-alt-screen belässt den letzten Frame im
Scrollback; --headless führt dasselbe Modell/Spiel ohne Anzeige aus.
Zwei Deployment-Optionen
Das Standard-ANE-Bundle hat Batch eins und Länge 96. Jeder Spielschritt beantwortet drei Fragen nacheinander. Sein Benchmark für eine einzelne Frage mit ~5 ms ist keine vollständige Spiel-Frame-Zeit. Das gewöhnliche Snake-GPU-Bundle verwendet B3/L64/K4 und bündelt diese drei Fragen:
hf download aac6fef/laya-multilingual-coreml-snake --local-dir models/snake-gpu
laya-coreml-snake --model ./models/snake-gpu --fps 12
Das Engine-Label beschreibt die ausgewählten Core ML-Compute-Units. Der dedizierte ANE-Graph hat
separate Belege durch Ausführungsplan und Hardware-Trace im ANE-Bericht;
CPU+ANE erlaubt weiterhin Host-Arbeit.
Was das Modell steuert
Code berechnet legale Züge, sicheren Fortschritt entlang eines Hamiltonian-Zyklus und ob das
Futter durch leere Zellen erreichbar ist. Laya erhält diese Features und gibt Richtungs- und
boolesche Wahrscheinlichkeiten zurück. Das angezeigte Risiko ist 1 - P(safe route); es ist
eine Modellschätzung, keine kalibrierte Wahrscheinlichkeit, im nächsten Zug zu sterben.
Das standardmäßige Sicherheitsschild beschränkt ausgeführte Züge auf zyklussicheren Fortschritt.
Die UI hält die ursprünglichen Modellwahrscheinlichkeiten sichtbar, zeigt die vorgeschlagene und
die ausgeführte Richtung und erhöht einen sichtbaren Eingriffszähler, wenn sie sich unterscheiden.
--unassisted führt die rohe Top-1 des Modells ohne dieses Schild aus. Null Tode mit dem Schild
belegen keine Snake-Intelligenz ohne Unterstützung oder unbegrenztes Überleben.
Einen echten Lauf aufzeichnen und teilbare Medien exportieren
laya-coreml-snake --model ./models/snake --fps 12 --seed 7 \
--duration 75 --record snake.jsonl
# Requires ffmpeg: brew install ffmpeg
laya-coreml-snake export snake.jsonl --start 45 --seconds 20 \
--output snake.mp4 --gif snake.gif --gif-seconds 15
laya-coreml-snake export snake.jsonl --start 55 --output snake.png
Aufzeichnungen enthalten die Modellherkunft, jedes Board vor der angekündigten Aktion, echte
Wahrscheinlichkeiten, Inferenzlatenz, verstrichene Zeitstempel und eine abschließende
Zusammenfassung. Der Exporter verwendet die Live-Terminal-Komposition wieder und bewahrt
1× Echtzeit-Timing. Das auf dem Bildschirm sichtbare RECORDED RUN · 1× kennzeichnet ein
Replay. Die Sidecar-Datei zeichnet Quell- und Renderer-Hashes auf. Die Video-FPS entnehmen
Stichproben der Aufzeichnung; sie ändern weder die Anzahl der Modellentscheidungen noch
beschleunigen sie die Wiedergabe.
Ausgabedateien müssen neue Pfade sein. --max-speed deaktiviert die Taktung und wartet vor
jedem Zug auf eine frische Vorhersage. Es werden keine Modellaufrufe übersprungen:
laya-coreml-snake --model ./models/snake --max-speed \
--duration 20 --record snake-fast.jsonl
Eine stabile Entscheidungsrate messen
laya-coreml-snake benchmark --model ./models/snake \
--rates 20,30,40,50,60 --sweep-steps 120 --soak-steps 600 \
--seeds 101,102,103 --raw-steps 200 --output snake-benchmark.json
Der Benchmark misst zuerst das Verhalten ohne Schild und den ungedrosselten Betrieb, sweept Zielraten und testet dann bestandene Raten auf längeren Episoden mit mehreren Seeds. Bestehen erfordert null Tode, endliche Ausgaben, erhaltene Zyklusreihenfolge und Futterfortschritt sowie höchstens 1% der Ticks, die das aktive Rechenbudget überschreiten.
Das Timing umfasst Modellvorhersage, Planner-Arbeit, Truecolor-Rich-Komposition, ANSI-Serialisierung und Spiel-Updates. Getaktete Tests enthalten echte Sleeps. Das Zeichnen des Terminal-Emulators ist von diesem In-Memory-Rendering-Test ausgeschlossen. Das Ergebnis ist die höchste bestandene getestete Rate auf dieser Maschine und mit diesen Seeds, kein universelles Maximum. Siehe SNAKE_BENCHMARKS.md für den Release-Lauf.