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.