Documentation

Snake Core ML : probabilités en direct, inférence locale

La démo terminal exécute un vrai modèle Laya à chaque coup. Le panneau de gauche montre le plateau, le score et la longueur du serpent ; le panneau de droite montre les probabilités de direction, le risque estimé de cul-de-sac, l’accessibilité de la nourriture, le temps de prédiction mesuré, le moteur, zéro token de sortie et l’état de l’inférence hors ligne.

Démarrer sur un Mac Apple Silicon

pip install 'laya-coreml[demo]'
hf download aac6fef/laya-multilingual-coreml-ane --local-dir models/snake
laya-coreml-snake --model ./models/snake --fps 12

Utilise un terminal d’au moins 104 colonnes × 35 lignes avec une police à chasse fixe et la prise en charge truecolor. Le chargement du modèle et la compilation Core ML initiale se produisent avant le démarrage du jeu et peuvent prendre des dizaines de secondes au premier lancement. Douze décisions par seconde est une vitesse de présentation lisible, pas un maximum matériel.

Le chemin du modèle est entièrement local après le téléchargement explicite. Démarrer le jeu avec un ID Hub non mis en cache échoue avec des instructions plutôt que de télécharger tout en affichant OFFLINE. Le runtime n’a besoin ni de MLX, ni de PyTorch, ni de Transformers.

Contrôle Action
Espace Mettre en pause ou reprendre
Haut / Bas, ou + / - Augmenter ou diminuer le débit de décision
R Démarrer la manche à graine suivante
Q / Ctrl-C Quitter et restaurer le terminal

L’interface attend quand le terminal est trop petit. --no-alt-screen laisse l’image finale dans le scrollback ; --headless exécute le même modèle/jeu sans l’affichage.

Deux choix de déploiement

Le bundle ANE par défaut a un lot de un et une longueur de 96. Chaque pas de jeu répond à trois questions séquentiellement. Son benchmark à une seule question de ~5 ms n’est pas un temps par image de partie complète. Le bundle Snake GPU ordinaire utilise B3/L64/K4 et met en lot ces trois questions :

hf download aac6fef/laya-multilingual-coreml-snake --local-dir models/snake-gpu
laya-coreml-snake --model ./models/snake-gpu --fps 12

L’étiquette du moteur décrit les unités de calcul Core ML sélectionnées. Le graphe ANE dédié a des preuves distinctes de plan d’exécution et de trace matérielle dans le rapport ANE ; CPU+ANE autorise encore le travail de l’hôte.

Ce que contrôle le modèle

Le code calcule les coups légaux, la progression sûre le long d’un cycle hamiltonien et si la nourriture est accessible à travers les cellules vides. Laya reçoit ces caractéristiques et renvoie des probabilités de direction et booléennes. Le risque affiché est 1 - P(safe route) ; c’est une estimation du modèle, pas une probabilité calibrée de mourir au coup suivant.

Le bouclier de sécurité par défaut restreint les coups exécutés à une progression sûre pour le cycle. L’interface garde visibles les probabilités d’origine du modèle, montre la direction proposée et la direction exécutée, et incrémente un compteur d’interventions visible quand elles diffèrent. --unassisted exécute le top-1 brut du modèle sans ce bouclier. Zéro mort avec le bouclier n’établit pas une intelligence Snake sans assistance ni une survie illimitée.

Enregistrer une vraie partie et exporter des médias partageables

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

Les enregistrements incluent la provenance du modèle, chaque plateau avant l’action annoncée, les vraies probabilités, la latence d’inférence, les horodatages écoulés et un résumé final. L’exportateur réutilise la composition du terminal en direct et préserve le timing à vitesse d’horloge murale d’origine (1×). À l’écran, RECORDED RUN · 1× identifie un replay. Le sidecar enregistre les hashs de la source et du moteur de rendu. Les FPS vidéo échantillonnent l’enregistrement ; ils ne changent pas le nombre de décisions du modèle ni n’accélèrent la lecture.

Les fichiers de sortie doivent être de nouveaux chemins. --max-speed désactive la cadence et attend chaque prédiction neuve avant de bouger. Il ne saute pas d’appels au modèle :

laya-coreml-snake --model ./models/snake --max-speed \
  --duration 20 --record snake-fast.jsonl

Mesurer un débit de décision stable

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

Le benchmark mesure d’abord le comportement sans bouclier et le fonctionnement sans plafond, balaie les débits cibles, puis teste les débits qui passent sur des épisodes plus longs avec plusieurs graines. Réussir exige zéro mort, des sorties finies, l’ordre de cycle et la progression vers la nourriture préservés, et au plus 1% des ticks dépassant le budget de calcul actif.

Le chronométrage inclut la prédiction du modèle, le travail du planificateur, la composition Rich truecolor, la sérialisation ANSI et les mises à jour du jeu. Les tests cadencés incluent de vrais sleeps. Le dessin de l’émulateur de terminal est exclu de ce test de rendu en mémoire. Le résultat est le débit testé le plus élevé qui passe sur cette machine et ces graines, pas un maximum universel. Voir SNAKE_BENCHMARKS.md pour l’exécution de release.