Benchmark de release de Snake Core ML
La démo ANE FP16 a soutenu 49.1–50.0 décisions fraîches/s sur trois épisodes de 600 pas sans plafond, avec zéro mort. Son débit groupé était de 49.66/s. Chaque coup inclut trois questions de modèle séquentielles, le travail du planificateur et la sérialisation terminal truecolor. C’est la boucle de jeu active complète, pas le microbenchmark séparé à une seule question de ~5 ms.
Pour un fonctionnement cadencé, 20 décisions/s demandées était le réglage testé le plus élevé à passer le critère d’échéance de calcul actif. Le débit d’horloge murale observé était de 18.39–18.42/s, incluant le vrai sleep et la surcharge d’ordonnancement. Ce résultat n’établit pas un affichage parfaitement synchronisé à 20 FPS. L’enregistrement du README utilise 12 décisions/s demandées pour la lisibilité, en observant 11.39/s dans son vrai terminal.
Environnement et méthode
- Apple M3 Max, GPU 40 cœurs, 128 GiB, macOS 27.2, Python 3.12.13.
- Wheel
laya-coreml==0.1.0installée dans un environnement neuf ; Core ML Tools 9.0, NumPy 2.1.3, Rich 15.0.0 ; aucun Torch, MLX ou Transformers installé. - Bundle public ANE FP16 à la révision
39d6a9b3d0f67f06da74fbade6121ea134cbdb21, téléchargé avant l’exécution. - B1/L96/K32, trois questions séquentielles par décision de jeu, prompt compact, plateau 24×16, six cellules initiales de serpent. Vingt décisions d’échauffement exclues.
- Couche de sécurité de cycle visible par défaut ; le top-1 brut est aussi mesuré séparément.
predictsynchrone, caractéristiques de jeu, composition Rich, sérialisation ANSI truecolor et mise à jour du jeu inclus. Chargement, échauffement et dessin de l’émulateur de terminal exclus. Les exécutions cadencées incluent de vrais appelssleep.
Réussir exige des sorties finies, zéro mort, l’ordre de cycle et la progression vers la nourriture préservés, plus au plus 1% des ticks actifs dépassant le budget de temps demandé dans chaque épisode cadencé. Le mode sans plafond attend une prédiction fraîche à chaque coup et n’a pas d’échéance fixe. Aucun autre benchmark de modèle n’a tourné en parallèle.
Le runtime, le checkpoint, le hash du paquet, le hash du prompt et les mesures par tick sont consignés dans coreml-snake.json.
Stabilité sans plafond
| Graine | Coups | Décisions/s observées | Score / longueur finale | Morts | Interventions de sécurité |
|---|---|---|---|---|---|
| 101 | 600 | 49.10 | 20 / 26 | 0 | 1 |
| 102 | 600 | 49.89 | 24 / 30 | 0 | 0 |
| 103 | 600 | 49.99 | 23 / 29 | 0 | 1 |
Sur ces 1,800 décisions, la latence de l’API à trois questions était de 16.32 ms P50 / 21.33 ms P95. La latence complète par tick actif était de 19.07 ms P50 / 25.96 ms P95. C’est une preuve de survie bornée avec assistance explicite, pas l’affirmation que le modèle peut jouer indéfiniment sans couche de sécurité.
Balayage cadencé et confirmation
Chaque balayage utilise la graine 7 sur 120 coups. Les débits échoués sont conservés :
| Décisions/s demandées | Décisions/s observées | Dépassements d’échéance active | Résultat |
|---|---|---|---|
| 20 | 18.55 | 0.83% | Réussi ; confirmé ci-dessous |
| 30 | 28.67 | 10.83% | Échec |
| 40 | 37.22 | 37.50% | Échec |
| 50 | 44.21 | 53.33% | Échec |
| 60 | 50.68 | 100.00% | Échec |
Confirmation plus longue au réglage 20/s :
| Graine | Coups | Décisions/s observées | Dépassements d’échéance active | Score | Résultat |
|---|---|---|---|---|---|
| 101 | 600 | 18.39 | 4 / 600, 0.67% | 20 | Réussi |
| 102 | 600 | 18.42 | 4 / 600, 0.67% | 24 | Réussi |
| 103 | 600 | 18.42 | 3 / 600, 0.50% | 23 | Réussi |
L’API à trois questions était d’environ 26.3 ms P50 dans ces épisodes cadencés, contre 16.3 ms pendant les épisodes sans plafond. L’expérience établit une différence dépendante de la cadence, mais n’en isole pas la cause. L’ordonnancement et les transitions d’état d’alimentation de l’appareil sont des explications possibles qui nécessitent un profilage séparé ; elles ne sont pas prouvées par ce rapport. Un résultat de débit soutenu ne doit donc pas être présenté comme une garantie d’échéance à image fixe.
Top-1 brut et l’enregistrement partageable
Bouclier de sécurité désactivé, les graines 101/102/103 ont chacune terminé 200 coups, avec des scores 7/6/7 et zéro mort. Le modèle reçoit toujours les mêmes caractéristiques exactes de planificateur, donc ces exécutions ne testent pas le raisonnement à partir d’un plateau non traité. Elles n’établissent pas non plus de survie sur une longue partie.
Sur tous les modes de benchmark, il y a eu 4,920 décisions, zéro mort et quatre interventions de sécurité. Séparément, la vitrine en vrai terminal a enregistré 855 décisions sur 75.034 secondes, score final 26, longueur 32, zéro mort et zéro intervention. Ses horodatages, états et actions d’origine sont testés par rejeu déterministe exact. Voir LAUNCH.md pour le GIF, le MP4 et la provenance.
Reproduire
pip install 'laya-coreml[demo]==0.1.0'
hf download aac6fef/laya-multilingual-coreml-ane \
--revision 39d6a9b3d0f67f06da74fbade6121ea134cbdb21 \
--local-dir models/ane
laya-coreml-snake benchmark --model ./models/ane \
--rates 20,30,40,50,60 --sweep-steps 120 --soak-steps 600 \
--seeds 101,102,103 --raw-steps 200 --output snake-benchmark.json
Pour jouer au débit non contraint observé, utilise
laya-coreml-snake --model ./models/ane --max-speed. Le dessin réel dans le terminal peut
réduire le débit par rapport au benchmark de sérialisation. Le bundle Snake GPU séparé met
en lot les trois questions ; ce rapport de release ne mesure que le bundle ANE FP16. Les
comparaisons de modèles appariées historiques restent dans
ANE_BENCHMARKS.md et BENCHMARKS.md.