Documentation

Vitesse et stabilité de Snake : M3 Max

La campagne truecolor finale a terminé 8,160 coups avec zéro mort et 4 interventions de sécurité. Le modèle par défaut était aac6fef/laya-multilingual-mlx en FP16, avec des descriptions compactes du planificateur, un plateau 24 × 16 et une longueur initiale de 6. Ces mesures utilisent le runtime eager par défaut ; la compilation optionnelle est évaluée séparément dans Optimisation de Snake.

Débit non plafonné soutenu : 63.61 coups/seconde au total sur 2,400 pas. Chacune des quatre graines a terminé 600 coups. Leurs fréquences allaient de 46.32 à 76.37 coups/seconde. Chaque partie a survécu, a maintenu l’ordre cyclique du corps et a continué d’atteindre la nourriture. La couche de sécurité a corrigé 2 propositions brutes du modèle dans ces épisodes.

Plus haut budget de calcul cadencé testé en réussite : 20 FPS. Les quatre graines ont satisfait l’exigence qu’au moins 99% des ticks actifs tiennent dans 50 ms. La fréquence réelle à l’horloge murale, dépassement dû à la mise en veille de l’OS inclus, était de 18.69–18.94 coups/seconde. C’est un réglage de budget, non une revendication de 20 images rendues exactement chaque seconde.

Vitesse maximale soutenue

Graine Pas Pas/s réels Tick actif p50 / p99 (ms) Score / longueur Interventions
101 600 46.32 15.52 / 39.67 20 / 26 1
102 600 67.91 13.84 / 22.96 24 / 30 0
103 600 74.20 12.27 / 21.42 23 / 29 1
104 600 76.37 11.98 / 21.00 16 / 22 0

L’inférence du modèle non plafonnée combinée p50 / p95 / p99 était de 10.08 / 31.68 / 33.61 ms. Le tick actif complet p50 / p99 était de 12.70 / 37.21 ms. Un tick actif inclut la planification, l’inférence synchronisée, la composition Rich, la sérialisation ANSI en truecolor et la mise à jour du jeu. Aucun délai de cadence n’est inséré.

Stabilité à budget fixe

Graine FPS cible Pas Pas/s réels Tick actif p99 (ms) Dépassements de budget
101 20.0 600 18.69 39.93 0 (0.00%)
102 20.0 600 18.86 45.09 0 (0.00%)
103 20.0 600 18.94 48.66 6 (1.00%)
104 20.0 600 18.85 44.53 0 (0.00%)

Le test en réussite avait 6 ticks actifs en retard sur 2,400 (99.75% dans le budget au total). La pire graine avait 6/600 ticks en retard, exactement la limite prédéfinie de 1%. Tous les coups attendent un nouveau résultat du modèle, donc une inférence lente réduit la fréquence du jeu au lieu d’exécuter des actions périmées.

Balayage court

Chaque candidat ci-dessous a tourné 120 coups avec la graine 7. Une sonde courte en réussite sélectionne un candidat pour le test plus long à quatre graines ; elle ne suffit pas à elle seule à revendiquer la stabilité. Toutes les parties ont survécu, y compris les échecs de timing.

FPS cible Pas/s réels Tick actif p99 (ms) Dépassements de budget Balayage court
10.0 9.60 52.13 0.00% réussi
12.0 11.39 42.07 0.00% réussi
15.0 14.10 48.69 0.00% réussi
18.0 16.95 58.10 2.50% échec
20.0 18.84 43.84 0.00% réussi
25.0 24.23 45.66 5.83% échec
30.0 28.60 40.04 97.50% échec
35.0 28.69 40.12 100.00% échec
40.0 28.16 44.15 100.00% échec
45.0 26.70 45.56 100.00% échec
50.0 28.67 40.23 100.00% échec
60.0 28.89 40.97 100.00% échec

Le balayage court est non monotone, et la latence mesurée change considérablement au fil du temps. Les exécutions cadencées et non plafonnées diffèrent par les périodes d’inactivité de l’appareil ; l’activité normale du bureau, l’ordonnancement et le comportement de l’horloge n’ont pas été isolés expérimentalement. Les données n’identifient pas une cause unique ni un plafond de vitesse universel. Nous rapportons la fréquence atteinte, tous les échantillons et le réglage testé en réussite le plus élevé.

Ce que le résultat de stabilité inclut

