Documentación

Core ML Snake: probabilidades en vivo, inferencia local

La demo de terminal ejecuta un modelo Laya real en cada movimiento. El panel izquierdo muestra el tablero, la puntuación y la longitud de la serpiente; el panel derecho muestra las probabilidades de dirección, el riesgo estimado de callejón sin salida, la accesibilidad de la comida, el tiempo de predicción medido, el motor, los cero tokens de salida y el estado de la inferencia sin conexión.

Empezar en un Mac con 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

Usa un terminal de al menos 104 columnas × 35 filas con una fuente monoespaciada y compatibilidad con truecolor. La carga del modelo y la compilación inicial de Core ML ocurren antes de que empiece el juego y pueden tardar decenas de segundos en la primera ejecución. Doce decisiones por segundo es una velocidad de presentación legible, no un máximo de hardware.

La ruta del modelo es totalmente local después de la descarga explícita. Iniciar el juego con un ID del Hub sin caché falla con instrucciones en lugar de descargar mientras muestra OFFLINE. El runtime no necesita MLX, PyTorch ni Transformers.

Control Acción
Espacio Pausar o reanudar
Arriba / Abajo, o + / - Aumentar o reducir el ritmo de decisión
R Iniciar la siguiente ronda con semilla
Q / Ctrl-C Salir y restaurar el terminal

La interfaz espera cuando el terminal es demasiado pequeño. --no-alt-screen deja el último fotograma en el scrollback; --headless ejecuta el mismo modelo/juego sin la pantalla.

Dos opciones de despliegue

El paquete ANE por defecto tiene lote uno y longitud 96. Cada paso de juego responde tres preguntas de forma secuencial. Su benchmark de ~5 ms para una sola pregunta no es un tiempo de fotograma del juego completo. El paquete ordinario Snake GPU usa B3/L64/K4 y procesa esas tres preguntas por lotes:

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

La etiqueta del motor describe las unidades de cómputo de Core ML seleccionadas. El grafo ANE dedicado tiene evidencia separada de plan de ejecución y de traza de hardware en el informe de ANE; CPU+ANE sigue permitiendo trabajo del host.

Qué controla el modelo

El código calcula los movimientos legales, el progreso seguro a lo largo de un ciclo hamiltoniano y si se puede llegar a la comida a través de celdas vacías. Laya recibe estas características y devuelve probabilidades de dirección y booleanas. El riesgo mostrado es 1 - P(safe route); es una estimación del modelo, no una probabilidad calibrada de morir en el siguiente movimiento.

El escudo de seguridad por defecto restringe los movimientos ejecutados al progreso seguro dentro del ciclo. La interfaz mantiene visibles las probabilidades originales del modelo, muestra la dirección propuesta y la ejecutada, e incrementa un contador de intervenciones visible cuando difieren. --unassisted ejecuta el top-1 bruto del modelo sin este escudo. Las cero muertes con el escudo no demuestran inteligencia de Snake sin ayuda ni supervivencia ilimitada.

Grabar una ejecución real y exportar contenido multimedia compartible

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

Las grabaciones incluyen la procedencia del modelo, cada tablero antes de la acción anunciada, probabilidades reales, latencia de inferencia, marcas de tiempo transcurridas y un resumen final. El exportador reutiliza la composición del terminal en vivo y preserva el tiempo de reloj de 1×. El texto en pantalla RECORDED RUN · 1× identifica una repetición. El archivo sidecar registra hashes de la fuente y del renderizador. Los FPS del vídeo muestrean la grabación; no cambian el número de decisiones del modelo ni aceleran la reproducción.

Los archivos de salida deben ser rutas nuevas. --max-speed desactiva el ritmo y espera cada predicción nueva antes de moverse. No se salta llamadas al modelo:

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

Medir un ritmo de decisión estable

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

El benchmark mide primero el comportamiento sin escudo y la operación sin límite, barre ritmos objetivo y luego prueba los ritmos que pasan en episodios más largos con varias semillas. Para pasar se exige cero muertes, salidas finitas, orden de ciclo y progreso de comida preservados, y como máximo un 1% de ticks que superen el presupuesto de cómputo activo.

La medición incluye la predicción del modelo, el trabajo del planificador, la composición Rich en truecolor, la serialización ANSI y las actualizaciones del juego. Las pruebas pautadas incluyen sleeps reales. El pintado del emulador de terminal queda excluido de esta prueba de renderizado en memoria. El resultado es el ritmo probado que pasa más alto en esta máquina y con estas semillas, no un máximo universal. Consulta SNAKE_BENCHMARKS.md para la ejecución de la versión.