Documentación

Laya Snake: demo de terminal local

Un juego real de Snake impulsado por predicciones de Laya MLX en Apple silicon, con un diseño de terminal pensado para un clip social legible. El panel izquierdo muestra el tablero, la puntuación, la longitud y la mejor puntuación. El panel derecho muestra las cuatro probabilidades de dirección, el movimiento ejecutado, dos estimaciones del modelo, el tiempo de inferencia medido, la tasa de decisiones y el estado local/sin conexión.

Partida real de Snake grabada

Ejecutar

Desde este repositorio en un Mac con Apple silicon:

uv run --extra demo laya-snake

El modelo por defecto es aac6fef/laya-multilingual-mlx, con los pesos FP16 originales. La demo comprueba primero models/hub/laya-multilingual-mlx y models/laya-multilingual, y luego la caché local de Hugging Face. Nunca descarga un modelo que falte durante la partida. En una copia recién clonada, descarga los pesos una vez de antemano:

uv run --extra demo hf download aac6fef/laya-multilingual-mlx \
  --local-dir models/hub/laya-multilingual-mlx
uv run --extra demo laya-snake

Usa una terminal de al menos 104 columnas × 35 filas, con una fuente monoespaciada y color verdadero. Menlo funciona bien en macOS. Una terminal más pequeña pausa el juego hasta que se redimensiona. El tamaño de tablero por defecto es 24 × 16, la longitud inicial es 6 y el objetivo de presentación es 12 decisiones/segundo.

La pantalla en vivo respeta NO_COLOR. Si tu shell lo define, usa env -u NO_COLOR uv run --extra demo laya-snake para la presentación en color. El benchmark activa explícitamente el color verdadero para que este ajuste del entorno no pueda cambiar silenciosamente su carga de trabajo de renderización.

Control Acción
Espacio Pausa / reanuda
↑ / ↓, o + / − Aumenta / reduce el objetivo con ritmo en 2 decisiones/segundo
R Inicia una ronda nueva con la siguiente semilla
Q o Ctrl-C Sale y restaura la terminal

Modos útiles:

# Every move waits for a new inference, with no pacing delay.
uv run --extra demo laya-snake --max-speed

# Optional measured compilation + prefix-reuse path.
uv run --extra demo laya-snake --optimize --max-speed

# Use the fixed computation-budget setting validated on the recorded M3 Max.
uv run --extra demo laya-snake --fps 20

# Execute the model's raw first choice without the execution safety shield.
uv run --extra demo laya-snake --unassisted

# A finite run without a terminal display.
uv run --extra demo laya-snake --headless --steps 600 --max-speed

--model acepta un directorio local o un ID de Hub ya en caché. --width, --height, --seed y --initial-length configuran una partida. Los tableros deben ser al menos de 4 × 4 con una dimensión par, porque el planificador de seguridad usa un ciclo hamiltoniano. Las teclas de velocidad afectan al modo con ritmo; --max-speed avanza siempre en cuanto se completa la decisión actual.

Grabar y exportar

La grabación contiene estados reales del tablero, probabilidades originales del modelo, acciones ejecutadas, tiempos, procedencia del modelo y resúmenes de la ejecución. Cada tablero se empareja con la predicción hecha antes de su siguiente movimiento.

uv run --extra demo laya-snake --fps 12 --duration 100 \
  --record artifacts/snake/run.jsonl

# ffmpeg is required for video export; on macOS: brew install ffmpeg
uv run --extra demo laya-snake export artifacts/snake/run.jsonl \
  --start 65 --seconds 30 --output artifacts/snake/demo.mp4 \
  --gif artifacts/snake/demo.gif

uv run --extra demo laya-snake export artifacts/snake/run.jsonl \
  --start 85 --output artifacts/snake/poster.png

La exportación MP4 usa por defecto 1920 × 1080, 30 fotogramas de vídeo/segundo, H.264 y velocidad de reloj de pared original. Renderiza las mismas celdas de terminal a partir de los datos grabados; es una repetición renderizada, no una captura de pantalla. Una etiqueta visible RECORDED RUN · 1× y un archivo JSON adjunto lo identifican. Exportar a 30 FPS no convierte un juego de 12 decisiones/segundo en uno de 30 decisiones/segundo. En cada marca de tiempo del vídeo, el exportador usa el fotograma de origen real más reciente. Las grabaciones rápidas pueden tener más decisiones de las que la tasa de fotogramas de vídeo elegida puede mostrar.

Usa --headless para grabar sin una terminal conectada. La inferencia del modelo sigue ocurriendo en cada movimiento; se omite el dibujado en vivo de la terminal. Los archivos de salida no se sobrescriben. Inicia una grabación nueva cuando cambies la presentación o la velocidad, en lugar de mezclar pausas o reinicios en un extracto social corto.

