Documentação

Snake em Core ML: probabilidades ao vivo, inferência local

A demonstração de terminal corre um modelo Laya real em cada movimento. O painel esquerdo mostra o tabuleiro, a pontuação e o comprimento da snake; o painel direito mostra as probabilidades de direção, o risco estimado de beco sem saída, a alcançabilidade da comida, o tempo de predição medido, o motor, zero tokens de saída e o estado de inferência offline.

Começar num Mac com Apple Silicon

pip install 'laya-coreml[demo]'
hf download aac6fef/laya-multilingual-coreml-ane --local-dir models/snake
laya-coreml-snake --model ./models/snake --fps 12

Usa um terminal com pelo menos 104 colunas × 35 linhas, com um tipo de letra monoespaçado e suporte de cores verdadeiras. O carregamento do modelo e a compilação inicial do Core ML acontecem antes de o jogo começar e podem demorar dezenas de segundos na primeira execução. Doze decisões por segundo é uma velocidade de apresentação legível, não um máximo de hardware.

O caminho do modelo é totalmente local após o download explícito. Iniciar o jogo com um ID do Hub não colocado em cache falha com instruções, em vez de descarregar enquanto apresenta OFFLINE. O runtime não precisa de MLX, PyTorch nem Transformers.

Controlo Ação
Barra de espaços Pausar ou retomar
Cima / Baixo, ou + / - Aumentar ou diminuir a taxa de decisão
R Iniciar a próxima ronda com semente
Q / Ctrl-C Sair e restaurar o terminal

A UI espera quando o terminal é demasiado pequeno. --no-alt-screen deixa o fotograma final no histórico de scroll; --headless corre o mesmo modelo/jogo sem a apresentação.

Duas opções de implementação

O pacote ANE predefinido tem lote um e comprimento 96. Cada passo de jogo responde a três perguntas sequencialmente. O seu benchmark de ~5 ms para uma única pergunta não é um tempo de fotograma de jogo completo. O pacote Snake GPU normal usa B3/L64/K4 e agrupa essas três perguntas:

hf download aac6fef/laya-multilingual-coreml-snake --local-dir models/snake-gpu
laya-coreml-snake --model ./models/snake-gpu --fps 12

A etiqueta do motor descreve as unidades de cálculo do Core ML selecionadas. O grafo ANE dedicado tem provas separadas de plano de execução e de traço de hardware no relatório ANE; CPU+ANE continua a permitir trabalho no anfitrião.

O que o modelo controla

O código calcula movimentos legais, progresso seguro ao longo de um ciclo hamiltoniano e se a comida é alcançável através de células vazias. O Laya recebe estas características e devolve probabilidades de direção e booleanas. O risco apresentado é 1 - P(safe route); é uma estimativa do modelo, não uma probabilidade calibrada de morrer no movimento seguinte.

O escudo de segurança predefinido restringe os movimentos executados a progresso seguro de ciclo. A UI mantém visíveis as probabilidades originais do modelo, mostra a direção proposta e a executada, e incrementa um contador de intervenções visível quando diferem. --unassisted executa o top-1 em bruto do modelo sem este escudo. Zero mortes com o escudo não estabelecem inteligência de Snake sem assistência nem sobrevivência ilimitada.

Gravar uma execução real e exportar media partilháveis

laya-coreml-snake --model ./models/snake --fps 12 --seed 7 \
  --duration 75 --record snake.jsonl

# Requires ffmpeg: brew install ffmpeg
laya-coreml-snake export snake.jsonl --start 45 --seconds 20 \
  --output snake.mp4 --gif snake.gif --gif-seconds 15
laya-coreml-snake export snake.jsonl --start 55 --output snake.png

As gravações incluem a proveniência do modelo, cada tabuleiro antes da ação anunciada, as probabilidades reais, a latência de inferência, os timestamps decorridos e um resumo final. O exportador reutiliza a composição do terminal ao vivo e preserva a temporização de relógio de parede 1×. O indicador no ecrã RECORDED RUN · 1× identifica um replay. O ficheiro sidecar regista os hashes da origem e do renderizador. Os FPS do vídeo amostram a gravação; não alteram o número de decisões do modelo nem aceleram a reprodução.

Os ficheiros de saída têm de ser caminhos novos. --max-speed desativa o ritmo fixo e espera por cada predição nova antes de se mover. Não salta chamadas ao modelo:

laya-coreml-snake --model ./models/snake --max-speed \
  --duration 20 --record snake-fast.jsonl

Medir uma taxa de decisão estável

laya-coreml-snake benchmark --model ./models/snake \
  --rates 20,30,40,50,60 --sweep-steps 120 --soak-steps 600 \
  --seeds 101,102,103 --raw-steps 200 --output snake-benchmark.json

O benchmark mede primeiro o comportamento sem escudo e o funcionamento sem limite, varre taxas-alvo e depois testa as taxas que passam em episódios mais longos com várias sementes. Passar exige zero mortes, saídas finitas, ordem de ciclo e progresso da comida preservados, e no máximo 1% dos ticks a exceder o orçamento de computação ativa.

A temporização inclui a predição do modelo, o trabalho do planeador, a composição Rich em cores verdadeiras, a serialização ANSI e as atualizações do jogo. Os testes a ritmo fixo incluem pausas (sleep) reais. A pintura do emulador de terminal está excluída deste teste de renderização em memória. O resultado é a taxa testada mais alta que passa nesta máquina e com estas sementes, não um máximo universal. Vê SNAKE_BENCHMARKS.md para a execução da versão.