Documentación

Velocidad y estabilidad de Snake: M3 Max

La campaña final en color verdadero completó 8,160 movimientos con cero muertes y 4 intervenciones de seguridad. El modelo por defecto era aac6fef/laya-multilingual-mlx en FP16, con descripciones compactas del planificador, un tablero de 24 × 16 y longitud inicial 6. Estas mediciones usan el runtime eager por defecto; la compilación opt-in se evalúa por separado en Optimización de Snake.

Rendimiento sostenido sin límite: 63.61 movimientos/segundo en total a lo largo de 2,400 pasos. Cada una de las cuatro semillas completó 600 movimientos. Sus tasas oscilaron entre 46.32 y 76.37 movimientos/segundo. Todos los juegos sobrevivieron, mantuvieron el orden cíclico del cuerpo y siguieron alcanzando la comida. La capa de seguridad corrigió 2 propuestas brutas del modelo en estos episodios.

Mayor presupuesto de computación con ritmo marcado que superó la prueba: 20 FPS. Las cuatro semillas cumplieron el requisito de que al menos el 99% de los ticks activos cupiera dentro de 50 ms. La tasa real de reloj de pared, incluido el exceso por suspensión del sistema operativo, fue de 18.69–18.94 movimientos/segundo. Es un ajuste de presupuesto, no una afirmación de exactamente 20 fotogramas renderizados cada segundo.

Velocidad máxima sostenida

Semilla Pasos Pasos/s reales Tick activo p50 / p99 (ms) Puntuación / longitud Intervenciones
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

La inferencia del modelo sin límite combinada p50 / p95 / p99 fue 10.08 / 31.68 / 33.61 ms. El tick activo completo p50 / p99 fue 12.70 / 37.21 ms. Un tick activo incluye planificación, inferencia sincronizada, composición con Rich, serialización ANSI en color verdadero y la actualización del juego. No se inserta ninguna demora de ritmo.

Estabilidad con presupuesto fijo

Semilla FPS objetivo Pasos Pasos/s reales Tick activo p99 (ms) Incumplimientos de presupuesto
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%)

La prueba superada tuvo 6 ticks activos tardíos de 2,400 (99.75% dentro del presupuesto en total). La peor semilla tuvo 6/600 ticks tardíos, exactamente el límite predefinido del 1%. Todos los movimientos esperan un resultado nuevo del modelo, así que una inferencia lenta reduce la tasa del juego en lugar de ejecutar acciones obsoletas.

Barrido corto

Cada candidato de abajo ejecutó 120 movimientos con la semilla 7. Una sonda corta que supera la prueba selecciona un candidato para la prueba larga de cuatro semillas; por sí sola no basta para afirmar estabilidad. Todos los juegos sobrevivieron, incluidas las fallas de tiempos.

FPS objetivo Pasos/s reales Tick activo p99 (ms) Incumplimientos de presupuesto Barrido corto
10.0 9.60 52.13 0.00% supera
12.0 11.39 42.07 0.00% supera
15.0 14.10 48.69 0.00% supera
18.0 16.95 58.10 2.50% falla
20.0 18.84 43.84 0.00% supera
25.0 24.23 45.66 5.83% falla
30.0 28.60 40.04 97.50% falla
35.0 28.69 40.12 100.00% falla
40.0 28.16 44.15 100.00% falla
45.0 26.70 45.56 100.00% falla
50.0 28.67 40.23 100.00% falla
60.0 28.89 40.97 100.00% falla

El barrido corto no es monótono, y la latencia medida cambia considerablemente con el tiempo. Las ejecuciones con ritmo y sin límite difieren en los periodos de inactividad del dispositivo; la actividad normal del escritorio, la planificación y el comportamiento del reloj no se aislaron experimentalmente. Los datos no identifican una única causa ni un techo de velocidad universal. Informamos de la tasa alcanzada, de todas las muestras y del mayor ajuste probado que superó la prueba.

Qué incluye el resultado de estabilidad

