В современном мире цифровых шахмат огромные массивы данных требуют продуманных решений для их хранения и обработки. Платформа Lichess, одна из самых популярных шахматных платформ в мире, столкнулась с необходимостью оптимизировать способ представления шахматных позиций. Ранее позиционные данные хранились в текстовых форматах, таких как FEN (Forsyth-Edwards Notation), что обеспечивало удобочитаемость, но не всегда соответствовало требованиям эффективности и компактности. Новейшая адаптация бинарного формата nnue-PyTorch предлагает инновационное решение, позволяющее значительно улучшить хранение и обработку позиций на Lichess, а также повысить быстродействие системы в целом. Исторически для описания шахматных позиций использовалась нотация FEN, которая представляет расположение фигур, чей ход, права на рокировку, позицию для взятия на проходе и счётчики ходов.
Это универсальный и человекочитаемый формат, однако его символы занимают заметное пространство, а преобразование из строки в внутренние структуры требует времени и вычислительных ресурсов. С ростом популярности платформы и объёма позиций становится актуальным вопрос о разработке более компактного и быстродействующего способа хранения и передачи данных. Основная идея новой реализации заключается в переходе от текстового представления к бинарному формату, основанному на наработках проекта nnue-PyTorch, разрабатываемого в тесной связке с шахматным движком Stockfish. Разработчики Stockfish сталкиваются с похожими задачами, ведь для обучения нейросетевых компонентов необходимы огромные массивы данных, которые должны быстро читаться и записываться. Вдохновившись их опытом, специалисты Lichess адаптировали формат под собственные требования, учитывая специфику своей платформы и особенности различных шахматных вариантов.
Бинарный формат привносит ключевое новшество: первые 64 бита кодируют маску занятости шахматных клеток, указывая, какие поле заняты фигурами. Такой подход позволяет быстро отделить пустые клетки и эффективно сжать данные. Далее следует последовательность, кодирующая сами фигуры на занятых клетках, каждая из которых занимает полбайта (ниббл). Для обычных шахматных фигур с их разнообразием цветов и типов этого пространства хватит с запасом. Интересной деталью является дополнительное использование оставшихся 4 кодов — они предназначены для более редких или специальных типов фигур, например, для белой или чёрной ладьи с правом на рокировку, чёрного короля с указанием очереди хода, а также пешки, которая сделала двойной ход и может быть взята на проходе.
Формат позволяет включать и дополнительную информацию, такую как счётчики ходов, которые кодируются с помощью LEB128, а также данные, специфичные для шахматных вариантов, включая идентификаторы варианта, счётчики трёхходовых шахов, данные Crazyhouse и маски превращённых фигур. Это делает формат универсальным и пригодным не только для классических, но и для разнообразных шахматных вариантов, поддерживаемых Lichess. Одной из сложностей стало учитывание того, что для некоторых позиций не существует стандартных условий — к примеру, в Антишахе нет чёткого понятия очередности хода с помощью короля, а вариации вроде Atomic могут содержать необычные состояния после так называемого ядерного Армагеддона. В подобных случаях формат требует обязательного присутствия счётчиков ходов, чтобы избежать недопониманий и однозначно представлять позицию. Разработчики особое внимание уделили обратимости формата, важной для корректного восстановления позиции из бинарного кода.
Двухстороннее преобразование происходит не медленнее, чем с использованием FEN, что играет важную роль для взаимодействия с другими системами и использования данных в реальном времени. По тестам чтение и запись новых бинарных позиций достигают скорости примерно в 50 раз выше, чем разбор обычного FEN, что значительно оптимизирует операции с большими объёмами позиций. Ключевым преимуществом нового решения является существенная экономия места на диске и в облачном хранилище. В среднем, размер данных, необходимых для хранения позиции, сократился с 42,1 символа в FEN-формате до 18,7 байта в бинарном представлении, что составляет около 56% экономии пространства. Для больших коллекций, например, учебных материалов Lichess (где хранятся тысячи позиций внутри исследовательских глав), экономия достигает ещё более впечатляющих показателей — свыше 60%.
Это существенно снижает затраты на хранение и передачу данных, а также ускоряет загрузку информации пользователям. Помимо хранения и передачи, формат также интегрирован в процессы облачной оценки позиций. Lichess активно использует облачную инфраструктуру для анализа партий, определяя качество ходов и помогая игрокам улучшать показатели. Оптимизация формата хранения данных напрямую влияет на быстродействие оценки и отзывчивость платформы. Встраивание бинарного формата в инфраструктуру Lichess стало возможным благодаря развитию масштабируемых библиотек и инструментов на базе Scala, таких как scalachess.
Открытость исходного кода и ориентированность на высокую производительность позволили реализовать двунаправленное преобразование форматов без ощутимых компромиссов по скорости, что ещё недавно казалось недостижимым. Помимо повышения скорости и сокращения пространства, новая система обладает гибкостью и расширяемостью. Поддержка любых шахматных вариантов, возможность кодирования нелегальных позиций и включение дополнительной информации выясняют готовность Lichess к будущим нововведениям и сценариям использования, включая эксперименты с новыми вариантами и углубленную аналитику. Среди потенциальных направлений развития можно выделить дальнейшую оптимизацию формата с применением энтропийного кодирования для ещё большей компрессии и ускорения процессов. Кроме того, опыт использования нового формата в облачной оценке подготовит почву для миграции других коллекций данных, таких как крупные исследования и учебные материалы.