Laya reçoit les caractéristiques du planificateur, y compris les directions légales et la meilleure progression admissible vers la nourriture. Elle calcule de vraies probabilités. La couche de sécurité de cycle peut corriger l’exécution tout en conservant les barres de probabilité brutes et en comptant chaque intervention. Le checkpoint n’a pas été entraîné sur Snake ici. Signification exacte des métriques de l’interface et comportement de la politique.

Un contrôle brut top-1 distinct a tourné sur les graines 101–103 pour 600 coups chacune, bouclier d’exécution désactivé. Les trois ont survécu ; les scores étaient de 9, 24 et 19, contre 20, 24 et 23 dans les contreparties protégées. Le contrôle brut fournit encore les caractéristiques du planificateur. Sa survie sur cet horizon n’établit pas une survie indéfinie sans bouclier ni un raisonnement sans assistance sur le plateau.

La démonstration publiée est une exécution TTY réelle distincte de 100.005 secondes, à une cible de 12 FPS : 1,144 coups, score 40, longueur 46, zéro mort et zéro intervention. Le débit atteint était de 11.44 coups/seconde. Chaque plateau et chaque action enregistrés sont vérifiés par un replay déterministe dans la suite de tests. Les chiffres d’inférence visibles proviennent de cette exécution, plutôt que d’être remplacés par des chiffres de benchmark favorables.

Un enregistrement TTY à vitesse maximale optimisé distinct a terminé 1,296 coups en 20.01 secondes (64.77 coups/seconde), avec un score de 44, une longueur de 50, zéro mort et zéro intervention. Cela inclut les écritures réelles du flux de terminal. Sa vidéo de 15 secondes à vitesse d’origine et son enregistrement complet sont inclus aux côtés du clip de présentation plus lent.

Frontières de mesure et provenance

  • Apple M3 Max, 40 cœurs GPU, 128 GiB de mémoire unifiée ; macOS 27.2, Python 3.12.13.
  • MLX 0.32.2, NumPy 2.5.3, Rich 15.0.0, tokenizers 0.23.2, huggingface-hub 1.32.0.
  • Poids FP16 d’origine, sans quantization ni kernel personnalisé. Révision du modèle en amont : 052592a15d198d9ad47da779604259b10b47b7aa.
  • SHA-256 des poids issu du manifeste publié précédemment vérifié : 7fc5834af4d8fdfb268d272a9d1a66e5819a0daac98241651c4c888cc43adff1.
  • Chaque coup appelle Agent.predict une fois avec trois questions mises en lot. Le temps d’inférence inclut la tokenisation, l’évaluation MLX synchronisée et la conversion de sortie.
  • Le benchmark active explicitement la truecolor, indépendamment de NO_COLOR, et sérialise la sortie Rich dans un flux en mémoire. Le rendu à l’écran de l’émulateur de terminal, le chargement du modèle et le warmup sont exclus. Les contrôles et le nettoyage réels du terminal ont été testés séparément.
  • Le rapport stocke la configuration, l’environnement, l’empreinte source et chaque probabilité par pas, chaque décision d’exécution et chaque temps. L’ajout ultérieur d’un label de token de sortie et d’une optimisation optionnelle ne change ni le modèle de référence ni la politique de jeu.

Les exécutions antérieures sont conservées

Les premières campagnes à prompt détaillé et à prompt compact héritaient de NO_COLOR=1 depuis l’environnement de l’outil. Elles ont mesuré une sérialisation monochrome et sont conservées comme résultats exploratoires, plutôt que substituées au benchmark couleur final. La campagne compacte antérieure a terminé 12,360 coups sans mort et a mesuré 52.55 coups/seconde non plafonnés au total ; son plus haut budget testé en réussite était de 18 FPS. La différence avec l’exécution finale n’est pas attribuée à l’activation de la couleur : les temps de la machine varient considérablement.

Le soak à 20 FPS du prompt détaillé a échoué à son critère de timing sur les quatre graines, tandis que chaque partie a survécu. Les échecs aux fréquences plus élevées de la campagne compacte antérieure sont aussi conservés. Aucun épisode terminé en échec n’a été retiré de ces fichiers.

Fichiers et reproduction

uv run --extra demo laya-snake benchmark \
  --rates 10,12,15,18,20,25,30,35,40,45,50,60 \
  --raw-steps 600 --sweep-steps 120 --soak-steps 600 \
  --seeds 101,102,103,104 --output artifacts/snake/benchmark.json

Utilise --resume avec le même chemin de sortie après une interruption. La présentation en direct est par défaut à une cible lisible de 12 FPS ; --max-speed mesure la fréquence de décision continue actuelle.