Вместо процессора 1355 копий космического пехотинца бегут по конвейерам, пересекают линии и буквально считают нейросеть внутри Doom. Разработчик под ником mottopanikeiku создал Doomformer, который превращает геометрию игровых уровней и старые механики шутера в систему для выполнения математических операций.
Основой вычислителя стали так называемые voodoo dolls, дополнительные копии игрока, возникающие при нескольких стартовых точках первого персонажа на карте. Клоны перемещаются по конвейерам и пересекают линии-триггеры, каждая из которых прибавляет определённое значение к накопленной сумме. Числа Doomformer хранит в уровнях освещения секторов и высоте полов и потолков. Ступени и проходы разной высоты выполняют роль условий и пропускают сигнал только при подходящем значении.
Doom при этом не обучает нейросети. Разработчик заранее готовит модели в PyTorch, переводит вычисления в целочисленную форму и компилирует получившуюся структуру в карту ZDoom, которую запускает через ViZDoom. Python передаёт входные значения, двигает игровое время и считывает результаты обратно. Каждый доступный результат сравнивается с независимым расчётом NumPy без допуска даже в единицу.
Самая наглядная демонстрация использует набор рукописных цифр MNIST. Игрок ходит по площадке размером 28×28 клеток и рисует цифру движением персонажа. После команды READ 784 пикселя поступают в сеть, а 1355 клонов выполняют расчёты. Модель содержит 64 скрытых элемента, сравнивает 45 пар оценок для цифр и определяет победителя, после чего нужная цифра загорается на стене.
В выборке из 1000 изображений MNIST модель правильно распознала 966 цифр. При этом все 1000 вычислений внутри Doom точно совпали с целочисленной реализацией в NumPy. Разница важна: ошибка в распознавании означает ошибку самой обученной модели, а не сбой необычного игрового вычислителя. На полном тестовом наборе из 10 000 изображений оптимизированный вариант получил 9716 правильных ответов, или 97,16%, и снова совпал с эталонным расчётом для каждого изображения.
Doomformer не ограничивается распознаванием цифр. Проект поддерживает многослойные сети и небольшие трансформеры, способные работать с последовательностями. Автор, например, обучил небольшую модель генерировать названия уровней Doom. Такие модели нельзя просто взять из обычного ИИ-приложения и перенести в игру: трансформеры для Doomformer заранее обучаются в PyTorch с учётом целочисленных вычислений и ограничений игровой механики.
Практической альтернативой обычному процессору Doom пока не стал. Для небольшой многослойной сети чистое время вычислений внутри движка оказалось примерно в 23 000 раз больше, чем у NumPy. Если учитывать передачу входных данных, запуск и чтение результата, разрыв увеличивается примерно до 65 000 раз. Первоначальная схема распознавания одной рукописной цифры требовала 5705 игровых тиков, или 163 секунды при стандартных 35 тиках в секунду. После оптимизации разработчик сократил сам расчёт до 273 тиков, примерно восьми секунд игрового времени.
Автор также проверяет Doomformer на случайных сетях и намеренно повреждает карты, чтобы убедиться, что система замечает ошибочные вычисления. Тесты уже помогли найти проблемы с расписанием операций и ограничениями движения игровых поверхностей. Исходный код опубликован под лицензией MIT, для локального запуска нужны Python 3.11 или новее, Linux либо macOS, а также инструменты для сборки компонентов Doomformer.