Инженерия

Как мы ускорили ИИ-генерацию beatmap до интерактивной скорости

Полный mapset osu! mania примерно за 20 секунд работы GPU вместо минуты и больше: куда уходит время в запросе к ManiaGAI и какие решения — от браузера до пакетных сложностей — его сократили.

Генератор, которого приходится ждать минутами, — это пакетное задание. Вы отправляете песню, идёте заниматься чем-то другим и возвращаетесь к тому, что получилось, — а если результат не нравится, попытка с другим стилем или другим набором сложностей стоит вам ещё одного ожидания. Генератор, который отвечает за секунды, — это инструмент: вы пробуете, слушаете, правите и пробуете снова.

Именно из-за этой разницы в ManiaGAI версии 2 мы относились к задержке как к ограничению при проектировании всей системы, а не как к тому, что оптимизируют в самом конце. Версии 1 на mapset требовалась минута или больше. Версии 2 на полный mapset для типичной песни нужно около 20 секунд работы GPU — обычно от 13 до 25 секунд, в зависимости от песни и запрошенных сложностей. Ниже — на что уходит это время и какие решения убрали всё остальное.

Анатомия запроса

  1. Ваш браузер
  2. Тайминг ∥ музыкальные признаки
  3. Planner
  4. Noter
  5. Проверка
  6. Скачивание

Один измеренный продакшен-запуск времён выхода v2: песня длиной 2:50, сложностей — 5, на GPU NVIDIA T4 — 12,7 секунды в сумме.

Время этапов одной генерации ManiaGAI v2
ЭтапВремя
Тайминг + музыкальные признаки (параллельно)3,8 с
Планирование (все сложности)1,0 с
Генерация нот (все сложности: 5)6,1 с
Весь запуск12,7 с

Время вычислений на GPU для одной песни на системе запуска v2 (1 октября 2026 года), без учёта загрузки, очереди и скачивания.

1. Обработать аудио ещё до того, как кто-то нажмёт «Создать»

Каждую загруженную песню нужно декодировать, нормализовать по громкости и перекодировать в единый формат, прежде чем модели смогут ею воспользоваться. На сервере это несколько секунд работы, которых GPU иначе пришлось бы ждать. В ManiaGAI это происходит в вашем браузере, как только вы выбрали файл, — пока вы ещё выбираете количество клавиш и сложности. К моменту, когда вы нажимаете «Создать», работа обычно уже сделана. Если подготовка песни на медленном устройстве занимает больше 20 секунд, её берёт на себя сервер, так что эта оптимизация никого не задерживает.

2. Запускать тайминг и понимание музыки параллельно

До начала планирования о песне нужно знать две вещи: её сетку тайминга (из открытой модели Beat This плюс нашей собственной подгонки сетки) и её музыкальные признаки (из музыкальной модели MERT). Они не зависят друг от друга, поэтому и не ждут друг друга: GPU запускает Beat This и MERT, а подгонка сетки в это же время идёт на CPU. В запуске выше весь этап понимания занял 3,8 секунды.

3. Генерировать все сложности за один проход

В mapset от ManiaGAI может быть до десяти сложностей. Генерация их одну за другой умножила бы время на число сложностей. Вместо этого все запрошенные сложности планируются и генерируются вместе, за один пакетный проход на GPU: у них одна и та же песня и одни и те же музыкальные признаки, различаются только цели. Так генерация нот для пяти сложностей в запуске выше уложилась в 6,1 секунды.

4. Уточнять весь чарт, а не писать его нота за нотой

Модель нот неавторегрессионная: она создаёт весь чарт за фиксированное число проходов уточнения, а не по одному токену от начала песни до конца, — поэтому число шагов модели фиксировано, сколько бы нот в итоге ни оказалось в чарте. (Почему модель устроена именно так — отдельная история: статья о Planner + Noter.)

5. Стартовать со снимка, а не с нуля

Генерация идёт на serverless-воркерах с GPU, а значит, когда приходит запрос, воркер запущен не всегда. Загрузка моделей и прогрев всего с нуля добавили бы к этому первому запросу много секунд. Вместо этого воркеры восстанавливаются из снимка памяти, сделанного после того, как всё загружено и прогрето, так что новый воркер готов примерно за секунду, а не тратит это время на загрузку моделей.

6. Не ждать на финише

Последние шаги раньше добавляли собственную задержку. Теперь .osz для скачивания собирается в тот же момент, когда готовы чарты, а готовая карта сохраняется в «Мои карты» сразу по окончании генерации — даже если вы ушли со страницы. Прогресс в генераторе показывает реальный этап, на котором находится каждая генерация, так что ожидание никогда не остаётся загадкой.

Ещё быстрее — с идентичными чартами

8 октября 2026 года мы выпустили более быструю реализацию системы генерации: карты теперь генерируются примерно вдвое быстрее, а чарты остаются точно такими же — тот же вход, тот же выход. Для этого изменения мы установили жёсткое правило: ускорение, которое меняет то, что пишет модель, — это изменение модели, и оценивать его нужно соответственно. Короче стало только ожидание.

Что даёт скорость

Скорость меняет то, как пользуются ManiaGAI. Благодаря ей попробовать второй стиль или другой набор сложностей — дело нескольких секунд, схема «сначала превью, потом скачивание» становится естественной, а бесплатный тариф можно поддерживать. Поэтому же мы оптимизируем весь запрос — от браузера до скачивания, — а не одну только модель: игроки чувствуют ожидание, а не время GPU.

Где эти этапы находятся в системе, показано на странице «Технология»; что и когда менялось — в списке изменений.