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.predictuma 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
- Traces finais truecolor
- Campanha monocromática compacta anterior
- Campanha monocromática com prompt detalhado anterior
- Controles reais de TTY e verificação de inferência offline
- Gravação original da demonstração
- Proveniência do vídeo
- Experimentos de compilação, prefixo e prompt
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.