Documentation

Laya Snake : démo locale dans le terminal

Un vrai jeu Snake piloté par les prédictions Laya MLX sur Apple silicon, avec une disposition de terminal pensée pour un clip social lisible. Le panneau de gauche montre le plateau, le score, la longueur et le meilleur score. Le panneau de droite montre quatre probabilités de direction, le coup exécuté, deux estimations du modèle, le temps d’inférence mesuré, la fréquence de décision et l’état local/hors ligne.

Partie de Snake réellement enregistrée

Lancer

Depuis ce dépôt, sur un Mac Apple silicon :

uv run --extra demo laya-snake

Le modèle par défaut est aac6fef/laya-multilingual-mlx, avec les poids FP16 d’origine. La démo vérifie d’abord models/hub/laya-multilingual-mlx et models/laya-multilingual, puis le cache local de Hugging Face. Elle ne télécharge jamais un modèle manquant pendant la partie. Sur un checkout neuf, télécharge les poids une fois au préalable :

uv run --extra demo hf download aac6fef/laya-multilingual-mlx \
  --local-dir models/hub/laya-multilingual-mlx
uv run --extra demo laya-snake

Utilise un terminal d’au moins 104 colonnes × 35 lignes avec une police à chasse fixe et la truecolor. Menlo fonctionne bien sur macOS. Un terminal plus petit met le jeu en pause jusqu’au redimensionnement. La taille de plateau par défaut est 24 × 16, la longueur initiale est 6, et la cible de présentation est de 12 décisions/seconde.

L’affichage en direct respecte NO_COLOR. Si ton shell le définit, utilise env -u NO_COLOR uv run --extra demo laya-snake pour la présentation en couleur. Le benchmark active explicitement la truecolor afin que ce réglage d’environnement ne puisse pas modifier silencieusement sa charge de rendu.

Commande Action
Espace Pause / reprise
↑ / ↓, ou + / − Augmenter / diminuer la cible cadencée de 2 décisions/seconde
R Démarrer une nouvelle manche avec la graine suivante
Q ou Ctrl-C Quitter et restaurer le terminal

Modes utiles :

# 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 accepte un répertoire local ou un identifiant Hub déjà en cache. --width, --height, --seed et --initial-length configurent une exécution. Les plateaux doivent faire au moins 4 × 4 avec une dimension paire, car le planificateur de sécurité utilise un cycle hamiltonien. Les touches de vitesse n’affectent que le mode cadencé ; --max-speed avance toujours dès que la décision courante est terminée.

Enregistrer et exporter

L’enregistrement contient les états réels du plateau, les probabilités d’origine du modèle, les actions exécutées, les temps, la provenance du modèle et les résumés d’exécution. Chaque plateau est associé à la prédiction faite avant son coup suivant.

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

L’export MP4 est par défaut en 1920 × 1080, 30 images vidéo/seconde, H.264, à vitesse d’horloge murale d’origine. Il rend les mêmes cellules de terminal à partir des données enregistrées ; c’est un replay rendu, plutôt qu’une capture d’écran. Un label visible RECORDED RUN · 1× et un sidecar JSON l’identifient. Exporter à 30 FPS ne transforme pas un jeu à 12 décisions/seconde en un jeu à 30 décisions/seconde. À chaque horodatage de la vidéo, l’exportateur utilise l’image source réelle la plus récente. Les enregistrements rapides peuvent comporter plus de décisions que la fréquence d’images vidéo choisie ne peut en afficher.

Utilise --headless pour enregistrer sans terminal attaché. L’inférence du modèle a toujours lieu à chaque coup ; le dessin en direct du terminal est omis. Les fichiers de sortie ne sont pas écrasés. Démarre un nouvel enregistrement quand tu changes la présentation ou la vitesse, plutôt que de mélanger des pauses ou des réinitialisations dans un court extrait social.

Le MP4 est par défaut un extrait de 30 secondes, et --gif exporte ses 15 premières secondes au même rythme d’origine. Utilise --gif-seconds pour changer la durée du GIF. Les ressources sociales livrées incluent les deux formats plus une affiche PNG.

Ce que fait l’IA

