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.