Laya recibe características del planificador, incluidas las direcciones legales y el mejor progreso admisible hacia la comida. Calcula probabilidades reales. La capa de seguridad del ciclo puede corregir la ejecución mientras conserva las barras de probabilidad brutas y cuenta cada intervención. El checkpoint no se entrenó con Snake aquí. Significado exacto de las métricas de la UI y comportamiento de la política.

Un control separado de top-1 bruto ejecutó las semillas 101–103 durante 600 movimientos cada una con el escudo de ejecución desactivado. Los tres sobrevivieron; las puntuaciones fueron 9, 24 y 19, frente a 20, 24 y 23 en sus equivalentes con escudo. El control bruto también recibe características del planificador. Su supervivencia en este horizonte no demuestra supervivencia indefinida sin escudo ni razonamiento del tablero sin ayuda.

La demostración publicada es una ejecución TTY real separada de 100.005 segundos, con un objetivo de 12 FPS: 1,144 movimientos, puntuación 40, longitud 46, cero muertes y cero intervenciones. El rendimiento alcanzado fue de 11.44 movimientos/segundo. Cada tablero y acción grabados se verifican mediante repetición determinista en la suite de pruebas. Los números de inferencia visibles provienen de esa ejecución, en lugar de sustituirse por números de benchmark favorables.

Una grabación TTY optimizada independiente a velocidad máxima completó 1,296 movimientos en 20.01 segundos (64.77 movimientos/segundo), con puntuación 44, longitud 50, cero muertes y cero intervenciones. Esto incluye las escrituras reales del flujo de terminal. Su vídeo de 15 segundos a velocidad original y su grabación completa se incluyen junto al clip de presentación más lento.

Límites de medición y procedencia

  • Apple M3 Max, 40 núcleos de GPU, 128 GiB de memoria unificada; 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.
  • Pesos FP16 originales, sin cuantización ni kernel personalizado. Revisión del modelo upstream: 052592a15d198d9ad47da779604259b10b47b7aa.
  • SHA-256 de los pesos del manifiesto publicado y verificado previamente: 7fc5834af4d8fdfb268d272a9d1a66e5819a0daac98241651c4c888cc43adff1.
  • Cada movimiento llama a Agent.predict una vez con tres preguntas agrupadas en lote. La medición de la inferencia incluye tokenización, evaluación MLX sincronizada y conversión de salida.
  • El benchmark activa explícitamente el color verdadero, con independencia de NO_COLOR, y serializa la salida de Rich en un flujo en memoria. Se excluyen el pintado de pantalla del emulador de terminal, la carga del modelo y el warmup. Los controles reales de terminal y la limpieza se probaron por separado.
  • El informe almacena la configuración, el entorno, la huella del código fuente y cada probabilidad por paso, decisión de ejecución y medición de tiempos. La adición posterior de una etiqueta de tokens de salida y de la optimización opt-in no cambia el modelo base ni la política del juego.

Las ejecuciones anteriores se conservan

Las primeras campañas de prompt detallado y prompt compacto heredaron NO_COLOR=1 del entorno de la herramienta. Midieron la serialización monocroma y se conservan como resultados exploratorios, en lugar de sustituirse por el benchmark final en color. La campaña compacta anterior completó 12,360 movimientos sin ninguna muerte y midió 52.55 movimientos/segundo sin límite en total; su mayor presupuesto probado que superó la prueba fue 18 FPS. La diferencia con la ejecución final no se atribuye a haber activado el color: los tiempos de la máquina varían sustancialmente.

La prueba de resistencia de 20 FPS con prompt detallado no cumplió su criterio de tiempos en las cuatro semillas, mientras que todos los juegos sobrevivieron. También se conservan los fallos a tasas más altas de la campaña compacta anterior. No se ha eliminado ningún episodio completado fallido de esos archivos.

Archivos y reproducción

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

Usa --resume con la misma ruta de salida tras una interrupción. La presentación en vivo usa por defecto un objetivo legible de 12 FPS; --max-speed mide la tasa de decisión continua actual.