Документация

Snake на Core ML: живые вероятности, локальный инференс

Терминальное демо прогоняет настоящую модель Laya на каждом ходу. Левая панель показывает поле, счёт и длину змейки; правая панель показывает вероятности направлений, оценку риска тупика, достижимость еды, измеренное время предсказания, движок, ноль выходных токенов и статус офлайн-инференса.

Запуск на Mac с 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

Используйте терминал не меньше 104 столбцов × 35 строк с моноширинным шрифтом и поддержкой truecolor. Загрузка модели и начальная компиляция Core ML происходят до начала игры и могут занять десятки секунд при первом запуске. Двенадцать решений в секунду — это разборчивая скорость показа, а не максимум оборудования.

Путь к модели полностью локальный после явного скачивания. Запуск игры с некешированным ID из Hub завершается с инструкциями, а не скачиванием во время отображения OFFLINE. Рантайму не нужны MLX, PyTorch или Transformers.

Управление Действие
Пробел Пауза или продолжение
Вверх / Вниз, или + / - Увеличить или уменьшить частоту решений
R Начать следующий раунд с заданным seed
Q / Ctrl-C Выйти и восстановить терминал

Интерфейс ждёт, когда терминал слишком мал. --no-alt-screen оставляет финальный кадр в истории прокрутки; --headless прогоняет ту же модель/игру без дисплея.

Два варианта развёртывания

Пакет ANE по умолчанию имеет батч один и длину 96. Каждый шаг игры отвечает на три вопроса последовательно. Его бенчмарк одного вопроса ~5 мс — это не время полного кадра игры. Обычный пакет Snake GPU использует B3/L64/K4 и батчит эти три вопроса:

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

Метка движка описывает выбранные единицы вычислений Core ML. Выделенный граф ANE имеет отдельные свидетельства плана исполнения и трассы оборудования в отчёте ANE; CPU+ANE всё ещё допускает работу хоста.

Чем управляет модель

Код вычисляет допустимые ходы, безопасное продвижение по гамильтонову циклу и то, достижима ли еда через пустые клетки. Laya получает эти признаки и возвращает вероятности направления и булевы вероятности. Показанный риск — это 1 - P(safe route); это оценка модели, а не калиброванная вероятность погибнуть на следующем ходу.

Щит безопасности по умолчанию ограничивает выполняемые ходы безопасным относительно цикла продвижением. Интерфейс сохраняет видимыми исходные вероятности модели, показывает предложенное и выполненное направление и увеличивает видимый счётчик вмешательств, когда они различаются. --unassisted выполняет сырой top-1 модели без этого щита. Ноль смертей со щитом не доказывает интеллект Snake без помощи или неограниченное выживание.

Запишите реальный прогон и экспортируйте медиа для публикации

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

Записи включают происхождение модели, каждое поле перед объявленным действием, реальные вероятности, задержку инференса, прошедшие метки времени и итоговую сводку. Экспортёр переиспользует живую композицию терминала и сохраняет тайминг 1× реального времени. Надпись на экране RECORDED RUN · 1× обозначает повтор. Боковой файл записывает хеши исходников и рендерера. FPS видео дискретизирует запись; он не меняет число решений модели и не ускоряет воспроизведение.

Выходные файлы должны быть новыми путями. --max-speed отключает темп и ждёт каждое новое предсказание перед ходом. Он не пропускает вызовы модели:

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

Измерьте стабильную частоту решений

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

Бенчмарк сначала измеряет поведение без щита и работу без ограничения, затем перебирает целевые частоты, а после проверяет проходные частоты на более длинных эпизодах с несколькими seed. Прохождение требует нуля смертей, конечных выходов, сохранённого порядка цикла и продвижения к еде, а также не более 1% тиков, превышающих активный бюджет вычислений.

Тайминг включает предсказание модели, работу планировщика, композицию Rich в truecolor, ANSI-сериализацию и обновления игры. Темповые тесты включают реальные sleep. Отрисовка эмулятором терминала исключена из этого теста рендеринга в памяти. Результат — наибольшая проходная проверенная частота на этой машине и этих seed, а не универсальный максимум. Прогон выпуска см. в SNAKE_BENCHMARKS.md.