Георгий Маслов georgiymaslov
Визитки, сайты на WordPress, боты, 1С, SEO, серверы, Python+AI
Рейтинг
21 229
№ 43 в каталоге
Отзывы
Профессионализм
10/10
Коммуникация
10 /10
Город
Москва
На сайте с
2017 года
Юридический статус
Самозанятый
Эксперт
Национальной Гильдии Фрилансеров
Безопасная сделка
Деньги списываются после приёмки

Ускорение обучения AlphaZero для настольной игры Quoridor в 8.9 раза: CUDA, батчевая самоигра, битборды вместо BFS

Используемые навыки CUDA Machine Learning Algorithms Python Pytorch Reinforcement Learning

Описание

Открытая реализация AlphaZero для настольной игры Quoridor на чистом Python обучалась только на процессоре. Одна итерация обучения занимала 783 секунды, полный план в 20 тысяч итераций упирался в месяцы работы. Требовалось ускорить самоигру в 5-20 раз и не тронуть качество игры: обученные веса и результат поиска должны остаться прежними, иначе теряется весь накопленный прогресс обучения.

Решение

Профилирование cProfile по одной итерации показало три узких места: сеть считается по одной позиции на ход, проверка достижимости финиша при постановке стены идёт обходом BFS по графу из 81 клетки, и на каждый вызов predict тратится переключение режима сети.

Этап 1, видеокарта. Обучение переведено на CUDA, воркеры самоигры остались на процессоре, устройство выбирается автоматически и задаётся флагом. Смешанный режим здесь важен: 30 процессов самоигры на ядрах обгоняют пачку партий на одной карте, это подтверждено замером на арендованной RTX 4090.

Этап 2, батчевая самоигра. Поиск переписан на генераторы, партии играются одновременно, и все запросы к сети от разных партий собираются в один вызов. В фазе sequential halving симуляции разных кандидатов идут по непересекающимся поддеревьям, поэтому батчинг не меняет результат поиска ни на один ход. Тем же приёмом переписана арена гейтинга, где две сети играют матч.

Этап 3, стены. BFS заменён на битборд-заливку 64-битными масками с предварительным отсечением по барьеру, из predict вынесен eval, маска допустимых ходов переписана на numpy.

Каждый этап отдельным коммитом со своим бенчмарком до и после, замеры на одном железе и одинаковых сидах, длинные прогоны под сторожевым процессом, который перезапускает зависший запуск.

Результат

Самоигра на процесс: было 1.36 хода в секунду, стало 12.16, ускорение 8.9 раза. Полная итерация стандартного пресета: было 783 секунды, стало 690 уже на ноутбуке, где батчи не раскрываются на 12 воркерах, а на сервере с 30 процессами выигрыш кратно больше.

Тестов 23 из 23, включая тест на побитовое совпадение нового генераторного пути поиска со старым и тест на учёт всех партий в батчевой арене: качество игры не изменилось, ускорилось только его вычисление.

Работа отдана пулреквестом из 8 коммитов в исходный репозиторий проекта, история покоммитная, каждый этап читается и откатывается отдельно.

Отдельно собран инструмент очной встречи двух чекпоинтов: две модели играют серию партий с чередованием цветов и жадными ходами, как в гейтинге, и владелец проекта видит цифрами, какая из версий сильнее.

Оценили проект:

Другие проекты

Все проекты →
Маркетинг и Продвижение Настройка рекламы в Яндекс.Директ для юридической компании
Настройка рекламы в Яндекс.Директ для юридической компании
32
Веб-разработка и IT Сайт-визитка кондитерской, демонстрационный образец: нарядное оформление каллиграфией и узором, меню с ценами за килограмм, заявка на торт
Сайт-визитка кондитерской, демонстрационный образец: нарядное оформление каллиграфией и узором, меню с ценами за килограмм, заявка на торт
29
Веб-разработка и IT Лента вертикальных видео (аналог Shorts) для видеохостинга: бесшовная бесконечная карусель, сделана с нуля
Лента вертикальных видео (аналог Shorts) для видеохостинга: бесшовная бесконечная карусель, сделана с нуля
42
Веб-разработка и IT Скрининг арбитража на торгах по банкротству: автоматическое сопоставление лотов с рыночными ценами
Скрининг арбитража на торгах по банкротству: автоматическое сопоставление лотов с рыночными ценами
46