C’est une démo de décision neuronale assistée par des caractéristiques, qui utilise le checkpoint Laya existant sans entraînement sur Snake. Un planificateur déterministe décrit les directions légales, la progression de cycle sûre et la connectivité actuelle des cellules vides. Laya reçoit ces descriptions, y compris quelle direction sûre progresse le plus. Elle renvoie une distribution sur UP, DOWN, LEFT et RIGHT. Les barres de probabilité sont ces sorties d’origine du modèle.

Le bouclier de sécurité par défaut exécute la direction admissible de plus haute probabilité du modèle. Si le premier choix brut est inadmissible, l’interface conserve cette distribution d’origine et marque le coup exécuté par SHIELD ; le compteur d’interventions augmente. L’exécution par défaut est étiquetée Laya + cycle safety. --unassisted désactive cette restriction d’exécution ; elle donne encore au modèle les caractéristiques du planificateur. Aucun des deux modes n’établit que le checkpoint peut déduire une stratégie Snake à partir d’un plateau non traité.

Un appel Agent.predict met en lot trois vraies questions par coup :

Affichage Signification réelle
NEXT MOVE Probabilités choice de Laya sur les quatre directions décrites
DEAD-END RISK 1 − P(safe route available), d’après une réponse noul de Laya
FOOD REACHABLE Réponse noul de Laya sur le résumé fourni de la joignabilité actuelle des cellules vides
INFERENCE Temps d’horloge murale synchronisé de Agent.predict, incluant la tokenisation et la conversion du résultat
DECISIONS Fréquence récente mesurée des décisions terminées
NETWORK OFFLINE Chargement local du checkpoint et inférence locale en mode Hub hors ligne ; cela n’éteint pas le Wi-Fi du Mac

Les deux estimations sont des sorties du modèle, pas des probabilités calibrées de mort au Snake. La joignabilité actuelle des cellules vides diffère aussi de la joignabilité future après le déplacement de la queue. Le risque peut rester bas longtemps parce que le planificateur fournit une route sûre. Aucune valeur aléatoire ni prédiction préenregistrée n’est substituée pendant le jeu en direct.

Le bouclier de cycle préserve l’ordre cyclique du corps et ne dépasse jamais la queue ni la nourriture. Chaque action admise progresse positivement vers la nourriture actuelle. Pour un plateau initialement valide, cela donne un successeur sûr disponible et une borne finie de progression vers la nourriture. Les tests exercent des choix arbitraires parmi les actions admissibles jusqu’à ce qu’un plateau soit plein.

Reproduire le test de vitesse

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

Utilise --resume --output artifacts/snake/benchmark.json pour conserver les épisodes terminés et reprendre la configuration enregistrée. Chaque rapport identifie le checkpoint, le prompt, l’environnement et le hachage source. Une fréquence en échec n’a pas besoin d’autres graines ; une fréquence en réussite doit terminer chaque graine demandée.

Le benchmark mesure l’inférence du modèle, la planification, la composition Rich, la sérialisation ANSI en mémoire et les mises à jour du jeu. Il exclut le chargement du modèle, le warmup et le rendu propre de l’émulateur de terminal. Les épisodes non plafonnés mesurent les coups/seconde réellement soutenus. Les épisodes cadencés vérifient séparément qu’au moins 99% des ticks actifs tiennent dans le budget de calcul demandé, sur chaque graine. Le dépassement dû à la mise en veille de l’OS reste inclus dans la fréquence atteinte rapportée.

L’exécution finale en truecolor sur M3 Max a terminé 8,160 décisions avec zéro mort, dont 2,400 pas non plafonnés à 63.61 pas/seconde au total. Son réglage de budget de calcul testé en réussite le plus élevé était 20 FPS, avec une fréquence cadencée atteinte de 18.69–18.94 pas/seconde. Les réglages cadencés plus élevés ont échoué au critère d’échéance énoncé, tandis que le jeu restait vivant. Voir le rapport de benchmark Snake complet pour les résultats par graine, les interventions et les limites.

Pour un clip social, la cible par défaut de 12 FPS laisse aux spectateurs le temps de voir la direction sélectionnée et le score qui monte. --max-speed démontre le débit mesuré. La vidéo de 30 secondes incluse préserve le rythme d’origine de son exécution source.