El MP4 usa por defecto un extracto de 30 segundos, y --gif exporta sus primeros 15 segundos al mismo ritmo original. Usa --gif-seconds para cambiar la duración del GIF. Los recursos sociales incluidos abarcan ambos formatos más un póster PNG.

Qué hace la IA

Esta es una demo de decisión neuronal asistida por características, que usa el checkpoint existente de Laya sin entrenamiento con Snake. Un planificador determinista describe las direcciones legales, el progreso seguro del ciclo y la conectividad actual de las celdas vacías. Laya recibe esas descripciones, incluida la dirección segura que logra el mayor progreso. Devuelve una distribución sobre UP, DOWN, LEFT y RIGHT. Las barras de probabilidad son esas salidas originales del modelo.

El escudo de seguridad por defecto ejecuta la dirección admisible de mayor probabilidad del modelo. Si la primera elección bruta no es admisible, la UI conserva esa distribución original y marca el movimiento ejecutado con SHIELD; el contador de intervenciones aumenta. La ejecución por defecto se etiqueta como Laya + cycle safety. --unassisted desactiva esa restricción de ejecución; aun así da características del planificador al modelo. Ninguno de los dos modos demuestra que el checkpoint pueda inferir la estrategia de Snake a partir de un tablero sin procesar.

Una llamada a Agent.predict agrupa tres preguntas reales por movimiento:

Pantalla Significado real
NEXT MOVE Probabilidades choice de Laya sobre las cuatro direcciones descritas
DEAD-END RISK 1 − P(safe route available), a partir de una respuesta noul de Laya
FOOD REACHABLE Respuesta noul de Laya sobre el resumen de alcanzabilidad actual de celdas vacías proporcionado
INFERENCE Tiempo de reloj de pared sincronizado de Agent.predict, incluida la tokenización y la conversión de resultados
DECISIONS Tasa medida reciente de decisiones completadas
NETWORK OFFLINE Carga local del checkpoint e inferencia local con el modo sin conexión de Hub; esto no apaga el Wi-Fi del Mac

Las dos estimaciones son salidas del modelo, no probabilidades calibradas de muerte en Snake. La alcanzabilidad actual de celdas vacías también difiere de la alcanzabilidad futura tras mover la cola. El riesgo puede permanecer bajo durante mucho tiempo porque el planificador proporciona una ruta segura. No se sustituyen valores aleatorios ni predicciones pregrabadas durante la partida en vivo.

El escudo de ciclo preserva el orden cíclico del cuerpo y nunca avanza más allá de la cola ni de la comida. Cada acción admitida logra un progreso positivo hacia la comida actual. Para un tablero inicialmente válido, esto da un sucesor seguro disponible y una cota finita de progreso hacia la comida. Las pruebas ejercitan elecciones arbitrarias entre acciones admisibles hasta que el tablero se llena.

Reproducir la prueba de velocidad

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

Usa --resume --output artifacts/snake/benchmark.json para conservar los episodios completados y reanudar la configuración grabada. Cada informe identifica el checkpoint, el prompt, el entorno y el hash del código fuente. Una tasa fallida no necesita más semillas; una tasa que supera la prueba debe completar cada semilla solicitada.

El benchmark mide la inferencia del modelo, la planificación, la composición con Rich, la serialización ANSI en memoria y las actualizaciones del juego. Excluye la carga del modelo, el warmup y el pintado propio del emulador de terminal. Los episodios sin límite miden los movimientos/segundo sostenidos reales. Los episodios con ritmo comprueban por separado si al menos el 99% de los ticks activos caben en el presupuesto de computación solicitado, en cada semilla. El exceso por suspensión del sistema operativo permanece incluido en la tasa alcanzada que se informa.

La ejecución final en color verdadero en M3 Max completó 8,160 decisiones con cero muertes, incluidos 2,400 pasos sin límite a 63.61 pasos/segundo en total. Su mayor ajuste probado de presupuesto de computación que superó la prueba fue 20 FPS, con una tasa con ritmo alcanzada de 18.69–18.94 pasos/segundo. Los ajustes con ritmo más altos no cumplieron el criterio de plazo indicado, mientras que el juego permaneció vivo. Consulta el informe completo del benchmark de Snake para ver los resultados por semilla, las intervenciones y las limitaciones.

Para un clip social, el objetivo por defecto de 12 FPS da tiempo a los espectadores a ver la dirección seleccionada y la puntuación creciente. --max-speed demuestra el rendimiento medido. El vídeo de 30 segundos incluido conserva el ritmo original de su ejecución de origen.