Documentação

Velocidade e estabilidade do Snake: M3 Max

A campanha final truecolor concluiu 8,160 movimentos com zero mortes e 4 intervenções de segurança. O modelo padrão era aac6fef/laya-multilingual-mlx em FP16, com descrições compactas do planejador, um tabuleiro 24 × 16 e comprimento inicial 6. Essas medições usam o runtime eager padrão; a compilação opt-in é avaliada separadamente em Otimização do Snake.

Vazão sustentada sem teto: 63.61 movimentos/segundo no geral em 2,400 passos. Cada uma das quatro seeds completou 600 movimentos. Suas taxas variaram de 46.32 a 76.37 movimentos/segundo. Todos os jogos sobreviveram, mantiveram a ordem cíclica do corpo e continuaram alcançando a comida. A camada de segurança corrigiu 2 propostas brutas do modelo nesses episódios.

Maior orçamento de computação com cadência testado e aprovado: 20 FPS. Todas as quatro seeds cumpriram o requisito de que pelo menos 99% dos ticks ativos caberiam dentro de 50 ms. A taxa real de relógio de parede, incluindo o excesso por suspensão do SO, foi de 18.69–18.94 movimentos/segundo. Esta é uma configuração de orçamento, não uma alegação de exatamente 20 quadros renderizados por segundo.

Velocidade máxima sustentada

Seed Passos Passos/s reais Tick ativo p50 / p99 (ms) Pontuação / comprimento Intervenções
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

Combinados, os p50 / p95 / p99 de inferência do modelo sem teto foram 10.08 / 31.68 / 33.61 ms. O p50 / p99 completo do tick ativo foi 12.70 / 37.21 ms. Um tick ativo inclui planejamento, inferência sincronizada, composição com Rich, serialização ANSI truecolor e a atualização do jogo. Nenhum atraso de cadência é inserido.

Estabilidade com orçamento fixo

Seed FPS alvo Passos Passos/s reais Tick ativo p99 (ms) Perdas de orçamento
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%)

O teste aprovado teve 6 ticks ativos atrasados em 2,400 (99.75% dentro do orçamento no geral). A pior seed teve 6/600 ticks atrasados, exatamente o limite predefinido de 1%. Todos os movimentos esperam um resultado novo do modelo, então uma inferência lenta reduz a taxa do jogo em vez de executar ações desatualizadas.

Varredura curta

Cada candidato abaixo rodou 120 movimentos com a seed 7. Uma sonda curta aprovada seleciona um candidato para o teste mais longo de quatro seeds; por si só, ela não basta para afirmar estabilidade. Todos os jogos sobreviveram, incluindo as falhas de tempo.

FPS alvo Passos/s reais Tick ativo p99 (ms) Perdas de orçamento Varredura curta
10.0 9.60 52.13 0.00% aprovado
12.0 11.39 42.07 0.00% aprovado
15.0 14.10 48.69 0.00% aprovado
18.0 16.95 58.10 2.50% reprovado
20.0 18.84 43.84 0.00% aprovado
25.0 24.23 45.66 5.83% reprovado
30.0 28.60 40.04 97.50% reprovado
35.0 28.69 40.12 100.00% reprovado
40.0 28.16 44.15 100.00% reprovado
45.0 26.70 45.56 100.00% reprovado
50.0 28.67 40.23 100.00% reprovado
60.0 28.89 40.97 100.00% reprovado

A varredura curta é não monotônica, e a latência medida varia consideravelmente ao longo do tempo. Execuções com cadência e sem teto diferem nos períodos de ociosidade do dispositivo; atividade normal da área de trabalho, agendamento e comportamento do relógio não foram isolados experimentalmente. Os dados não identificam uma única causa nem um teto universal de velocidade. Relatamos a taxa alcançada, todas as amostras e a maior configuração testada aprovada.

O que o resultado de estabilidade inclui

