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.