Documentação

Laya Snake: demo de terminal local

Um jogo Snake de verdade guiado por previsões do Laya MLX em Apple silicon, com um layout de terminal projetado para um clipe social legível. O painel esquerdo mostra o tabuleiro, a pontuação, o comprimento e a melhor pontuação. O painel direito mostra quatro probabilidades de direção, o movimento executado, duas estimativas do modelo, o tempo de inferência medido, a taxa de decisões e o status local/offline.

Execução real gravada do Snake

Execução

A partir deste repositório, em um Mac com Apple silicon:

uv run --extra demo laya-snake

O modelo padrão é aac6fef/laya-multilingual-mlx, usando os pesos FP16 originais. A demo primeiro verifica models/hub/laya-multilingual-mlx e models/laya-multilingual, depois o cache local do Hugging Face. Ela nunca baixa um modelo ausente durante o jogo. Em um checkout novo, baixe os pesos uma vez antes:

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

Use um terminal com pelo menos 104 colunas × 35 linhas, com fonte monoespaçada e true color. Menlo funciona bem no macOS. Um terminal menor pausa o jogo até ser redimensionado. O tamanho padrão do tabuleiro é 24 × 16, o comprimento inicial é 6 e a meta de apresentação é 12 decisões/segundo.

A exibição ao vivo respeita NO_COLOR. Se o seu shell o define, use env -u NO_COLOR uv run --extra demo laya-snake para a apresentação colorida. O benchmark ativa explicitamente o true color, para que essa configuração de ambiente não altere silenciosamente sua carga de trabalho de renderização.

Controle Ação
Espaço Pausa / retoma
↑ / ↓, ou + / − Aumenta / diminui a meta com cadência em 2 decisões/segundo
R Inicia uma nova rodada com a próxima seed
Q ou Ctrl-C Encerra e restaura o terminal

Modos úteis:

# 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 aceita um diretório local ou um ID do Hub já em cache. --width, --height, --seed e --initial-length configuram uma execução. Os tabuleiros devem ter pelo menos 4 × 4 com uma dimensão par, porque o planejador de segurança usa um ciclo hamiltoniano. As teclas de velocidade afetam o modo com cadência; --max-speed sempre avança assim que a decisão atual termina.

Gravar e exportar

A gravação contém estados reais do tabuleiro, probabilidades originais do modelo, ações executadas, tempos, proveniência do modelo e resumos da execução. Cada tabuleiro é pareado com a previsão feita antes de seu próximo movimento.

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

A exportação de MP4 usa por padrão 1920 × 1080, 30 quadros de vídeo/segundo, H.264 e velocidade de relógio de parede original. Ela renderiza as mesmas células de terminal a partir dos dados gravados; é uma reprodução renderizada, e não uma captura de tela. Um rótulo visível RECORDED RUN · 1× e um sidecar JSON identificam isso. Exportar a 30 FPS não transforma um jogo de 12 decisões/segundo em um de 30 decisões/segundo. Em cada carimbo de tempo do vídeo, o exportador usa o quadro de origem real mais recente. Gravações rápidas podem ter mais decisões do que a taxa de quadros escolhida consegue exibir.

Use --headless ao gravar sem um terminal anexado. A inferência do modelo continua acontecendo a cada movimento; o desenho ao vivo do terminal é omitido. Os arquivos de saída não são sobrescritos. Inicie uma nova gravação ao mudar a apresentação ou a velocidade, em vez de misturar pausas ou reinícios em um trecho social curto.

O MP4 usa por padrão um trecho de 30 segundos, e --gif exporta seus primeiros 15 segundos no mesmo ritmo original. Use --gif-seconds para mudar a duração do GIF. Os ativos sociais fornecidos incluem os dois formatos mais um pôster PNG.

O que a IA faz