O Laya recebe features do planejador, incluindo direções legais e o melhor progresso admissível rumo à comida. Ele calcula probabilidades reais. A camada de segurança de ciclo pode corrigir a execução, mantendo as barras de probabilidade brutas e contando cada intervenção. O checkpoint não foi treinado em Snake aqui. Significados exatos das métricas da UI e comportamento da política.

Um controle separado de top-1 bruto rodou as seeds 101–103 por 600 movimentos cada, com o escudo de execução desativado. Os três sobreviveram; as pontuações foram 9, 24 e 19, em comparação com 20, 24 e 23 nas contrapartes com escudo. O controle bruto ainda fornece features do planejador. Sua sobrevivência nesse horizonte não estabelece sobrevivência indefinida sem escudo nem raciocínio de tabuleiro sem auxílio.

A demonstração publicada é uma execução real de 100.005 segundos em TTY, separada, com meta de 12 FPS: 1,144 movimentos, pontuação 40, comprimento 46, zero mortes e zero intervenções. A vazão alcançada foi de 11.44 movimentos/segundo. Cada tabuleiro e ação gravados são conferidos por replay determinístico na suíte de testes. Os números de inferência visíveis vêm dessa execução, em vez de serem substituídos por números de benchmark favoráveis.

Uma gravação separada otimizada em velocidade máxima no TTY concluiu 1,296 movimentos em 20.01 segundos (64.77 movimentos/segundo), com pontuação 44, comprimento 50, zero mortes e zero intervenções. Isto inclui as escritas reais do fluxo de terminal. Seu vídeo de 15 segundos em velocidade original e a gravação completa são incluídos ao lado do clipe de apresentação mais lento.

Fronteiras de medição e proveniência

  • Apple M3 Max, 40 núcleos de GPU, 128 GiB de memória 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 originais, sem quantização nem kernel personalizado. Revisão do modelo upstream: 052592a15d198d9ad47da779604259b10b47b7aa.
  • SHA-256 dos pesos do manifesto publicado e verificado anteriormente: 7fc5834af4d8fdfb268d272a9d1a66e5819a0daac98241651c4c888cc43adff1.
  • Cada movimento chama Agent.predict uma vez com três perguntas agrupadas em lote. A medição de tempo da inferência inclui tokenização, avaliação MLX sincronizada e conversão da saída.
  • O benchmark ativa explicitamente o true color, independentemente de NO_COLOR, e serializa a saída do Rich em um fluxo em memória. A pintura de tela do emulador de terminal, o carregamento do modelo e o warmup ficam de fora. Controles reais de terminal e limpeza foram testados separadamente.
  • O relatório armazena configuração, ambiente, impressão digital da origem e cada probabilidade por passo, decisão de execução e tempo. A adição posterior de um rótulo de tokens de saída e da otimização opt-in não altera o modelo de linha de base nem a política do jogo.

Execuções anteriores são mantidas

As primeiras campanhas com prompt detalhado e prompt compacto herdaram NO_COLOR=1 do ambiente da ferramenta. Elas mediram serialização monocromática e são mantidas como resultados exploratórios, em vez de substituírem o benchmark final colorido. A campanha compacta anterior completou 12,360 movimentos sem morte e mediu 52.55 movimentos/segundo sem teto no geral; seu maior orçamento testado e aprovado foi 18 FPS. A diferença em relação à execução final não é atribuída a ativar cor: os tempos da máquina variam substancialmente.

O soak de 20 FPS com prompt detalhado falhou no critério de tempo em todas as quatro seeds, enquanto todos os jogos sobreviveram. As falhas de taxa mais alta da campanha compacta anterior também são mantidas. Nenhum episódio concluído e reprovado foi removido desses arquivos.

Arquivos e reprodução

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

Use --resume com o mesmo caminho de saída após uma interrupção. A apresentação ao vivo usa por padrão uma meta legível de 12 FPS; --max-speed mede a taxa contínua atual de decisões.