Documentação

Velocidade e estabilidade do Snake: M3 Max

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

Débito sustentado sem limite: 63.61 movimentos/segundo no total, ao longo de 2,400 passos. Cada uma das quatro seeds completou 600 movimentos. As suas taxas variaram entre 46.32 e 76.37 movimentos/segundo. Todos os jogos sobreviveram, mantiveram a ordem cíclica do corpo e continuaram a alcançar a comida. A camada de segurança corrigiu 2 propostas em bruto do modelo nestes episódios.

Orçamento de computação com ritmo testado mais alto que passou: 20 FPS. As quatro seeds cumpriram o requisito de pelo menos 99% dos ticks ativos caberem em 50 ms. A taxa real, incluindo o excesso de suspensão do SO, foi de 18.69–18.94 movimentos/segundo. Isto é uma definição de orçamento, não uma afirmação de exatamente 20 fotogramas 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

A inferência do modelo sem limite combinada p50 / p95 / p99 foi 10.08 / 31.68 / 33.61 ms. O tick ativo completo p50 / p99 foi 12.70 / 37.21 ms. Um tick ativo inclui planeamento, inferência sincronizada, composição Rich, serialização ANSI truecolor e a atualização do jogo. Não é inserido qualquer atraso de ritmo.

Estabilidade com orçamento fixo

Seed FPS alvo Passos Passos/s reais Tick ativo p99 (ms) Falhas 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 total). A pior seed teve 6/600 ticks atrasados, exatamente o limite predefinido de 1%. Todos os movimentos esperam por um resultado novo do modelo, por isso a inferência lenta reduz a taxa do jogo em vez de executar ações desatualizadas.

Varredura curta

Cada candidato abaixo correu 120 movimentos com a seed 7. Uma sonda curta que passa seleciona um candidato para o teste mais longo de quatro seeds; por si só não é suficiente para reivindicar estabilidade. Todos os jogos sobreviveram, incluindo as falhas de tempo.

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

A varredura curta não é monótona, e a latência medida varia consideravelmente ao longo do tempo. As execuções com ritmo e sem limite diferem nos períodos de inatividade do dispositivo; a atividade normal do ambiente de trabalho, o escalonamento e o comportamento do relógio não foram isolados experimentalmente. Os dados não identificam uma única causa nem um teto de velocidade universal. Reportamos a taxa alcançada, todas as amostras e a definição testada mais alta que passou.

O que o resultado de estabilidade inclui

O Laya recebe características do planeador, incluindo as direções legais e o melhor progresso admissível em direção à comida. Calcula probabilidades reais. A camada de segurança de ciclo pode corrigir a execução, mantendo as barras de probabilidade em bruto e contando todas as intervenções. O checkpoint não foi treinado em Snake aqui. Significado exato das métricas da UI e comportamento da política.

Um controlo separado de top-1 em bruto correu as seeds 101–103 durante 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 controlo em bruto continua a fornecer características do planeador. A sua sobrevivência neste horizonte não estabelece sobrevivência indefinida sem escudo nem raciocínio sobre o tabuleiro sem ajuda.

A montra publicada é uma execução TTY real separada de 100.005 segundos, com um alvo de 12 FPS: 1,144 movimentos, pontuação 40, comprimento 46, zero mortes e zero intervenções. O débito alcançado foi de 11.44 movimentos/segundo. Cada tabuleiro e ação gravados são verificados por reprodução determinística na suite 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 TTY separada otimizada à velocidade máxima completou 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 no fluxo do terminal. O seu vídeo de 15 segundos à velocidade original e a gravação completa estão incluídos a par do clipe de apresentação mais lento.

Limites 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 previamente verificado: 7fc5834af4d8fdfb268d272a9d1a66e5819a0daac98241651c4c888cc43adff1.
  • Cada movimento chama Agent.predict uma vez com três perguntas agrupadas. A medição 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 Rich para um fluxo em memória. A pintura do ecrã do emulador de terminal, o carregamento do modelo e o warmup estão excluídos. Os controlos reais do terminal e a limpeza foram testados separadamente.
  • O relatório guarda a configuração, o ambiente, a impressão digital da origem e todas as probabilidades, decisões de execução e medições de tempo por passo. 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 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. Mediram a serialização monocromática e são mantidas como resultados exploratórios, em vez de substituírem o benchmark final a cores. A campanha compacta anterior completou 12,360 movimentos sem qualquer morte e mediu 52.55 movimentos/segundo sem limite no total; o seu orçamento testado mais alto que passou foi 18 FPS. A diferença em relação à execução final não é atribuída ao facto de se ter ativado a cor: as medições de tempo da máquina variam substancialmente.

O soak de 20 FPS com prompt detalhado falhou o seu critério de tempo nas quatro seeds, embora todos os jogos tenham sobrevivido. As falhas de taxa mais alta da campanha compacta anterior também são mantidas. Nenhum episódio concluído com falha foi removido desses ficheiros.

Ficheiros 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

Usa --resume com o mesmo caminho de saída após uma interrupção. A apresentação em direto usa por predefinição um alvo legível de 12 FPS; --max-speed mede a taxa de decisões contínua atual.