Esta é uma demo de decisão neural assistida por features, usando o checkpoint Laya existente sem treinamento em Snake. Um planejador determinístico descreve direções legais, progresso seguro no ciclo e conectividade atual de células vazias. O Laya recebe essas descrições, incluindo qual direção segura faz o maior progresso. Ele retorna uma distribuição sobre UP, DOWN, LEFT e RIGHT. As barras de probabilidade são essas saídas originais do modelo.

O escudo de segurança padrão executa a direção admissível de maior probabilidade do modelo. Se a primeira escolha bruta for inadmissível, a UI mantém essa distribuição original e marca o movimento executado com SHIELD; o contador de intervenções aumenta. A execução padrão é rotulada Laya + cycle safety. --unassisted desativa essa restrição de execução; ainda fornece ao modelo as features do planejador. Nenhum dos modos estabelece que o checkpoint consegue inferir a estratégia do Snake a partir de um tabuleiro não processado.

Uma chamada de Agent.predict agrupa três perguntas reais por movimento:

Exibição Significado real
NEXT MOVE probabilidades choice do Laya sobre as quatro direções descritas
DEAD-END RISK 1 − P(safe route available), a partir de uma resposta noul do Laya
FOOD REACHABLE resposta noul do Laya sobre o resumo de alcançabilidade das células vazias atuais fornecido
INFERENCE tempo de relógio de parede sincronizado do Agent.predict, incluindo tokenização e conversão do resultado
DECISIONS taxa recente medida de decisões concluídas
NETWORK OFFLINE carregamento local do checkpoint e inferência local com o modo offline do Hub; isto não desliga o Wi-Fi do Mac

As duas estimativas são saídas do modelo, não probabilidades calibradas de morte no Snake. A alcançabilidade atual das células vazias também difere da alcançabilidade futura após a cauda se mover. O risco pode permanecer baixo por muito tempo porque o planejador fornece uma rota segura. Nenhum valor aleatório ou previsão pré-gravada é substituído durante o jogo ao vivo.

O escudo de ciclo preserva a ordem cíclica do corpo e nunca avança além da cauda ou da comida. Toda ação admitida faz progresso positivo rumo à comida atual. Para um tabuleiro inicialmente válido, isso dá um sucessor seguro disponível e um limite finito de progresso rumo à comida. Os testes exercitam escolhas arbitrárias entre ações admissíveis até um tabuleiro ficar cheio.

Reproduza o teste de velocidade

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

Use --resume --output artifacts/snake/benchmark.json para manter os episódios concluídos e retomar a configuração gravada. Cada relatório identifica o checkpoint, o prompt, o ambiente e o hash da origem. Uma taxa reprovada não precisa de mais seeds; uma taxa aprovada precisa concluir toda seed solicitada.

O benchmark mede inferência do modelo, planejamento, composição com Rich, serialização ANSI em memória e atualizações do jogo. Ele exclui carregamento do modelo, warmup e a pintura do próprio emulador de terminal. Episódios sem teto medem os movimentos/segundo sustentados reais. Episódios com cadência verificam separadamente se pelo menos 99% dos ticks ativos cabem no orçamento de computação solicitado, em cada seed. O excesso por suspensão do SO continua incluído na taxa alcançada relatada.

A execução final truecolor no M3 Max concluiu 8,160 decisões com zero mortes, incluindo 2,400 passos sem teto a 63.61 passos/segundo no geral. Sua maior configuração de orçamento de computação testada e aprovada foi 20 FPS, com uma taxa com cadência alcançada de 18.69–18.94 passos/segundo. Configurações com cadência mais alta falharam no critério de prazo declarado, enquanto o jogo permanecia vivo. Veja o relatório completo do benchmark do Snake para resultados por seed, intervenções e limitações.

Para um clipe social, a meta padrão de 12 FPS dá aos espectadores tempo para ver a direção selecionada e a pontuação crescente. --max-speed demonstra a vazão medida. O vídeo de 30 segundos incluído preserva o ritmo original de sua execução de origem.